純 Socket 實作 SMTP 協定(RFC 5321),無第三方依賴,支援:
EHLO)與 AUTH LOGIN 驗證
public class MailSender {
// 伺服器設定
public string Server { get; set; } = "";
public int Port { get; set; } = 25;
public string UserName { get; set; } = "";
public string PassWord { get; set; } = "";
// 郵件內容
public string From { get; set; } = "";
public string To { get; set; } = "";
public string Subject { get; set; } = "";
public string Body { get; set; } = "";
public string HtmlBody { get; set; } = "";
public bool IsHtml { get; set; } = false;
public string LanguageEncoding { get; set; } = "GB2312";
public string MailEncoding { get; set; } = "8bit";
public int Priority { get; set; } = 3;
// 附件集合
public IList Attachments { get; } = new ArrayList();
public void SendMail() { /* 核心流程 */ }
}
public struct AttachmentInfo {
public string FileName { get; set; } // 自動取檔名
public string Bytes { get; set; } // Base64 字串
// 多種建構方式
public AttachmentInfo(string path) { /* 讀檔→Base64 */ }
public AttachmentInfo(string fileName, Stream stream) { /* 讀流→Base64 */ }
public AttachmentInfo(string fileName, byte[] bytes) { /* 直接 Base64 */ }
}
// 分塊寫入(每 75 bytes),避免單次寫入過大
protected void WriteString(NetworkStream ns, string str) {
str += "\r\n";
byte[] data = Encoding.GetEncoding(LanguageEncoding).GetBytes(str);
// 分頁寫入邏輯...
}
// 讀取回應
protected string ReadString(NetworkStream ns) {
byte[] buf = new byte[1024];
int len = ns.Read(buf, 0, buf.Length);
return len > 0 ? Encoding.Default.GetString(buf, 0, len) : null;
}
// 指令發送與狀態碼驗證
protected bool Command(NetworkStream ns, string cmd, string expectedCode) {
WriteString(ns, cmd);
string resp = ReadString(ns);
return resp?.IndexOf(expectedCode) >= 0;
}
// Base64 編碼
protected string ToBase64(string s) {
return Convert.ToBase64String(Encoding.Default.GetBytes(s));
}
var ms = new MailSender {
Server = "smtp.gmail.com",
Port = 587, // 或 465 SSL
UserName = "your@gmail.com",
PassWord = "app-password",
From = "your@gmail.com",
To = "target@example.com",
Subject = "測試郵件",
Body = "純文字內容",
HtmlBody = "HTML 內容
",
IsHtml = true,
LanguageEncoding = "UTF-8"
};
ms.Attachments.Add(new MailSender.AttachmentInfo(@"C:\report.pdf"));
ms.Attachments.Add(new MailSender.AttachmentInfo("logo.png", File.OpenRead(@"C:\logo.png")));
try {
ms.SendMail();
Console.WriteLine("發送成功");
} catch (Exception ex) {
Console.WriteLine($"失敗: {ex.Message}");
}
| 議題 | 說明 | 建議 |
|---|---|---|
| SSL/TLS | 原碼使用明文 TCP,Gmail/Outlook 等強制加密 | 改用 SslStream 包裝 NetworkStream,或直接用 SmtpClient / MailKit |
| 編碼 | 預設 GB2312,國際郵件易亂碼 | 統一使用 UTF-8,標頭以 `=?UTF-8?B?...?=` 編碼 |
| 大附件 | 全量載入記憶體再 Base64,記憶體壓力大 | 串流分塊 Base64 編碼,或改用 MailKit 的 MIME 串流 |
| 異步/取消 | 同步阻塞呼叫 | 改用 MailKit 非同步 API + CancellationToken |
| DKIM/SPF/DMARC | 無簽名支援,進垃圾箱機率高 | 使用成熟庫(MailKit/MimeKit)並配置簽名 |