8

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

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

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

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

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

编辑1:

我正在使用.Net 3.5。

4

6 回答 6

6

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

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

如果您不使用框架 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);
于 2009-06-13T04:44:25.347 回答
6

这是我在 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# 中应该没有太大的不同。

于 2009-06-13T22:09:26.350 回答
2

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

请注意:

  1. 提要仅允许您获取有关帐户的琐碎信息(例如新邮件)。它不允许您发送消息。
  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);
    }
}
于 2009-06-13T04:44:47.233 回答
1

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

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

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

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

嗯!!

于 2009-06-16T01:23:05.603 回答
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;
    }
于 2012-01-15T16:31:54.887 回答
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 ... 
    }
于 2010-04-07T11:56:04.090 回答