[C#] MailKitライブラリを利用したメール送信方法まとめ


はじめに

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