> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】メールを送信する方法を紹介(MailKit)

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

メールを送信するにはどうしたらいい!?

この記事では、C# でメールを送信する方法について紹介します。

Microsoft が推奨するサードパーティ製のオープンソースライブラリの「MailKit」を使ってメールを送信します。(標準の System.Net.Mail 名前空間の StmpClient クラスは現在、非推奨となっています。)

C# でメールを送信したいという方はぜひ参考にしてみてください。

オススメの参考書

C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。

C#でメールを送信するには?

C# でメールを送信する方法として、オープンソースライブラリの「MailKit」を利用する方法があります。

MailKitとは?

MailKit(メールキット)は、メールの送信や受信などメールに関する機能を提供する .NET 用のライブラリです。「SMTP クライアント」「POP3 クライアント」「IMAP4 クライアント」などのプロトコルをサポートしています。

標準ライブラリだったSystem.Net.Mail.StmpClientは廃止(非推奨)になっており、代わりに Microsoft の公式サイトでは MailKit を使うことを推奨しています。

2017年4月14日に Jonathan Allen 氏の記事に StmpClient から MailKit に置き換わった経緯などが記載されています。この記事やインターネットで調べた結果、StmpClient が非推奨の理由は以下の通りです。

  • StmpClient は接続ライフサイクルが分かりにくい設計になっていること
  • StmpClient はメールの送信に必要な機能が不足していること
  • StmpClient はメンテナンスがされていないこと

\ MailKit の Githubサイトへ /

.NETでメール操作できる便利なライブラリ!!

MailKit は MimeKit に依存しており、MimeKit のクラスを利用します。

MimeKit は MIME(Multipurpose Internet Mail Extension)という規格に準拠しており、多くのメール関連の操作をサポートしています。

MIME について

メールは元々テキストベースのシステムで英語(ASCII コード)の仕様が前提でした。そのため、ASCII コード以外のデータ(日本語などマルチバイト文字や画像、音声)は扱うことができないデメリットがありました。

そのデメリットを解決したのがMIME。テキスト以外も扱えるようにデータを ASCII コードに変換する仕組みであり、メールでデータのやり取りを行う上でも欠かすことのできない重要なプロトコルとなっています。

インストールするには?

MailKit は NuGet からインストールできます。

インストールしたいプロジェクトを Visual Studio で起動して、次の作業を行います。

STEP
NuGet パッケージマネージャー画面を開く

ソリューションエクスプローラーからプロジェクト名で右クリックして、[NuGet パッケージの管理]をクリックします。

STEP
MailKitを検索する

NuGet パッケージマネージャー画面が開くので、[参照]タブを選択して検索欄に「MailKit」と入力します。

STEP
インストールする

検索結果の一覧にある Jeffrey Stedfast 氏が提供する「MailKit」を選択して、[インストール]ボタンをクリックします。

インストールが正常に完了すると、下図のようにアイコンに が付きます。

メールを送信する

ここからは MailKit でメールを送信する方法を紹介します。紹介するサンプルコードは以下の環境で動作確認を行っています。

環境

  • 統合開発環境:Visual Studio 2022
  • フレームワーク:.NET 7.0
  • MailKit のバージョン:4.3.0(公開日 2023/11/12)

サンプルコード

以下のコードが MailKit でメールを送信するサンプルコードです。

public class MailService
{
    private readonly Mail _mail;

    public MailService(Mail mail)
    {
        _mail = mail;
    }

    public async Task SendMailAsync(string to, string from, string cc, string subject, string text)
    {
        // MimeMessageクラスのインスタンスを生成
        var message = new MimeKit.MimeMessage();

        // 送信元を追加  
        message.From.Add(new MimeKit.MailboxAddress("<送信元>", from));

        // 宛先を追加  
        message.To.Add(new MimeKit.MailboxAddress("<宛先>", to));

        // Ccを追加  
        message.Cc.Add(new MimeKit.MailboxAddress("<Cc>", cc));

        // 件名を設定
        message.Subject = subject;

        // 本文を設定 
        var textPart = new MimeKit.TextPart(MimeKit.Text.TextFormat.Plain);
        textPart.Text = text;
        message.Body = textPart;

        using (var client = new MailKit.Net.Smtp.SmtpClient())
        {
            try
            {
                // SMTPサーバに接続  
                await client.ConnectAsync(_mail.SmtpHost, _mail.SmtpPort);
                Debug.WriteLine("接続完了");

                // SMTPサーバ認証  
                await client.AuthenticateAsync(_mail.UserName, _mail.Password);

                // 送信  
                await client.SendAsync(message);
                Debug.WriteLine("送信完了");

                // 切断  
                await client.DisconnectAsync(true);

            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Failed send:{ex}");
            }
        }
    }
}

public class Mail
{
    public string SmtpHost { get; set; }

    public int SmtpPort { get; set; }

    public string UserName { get; set; }

    public string Password { get; set; }
}

MimeMessageクラスのオブジェクトを作成する

var message = new MimeKit.MimeMessage();

MimeMessageクラスのインスタンスを生成します。

このオブジェクトに、送信者(Fromプロパティ)、宛先(Toプロパティ、Ccプロパティ、Bccプロパティ)、件名(Subjectプロパティ)、本文(Bodyプロパティ)などのメールに関する情報を設定します。

StmpClientクラスでメールを送信する

MailKit のStmpClientクラスのインスタンスを生成します。

var client = new MailKit.Net.Smtp.SmtpClient()

このオブジェクトに、SMTP サーバの URL、ポート番号、使用するアカウント名、パスワードなど必要な情報を設定して、SMTP サーバと通信を行います。

SMTP サーバーて何ですか?

SMTP(Simple Mail Transfer Protocol)は、メールを送信するためのプロトコルです。

SMTP サーバーは SMTP を使って、送信元から送信先へメールを届ける役割を担っている重要なサーバーで、メールアドレスの「@」以降の部分であるドメイン名毎に存在します。代表的な SMTP サーバーを以下に記述しています。

SMTPプロバイダSMTPサーバーポートURL
Gmail smtp.gmail.com587gmail.com
Yahoo!JAPANsmtp.mail.yahoo.co.jp465yahoo.co.jp
iCloudsmtp.mail.me.com465icloud.com
Outlooksmtp-mail.outlook.com587outlook.com

サンプルコード(添付ファイルがある場合)

以下のコードが MailKit で添付ファイル付きのメールを送信するサンプルコードです。

public class MailService
{
    private readonly Mail _mail;

    public MailService(Mail mail)
    {
        _mail = mail;
    }

    public async Task SendMailAsync(string to, string from, string subject, string text, string filePath)
    {
        // MimeMessageクラスのインスタンスを生成
        var message = new MimeKit.MimeMessage();

        // 宛先を追加  
        message.From.Add(new MimeKit.MailboxAddress("<宛先>", from));

        // 送信元を追加  
        message.To.Add(new MimeKit.MailboxAddress("<送信元>", to));

        // 件名を設定
        message.Subject = subject;

        // Multipartクラスのインスタンスを生成
        var multipart = new MimeKit.Multipart("mixed")
            {
                // 本文を設定 
                new MimeKit.TextPart(MimeKit.Text.TextFormat.Plain)
                {
                    Text = text,
                },
                // 添付ファイルを設定
                new MimePart(MimeTypes.GetMimeType(filePath))
                {
                    Content = new MimeContent(File.OpenRead(filePath)),
                    ContentDisposition = new ContentDisposition(),
                    ContentTransferEncoding = ContentEncoding.Base64,
                    FileName = Path.GetFileName(filePath)
                }
            };

        message.Body = multipart;

        using (var client = new MailKit.Net.Smtp.SmtpClient())
        {
            try
            {
                // SMTPサーバに接続  
                await client.ConnectAsync(_mail.SmtpHost, _mail.SmtpPort);
                Debug.WriteLine("接続完了");

                // SMTPサーバ認証  
                await client.AuthenticateAsync(_mail.UserName, _mail.Password);

                // 送信  
                await client.SendAsync(message);
                Debug.WriteLine("送信完了");

                // 切断  
                await client.DisconnectAsync(true);

            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Failed send:{ex}");
            }
        }
    }
}

public class Mail
{
    public string SmtpHost { get; set; }

    public int SmtpPort { get; set; }

    public string UserName { get; set; }

    public string Password { get; set; }
}

Multipartクラスのオブジェクトを作成する

var multipart = new MimeKit.Multipart("mixed");

MimeMessageクラスのインスタンスを生成します。

このオブジェクトはメールの本文と添付ファイルを合わせて送信するために使われます。

MimePartクラスのオブジェクトを作成する

MimeKit のMimePartクラスのインスタンスを生成します。その際、MimeTypeを指定します。

multipart.Add(new MimePart(MimeTypes.GetMimeType(filePath))
{
    Content = new MimeContent(file),
    ContentDisposition = new ContentDisposition(),
    ContentTransferEncoding = ContentEncoding.Base64,
    FileName = Path.GetFileName(filePath)
});

Contentプロパティ、ContentDispositionプロパティ、ContentTransferEncodingプロパティ、FileNameプロパティに添付するファイルの情報を設定します。

ContentDispositionプロパティで指定しているContentEncoding.Base64は、「データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことのできない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式」であり、メールで添付ファイルを送信する際によく利用されています。

GmailのSMTPサーバーを利用して送信する

メールを送信するには、上記のSendMailAsyncメソッドに SMTP サーバーの情報を設定する必要があります。

Gmail の SMTP サーバーを使ってメールを送信するために、Mialクラスに定義されている4つのプロパティ(SmtpHostSmtpPortUserNamePassword)を設定します。

  • SmtpHost:smtp.gmail.com
  • SmtpPort:587
  • UserName:Googleアカウントのメールアドレス(”@gmail.com”は除く)
  • Password:アプリ パスワード

SMTP サーバーで利用するPasswordは、Google アカウントのセキュリティ設定から2段階認証のアプリパスワードを設定する必要があります。※Password は Google アカウントのパスワードではありません。

アプリ パスワードを作成するとセキュリティが低くなるので、自己責任でお願いします。

STEP
Googleアカウントを開き、[セキュリティ]を選択する

Googleアカウントに移動して、左側にあるサイドメニューから[セキュリティ]を選択します。

STEP
[2段階認証プロセス]を選択する

[Googleへのログイン]で[2段階認証プロセス]を選択します。

STEP
[アプリ パスワード]を選択する

ページの下部までスクロールし、[アプリ パスワード]を選択します。

STEP
パスワードを生成する

アプリパスワードが分かる名前を入力して[作成]ボタンをクリックします。

画面上に16桁のアプリ パスワードが表示されます。

Gmail の SMTP サーバーを使うようにしたサンプルコードが以下になります。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {

        var mail = new Mail()
        {
            SmtpHost = "smtp.gmail.com",
            SmtpPort = 587,
            UserName = "xxxxxxx",
            Password = "1234567890123456",
        };

        // 添付なしでメールを送信する場合
        var service = new MailService(mail);
        await service.SendMailAsync(
            "sample@gmail.com",
            "xxxxxxx@gmail.com",
            "ooooooo@gmail.com",
            "件名",
            "これはテストです。");

        // 添付ありでメールを送信する場合
        var service = new MailService(mail);
        await service.SendMailAsync(
            "sample@gmail.com",
            "xxxxxxx@gmail.com",
            "件名",
            "これはテストです。",
            @"C:\Users\admin\Desktop\picture.jpg");
    }
} 

まとめ

この記事では、MailKit を使って C# でメールを送信する方法について紹介をしました。

C# でメールを送信したい場合は、Microsoft が推奨するサードパーティ製のオープンソースライブラリの MailKit を使うといいでしょう。

この記事が参考になれば幸いです。

以上、最後まで読んで頂きありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!