C# で添付ファイル付きのメールを送信 するのは、レポートや請求書、ログの共有など、業務アプリケーションでよく求められる機能の一つです。.NET の標準ライブラリでも基本的なメール送信は可能ですが、添付ファイルの扱いやエンコーディング、動的に生成されるファイルの送信など、やや複雑な処理が必要になる場合があります。
この記事では、C# でメールにファイルを添付して送信する方法 を、具体的な C# コードとともにわかりやすく解説します。ローカルファイルの添付、メモリストリームやバイト配列からの添付、SMTP の設定方法などを順を追って紹介していきます。コンソールアプリや ASP.NET など、さまざまなプロジェクトに応用できる内容です。
目次
- 1. はじめに:Spire.Email で C# メール送信を始める
- 2. C# でローカルファイルを添付してメールを送信する方法
- 3. C# でメモリストリームやバイト配列からファイルを添付する方法
- 4. C# で Outlook の SMTP を使ってメールを送信する方法
- 5. C# による実用的な添付メール送信の例:動的宛名と複数送信
- 6. トラブル対処とベストプラクティス
- 7. まとめと次のステップ
- 8. よくある質問(FAQ)
1. はじめに:Spire.Email で C# メール送信を始める
Spire.Email for .NET は、Outlook や他のメールクライアントに依存せず、C# アプリケーション内でメールの作成・送信・受信・管理を実現できるプロフェッショナルなライブラリです。SMTP、POP3、IMAP をサポートし、添付ファイルや HTML 本文、インラインリソースなども簡単に扱えます。
インストール
NuGet 経由で簡単にインストールできます:
Install-Package Spire.Email
または、公式サイトから Spire.Email をダウンロード して手動でインストールすることも可能です。
2. C# でローカルファイルを添付してメールを送信する方法
業務システムなどでは、PDF レポートなどのファイルを定期的に送信するケースが多くあります。ここでは、ローカルディスク上のファイル(例:PDF)を添付し、Spire.Email を使って C# から送信する基本的な方法を紹介します。
主なステップは以下の通りです:
- 送信者・受信者情報の設定
- HTML 形式のメール本文の作成
- Attachment クラスを使ったファイル添付
- SMTP クライアントの構成と認証設定
サンプルコード
この実践的な例では、C#を使用して添付ファイル付きのメールを送信する方法を、わずか数行のコードで明確に説明しています。
using Spire.Email;
using Spire.Email.Smtp;
class Program
{
static void Main()
{
try
{
// 差出人、宛先、CC のメールアドレスを作成
MailAddress addressFrom = new MailAddress("このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。", "送信者名");
MailAddress addressTo = new MailAddress("このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。", "受信者名");
MailAddress addressCc = new MailAddress("このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。", "CC 名");
// メールメッセージを作成し、差出人と宛先を設定
MailMessage message = new MailMessage(addressFrom, addressTo);
// CC を追加
message.Cc.Add(addressCc);
// 件名と本文(HTML)を設定
message.Subject = "2025年6月分 月次レポート";
message.BodyHtml = "<div style='font-family:Meiryo, sans-serif; font-size:14px; color:#333; line-height:1.8;'>" +
"<p>関係者各位</p>" +
"<p>いつもお世話になっております。</p>" +
"<p>2025年6月分の<strong style='color:#2E86C1;'>月次レポート</strong>を添付いたしましたので、ご確認ください。</p>" +
"<p>ご不明な点がございましたら、お気軽にご連絡ください。</p>" +
"<p style='margin-top:30px;'>どうぞよろしくお願いいたします。</p>" +
"<p style='font-style:italic; color:#555;'>送信者名</p>" +
"</div>";
// 添付ファイルを追加
string filePath = @"Sample.pdf";
Attachment attachment = new Attachment(filePath);
message.Attachments.Add(attachment);
// SMTP クライアントの設定
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.yourcompany.com";
smtp.Port = 587;
smtp.Username = "your_username";
smtp.Password = "your_password";
smtp.ConnectionProtocols = ConnectionProtocols.StartTls;
// メールを送信
smtp.SendOne(message);
// 成功メッセージ
Console.WriteLine("メールを正常に送信しました。");
}
catch (Exception ex)
{
// エラーメッセージ
Console.WriteLine("メールの送信に失敗しました。");
Console.WriteLine("エラー内容: " + ex.Message);
}
}
}
実行すると、以下のように PDF を添付したメールが送信されます。
3. C# でメモリストリームやバイト配列からファイルを添付する方法
ドキュメントや画像をリアルタイムで生成して添付したい場合、ファイルを保存せずにそのまま添付できると便利です。Spire.Email では、MemoryStream や byte[] から直接添付が可能です。
メモリストリームからPDFを添付する:
using System.IO;
using Spire.Email;
String filePath = @"Sample.pdf";
MemoryStream stream = new MemoryStream(File.ReadAllBytes(filePath));
Attachment attachment = new Attachment(stream, Path.GetFileName(filePath);
message.Attachments.Add(attachment);
バイト配列からも添付できます:
String filePath = @"Sample.pdf";
byte[] fileBytes = File.ReadAllBytes(filePath);
MemoryStream memStream = new MemoryStream(fileBytes);
Attachment imgAttachment = new Attachment(memStream, Path.GetFileName(filePath));
message.Attachments.Add(imgAttachment);
添付ファイル名には拡張子(.pdf, .xlsx など)を必ず含めてください。MIME タイプの判別に影響します。
4. C# で Outlook の SMTP を使ってメールを送信する方法
Outlook(Microsoft 365)の SMTP サーバーを利用してメールを送信することも可能です。設定は以下の通りです。
Outlook SMTP 設定
smtp.Host = "smtp.office365.com";
smtp.Port = 587;
smtp.Username = "このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。";
smtp.Password = "your_password";
smtp.ConnectionProtocols = ConnectionProtocols.StartTls;
TLS や STARTTLS にも対応しているため、セキュアな通信が可能です。
5. C# による実用的な添付メール送信の例:動的宛名と複数送信
実際のビジネスシナリオでは、プロジェクトの進捗レポートを複数の受信者に送信し、それぞれにパーソナライズされた内容を含める必要があることがよくあります。Spire.Email for .NET を使用すれば、添付ファイル付きで挨拶文をカスタマイズした個別メールを、シンプルな C# アプリケーション内で簡単に送信できます。
以下の例では、プロジェクトの進捗レポートを複数の顧客に送信する方法を紹介します。挨拶文に受信者名を動的に挿入し、PDF や Excel ファイルを添付しています。
完全なコード例
using Spire.Email;
using Spire.Email.Smtp;
class Program
{
static void Main()
{
// 差出人を定義
MailAddress addressFrom = new MailAddress("このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。", "送信者");
// 宛先リストを定義(名前とメールアドレス)
List<MailAddress> recipients = new List<MailAddress>
{
new MailAddress("このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。", "営業チームA"),
new MailAddress("このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。", "マネージャーB"),
new MailAddress("このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。", "サポートチームC")
};
// 添付ファイルを定義
string[] attachmentFiles = { @"Sample.pdf", @"Sample.xlsx" };
// SMTP 設定(1回だけ)
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.yourcompany.com";
smtp.Port = 587;
smtp.Username = "your_username";
smtp.Password = "your_password";
smtp.ConnectionProtocols = ConnectionProtocols.StartTls;
// 各宛先に個別にメールを送信
foreach (var recipient in recipients)
{
try
{
// 宛先ごとに新しいメールメッセージを作成
MailMessage message = new MailMessage(addressFrom, recipient);
message.Subject = "2025年第2四半期 プロジェクト進捗報告";
// 宛名をあいさつに使用
string greetingName = string.IsNullOrEmpty(recipient.DisplayName)
? "ご担当者様"
: recipient.DisplayName + " 様";
// 本文(HTML形式)
message.BodyHtml = $@"
<div style='font-family:Meiryo, sans-serif; font-size:14px; color:#333; line-height:1.8;'>
<p>{greetingName}</p>
<p>いつも大変お世話になっております。</p>
<p>2025年第2四半期の<strong>プロジェクト進捗報告書</strong>を添付いたします。内容は以下の通りです:</p>
<ul style='padding-left:20px; margin:0;'>
<li>達成したマイルストーン</li>
<li>未完了のタスク</li>
<li>主要な考察・所見</li>
</ul>
<p>ご質問やご不明点などがございましたら、お気軽にご連絡ください。</p>
<p style='margin-top:30px;'>引き続きどうぞよろしくお願いいたします。<br><strong>送信者</strong></p>
</div>";
// 添付ファイルを追加
foreach (string file in attachmentFiles)
{
Attachment attachment = new Attachment(file);
message.Attachments.Add(attachment);
}
// メールを送信
smtp.SendOne(message);
Console.WriteLine($"{recipient.Address} にメールを送信しました。");
}
catch (Exception ex)
{
Console.WriteLine($"{recipient.Address} へのメール送信に失敗しました。");
Console.WriteLine("エラー内容: " + ex.Message);
}
}
}
}
このコードは、C# コンソールアプリや ASP.NET アプリでも簡単に応用できます。
以下は送信されたメールのスクリーンショットです。
6. トラブル対処とベストプラクティス
- 認証エラー:SMTP の認証情報(ユーザー名・パスワード・TLS 設定)を再確認
- ポート制限:ポート 25 がブロックされている場合は 587(TLS)や 465(SSL)を使用
- 添付サイズ制限:SMTP サーバーの制限に注意。大きなファイルは圧縮や分割を検討
- 認証情報の安全管理:コードへの埋め込みは避け、環境変数や安全な設定ファイルへ
- MIME タイプの誤認識:ファイル名に正しい拡張子を含める
Spire.Email を使えば、これらの問題にもスマートに対応できます。
7. まとめと次のステップ
今回は、Spire.Email for .NET を使って、C# で添付ファイル付きメールを送信する方法を一通り紹介しました。ローカルファイル、ストリーム、Outlook 対応まで、実用的なパターンに対応しています。
.NET アプリでメール機能を簡単に導入したい方は、一時ライセンスを申請 してぜひお試しください。
8. よくある質問(FAQ)
❓ C# でファイルを添付してメール送信するには?
message.Attachments.Add(new Attachment(@"file.pdf"));
メモリストリームやバイト配列からの添付にも対応しています。
❓ 添付付きメールの送信方法は?
添付後に SmtpClient.SendOne() を使って送信します。SMTP の設定や認証情報を正しく構成してください。
❓ .NET Core でも使えますか?
はい。Spire.Email for .NET は .NET Core, .NET Standard, .NET 5+, .NET Framework, ASP.NET, MonoAndroid, Xamarin.iOS に対応しています。
❓ Excel ファイルも添付できますか?
もちろん可能です:
message.Attachments.Add(new Attachment(@"report.xlsx"));
有効なファイルパスを指定し、アプリからアクセス可能である必要があります。