Чтение Atom-канала учетной записи Gmail из C # - PullRequest
8 голосов
/ 13 июня 2009

У меня есть проект, который отправит письмо с определенными данными на учетную запись Gmail. Я думаю, что, вероятно, будет проще читать канал Atom, чем подключаться через POP.

URL, который я должен использовать в соответствии с Google:

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

Вопрос / проблема в следующем: как аутентифицировать учетную запись электронной почты, которую я хочу видеть? Если я делаю это в Firefox, он использует куки.

Я также не уверен, как именно «загрузить» XML-файл, который должен возвращать этот запрос (я считаю, что правильным термином является поток).

Редактировать 1:

Я использую .Net 3.5.

Ответы [ 6 ]

6 голосов
/ 14 июня 2009

Это то, что я использовал в 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 #.

6 голосов
/ 13 июня 2009

.NET Framework 3.5 предоставляет собственные классы для чтения каналов. Эта статья описывает, как это сделать.

Я не использовал это, хотя, но должно быть некоторое условие для аутентификации к 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);
2 голосов
/ 13 июня 2009

Вы используете Basic Auth. По сути, вы делаете первоначальный запрос, сервер отвечает 401, а затем отправляете пароль обратно в base64 (в данном случае через HTTPS).

Обратите внимание, что:

  1. Фид позволяет только получать тривиальную информацию об учетной записи (например, новую почту). Он не позволяет отправлять сообщения.
  2. POP также не может использоваться для отправки сообщений.
  3. Обычно используется SMTP, и это действительно не так сложно.

РЕДАКТИРОВАТЬ: Вот пример для проверки подлинности и загрузки канала Atom в XmlDocument. Обратите внимание, что это только предоставит доступ для чтения. Поиск или задать другой вопрос для получения информации о C # и SMTP. Хлам ICertificatePolicy был необходим мне, поскольку Моно не нравился сертификат 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);
    }
}
1 голос
/ 15 января 2012

Следующий метод работает для проверки количества непрочитанных сообщений. Я совсем не очень разбираюсь в 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;
    }
1 голос
/ 16 июня 2009

Для чего бы это ни стоило, мне никогда не удавалось аутентифицировать с помощью:

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

Однако я всегда могу пройти проверку подлинности:

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

НТН !!

0 голосов
/ 07 апреля 2010

Вот мое скудное и подлое решение:

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