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=&#39;font-family:Meiryo, sans-serif; font-size:14px; color:#333; line-height:1.8;&#39;>" + "<p>関係者各位</p>" + "<p>いつもお世話になっております。</p>" + "<p>2025年6月分の<strong style=&#39;color:#2E86C1;&#39;>月次レポート</strong>を添付いたしましたので、ご確認ください。</p>" + "<p>ご不明な点がございましたら、お気軽にご連絡ください。</p>" + "<p style=&#39;margin-top:30px;&#39;>どうぞよろしくお願いいたします。</p>" + "<p style=&#39;font-style:italic; color:#555;&#39;>送信者名</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=&#39;font-family:Meiryo, sans-serif; font-size:14px; color:#333; line-height:1.8;&#39;> <p>{greetingName}</p> <p>いつも大変お世話になっております。</p> <p>2025年第2四半期の<strong>プロジェクト進捗報告書</strong>を添付いたします。内容は以下の通りです:</p> <ul style=&#39;padding-left:20px; margin:0;&#39;> <li>達成したマイルストーン</li> <li>未完了のタスク</li> <li>主要な考察・所見</li> </ul> <p>ご質問やご不明点などがございましたら、お気軽にご連絡ください。</p> <p style=&#39;margin-top:30px;&#39;>引き続きどうぞよろしくお願いいたします。<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")); 有効なファイルパスを指定し、アプリからアクセス可能である必要があります。