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

时间:2009-06-13 04:34:51

标签: c# xml gmail atom-feed

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

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

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

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

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

修改1:

我正在使用.Net 3.5。

6 个答案:

答案 0 :(得分:6)

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

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

如果您没有使用框架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);

答案 1 :(得分:6)

这是我在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("<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")

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

答案 2 :(得分:2)

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

请注意:

  1. 该Feed只允许您获取有关该帐户的简单信息(例如新邮件)。它不允许您发送消息。
  2. POP也不能用于发送消息。
  3. 通常使用SMTP,实际上并不那么难。
  4. 编辑:这是一个用于验证Atom提要并将其加载到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);
        }
    }
    

答案 3 :(得分:1)

为了它的价值,我从未通过以下方式进行身份验证:

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

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

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

HTH !!

答案 4 :(得分:1)

以下方法似乎可以检查未读邮件的数量。我根本不了解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;
    }

答案 5 :(得分:0)

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

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