メールを送信するにはどうしたらいい!?
この記事では、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 で起動して、次の作業を行います。
ソリューションエクスプローラーからプロジェクト名で右クリックして、[NuGet パッケージの管理]をクリックします。
NuGet パッケージマネージャー画面が開くので、[参照]タブを選択して検索欄に「MailKit」と入力します。
検索結果の一覧にある 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 サーバと通信を行います。
サンプルコード(添付ファイルがある場合)
以下のコードが 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つのプロパティ(SmtpHost
、SmtpPort
、UserName
、Password
)を設定します。
SmtpHost
:smtp.gmail.comSmtpPort
:587UserName
:Googleアカウントのメールアドレス(”@gmail.com”は除く)Password
:アプリ パスワード
SMTP サーバーで利用するPassword
は、Google アカウントのセキュリティ設定から2段階認証のアプリパスワードを設定する必要があります。※Password は Google アカウントのパスワードではありません。
[Googleへのログイン]で[2段階認証プロセス]を選択します。
ページの下部までスクロールし、[アプリ パスワード]を選択します。
アプリパスワードが分かる名前を入力して[作成]ボタンをクリックします。
画面上に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 を使うといいでしょう。
この記事が参考になれば幸いです。
以上、最後まで読んで頂きありがとうございました。