メールクライアントライブラリ(MailKit&MimeKit)について説明していきます。
アグリモ製品では、ひかり電話CTI、ひかりFAX電話CTIの着信通知メール機能その他で使用しています。スレッドセーフなライブラリということで信頼して使っています。また、マイクロソフトもこのライブラリの使用を推奨しています。
1.新規にソリューションを作成します。
2.パッケージマネージャーコンソールで、「Install-Package MimeKit」と入力してEnterキーを押下します。
3.続いて、パッケージマネージャーコンソールで、「Install-Package MailKit」と入力してEnterキーを押下します。
4.プロジェクトの参照に以下の3つが追加されます。
サンプル1 (SSL/TLS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
//メール保存(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処理から抜ける } } } } |