首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 發送電子郵件完整教學:System.Web.Mail 與現代替代方案

     編輯:關於C語言

前言

.NET Framework 早期透過 `System.Web.Mail` 命名空間提供郵件發送功能,雖已標記為過時(Obsolete),但在維護 .NET Framework 2.0/3.5 專案時仍常見。本文完整說明其用法,並對比現代 `System.Net.Mail` 與第三方庫的最佳實踐。

System.Web.Mail 核心三類別

類別用途
MailMessage構建郵件內容(寄件者、收件者、主旨、本文、附件、優先權等)
MailAttachment構建附件
SmtpMail發送郵件(靜態類別,設定 SMTP 伺服器)

完整發送範例

using System.Web.Mail;

public void SendEmailLegacy()
{
    MailMessage msg = new MailMessage();
    msg.From = "sender@company.com";
    msg.To = "receiver1@company.com;receiver2@company.com"; // 分號分隔
    msg.Cc = "cc@company.com";
    msg.Subject = "測試郵件 - System.Web.Mail";
    msg.Body = "這是純文字內文";
    msg.BodyFormat = MailFormat.Text; // 或 MailFormat.Html
    msg.Priority = MailPriority.High;

    // 附件
    string attachPath = @"D:\test\report.pdf";
    MailAttachment attachment = new MailAttachment(attachPath);
    msg.Attachments.Add(attachment);

    // SMTP 設定
    SmtpMail.SmtpServer = "smtp.company.com"; // 或 IP
    // 若需認證,需在 machine.config / web.config 設定
    // 

    SmtpMail.Send(msg);
}

MailMessage 常用屬性速查

  • From:寄件者 Email
  • To、Cc、Bcc:以分號 `;` 分隔多位址
  • Subject:主旨
  • Body:內文
  • BodyFormat:`MailFormat.Text` / `MailFormat.Html`
  • Priority:`MailPriority.Low/Normal/High`
  • Attachments:`MailAttachment` 集合

⚠ 重大限制與棄用警告

  1. 已標記 Obsolete:.NET Framework 4.0+ 建議改用 `System.Net.Mail`。
  2. 不支援 SSL/TLS 直接設定:需透過 `machine.config` 或 IIS SMTP 服務轉發。
  3. 無非同步發送:`Send` 會阻塞執行緒。
  4. 編碼問題:中文主旨/附件檔名易亂碼,需手動 Base64/Quoted-Printable 編碼。
  5. 僅相容 .NET Framework:.NET Core / .NET 5+ 不包含此命名空間。

現代標準:System.Net.Mail (推薦)

using System.Net;
using System.Net.Mail;

public async Task SendEmailModernAsync()
{
    using var msg = new MailMessage
    {
        From = new MailAddress("sender@company.com", "發送者名稱"),
        Subject = "測試郵件 - System.Net.Mail",
        Body = "

HTML 內文

支援中文

", IsBodyHtml = true, Priority = MailPriority.Normal }; msg.To.Add("receiver@company.com"); msg.CC.Add("cc@company.com"); msg.Attachments.Add(new Attachment(@"D:\test\report.pdf")); using var smtp = new SmtpClient("smtp.company.com", 587) { Credentials = new NetworkCredential("user", "pwd"), EnableSsl = true, // 關鍵:啟用 STARTTLS DeliveryMethod = SmtpDeliveryMethod.Network, Timeout = 30000 }; await smtp.SendMailAsync(msg); // 非同步,不阻塞 }

進階功能對比

功能System.Web.MailSystem.Net.Mail
SSL/TLS不支援(需外部 Relay)原生 `EnableSsl=true`
非同步無`SendMailAsync`
認證僅透過 config程式碼直接設定 `Credentials`
嵌入圖片困難`AlternateView` + `LinkedResource`
多檔附件支援支援
.NET Core 支援無完整支援

生產級建議:第三方庫與雲端服務

  • MailKit:跨平台、功能最完整的開源 MIME/SMTP/IMAP/POP3 庫,支援 OAuth2、DKIM、S/MIME。nuget install MailKit
  • FluentEmail:鏈式語法、Razor 模板、多發送器抽象(SMTP、SendGrid、Mailgun、Postmark)。
  • 雲端郵件服務:SendGrid、Mailgun、Amazon SES、Postmark、Azure Communication Services —— 高送達率、退信追蹤、模板管理、API 驅動,免維護 SMTP 伺服器。

總結

`System.Web.Mail` 曾是經典選擇,但已不適合新專案。請直接採用 `System.Net.Mail` 或 MailKit/FluentEmail 結合雲端郵件服務,獲得安全、非同步、可維護、跨平台的郵件發送能力。維護舊代碼時,若遇編碼/SSL 問題,優先規劃遷移而非修補。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved