8

特定のデータを含むメールをGmailアカウントに送信するプロジェクトがあります。POP経由で接続するよりもAtomフィードを読む方がおそらく簡単だと思います。

Googleによると私が使用すべきURLは次のとおりです。

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

質問/問題は次のとおりです。表示したい電子メールアカウントを認証するにはどうすればよいですか?Firefoxで行うと、Cookieが使用されます。

また、このリクエストが返すXMLファイルを正確に「ダウンロード」する方法もわかりません(適切な用語はストリームだと思います)。

編集1:

.Net3.5を使用しています。

4

6 に答える 6

6

.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);
于 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に関する情報については、検索するか、別の質問をしてください。MonoはGoogleの証明書が気に入らなかったので、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);
    }
}
于 2009-06-13T04:44:47.233 に答える
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 に答える
1

その価値のために、私は次の方法で認証することができませんでした:

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

ただし、私はいつでも認証できます:

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

HTH!!

于 2009-06-16T01:23:05.603 に答える
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 に答える