C#でメール送信する方法|SMTP設定からエラー対処まで初心者向けに解説
はじめに
C#でメール送信を実装したい場面は、問い合わせフォーム、会員登録の確認メール、パスワード再設定メール、予約通知、エラー通知などさまざまです。C#にはメール送信に使える標準機能もありますが、現在の新規開発では、SMTP認証、SSL/TLS、OAuth、HTMLメール、添付ファイルなどに対応しやすいライブラリを使うのが一般的です。
この記事では、C#でメール送信する方法を初心者向けに解説します。SMTPの基本、MailKitを使った実装、GmailやOutlook・Microsoft 365の設定、HTMLメールや添付ファイル、よくあるエラー対処、セキュリティ上の注意点まで順番に紹介します。
1. C#でメール送信する前に知っておきたい基本
1-1. C#でメール送信する仕組み
C#でメールを送信する場合、アプリケーションが直接相手のメールボックスにメールを届けるわけではありません。通常は、C#アプリケーションからSMTPサーバーへ接続し、SMTPサーバーにメール配送を依頼します。
流れは次のようになります。
C#アプリケーションで送信者、宛先、件名、本文を作成する
SMTPサーバーへ接続する
ユーザー名とパスワード、またはOAuthなどで認証する
SMTPサーバーへメールデータを送信する
SMTPサーバーが宛先のメールサーバーへ配送する
つまり、C#のメール送信では「メール本文を作る処理」と「SMTPサーバーへ送る処理」の2つを理解することが重要です。
1-2. SMTPとは何か
SMTPは「Simple Mail Transfer Protocol」の略で、メールを送信するための通信プロトコルです。C#に限らず、Webアプリ、業務システム、メールソフト、複合機などがメールを送る際にもSMTPが使われます。
SMTPサーバーには、Gmailのsmtp.gmail.com、Microsoft 365のsmtp.office365.com、レンタルサーバーや独自ドメインメールのSMTPサーバーなどがあります。C#でメールを送る場合は、利用するメールサービスが指定しているSMTPサーバー名、ポート番号、暗号化方式、認証情報をコードに設定します。
1-3. メール送信に必要な情報
C#でメール送信するには、主に以下の情報が必要です。
| 項目 | 例 | 説明 |
|---|---|---|
| SMTPサーバー | smtp.gmail.com | 接続先のSMTPサーバー |
| ポート番号 | 587、465 | SMTP通信に使うポート |
| 暗号化方式 | STARTTLS、SSL/TLS | 通信を暗号化する方式 |
| ユーザー名 | yourname@example.com | SMTP認証に使うメールアドレス |
| パスワード | アプリパスワードなど | SMTP認証に使うパスワード |
| 送信元 | from@example.com | 差出人メールアドレス |
| 宛先 | to@example.com | 受信者メールアドレス |
| 件名 | お問い合わせありがとうございます | メール件名 |
| 本文 | メール本文 | テキストまたはHTML本文 |
特に初心者がつまずきやすいのは、通常のログインパスワードではなく「アプリパスワード」や「OAuth認証」が必要になるケースです。Gmailでは、アプリパスワードは2段階認証が有効なアカウントで使える16桁のパスコードとして説明されています。Google ヘルプ
1-4. System.Net.MailとMailKitの違い
C#でメール送信する方法を調べると、System.Net.Mail.SmtpClientを使ったサンプルが見つかることがあります。System.Net.Mailは.NETに含まれる標準ライブラリで、古いプロジェクトでは現在も使われています。
しかし、Microsoft公式ドキュメントでは、SmtpClientは多くの最新プロトコルをサポートしていないため、新規開発では推奨されておらず、MailKitなどのライブラリを使うことが案内されています。Microsoft Learn
MailKitは、SMTP、POP3、IMAPに対応した.NET向けのメールクライアントライブラリです。MailKitの公式ドキュメントでは、SMTPクライアントがSSL/TLSやSTARTTLS、SMTPUTF8などの拡張に対応していることが示されています。MimeKit
そのため、これからC#でメール送信を実装するなら、基本的にはMailKitを使うのがおすすめです。
2. C#でメール送信する開発環境を準備する
2-1. .NETのバージョンを確認する
まず、使用している.NETのバージョンを確認します。コマンドプロンプトやターミナルで次のコマンドを実行します。
Bashdotnet --version
バージョン番号が表示されれば、.NET SDKがインストールされています。表示されない場合は、.NET SDKをインストールしてからプロジェクトを作成してください。
MailKitはNuGetパッケージとして提供されているため、Visual Studio、Visual Studio Code、コマンドラインのいずれでも導入できます。
2-2. プロジェクトを作成する
コンソールアプリで試す場合は、以下のコマンドでプロジェクトを作成できます。
Bashdotnet new console -n MailSendSample
cd MailSendSample
作成されたProgram.csにメール送信コードを記述していきます。最初はコンソールアプリで動作確認し、その後ASP.NET CoreやWindowsアプリ、バッチ処理などに組み込むと理解しやすくなります。
2-3. MailKitをインストールする方法
MailKitはNuGetからインストールします。コマンドラインでは次のように実行します。
Bashdotnet add package MailKit
Visual Studioを使う場合は、以下の手順でインストールできます。
プロジェクトを右クリック
「NuGetパッケージの管理」を選択
「参照」タブで
MailKitを検索MailKitを選択してインストール
NuGet Galleryでは、MailKitは.NET向けのSMTP、POP3、IMAPクライアント実装を提供するライブラリとして説明されています。NuGet
2-4. SMTPサーバー情報を用意する
次に、利用するメールサービスのSMTP情報を用意します。
Gmailを使う場合の代表的な設定は次のとおりです。
| 項目 | 値 |
|---|---|
| SMTPサーバー | smtp.gmail.com |
| ポート | 587または465 |
| 暗号化 | 587はTLS、465はSSL |
| ユーザー名 | Gmailアドレス |
| パスワード | アプリパスワード |
Google Workspaceヘルプでは、Gmail SMTPサーバーを使う場合、サーバーアドレスはsmtp.gmail.com、SSLは465、TLSは587、認証には完全なメールアドレスとアプリパスワードを使うと説明されています。Google Workspace Help
Microsoft 365を使う場合の代表的な設定は次のとおりです。
| 項目 | 値 |
|---|---|
| SMTPサーバー | smtp.office365.com |
| ポート | 587 |
| 暗号化 | STARTTLS |
| ユーザー名 | Microsoft 365のメールアドレス |
| パスワード | アカウントの認証情報、またはOAuth |
Microsoftの公式ドキュメントでは、クライアントSMTP送信の設定としてsmtp.office365.com、TCPポート587、TLS/StartTLS有効が示されています。Microsoft Learn
3. C#でSMTPを使ってメール送信する基本コード
3-1. MailKitを使ったメール送信の基本手順
MailKitを使ったC#のメール送信は、次の流れで実装します。
MimeMessageを作成する差出人、宛先、件名、本文を設定する
SmtpClientでSMTPサーバーへ接続するSMTP認証を行う
メールを送信する
SMTPサーバーから切断する
基本コードは以下のとおりです。
C#using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
var message = new MimeMessage();
message.From.Add(new MailboxAddress("送信者名", "your-address@gmail.com"));
message.To.Add(new MailboxAddress("宛先名", "to@example.com"));
message.Subject = "C#からのテストメール";
message.Body = new TextPart("plain")
{
Text = "これはC#とMailKitを使って送信したテストメールです。"
};
using var client = new SmtpClient();
await client.ConnectAsync("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("your-address@gmail.com", "your-app-password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
Console.WriteLine("メールを送信しました。");
このコードでは、GmailのSMTPサーバーへSTARTTLSで接続し、認証後にメールを送信しています。実際に使う場合は、メールアドレスやアプリパスワードを自分の環境に合わせて変更してください。
3-2. 宛先・件名・本文を設定する
MailKitでは、メールの内容をMimeMessageで作成します。
C#var message = new MimeMessage();
message.From.Add(new MailboxAddress("山田太郎", "from@example.com"));
message.To.Add(new MailboxAddress("佐藤花子", "to@example.com"));
message.Subject = "お問い合わせありがとうございます";
message.Body = new TextPart("plain")
{
Text = "お問い合わせを受け付けました。\n担当者よりご連絡いたします。"
};
Fromには差出人、Toには宛先、Subjectには件名、Bodyには本文を指定します。
日本語のメールでも、MailKitとMimeKitを使えば基本的に文字コードを意識せずに扱えます。ただし、古いメールソフトや特殊な環境に送信する場合は、文字エンコーディングを明示する対応が必要になることもあります。
3-3. SMTPサーバーへ接続する
SMTPサーバーへ接続するには、SmtpClientのConnectAsyncを使います。
C#using var client = new SmtpClient();
await client.ConnectAsync(
"smtp.gmail.com",
587,
SecureSocketOptions.StartTls
);
第1引数はSMTPサーバー名、第2引数はポート番号、第3引数は暗号化方式です。
よく使う暗号化方式は次のとおりです。
| ポート | 暗号化方式 | MailKitの指定例 |
|---|---|---|
| 587 | STARTTLS | SecureSocketOptions.StartTls |
| 465 | SSL/TLS | SecureSocketOptions.SslOnConnect |
| 25 | なし、またはSTARTTLS | 環境による |
GmailではTLSに587、SSLに465が案内されています。Google Workspace Help
3-4. 認証してメールを送信する
SMTPサーバーへ接続したら、AuthenticateAsyncで認証します。
C#await client.AuthenticateAsync("your-address@gmail.com", "your-app-password");
認証に成功したら、SendAsyncでメールを送信します。
C#await client.SendAsync(message);
Gmailの場合、通常のGoogleアカウントのパスワードではなく、アプリパスワードが必要になることがあります。Google公式ヘルプでは、アプリパスワードは2段階認証が有効なアカウントで利用できると説明されています。Google ヘルプ
3-5. 接続を終了する
メール送信後は、SMTPサーバーとの接続を終了します。
C#await client.DisconnectAsync(true);
引数にtrueを指定すると、SMTPのQUITコマンドを送って正常に切断します。using var client = new SmtpClient();としておけば、処理終了時にリソースも解放されます。
実運用では、例外処理を追加して、送信失敗時にログを出力できるようにしておきましょう。
C#try
{
using var client = new SmtpClient();
await client.ConnectAsync("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("your-address@gmail.com", "your-app-password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
Console.WriteLine("メールを送信しました。");
}
catch (Exception ex)
{
Console.WriteLine($"メール送信に失敗しました: {ex.Message}");
}
4. GmailやOutlookでC#からメール送信する方法
4-1. GmailのSMTP設定
GmailでC#からメール送信する場合は、以下のSMTP設定を使います。
C#await client.ConnectAsync("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("yourname@gmail.com", "app-password");
Gmailの主な設定は次のとおりです。
| 項目 | 値 |
|---|---|
| SMTPサーバー | smtp.gmail.com |
| ポート | 587または465 |
| 暗号化 | 587はTLS、465はSSL |
| ユーザー名 | Gmailアドレス |
| パスワード | アプリパスワード |
Google Workspaceヘルプでは、Gmail SMTPサーバーを使う場合、smtp.gmail.com、SSLは465、TLSは587、認証には完全なメールアドレスとアプリパスワードを使うと説明されています。Google Workspace Help
4-2. Gmailでアプリパスワードを使う方法
GmailでC#からSMTP送信する場合、アプリパスワードを使うケースがあります。アプリパスワードは通常のGoogleアカウントのパスワードとは異なり、外部アプリやデバイスから接続するための専用パスワードです。
基本的な流れは次のとおりです。
Googleアカウントにログインする
2段階認証を有効にする
アプリパスワードの画面を開く
用途名を入力してアプリパスワードを作成する
表示された16桁のパスワードをC#のSMTP認証に使う
Google公式ヘルプでは、アプリパスワードは2段階認証が有効なアカウントで利用でき、通常はアプリやデバイスごとに一度入力すればよいと説明されています。Google ヘルプ
コードでは次のように指定します。
C#await client.AuthenticateAsync("yourname@gmail.com", "生成したアプリパスワード");
アプリパスワードをコピーするときにスペースが含まれているように見える場合がありますが、コードに設定する際はスペースを除いた文字列として扱うのが一般的です。
4-3. Outlook・Microsoft 365のSMTP設定
Outlook.comやMicrosoft 365でC#からメール送信する場合は、利用しているアカウントの種類によって設定が異なります。Microsoft 365のクライアントSMTP送信では、以下のような設定が使われます。
| 項目 | 値 |
|---|---|
| SMTPサーバー | smtp.office365.com |
| ポート | 587 |
| 暗号化 | STARTTLS |
| ユーザー名 | Microsoft 365のメールアドレス |
| パスワード | アカウントの認証情報、またはOAuth |
C#のコード例は次のとおりです。
C#await client.ConnectAsync("smtp.office365.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("yourname@example.com", "password-or-token");
await client.SendAsync(message);
await client.DisconnectAsync(true);
Microsoft公式ドキュメントでは、Microsoft 365またはOffice 365のクライアントSMTP送信設定として、サーバーはsmtp.office365.com、TCPポートは587、TLS/StartTLSを有効にすることが示されています。Microsoft Learn
ただし、Microsoft 365ではSMTP AUTHが組織全体またはメールボックス単位で無効になっている場合があります。Microsoftのドキュメントでは、セキュリティ既定値が有効な組織ではExchange OnlineのSMTP AUTHが無効になることや、必要に応じてメールボックス単位で有効化できることが説明されています。Microsoft Learn
4-4. 送信できない場合に確認するポイント
GmailやOutlook・Microsoft 365で送信できない場合は、次の点を確認してください。
| 確認項目 | 内容 |
|---|---|
| SMTPサーバー名 | smtp.gmail.comやsmtp.office365.comが正しいか |
| ポート番号 | 587または465を正しく指定しているか |
| 暗号化方式 | 587ならSTARTTLS、465ならSSL/TLSになっているか |
| ユーザー名 | メールアドレス全体を指定しているか |
| パスワード | 通常パスワードではなくアプリパスワードが必要ではないか |
| SMTP AUTH | Microsoft 365で無効になっていないか |
| 2段階認証 | Gmailのアプリパスワード作成条件を満たしているか |
| ファイアウォール | 587や465への通信がブロックされていないか |
特にGmailではアプリパスワード、Microsoft 365ではSMTP AUTHやOAuth認証が原因になりやすいです。
5. C#メール送信の応用設定
5-1. HTMLメールを送信する方法
HTMLメールを送信するには、TextPart("html")を使います。
C#message.Body = new TextPart("html")
{
Text = @"
<html>
<body>
<h1>お問い合わせありがとうございます</h1>
<p>以下の内容でお問い合わせを受け付けました。</p>
<p><strong>担当者よりご連絡いたします。</strong></p>
</body>
</html>"
};
HTMLメールでは、見出し、太字、リンク、表、ボタン風の装飾などを使えます。ただし、メールクライアントによってCSSの対応状況が異なるため、Webページと同じ感覚で複雑なデザインを組むと表示が崩れることがあります。
テキスト本文とHTML本文の両方を設定したい場合は、BodyBuilderを使います。
C#var builder = new BodyBuilder();
builder.TextBody = "お問い合わせありがとうございます。担当者よりご連絡いたします。";
builder.HtmlBody = @"
<h1>お問い合わせありがとうございます</h1>
<p>担当者よりご連絡いたします。</p>
";
message.Body = builder.ToMessageBody();
HTMLメールを送る場合でも、テキスト版を用意しておくと、HTML表示に対応していない環境や迷惑メール判定対策の面で安心です。
5-2. 添付ファイル付きメールを送信する方法
添付ファイルを送信する場合も、BodyBuilderを使うと簡単です。
C#var builder = new BodyBuilder();
builder.TextBody = "請求書を添付いたします。ご確認ください。";
builder.Attachments.Add(@"C:\files\invoice.pdf");
message.Body = builder.ToMessageBody();
複数のファイルを添付する場合は、Attachments.Addを複数回呼び出します。
C#builder.Attachments.Add(@"C:\files\invoice.pdf");
builder.Attachments.Add(@"C:\files\detail.xlsx");
添付ファイルを扱うときは、ファイルパスが正しいか、ファイルが存在するか、アプリケーションに読み取り権限があるかを確認してください。また、メールサービス側で添付ファイルサイズの上限が設定されている場合があります。
5-3. CC・BCCを指定する方法
CCを指定するにはmessage.Cc、BCCを指定するにはmessage.Bccを使います。
C#message.To.Add(new MailboxAddress("宛先", "to@example.com"));
message.Cc.Add(new MailboxAddress("共有先", "cc@example.com"));
message.Bcc.Add(new MailboxAddress("非公開共有先", "bcc@example.com"));
CCは受信者全員に見える宛先、BCCは他の受信者には見えない宛先です。社内共有ではCC、顧客への一斉送信などで宛先を見せたくない場合はBCCを使うことがあります。
ただし、大量のBCC送信は迷惑メールと判定される可能性があるため、メール配信サービスの利用も検討してください。
5-4. 複数宛先にメール送信する方法
複数の宛先に送信する場合は、To.Addを繰り返します。
C#message.To.Add(new MailboxAddress("田中", "tanaka@example.com"));
message.To.Add(new MailboxAddress("鈴木", "suzuki@example.com"));
message.To.Add(new MailboxAddress("佐藤", "sato@example.com"));
リストを使って追加することもできます。
C#var recipients = new[]
{
"tanaka@example.com",
"suzuki@example.com",
"sato@example.com"
};
foreach (var recipient in recipients)
{
message.To.Add(MailboxAddress.Parse(recipient));
}
ただし、複数宛先にまとめて送ると、受信者同士にメールアドレスが見えてしまう場合があります。個別通知メールの場合は、1通ずつ宛先を変えて送信する方が安全です。
5-5. 差出人名を設定する方法
差出人名を設定するには、MailboxAddressの第1引数に表示名を指定します。
C#message.From.Add(new MailboxAddress("株式会社サンプル サポート", "support@example.com"));
受信者のメールソフトでは、メールアドレスだけでなく「株式会社サンプル サポート」のような名前が表示されます。
ただし、SMTP認証に使ったアカウントと異なるメールアドレスを差出人にすると、送信エラーになったり、迷惑メール判定されたりすることがあります。Microsoft 365では、認証に使うアカウントと異なる送信元を使う場合、Send As権限が必要になるケースが公式ドキュメントで説明されています。Microsoft Learn
6. C#メール送信でよくあるエラーと対処法
6-1. SMTP認証エラーの原因と対処法
SMTP認証エラーは、C#メール送信で非常によく発生します。代表的な原因は次のとおりです。
| 原因 | 対処法 |
|---|---|
| メールアドレスが間違っている | ユーザー名にメールアドレス全体を指定する |
| パスワードが間違っている | 入力ミスや古いパスワードを確認する |
| アプリパスワードが必要 | Gmailではアプリパスワードを作成する |
| SMTP AUTHが無効 | Microsoft 365管理画面で有効化する |
| OAuthが必要 | OAuth認証方式に変更する |
Gmailでは、2段階認証を使っていて通常のパスワードでログインできない場合、アプリパスワードを試すよう公式ヘルプで案内されています。Google ヘルプ
Microsoft 365では、組織やメールボックスでSMTP AUTHが無効になっていると認証できません。SMTP AUTHが無効な場合は、管理者に確認するか、OAuthや別の送信方式を検討してください。Microsoft Learn
6-2. 接続タイムアウトの原因と対処法
接続タイムアウトは、SMTPサーバーへ接続できないときに発生します。
主な原因は次のとおりです。
| 原因 | 対処法 |
|---|---|
| SMTPサーバー名が間違っている | サーバー名を再確認する |
| ポート番号が間違っている | 587、465など正しいポートを指定する |
| ネットワークでブロックされている | ファイアウォールやプロキシを確認する |
| ISPがSMTP通信を制限している | 別ポートや別回線で試す |
| SMTPサーバーが一時的に停止している | 時間を置いて再試行する |
タイムアウトが発生する場合は、まずSMTPサーバー名とポート番号を確認しましょう。次に、同じネットワークからそのポートへ接続できるかを確認します。
6-3. SSL・TLS関連エラーの原因と対処法
SSL・TLS関連のエラーは、暗号化方式とポート番号の組み合わせが間違っている場合によく起こります。
よくある間違いは次のとおりです。
C#// 例: 587なのにSslOnConnectを指定してしまう
await client.ConnectAsync("smtp.gmail.com", 587, SecureSocketOptions.SslOnConnect);
587番ポートでは通常STARTTLSを使います。
C#await client.ConnectAsync("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
465番ポートを使う場合は、接続開始時からSSL/TLSを使います。
C#await client.ConnectAsync("smtp.gmail.com", 465, SecureSocketOptions.SslOnConnect);
GmailではSSLに465、TLSに587が案内されています。Google Workspace Help
Microsoft 365のクライアントSMTP送信では、TLS/StartTLSを有効にし、ポート587を使う設定が示されています。Microsoft Learn
6-4. Gmailで送信できない場合の対処法
GmailでC#からメール送信できない場合は、以下を確認してください。
SMTPサーバーが
smtp.gmail.comになっているかポート587とSTARTTLSの組み合わせになっているか
Gmailアドレス全体をユーザー名にしているか
通常のパスワードではなくアプリパスワードを使っているか
Googleアカウントで2段階認証が有効になっているか
アプリパスワードが無効化されていないか
送信上限に達していないか
Google Workspaceヘルプでは、Gmail SMTPサーバー利用時の送信上限として1日2,000通が示されています。Google Workspace Help
また、Googleアカウントのパスワードを変更するとアプリパスワードが取り消されるため、必要に応じて新しいアプリパスワードを作成してください。Google公式ヘルプでは、アカウント保護のため、Googleアカウントのパスワード変更時にアプリパスワードが取り消されると説明されています。Google ヘルプ
6-5. 文字化けが発生する場合の対処法
日本語メールで文字化けが発生する場合は、以下を確認します。
| 原因 | 対処法 |
|---|---|
| 古いメールソフトで受信している | UTF-8対応のメールソフトで確認する |
| 件名や本文に特殊文字がある | 機種依存文字や絵文字を避ける |
| HTMLメールのcharset指定がない | HTML側にUTF-8を指定する |
| 外部システムが本文を変換している | 中継サーバーやメール配信サービスを確認する |
HTMLメールでは、必要に応じて以下のようにcharsetを指定します。
C#builder.HtmlBody = @"
<!DOCTYPE html>
<html>
<head>
<meta charset=""UTF-8"">
</head>
<body>
<p>日本語のHTMLメールです。</p>
</body>
</html>";
MailKitとMimeKitを使う場合、通常の日本語メールであれば大きな問題は起きにくいですが、古い携帯端末や特殊な業務用メールシステムでは文字化けが発生することがあります。
6-6. 添付ファイル送信時のエラー対処法
添付ファイル付きメールでエラーが出る場合は、次の点を確認してください。
| 原因 | 対処法 |
|---|---|
| ファイルパスが間違っている | 絶対パスまたは正しい相対パスを指定する |
| ファイルが存在しない | 送信前にFile.Existsで確認する |
| 読み取り権限がない | アプリ実行ユーザーに権限を付与する |
| ファイルサイズが大きすぎる | ファイルを圧縮する、クラウドストレージURLを送る |
| 拡張子がブロックされている | zip化や別手段で共有する |
送信前にファイルの存在を確認する例です。
C#var filePath = @"C:\files\invoice.pdf";
if (!File.Exists(filePath))
{
throw new FileNotFoundException("添付ファイルが見つかりません。", filePath);
}
builder.Attachments.Add(filePath);
添付ファイルが大きい場合、SMTPサーバー側や受信側で拒否される可能性があります。大容量ファイルはメールに直接添付せず、クラウドストレージの共有リンクを送る方法も検討しましょう。
7. C#でメール送信する際のセキュリティ注意点
7-1. パスワードをソースコードに直接書かない
以下のように、ソースコードにメールアドレスやパスワードを直接書くのは避けてください。
C#await client.AuthenticateAsync("yourname@gmail.com", "password123");
この書き方は簡単ですが、GitHubなどに誤って公開した場合、第三者に認証情報を悪用される危険があります。個人開発でも業務システムでも、パスワードやAPIキーなどの秘密情報はソースコードから分離するべきです。
7-2. 環境変数や設定ファイルで認証情報を管理する
認証情報は、環境変数や設定ファイルで管理します。環境変数を使う例は次のとおりです。
C#var smtpUser = Environment.GetEnvironmentVariable("SMTP_USER");
var smtpPassword = Environment.GetEnvironmentVariable("SMTP_PASSWORD");
if (string.IsNullOrWhiteSpace(smtpUser) || string.IsNullOrWhiteSpace(smtpPassword))
{
throw new InvalidOperationException("SMTP認証情報が設定されていません。");
}
await client.AuthenticateAsync(smtpUser, smtpPassword);
Windows、Linux、クラウド環境、CI/CDなどでは、それぞれの環境に応じた方法で環境変数を設定できます。
ASP.NET Coreでは、開発環境ではユーザーシークレット、本番環境では環境変数、Azure Key Vault、AWS Secrets Managerなどのシークレット管理サービスを使う方法もあります。
7-3. SSL・TLSを有効にする
SMTP認証では、メールアドレスやパスワードを送信します。そのため、SSL/TLSを使わずに通信すると、認証情報やメール内容が盗み見されるリスクがあります。
基本的には、以下のどちらかを使いましょう。
C#// 587番ポート + STARTTLS
await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls);
C#// 465番ポート + SSL/TLS
await client.ConnectAsync("smtp.example.com", 465, SecureSocketOptions.SslOnConnect);
MailKitの公式ドキュメントでは、SMTPクライアントがSSL/TLSとSTARTTLSをサポートしていることが示されています。MimeKit
7-4. OAuth認証が必要になるケース
GmailやMicrosoft 365では、セキュリティ強化のため、単純なユーザー名とパスワードによるSMTP認証が使えない、または推奨されない場合があります。
Google公式ヘルプでは、アプリパスワードは推奨されず、多くの場合は「Sign in with Google」を使うことが案内されています。Google ヘルプ
Microsoft 365でも、クライアントSMTP送信ではOAuthのようなModern Authenticationの利用が推奨されています。Microsoft公式ドキュメントでは、Basic認証を使うクライアントSMTP送信の非推奨化や、OAuthの利用推奨が説明されています。Microsoft Learn
小規模な社内ツールや検証ではアプリパスワードで十分な場合もありますが、本番運用の業務システムではOAuth、メール配信サービス、クラウドのメール送信機能などを検討しましょう。
7-5. 大量送信時に注意すべきこと
C#でメール送信処理を作ると、ループで大量のメールを送ることもできます。しかし、GmailやMicrosoft 365などの通常のメールアカウントは、大量配信用のサービスではありません。
大量送信時には次の点に注意してください。
| 注意点 | 内容 |
|---|---|
| 送信上限 | サービスごとの1日・1分あたりの制限を確認する |
| 迷惑メール判定 | 同じ内容を大量送信するとブロックされやすい |
| 宛先管理 | 配信停止や無効アドレスを管理する |
| 認証設定 | SPF、DKIM、DMARCを設定する |
| ログ管理 | 送信成功、失敗、バウンスを記録する |
| 個人情報保護 | 宛先や本文に個人情報を含める場合は慎重に扱う |
Microsoft 365のクライアントSMTP送信では、公式ドキュメント上で1日あたり10,000受信者、1分あたり30メッセージといった制限が示されています。Microsoft Learn
メールマガジン、キャンペーンメール、通知メールの大量配信を行う場合は、SendGrid、Amazon SES、Mailgun、Azure Communication Services Emailなどのメール配信サービスを使う方が安全で管理しやすいです。
まとめ
C#でメール送信するには、SMTPサーバーへ接続し、認証してメールデータを送信する仕組みを理解することが大切です。古いサンプルではSystem.Net.Mail.SmtpClientが使われていることがありますが、新規開発ではMicrosoft公式ドキュメントでもMailKitなどの利用が案内されています。Microsoft Learn
基本的な流れは、MailKitをインストールし、MimeMessageでメールを作成し、SmtpClientでSMTPサーバーへ接続して送信するだけです。
最小構成のコードは次のようになります。
C#using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
var message = new MimeMessage();
message.From.Add(new MailboxAddress("送信者名", "from@example.com"));
message.To.Add(new MailboxAddress("宛先名", "to@example.com"));
message.Subject = "C#メール送信テスト";
message.Body = new TextPart("plain")
{
Text = "C#からメールを送信しました。"
};
using var client = new SmtpClient();
await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("user@example.com", "password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
Gmailを使う場合はsmtp.gmail.com、Microsoft 365を使う場合はsmtp.office365.comなど、利用するメールサービスに合わせてSMTPサーバー、ポート、暗号化方式、認証情報を正しく設定しましょう。
また、パスワードをソースコードに直接書かない、SSL/TLSを有効にする、必要に応じてOAuthを検討する、大量送信では専用サービスを使うなど、セキュリティと運用面にも注意が必要です。
C#のメール送信は、基本コードだけならそれほど難しくありません。しかし、本番運用では認証、暗号化、エラー処理、添付ファイル、送信制限、迷惑メール対策まで考慮する必要があります。まずはMailKitで基本のメール送信を動かし、徐々にHTMLメール、添付ファイル、CC・BCC、環境変数管理などを追加していくとよいでしょう。

