使用 `System.Web.Mail`(.NET Framework 1.x/2.0 相容)或現代 `System.Net.Mail.SmtpClient`。核心在於 **SMTP 驗證** 設定。
using System.Web.Mail;
public void SendViaExternalSmtp() {
MailMessage msg = new MailMessage();
msg.From = "yourname@126.com";
msg.To = "target@example.com";
msg.Subject = "測試郵件";
msg.BodyFormat = MailFormat.Text;
msg.Body = "內容測試";
// 關鍵:SMTP 驗證欄位
msg.Fields.Add("https://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); // 1 = Basic
msg.Fields.Add("https://schemas.microsoft.com/cdo/configuration/sendusername", "yourname");
msg.Fields.Add("https://schemas.microsoft.com/cdo/configuration/sendpassword", "yourpassword");
SmtpMail.SmtpServer = "smtp.126.com"; // 或 smtp.gmail.com:587
SmtpMail.Send(msg);
}
using System.Net.Mail;
using System.Net;
public void SendModern(string smtpHost, int port, string user, string pass, bool enableSsl) {
using (var client = new SmtpClient(smtpHost, port)) {
client.Credentials = new NetworkCredential(user, pass);
client.EnableSsl = enableSsl; // Gmail/Outlook 必須 true
client.DeliveryMethod = SmtpDeliveryMethod.Network;
var msg = new MailMessage {
From = new MailAddress(user, "顯示名稱"),
Subject = "測試",
Body = "HTML 內容
",
IsBodyHtml = true
};
msg.To.Add("target@example.com");
client.Send(msg); // 或 client.SendMailAsync(msg)
}
}
適用於:伺服器端批量發送、不想管理外部帳密、需高吞吐量。
// System.Web.Mail
SmtpMail.SmtpServer = "localhost";
SmtpMail.Send(msg); // 瞬間回傳,實際投遞由 SMTP 服務背景處理
// System.Net.Mail
var client = new SmtpClient("localhost", 25) { DeliveryMethod = SmtpDeliveryMethod.Network };
client.Send(msg);
| 維度 | 外部 SMTP (驗證) | 本機 IIS SMTP |
|---|---|---|
| 發送速度(回傳) | 較慢(需握手、驗證、排隊) | 極快(寫入 Pickup 目錄即返回) |
| 真實投遞率 | 高(信譽由提供商維護) | 低(需自建 SPF/DKIM/DMARC、IP 信譽、反向解析) |
| 帳密管理 | 需安全儲存 | 無 |
| 附件/大郵件 | 受提供商限制 | 僅受磁碟/記憶體限制 |
| 適用場景 | 一般應用、交易郵件、通知信 | 內部系統、大量行銷信、日誌通知 |
| 風險 | 帳號被鎖、每日額度限制 | IP 被列入黑名單、垃圾郵件投訴、開放轉送濫用 |
public interface IMailSender {
Task SendAsync(MailMessage msg);
}
public class SmtpMailSender : IMailSender { /* 包裝 SmtpClient */ }
public class PickupMailSender : IMailSender { /* 寫入 Pickup 目錄 .eml */ }
// 依設定注入:交易信走 SMTP,大量通知走 Pickup + 背景服務輪詢發送