はじめに
C#でのメール送信では今まで、System.Net.MailのSmtpClientクラスを利用していました。
このSystem.Net.MailのSmtpClientは.NET Framework 4.5から、利用において非推奨となり、MailKitを使うことが推奨されることになりました。
本項では、Mailkitの利用準備からMailKitでのメール送信方法をまとめておきたいと思います。
MailKitで利用できるAPI
MailKitでは、「SMTPクライアント」「POP3クライアント」「IMAP4クライアント」のAPIを提供しており、メール送信だけでなくメール受信やIMAPサーバ上のメール管理まで行えるようです。
利用プラットフォームとしては
- .NET Framework 4.5以降
- .NET Standard 1.3以降
となります。
ライセンスはMITライセンスです。
MailKitの利用準備
まずはNugetパッケージにてMailKitをインストールします。
1) まずはNuget パッケージ マネージャを開きMailKitを検索します。
2) 次にMailKitをインストールします。今回は安定板の3.1.1をインストールします。
3) インストールが完了です。
利用方法
では MailKitを利用していきたいと思います。
下記は基本的なメール送信のサンプルとなります。
public static async void SendMailAsync()
{
var msg = new MimeMessage();
// 送信者を用意する
var from = new MailboxAddress("FromName", "FromNameAddress");
// 送信者の情報を設定(追加)する
msg.From.Add(from);
// 宛先を用意する
var to = new MailboxAddress("ToName", "ToNameAddress");
// 宛先の情報を設定(追加)する
msg.To.Add(to);
// Ccを用意する
var cc = new MailboxAddress("CcName", "CcNameAddress");
// Ccの情報を設定(追加)する
msg.Cc.Add(cc);
// 件名を設定する
msg.Subject = "テストメール";
// 本文を設定する
// 本文のテキストのフォーマットを設定します。
var textPart = new TextPart(MimeKit.Text.TextFormat.Plain);
textPart.Text = "テスト本文";
var multipart = new Multipart("mixed");
multipart.Add(textPart);
msg.Body = multipart;
// メールの送信
using (var sc = new MailKit.Net.Smtp.SmtpClient())
{
try
{
// SMTPサーバに接続する
await sc.ConnectAsync("smtp.xxx.xxx.com", 587);
// SMTP認証
await sc.AuthenticateAsync("username", "password");
// メールを送信する
await sc.SendAsync(msg);
// SMTPサーバを切断する
await sc.DisconnectAsync(true);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
}
添付ファイル
添付ファイルを一緒に送信する方法は下記の通りです。
private void AttachmentSetting(string attachmentFilePath, string mimetype, ref Multipart mp)
{
var mimeType = MimeTypes.GetMimeType(attachmentFilePath);
var attachment = new MimePart(mimeType);
using (var file = File.OpenRead(attachmentFilePath))
{
attachment.Content = new MimeContent(file);
attachment.ContentDisposition = new ContentDisposition();
attachment.ContentTransferEncoding = ContentEncoding.Base64;
attachment.FileName = Path.GetFileName(attachmentFilePath);
mp.Add(attachment);
}
}
public static async void SendMailAsync()
{
// 〜省略〜
var multipart = new Multipart("mixed");
multipart.Add(textPart);
// 追加 (添付ファイルを作成)
AttachmentSetting("C:¥work¥test.jpg", ref multipart)
msg.Body = multipart;
// 〜省略〜
}
ここでは 「AttachmentSetting」メソッドを用意して、multipartにAddしたものをそのままBodyにて利用しています。
送信するファイルにはMimeTypeを設定します。
POP3によるメール受信と転送方法
MailKitではPOP3クライアントAPIを利用することができます。
下記では、POP3でメール受信をし、その受信したメールを転送方法について記載しています。
private static async void POP3Transration()
{
using (var pop3 = new Pop3Client(new MailKit.ProtocolLogger("pop3.log")))
{
pop3.Connect("pop3.xxxxx.com", 110, false);
pop3.Authenticate("account", "password");
for (int i = 0; i < pop3.Count; i++)
{
MimeMessage msg = pop3.GetMessage(i);
var fwMsg = new MimeMessage();
var from = new MailboxAddress("FromName", "FromNameAddress");
var to = new MailboxAddress("ToName", "ToNameAddress");
fwMsg.From.Add(from);
fwMsg.To.Add(to);
// 件名を設定する
msg.Subject = "Fw: テスト件名";
// 転送用のメッセージを設定する
var textPart = new TextPart(MimeKit.Text.TextFormat.Plain);
textPart.Text = $"Fw: テスト本文";
// オリジナルのメッセージを設定
var messagePart = new MessagePart{Message = msg};
var multipart = new Multipart("mixed");
multipart.Add(textPart);
multipart.Add(messagePart);
fwMsg.Body = multipart;
// メールの送信
using (var sc = new MailKit.Net.Smtp.SmtpClient())
{
try
{
// SMTPサーバに接続する
await sc.ConnectAsync("smtp.xxx.xxx.com", 587);
// SMTP認証
await sc.AuthenticateAsync("username", "password");
// メールを送信する
await sc.SendAsync(msg);
// SMTPサーバを切断する
await sc.DisconnectAsync(true);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
}
まずはpop3サーバに接続し認証します。
メッセージを全て転送しています。
もし、特定のメールのみ転送したい場合は、for内で条件を設定してください。
IMAP4によるメール受信
IMAP4によるメール受信方法については下記の通りです。
private static async void GetIMAPMessageAsync()
{
using (var client = new MailKit.Net.Imap.ImapClient(new MailKit.ProtocolLogger("imap.log")))
{
// 接続(gmail は SSL を使用)
await client.ConnectAsync("imap.gmail.com", 993, MailKit.Security.SecureSocketOptions.SslOnConnect);
// 認証
await client.AuthenticateAsync("account", "password");
// ReadOnly で Inbox を開きます
await client.Inbox.OpenAsync(FolderAccess.ReadOnly);
// すべてのメールを取得する
var query = MailKit.Search.SearchQuery.All;
// 件名に~が含まれるメッセージを検索して取得する場合は
// var query = MailKit.Search.SearchQuery.SubjectContaints("~~~");
// のように条件を指定することも可能。
var searchOptions = SearchOptions.All | SearchOptions.Count | SearchOptions.Min | SearchOptions.Max;
var results = await client.Inbox.SearchAsync(searchOptions, query);
var count = results.Count;
foreach(var uid in results.UniqueIds)
{
var message = await client.Inbox.GetMessageAsync(uid);
message.WriteTo($"{uid}.eml");
}
await client.DisconnectAsync(false);
}
}
最後に
SmtpやPOP3、IMAPなどの基本的な利用方法についてまとめてみました。
メールの削除などについては、機会があれば詳しく乗せていきたいと思っています。
是非参考までに。
reference:
jstedfast/MimeKit