从C#读取gmail帐户的Atom提要

我有一个项目会将包含某些数据的电子邮件发送到Gmail帐户。 我认为阅读Atom提要可能更容易,而不是通过POP连接。

根据Google,我应该使用的url是:

https://gmail.google.com/gmail/feed/atom 

问题/问题是:如何validation我想要查看的电子邮件帐户? 如果我在Firefox中使用它,它会使用cookie。

我也不确定如何“下载”此请求应该返回的XML文件(我相信正确的术语是流)。

编辑1:

我正在使用.Net 3.5。

这是我在Vb.net中使用的:

 objClient.Credentials = New System.Net.NetworkCredential(username, password) 

objClient的类型为System.Net.WebClient。

然后,您可以使用以下内容从Feed中获取电子邮件:

 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("", "") '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") 

这在C#中应该没有什么不同。

.NET framework 3.5提供了读取提要的本机类。 本文介绍了如何执行此操作。

我没有使用它,但必须有一些URL的身份validation。 你可以检查一下。 我也会这样做,并将答案发回。

如果您没有使用框架3.5,那么您可以尝试使用Atom.NET 。 我曾经使用过它,但它的旧版本。 如果满足您的需求,您可以尝试一下。

编辑:这是分配用户凭据的代码:

 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); 

您使用Basic Auth。 基本上,您发出初始请求,服务器回复401,然后您在base64中发回密码(在这种情况下通过HTTPS)。

请注意:

  1. Feed只允许您获取有关帐户的简单信息(例如新邮件)。 它不允许您发送消息。
  2. POP也不能用于发送消息。
  3. 通常使用SMTP,它确实不是那么难。

编辑:这是一个用于validationAtom提要并将其加载到XmlDocument中的示例。 请注意,这只会提供读取权限。 搜索或询问有关C#和SMTP信息的其他问题。 由于Mono不喜欢谷歌的证书,ICertificatePolicy垃圾对我来说是必要的。 这是一个快速的解决方法,不适合生产。

好的,既然你已经澄清了你实际上正在阅读邮件(而另一个组件正在发送邮件),我建议你使用POP。 :

 using System; using System.Net; using System.IO; using System.Security.Cryptography.X509Certificates; using System.Xml; public class GmailFeed { private class IgnoreBadCerts : ICertificatePolicy { public bool CheckValidationResult (ServicePoint sp, X509Certificate certificate, WebRequest request, int error) { return true; } } public static void Main(string[] argv) { if(argv.Length != 2) { Console.Error.WriteLine("Usage: GmailFeed username password"); Environment.ExitCode = 1; return; } ServicePointManager.CertificatePolicy = new IgnoreBadCerts(); NetworkCredential cred = new NetworkCredential(); cred.UserName = argv[0]; cred.Password = argv[1]; WebRequest req = WebRequest.Create("https://gmail.google.com/gmail/feed/atom"); req.Credentials = cred; Stream resp = req.GetResponse().GetResponseStream(); XmlReader reader = XmlReader.Create(resp); XmlDocument doc = new XmlDocument(); doc.Load(reader); } } 

为了它的价值,我从来没有能够通过以下方式进行身份validation:

 https://gmail.google.com/gmail/feed/atom 

但是我可以随时进行身份validation:

 https://mail.google.com/mail/feed/atom 

HTH!

以下方法似乎可以检查未读邮件的数量。 我根本不太了解xml所以我无法解析结果而不是检索未读数。 (出错时返回-1)

 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; } 

这是我的精益和平均解决方案:

  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 ... }