System.Net.Mail.SmtpClient + MailMessage.NET 2.0+ 建議使用 System.Net.Mail 命名空間,舊版 System.Web.Mail 已標記過時。
using System.Net;
using System.Net.Mail;
public void SendEmail()
{
var msg = new MailMessage();
msg.To.Add("recipient@gmail.com");
msg.From = new MailAddress("sender@gmail.com", "顯示名稱", Encoding.UTF8);
msg.Subject = "測試郵件";
msg.SubjectEncoding = Encoding.UTF8;
msg.Body = "HTML 內容
支援中文
";
msg.BodyEncoding = Encoding.UTF8;
msg.IsBodyHtml = true;
msg.Priority = MailPriority.High;
using (var client = new SmtpClient())
{
client.Host = "smtp.gmail.com";
client.Port = 587; // TLS port
client.EnableSsl = true; // 必須啟用
client.Credentials = new NetworkCredential("sender@gmail.com", "應用程式密碼"); // 非帳號密碼
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Timeout = 30000;
try
{
client.Send(msg);
Console.WriteLine("發送成功");
}
catch (SmtpException ex)
{
Console.WriteLine($"SMTP 錯誤: {ex.StatusCode} - {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"一般錯誤: {ex.Message}");
}
}
}
| 現象 | 原因 | 解決 |
|---|---|---|
| Authentication failed / 535 | 使用帳號密碼而非應用程式密碼;或未開啟「低安全性應用程式存取權」 | Google/Gmail/Outlook 皆需建立**應用程式密碼**(App Password),或使用 OAuth 2.0 |
| EHLO 回應錯誤 / 主機名稱包含中文 | SmtpClient 送出 EHLO <MachineName>,電腦名稱含中文導致 SMTP 伺服器拒絕 | 將電腦名稱改為純英文/數字,或設定 client.Host 為 IP(不推薦) |
| 憑證驗證失敗 | 公司防火牆/Proxy 進行 SSL 攔截,導致遠端憑證不受信 | 加入 ServicePointManager.ServerCertificateValidationCallback += (s,c,h,e) => true;(僅測試環境),生產環境請匯入正確根憑證 |
msg.Attachments.Add(new Attachment(@"C:\file.pdf"));AlternateView + LinkedResource 設定 ContentId,HTML 中 `await client.SendMailAsync(msg);(.NET 4.5+),避免阻塞 UI 執行緒SmtpClient 實例重用連線,配合 SemaphoreSlim 限制併發數掌握「SSL/TLS 設定、認證方式、電腦名稱編碼」三大關鍵,即可解決 90% 的發送失敗案例。生產系統建議引入 FluentEmail、MailKit 等成熟庫,支援 OAuth、DKIM、模板引擎等企業級功能。