【问题标题】:Reading Atom feed of gmail account from C#从 C# 读取 gmail 帐户的 Atom 提要
【发布时间】:2009-06-13 04:34:50
【问题描述】:

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

根据谷歌我应该使用的网址是:

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

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

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

编辑 1:

我正在使用 .Net 3.5。

【问题讨论】:

  • 我写的代码一定能正常运行,但我猜Google的身份验证方法似乎有些问题。这家伙似乎有同样的问题 - objectmix.com/xml-soap/…

标签: c# xml gmail atom-feed


【解决方案1】:

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

这在 C# 中应该没有太大的不同。

【讨论】:

  • 谢谢,我回家试试看
  • 我在运行此代码时收到“(407) 需要代理身份验证”错误,有其他人尝试过吗?
  • 这很奇怪。我在日常工作中使用的应用程序中使用该代码。你可能会得到的唯一方法是如果谷歌最终改变了一些东西,我有点怀疑(他们在我使用我的应用的那一年没有改变任何东西)。
【解决方案2】:

.NET 框架 3.5 提供本机类来读取提要。 This文章描述了如何做到这一点。

我还没有使用它,但是必须有一些对 URL 进行身份验证的规定。你可以检查一下。我也会这样做,然后将答案发布回来。

如果你没有使用 framework 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);

【讨论】:

  • 此代码运行良好,谢谢 - 正如 Matthew Flaschen 所述,它返回一个 401 错误,我想我需要以某种方式发送身份验证。有人对此有任何想法吗?
【解决方案3】:

您使用基本身份验证。基本上,您发出一个初始请求,服务器回复 401,然后您以 base64 格式发回密码(在本例中是通过 HTTPS)。

请注意:

  1. Feed 仅允许您获取有关帐户的琐碎信息(例如新邮件)。它不允许您发送消息。
  2. POP 也不能用于发送消息。
  3. 一般都是用 SMTP,确实没那么难。

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

好的,既然您已经澄清您实际上是在阅读邮件(并且发送邮件的组件不同),我建议您使用 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);
    }
}

【讨论】:

  • 你能发一个例子吗?我真的不知道怎么做
  • 该帐户将仅用作单向系统。基本上gps线是以邮件的形式发送的。然后我需要拿起它们并阅读它们感谢您提供的代码,我会试一试
  • 我再次遇到同样的错误。我很困惑,在你的帖子中你提到在 base64 中发送密码,但在代码中我也没有看到这一点,你如何要求页面然后响应页面以提供 base64 密码?
  • 您是否使用了完整的代码(包括“ServicePointManager.CertificatePolicy = new IgnoreBadCerts();”)?使用 Base64,但在内部,因此您不必担心。
【解决方案4】:

对于它的价值,我从未能够通过以下方式进行身份验证:

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

但是我总是可以通过以下方式进行身份验证:

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

HTH!!

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      这是我精益求精的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 2011-02-12
        • 1970-01-01
        • 2011-04-09
        • 2011-03-11
        相关资源
        最近更新 更多