メールクライアントライブラリ(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処理から抜ける
}
}
}
}




