2009-06-13 16 views
8

Mam projekt, który wyśle ​​e-mail z pewnymi danymi do konta Gmail. Myślę, że łatwiej będzie odczytać kanał Atom niż połączyć się z POP.Czytanie kanału Atom konta Gmail od C#

adres URL, który I powinny być using według Google jest:

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

pytanie/problem, brzmi: w jaki sposób mogę uwierzytelnić konto e-mail Chcę zobaczyć? Jeśli zrobię to w Firefoksie, używa plików cookie.

Nie jestem również pewien, jak dokładnie "pobrać" plik XML, który to żądanie powinno zwrócić (uważam, że właściwym terminem jest strumień).

Edit 1:

Używam .NET 3.5.

+0

Kod, który napisałem, musi działać idealnie, ale wydaje mi się, że istnieje pewien problem z metodą uwierzytelniania Google. Ten facet wydaje się mieć ten sam problem - http://objectmix.com/xml-soap/336644-problem-reading-gmail-atom-feed-net.html – Kirtan

Odpowiedz

6

To, co kiedyś w VB.NET:

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

objClient jest typu System.Net.WebClient.

Następnie można dostać e-maile z kanału za pomocą czegoś takiego:

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

To nie powinno być bardzo różne w języku C#.

+0

Dzięki temu spróbuję, gdy wrócę do domu. – Crash893

+0

Po uruchomieniu tego kodu pojawia się błąd "(407) Proxy Authentication", czy ktoś próbował? – ryanulit

+0

To dziwne. Używam tego kodu w aplikacji, z której korzystam codziennie w pracy. Jedyny sposób, by to osiągnąć, to gdyby Google zmienił coś na końcu, co mam wątpliwości (nie zmieniły niczego w roku, w którym korzystałem z mojej aplikacji). – alex

6

. Program .NET framework 3.5 udostępnia klasy macierzyste do odczytywania kanałów. This artykułów opisuje, jak to zrobić.

Nie używałem go Chciaż, ale musi być jakiś przepis do uwierzytelniania do adresu URL. Możesz to sprawdzić. Ja też to zrobię i opublikuję odpowiedź.

Jeśli nie korzystasz z frameworka 3.5, możesz wypróbować Atom.NET. Użyłem go raz, ale jest stary. Możesz spróbować, jeśli spełnia Twoje potrzeby.

EDIT: Jest to kod do przypisywania poświadczeń użytkownika:

XmlUrlResolver resolver = new XmlUrlResolver(); 
resolver.Credentials = new NetworkCredential("[email protected]", "password"); 

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.XmlResolver = resolver; 

XmlReader reader = XmlReader.Create("https://gmail.google.com/gmail/feed/atom", settings); 
+0

ten kod działa dobrze dzięki - jak stwierdził Matthew Flaschen, zwraca błąd 401, który, jak sądzę, musi następnie wysłać uwierzytelnianie. Czy ktoś ma jakieś pomysły na ten temat? – Crash893

2

użyć Podstawowe Auth. Zasadniczo, tworzysz wstępne żądanie, serwer odpowiada 401, a następnie odsyłasz hasło w base64 (w tym przypadku przez HTTPS).

Uwaga jednak, że:

  1. Pasza tylko pozwala uzyskać trywialne informacje o koncie (na przykład nowy mail). To nie pozwala na wysyłanie wiadomości.
  2. Nie można również wysyłać wiadomości POP za pomocą protokołu POP.
  3. Zwykle używa się SMTP i to naprawdę nie jest takie trudne.

EDYCJA: Oto przykład uwierzytelniania i ładowania kanału Atom do XmlDocument. Pamiętaj jednak, że zapewni to tylko dostęp do odczytu. Wyszukaj lub zadaj inne pytanie, aby uzyskać informacje o C# i SMTP. Śmieci ICertificatePolicy były dla mnie niezbędne, ponieważ Mono nie lubił certyfikatu Google. Jest to szybkie obejście, nieodpowiednie dla produkcji.

OK, ponieważ wyjaśniłeś, że faktycznie czytasz pocztę (i wysyła ją inny komponent), polecam korzystanie z 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); 
    } 
} 
+0

Czy mógłbyś podać przykład: Naprawdę nie rozumiem, jak to zrobić. – Crash893

+0

Konto będzie używane tylko jako system jednokierunkowy. w zasadzie sznury GPS są wysyłane w postaci poczty. to muszę je odebrać i przeczytać je. Dzięki za kod i spróbuję. – Crash893

+0

Ponownie otrzymuję ten sam błąd. Jestem zdezorientowany, że w yoru post wspomniałeś o wysłaniu hasła w base64, ale w kodzie nie widzę tego również w jaki sposób pytasz o stronę, a następnie odpowiadasz na stronę, aby podać hasło base64? – Crash893

1

Na co warto, nigdy nie był w stanie autheniticate poprzez:

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

Jednak zawsze mogę uwierzytelniać na:

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

HTH !!

0

Oto mój chude i myśli rozwiązanie:

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

Powoduje błąd 401 – Reynevan

1

Poniższa metoda wydaje się działać, aby sprawdzić ilość nieprzeczytanych wiadomości. Nie wiem zbyt wiele o xml, więc nie mogłem przeanalizować wyników innych niż odczytanie liczby nieprzeczytanych. (Zwraca -1 w przypadku błędu)

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; 
    } 
Powiązane problemy