web-dev-qa-db-ja.com

C#.netライブラリを使用してGmailサーバーからのIMAPメッセージを確認する

IMAP SSL経由でgooglemailサーバーに接続して新しいメールをチェックする.Netフレームワークを利用するサンプルコードはありますか?

30
Belliez
20
lakshmanaraj

上記のプロジェクトの作成者として、はい、SSLをサポートしています。

私は現在、ライブラリの新しいバージョンに取り組んでいます。これは完全に非同期で、IMAPサーバーとやり取りできる速度を向上させます。

このコードは、完全ではありませんが、上記のリンクされたコードプレックスサイトから元の同期ライブラリ(SSLもサポートします)とともにダウンロードできます。

17

MailKit を参照することをお勧めします。これはおそらく最も堅牢なメールライブラリであり、オープンソース(MIT)であるためです。

MailKitの素晴らしい点の1つは、すべてのネットワークAPIがキャンセル可能であることです(他のIMAPライブラリで利用可能なものを見ていません)。

また、メッセージのスレッド化をサポートする唯一のライブラリでもあります。

using System;
using System.Net;
using System.Threading;

using MailKit.Net.Imap;
using MailKit.Search;
using MailKit;
using MimeKit;

namespace TestClient {
    class Program
    {
        public static void Main (string[] args)
        {
            using (var client = new ImapClient ()) {
                using (var cancel = new CancellationTokenSource ()) {
                    client.Connect ("imap.gmail.com", 993, true, cancel.Token);

                    // If you want to disable an authentication mechanism,
                    // you can do so by removing the mechanism like this:
                    client.AuthenticationMechanisms.Remove ("XOAUTH");

                    client.Authenticate ("joey", "password", cancel.Token);

                    // The Inbox folder is always available...
                    var inbox = client.Inbox;
                    inbox.Open (FolderAccess.ReadOnly, cancel.Token);

                    Console.WriteLine ("Total messages: {0}", inbox.Count);
                    Console.WriteLine ("Recent messages: {0}", inbox.Recent);

                    // download each message based on the message index
                    for (int i = 0; i < inbox.Count; i++) {
                        var message = inbox.GetMessage (i, cancel.Token);
                        Console.WriteLine ("Subject: {0}", message.Subject);
                    }

                    // let's try searching for some messages...
                    var query = SearchQuery.DeliveredAfter (DateTime.Parse ("2013-01-12"))
                        .And (SearchQuery.SubjectContains ("MailKit"))
                        .And (SearchQuery.Seen);

                    foreach (var uid in inbox.Search (query, cancel.Token)) {
                        var message = inbox.GetMessage (uid, cancel.Token);
                        Console.WriteLine ("[match] {0}: {1}", uid, message.Subject);
                    }

                    client.Disconnect (true, cancel.Token);
                }
            }
        }
    }
}
15
jstedfast

他の同様の質問から投稿されたクロス。似たようなものになったらどうなるか見てみましょうか?

しばらくの間IMAPソリューションを探していましたが、かなりの数を試した後、 AE.Net.Mail を使用します。

マイナス面と考えられるドキュメントはありませんが、ソースコード(オープンソースに賛成です!)を調べてIntellisenseを使用することで、これを改善できました。以下のコードは、特にGmailのIMAPサーバーに接続します。

// Connect to the IMAP server. The 'true' parameter specifies to use SSL
// which is important (for Gmail at least)
ImapClient ic = new ImapClient("imap.gmail.com", "[email protected]", "pass",
                ImapClient.AuthMethods.Login, 993, true);
// Select a mailbox. Case-insensitive
ic.SelectMailbox("INBOX");
Console.WriteLine(ic.GetMessageCount());
// Get the first *11* messages. 0 is the first message;
// and it also includes the 10th message, which is really the eleventh ;)
// MailMessage represents, well, a message in your mailbox
MailMessage[] mm = ic.GetMessages(0, 10);
foreach (MailMessage m in mm)
{
    Console.WriteLine(m.Subject);
}
// Probably wiser to use a using statement
ic.Dispose();

私はこのライブラリなどとは関係ありませんが、非常に高速で安定していることがわかりました。

13
Dominic K

Lumisoft.net には、使用できるIMAPクライアントとサーバーの両方のコードがあります。

Gmailからメールをダウンロードするために使用しました。オブジェクトモデルは最適ではありませんが、実行可能であり、かなり柔軟で安定しているようです。

これは、使用するスパイクの部分的な結果です。エンベロープ付きの最初の10個のヘッダーを取得してから、メッセージ全体を取得します。

using (var client = new IMAP_Client())
{
    client.Connect(_hostname, _port, _useSsl);
    client.Authenticate(_username, _password);
    client.SelectFolder("INBOX");
     var sequence = new IMAP_SequenceSet();
    sequence.Parse("0:10");
    var fetchItems = client.FetchMessages(sequence, IMAP_FetchItem_Flags.Envelope | IMAP_FetchItlags.UID,
                                        false, true);
    foreach (var fetchItem in fetchItems)
    {
        Console.Out.WriteLine("message.UID = {0}", fetchItem.UID);
        Console.Out.WriteLine("message.Envelope.From = {0}", fetchItem.Envelope.From);
        Console.Out.WriteLine("message.Envelope.To = {0}", fetchItem.Envelope.To);
        Console.Out.WriteLine("message.Envelope.Subject = {0}", fetchItem.Envelope.Subject);
        Console.Out.WriteLine("message.Envelope.MessageID = {0}", fetchItem.Envelope.MessageID);
    }
    Console.Out.WriteLine("Fetching bodies");
    foreach (var fetchItem in client.FetchMessages(sequence, IMAP_FetchItem_Flags.All, false, true)
    {             
        var email = LumiSoft.Net.Mail.Mail_Message.ParseFromByte(fetchItem.MessageData);             
        Console.Out.WriteLine("email.BodyText = {0}", email.BodyText);

    }
}
12
Bruno Lopes

IMAPに対する.NETフレームワークのサポートはありません。サードパーティのコンポーネントを使用する必要があります。

Mail.dll電子メールコンポーネント を試してください。非常に手頃な価格で使いやすく、[〜#〜] ssl [〜#〜]

using(Imap imap = new Imap())
{
    imap.ConnectSSL("imap.company.com");
    imap.Login("user", "password");

    imap.SelectInbox();
    List<long> uids = imap.Search(Flag.Unseen);
    foreach (long uid in uids)
    {
        string eml = imap.GetMessageByUID(uid);
        IMail message = new MailBuilder()
            .CreateFromEml(eml);

        Console.WriteLine(message.Subject);
        Console.WriteLine(message.Text);
    }
    imap.Close(true);
}

これは私が作成した商用製品であることに注意してください。

こちらからダウンロードできます: https://www.limilabs.com/mail

7

MailSystem.NET には、IMAP4のすべてのニーズが含まれています。無料でオープンソースです。

(私はプロジェクトに関与しています)

5
user333306

このsslバージョンのソースは次のとおりです。 http://atmospherian.wordpress.com/downloads/

1
Belliez

LumiSoft.ee-素晴らしく、かなり簡単に動作します。 .NET 4.0でコンパイルします。

以下は、それらのライブラリとサンプルへの必須リンクです。メインのダウンロード:

http://www.lumisoft.ee/lsWWW/Download/Downloads/

コード例:

ここにあります:... lsWWW/Download/Downloads/Examples /

。ネット:

ここにあります:... lsWWW/Download/Downloads/Net /

Codeplex(IMAPClientLumiSoft.codeplex.com)のライブラリを使用して、シンプルなサンプルを作成しています。ライブラリをサイトから直接取得する必要があります。私は彼らのコードを維持しておらず、コードに対するいかなる権利も持っていないので、彼らを含めません。上記のリンクに移動して、直接ダウンロードしてください。 VS2010でLumiSoftプロジェクトプロパティを設定し、エラーなしですべてを.NET 4.0でビルドしました。サンプルはかなり複雑で、ほんの一例ではコーディングが非常にきついかもしれません。これらは一般的に上級レベルの開発者を対象としていると思いますが。

彼らのプロジェクトはわずかな調整で機能しました。微調整:IMAPクライアントWinformの例は、プロジェクトプロパティで「リリース」として設定され、VSがデバッグポイントで破損するのを防ぎます。ソリューション「Configuration Manager」を使用して、ブレークポイントが機能するようにプロジェクトを「Active(Debug)」に設定する必要があります。彼らの例では、イベントハンドラーに匿名メソッドを使用していますが、これは非常にタイトなコーディングです。教育ツールとしてはあまり良くありません。私のプロジェクトは「名前付き」イベントメソッドハンドラーを使用しているため、ハンドラー内にブレークポイントを設定できます。ただし、それらはインラインコードを処理する優れた方法です。 .NET 3.0以降で利用可能な新しいLambdaメソッドを使用した可能性がありますが、使用しなかったため、変換しようとしませんでした。

サンプルから、IMAPクライアントを最小限に簡素化しました。

0
wph101larrya

別の選択肢:HigLabo

https://higlabo.codeplex.com/documentation

良い議論: https://higlabo.codeplex.com/discussions/47925

//====Imap sample================================//
//You can set default value by Default property
ImapClient.Default.UserName = "your server name";
ImapClient cl = new ImapClient("your server name");
cl.UserName = "your name";
cl.Password = "pass";
cl.Ssl = false;
if (cl.Authenticate() == true)
{
    Int32 MailIndex = 1;
    //Get all folder
    List<ImapFolder> l = cl.GetAllFolders();
    ImapFolder rFolder = cl.SelectFolder("INBOX");
    MailMessage mg = cl.GetMessage(MailIndex);
}

//Delete selected mail from mailbox
ImapClient pop = new ImapClient("server name", 110, "user name", "pass");
pop.AuthenticateMode = Pop3AuthenticateMode.Pop;
Int64[] DeleteIndexList = new.....//It depend on your needs
cl.DeleteEMail(DeleteIndexList);

//Get unread message list from GMail
using (ImapClient cl = new ImapClient("imap.gmail.com")) 
{
    cl.Port = 993;
    cl.Ssl = true; 
    cl.UserName = "xxxxx";
    cl.Password = "yyyyy";
    var bl = cl.Authenticate();
    if (bl == true)
    {
        //Select folder
        ImapFolder folder = cl.SelectFolder("[Gmail]/All Mail");
        //Search Unread
        SearchResult list = cl.ExecuteSearch("UNSEEN UNDELETED");
        //Get all unread mail
        for (int i = 0; i < list.MailIndexList.Count; i++)
        {
            mg = cl.GetMessage(list.MailIndexList[i]);
        }
    }
    //Change mail read state as read
    cl.ExecuteStore(1, StoreItem.FlagsReplace, "UNSEEN")
}


//Create draft mail to mailbox
using (ImapClient cl = new ImapClient("imap.gmail.com")) 
{
    cl.Port = 993;
    cl.Ssl = true; 
    cl.UserName = "xxxxx";
    cl.Password = "yyyyy";
    var bl = cl.Authenticate();
    if (bl == true)
    {
        var smg = new SmtpMessage("from mail address", "to mail addres list"
            , "cc mail address list", "This is a test mail.", "Hi.It is my draft mail");
        cl.ExecuteAppend("GMail/Drafts", smg.GetDataText(), "\\Draft", DateTimeOffset.Now); 
    }
}

//Idle
using (var cl = new ImapClient("imap.gmail.com", 993, "user name", "pass"))
{
    cl.Ssl = true;
    cl.ReceiveTimeout = 10 * 60 * 1000;//10 minute
    if (cl.Authenticate() == true)
    {
        var l = cl.GetAllFolders();
        ImapFolder r = cl.SelectFolder("INBOX");
        //You must dispose ImapIdleCommand object
        using (var cm = cl.CreateImapIdleCommand()) Caution! Ensure dispose command object
        {
            //This handler is invoked when you receive a mesage from server
            cm.MessageReceived += (Object o, ImapIdleCommandMessageReceivedEventArgs e) =>
            {
                foreach (var mg in e.MessageList)
                {
                    String text = String.Format("Type is {0} Number is {1}", mg.MessageType, mg.Number);
                    Console.WriteLine(text);
                }
            };
            cl.ExecuteIdle(cm);
            while (true)
            {
                var line = Console.ReadLine();
                if (line == "done")
                {
                    cl.ExecuteDone(cm);
                    break;
                }
            }
        }
    }
}
0
Kiquenet