2.MailKit&MimeKit (メールクライアントライブラリ)

メールクライアントライブラリ(MailKit&MimeKit)について説明していきます。

アグリモ製品では、ひかり電話CTI、ひかりFAX電話CTIの着信通知メール機能その他で使用しています。スレッドセーフなライブラリということで信頼して使っています。また、マイクロソフトもこのライブラリの使用を推奨しています。

 

1.新規にソリューションを作成します。

2.パッケージマネージャーコンソールで、「Install-Package MimeKit」と入力してEnterキーを押下します。

3.続いて、パッケージマネージャーコンソールで、「Install-Package MailKit」と入力してEnterキーを押下します。

4.プロジェクトの参照に以下の3つが追加されます。

 

サンプル1 (SSL/TLS)

using MailKit;
using MailKit.Net.Imap;
using MailKit.Net.Pop3;
using MailKit.Search;
using MailKit.Security;


//SSL
SecureSocketOptions ssl = SecureSocketOptions.None;

ssl = SecureSocketOptions.Auto;                     // 自動判別で接続する
ssl = SecureSocketOptions.SslOnConnect;             // SSLで接続する
ssl = SecureSocketOptions.StartTls;                 // StartTLSで接続する
ssl = SecureSocketOptions.StartTlsWhenAvailable;    // 可能ならStartTLSで接続する

 

サンプル2 (POP3)

using (var client = new Pop3Client())
{
    lock (client.SyncRoot)  //スレッド処理のためロックする
    {
        client.Connect(RecvSvr_Addr, int.Parse(RecvSvr_Port), ssl);

        // disable OAuth2 authentication unless you are actually using an access_token
        client.AuthenticationMechanisms.Remove("XOAUTH2");

        client.Authenticate(AccountNM, MPasswd);

        string mydocument = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        string save_path = mydocument + "\\mail\\INBOX\\";

        for (int i = 0; i < client.Count; i++)
        {
            var m = client.GetMessage(i);

            string _from = "";
            if (m.From.Count > 0)
            {
                _from = ((MimeKit.MailboxAddress)m.From[0]).Address;
            }
            string _to = "";
            if (m.To.Count > 0)
            {
                _to = ((MimeKit.MailboxAddress)m.To[0]).Address;
            }

            //メール履歴をDBに保存する
            int ret = Hozon_to_DB_mail_rireki(_from, _to, m.MessageId, m.Date.LocalDateTime, "1", m.Subject, "INBOX");
            //エラー時
            if (ret == -1)
            {
                throw new MyExitException();    //MyClock処理から抜ける
            }
            //顧客情報に見つかった時
            else if (ret == 1)
            {
                // メッセージ本文をダウンロードしてファイルに保存する
                m.WriteTo(save_path + m.MessageId + ".eml");
            }
        }

        client.Disconnect(true);
    }
}

 

サンプル3 (IMAP)

using (var client = new ImapClient())
{
    lock (client.SyncRoot)  //スレッド処理のためロックする
    {
        client.Connect(RecvSvr_Addr, int.Parse(RecvSvr_Port), ssl);

        // disable OAuth2 authentication unless you are actually using an access_token
        client.AuthenticationMechanisms.Remove("XOAUTH2");

        client.Authenticate(IMAP4_AccountNM, MPasswd);


        //IMAP INBOXフォルダの受信と保存
        save_mail_imap(client.Inbox, "1");

        //IMAP その他フォルダの受信と保存
        var personal = client.GetFolder(client.PersonalNamespaces[0]);
        foreach (var folder in personal.GetSubfolders(false))
        {
            switch (folder.Name)
            {
                case "INBOX.Sent":
                case "INBOX.Sent Items":
                case "INBOX/Sent":
                case "INBOX/Sent Items":
                case "Sent":
                case "Sent Items":
                    save_mail_imap(folder, "2");
                    break;
            }
        }

        client.Disconnect(true);
    }
}

 

サンプル4 (メール保存 IMAP)

        //メール保存(IMAP用)
        private void save_mail_imap(IMailFolder folder, string mtype)
        {
            string mydocument = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            string save_path = mydocument + "\\mail\\";

            //IMAPフォルダを開く
            folder.Open(FolderAccess.ReadOnly);

            var uids = folder.Search(SearchQuery.All);
            foreach (var uid in uids)
            {
                var m = folder.GetMessage(uid);
                if (m.Date != null)
                {
                    //例外エラーの発生を防ぐ処理
                    if (m.To.Count < 1)
                    {
                        continue;
                    }

                    //メール履歴をDBに保存する
                    string _from = "";
                    if (m.From.Count > 0)
                    {
                        _from = ((MimeKit.MailboxAddress)m.From[0]).Address;
                    }
                    string _to = "";
                    if (m.To.Count > 0)
                    {
                        _to = ((MimeKit.MailboxAddress)m.To[0]).Address;
                    }

                    int ret = Hozon_to_DB_mail_rireki(_from, _to, uid.ToString(), m.Date.LocalDateTime, mtype, m.Subject, folder.Name);
                    //エラー時
                    if (ret == -1)
                    {
                        return;
                    }
                    //顧客情報に見つかった時
                    else if (ret == 1)
                    {
                        // メッセージ本文をダウンロードしてファイルに保存する
                        if (File.Exists(save_path + folder.Name + "\\" + uid.ToString() + ".eml") == false)
                        {
                            //ファイルへ書き出し
                            m.WriteTo(save_path + folder.Name + "\\" + uid.ToString() + ".eml");
                        }
                    }

                    if (thread_mail_abort == true)
                    {
                        throw new MyExitException();    //MyClock処理から抜ける
                    }
                }
            }
        }