C# 从C读取gmail帐户的Atom提要#
我有一个项目,将发送一封带有特定数据的电子邮件到gmail帐户。我认为阅读Atom提要可能比通过POP连接更容易 根据谷歌的说法,我应该使用的url是:C# 从C读取gmail帐户的Atom提要#,c#,xml,gmail,atom-feed,C#,Xml,Gmail,Atom Feed,我有一个项目,将发送一封带有特定数据的电子邮件到gmail帐户。我认为阅读Atom提要可能比通过POP连接更容易 根据谷歌的说法,我应该使用的url是: https://gmail.google.com/gmail/feed/atom 问题是:如何验证我想要查看的电子邮件帐户?如果我在Firefox中这样做,它会使用cookies 我还不确定如何“下载”这个请求应该返回的XML文件(我认为正确的术语是流) 编辑1: 我使用的是.NET3.5。.NETFramework3.5提供了本机类来读取提
https://gmail.google.com/gmail/feed/atom
问题是:如何验证我想要查看的电子邮件帐户?如果我在Firefox中这样做,它会使用cookies
我还不确定如何“下载”这个请求应该返回的XML文件(我认为正确的术语是流)
编辑1:
我使用的是.NET3.5。.NETFramework3.5提供了本机类来读取提要。文章介绍了如何做到这一点 我还没有使用它,但必须有一些规定,以验证一个网址。你可以看看。我也会这样做,然后把答案寄回来 如果您没有使用Framework3.5,那么您可以尝试一下。我用过一次,但它已经旧了。如果它符合你的需要,你可以试一试 编辑:这是分配用户凭据的代码:
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = new NetworkCredential("abc@abc.com", "password");
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
XmlReader reader = XmlReader.Create("https://gmail.google.com/gmail/feed/atom", settings);
您可以使用基本身份验证。基本上,您发出一个初始请求,服务器用401回复,然后您用base64(在本例中是通过HTTPS)发回密码 但请注意:
这是我在Vb.net中使用的:
objClient.Credentials = New System.Net.NetworkCredential(username, password)
objClient的类型为System.Net.WebClient
然后,您可以使用以下方式从提要获取电子邮件:
Dim nodelist As XmlNodeList
Dim node As XmlNode
Dim response As String
Dim xmlDoc As New XmlDocument
'get emails from gmail
response = Encoding.UTF8.GetString(objClient.DownloadData("https://mail.google.com/mail/feed/atom"))
response = response.Replace("<feed version=""0.3"" xmlns=""http://purl.org/atom/ns#"">", "<feed>")
'Get the number of unread emails
xmlDoc.LoadXml(response)
node = xmlDoc.SelectSingleNode("/feed/fullcount")
mailCount = node.InnerText
nodelist = xmlDoc.SelectNodes("/feed/entry")
node = xmlDoc.SelectSingleNode("title")
Dim节点列表作为XmlNodeList
Dim节点作为XmlNode
作为字符串的暗淡响应
Dim xmlDoc作为新的XmlDocument
“从gmail获取电子邮件
response=Encoding.UTF8.GetString(objClient.DownloadData(“https://mail.google.com/mail/feed/atom"))
响应=响应。替换(“,”)
'获取未读电子邮件的数量
LoadXml(响应)
node=xmlDoc.SelectSingleNode(“/feed/fullcount”)
mailCount=node.InnerText
nodelist=xmlDoc.SelectNodes(“/feed/entry”)
node=xmlDoc.SelectSingleNode(“标题”)
这在C#中应该不会有太大的不同。就其价值而言,我从未能够通过以下方式进行身份验证:
https://gmail.google.com/gmail/feed/atom
但是,我始终可以在以下位置进行身份验证:
https://mail.google.com/mail/feed/atom
嗯 以下是我的精干而中庸的解决方案:
public static string TextToBase64(string sAscii)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] bytes = encoding.GetBytes(sAscii);
return System.Convert.ToBase64String(bytes, 0, bytes.Length);
}
public static void foobar()
{
var url = @"https://gmail.google.com/gmail/feed/atom";
var USER = "userName";
var PASS = "password";
var encoded = TextToBase64(USER + ":" + PASS);
var myWebRequest = HttpWebRequest.Create(url);
myWebRequest.Method = "POST";
myWebRequest.ContentLength = 0;
myWebRequest.Headers.Add("Authorization", "Basic " + encoded);
var response = myWebRequest.GetResponse();
var stream = response.GetResponseStream();
// Parse the stream using your favorite parsing library or using XmlDocument ...
}
下面的方法似乎可以检查未读邮件的数量。我对xml知之甚少,所以除了检索未读计数外,我无法解析结果。(错误时返回-1)
你能举个例子吗?我真的不知道该怎么做。这个账户只会用作单向系统。gps跳线基本上是以邮件的形式发送的。然后我需要把它们捡起来读一遍,谢谢你的代码,我会尝试一下,我会再次遇到同样的错误。我很困惑,在你的帖子中,你提到用base64发送密码,但在代码中我看不到这一点。你如何请求页面,然后响应页面以提供base64密码?你使用了完整的代码(包括“ServicePointManager.CertificatePolicy=new IgnoreBadCerts();”)吗?Base64是使用的,但在内部,所以您不必担心它。此代码运行良好,谢谢-正如Matthew Flaschen所述,它返回一个401错误,我想我需要以某种方式发送身份验证。有人对此有什么想法吗?我写的代码必须工作得很理想,但我想谷歌的认证方法似乎有些问题。这家伙似乎也有同样的问题-谢谢,我回家后会尝试一下。我在运行此代码时遇到了一个“(407)Proxy Authentication Required”错误,有其他人尝试过吗?这很奇怪。我在日常工作中使用的应用程序中使用了该代码。唯一的办法是如果谷歌改变了一些东西,我有点怀疑(在我使用我的应用程序的这一年里,他们没有改变任何东西)。
public static string TextToBase64(string sAscii)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] bytes = encoding.GetBytes(sAscii);
return System.Convert.ToBase64String(bytes, 0, bytes.Length);
}
public static void foobar()
{
var url = @"https://gmail.google.com/gmail/feed/atom";
var USER = "userName";
var PASS = "password";
var encoded = TextToBase64(USER + ":" + PASS);
var myWebRequest = HttpWebRequest.Create(url);
myWebRequest.Method = "POST";
myWebRequest.ContentLength = 0;
myWebRequest.Headers.Add("Authorization", "Basic " + encoded);
var response = myWebRequest.GetResponse();
var stream = response.GetResponseStream();
// Parse the stream using your favorite parsing library or using XmlDocument ...
}
public int GmailUnreadCount(string username, string password)
{
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = new NetworkCredential(username, password);
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
try
{
XmlReader reader = XmlReader.Create("https://mail.google.com/mail/feed/atom", settings);
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
switch (reader.Name)
{
case "fullcount":
int output;
Int32.TryParse(reader.ReadString(), out output);
return output;
}
break;
}
}
}
catch (Exception a)
{
MessageBox.Show(a.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return -1;
}
return -1;
}