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サーバーにメール配送を依頼します。

流れは次のようになります。

  1. C#アプリケーションで送信者、宛先、件名、本文を作成する

  2. SMTPサーバーへ接続する

  3. ユーザー名とパスワード、またはOAuthなどで認証する

  4. SMTPサーバーへメールデータを送信する

  5. 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、465SMTP通信に使うポート
暗号化方式STARTTLS、SSL/TLS通信を暗号化する方式
ユーザー名yourname@example.comSMTP認証に使うメールアドレス
パスワードアプリパスワードなど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のバージョンを確認します。コマンドプロンプトやターミナルで次のコマンドを実行します。

Bash
dotnet --version

バージョン番号が表示されれば、.NET SDKがインストールされています。表示されない場合は、.NET SDKをインストールしてからプロジェクトを作成してください。

MailKitはNuGetパッケージとして提供されているため、Visual Studio、Visual Studio Code、コマンドラインのいずれでも導入できます。

2-2. プロジェクトを作成する

コンソールアプリで試す場合は、以下のコマンドでプロジェクトを作成できます。

Bash
dotnet new console -n MailSendSample
cd MailSendSample

作成されたProgram.csにメール送信コードを記述していきます。最初はコンソールアプリで動作確認し、その後ASP.NET CoreやWindowsアプリ、バッチ処理などに組み込むと理解しやすくなります。

2-3. MailKitをインストールする方法

MailKitはNuGetからインストールします。コマンドラインでは次のように実行します。

Bash
dotnet add package MailKit

Visual Studioを使う場合は、以下の手順でインストールできます。

  1. プロジェクトを右クリック

  2. 「NuGetパッケージの管理」を選択

  3. 「参照」タブでMailKitを検索

  4. 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#のメール送信は、次の流れで実装します。

  1. MimeMessageを作成する

  2. 差出人、宛先、件名、本文を設定する

  3. SmtpClientでSMTPサーバーへ接続する

  4. SMTP認証を行う

  5. メールを送信する

  6. 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サーバーへ接続するには、SmtpClientConnectAsyncを使います。

C#
using var client = new SmtpClient();

await client.ConnectAsync(
"smtp.gmail.com",
587,
SecureSocketOptions.StartTls
);

第1引数はSMTPサーバー名、第2引数はポート番号、第3引数は暗号化方式です。

よく使う暗号化方式は次のとおりです。

ポート暗号化方式MailKitの指定例
587STARTTLSSecureSocketOptions.StartTls
465SSL/TLSSecureSocketOptions.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アカウントのパスワードとは異なり、外部アプリやデバイスから接続するための専用パスワードです。

基本的な流れは次のとおりです。

  1. Googleアカウントにログインする

  2. 2段階認証を有効にする

  3. アプリパスワードの画面を開く

  4. 用途名を入力してアプリパスワードを作成する

  5. 表示された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.comsmtp.office365.comが正しいか
ポート番号587または465を正しく指定しているか
暗号化方式587ならSTARTTLS、465ならSSL/TLSになっているか
ユーザー名メールアドレス全体を指定しているか
パスワード通常パスワードではなくアプリパスワードが必要ではないか
SMTP AUTHMicrosoft 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#からメール送信できない場合は、以下を確認してください。

  1. SMTPサーバーがsmtp.gmail.comになっているか

  2. ポート587とSTARTTLSの組み合わせになっているか

  3. Gmailアドレス全体をユーザー名にしているか

  4. 通常のパスワードではなくアプリパスワードを使っているか

  5. Googleアカウントで2段階認証が有効になっているか

  6. アプリパスワードが無効化されていないか

  7. 送信上限に達していないか

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、環境変数管理などを追加していくとよいでしょう。