在 NET Core 上面,連到 SMTP Server 進行寄信操作,微軟已經不推薦使用System.Net.Mail.SmtpClient 來進行。
文中簡單寫的理由也只是 SmtpClient 不支援許多新式的通訊協定。
其對我現在做的內部服務來說,急迫性不高。
不過換一下不會花多少時間,也能避免未來可能被弱點掃描當成扣分的項目XD
安裝
在安裝時可能會看到 MimeKit 、 MailKit 名字相似。
MailKit 底層就是呼叫 MimeKit 這個 C# Libary,
在專案中直接用 NuGet 安裝 [MailKit] 就可以了(https://github.com/jstedfast/MailKit)。
程式碼範例
var message = new MimeMessage();
var fromEmail = new MailboxAddress("劉長庚", "dannyliu@test.com");
var toEmail = new MailboxAddress("測試信箱", "dannytest@test.com");
message.From.Add(fromEmail);
message.To.Add(toEmail);
message.Subject = "主旨:測試 MimeKit";
var builder = new BodyBuilder
{
HtmlBody = @"<p>使用 MimeKit 進行 SMTP 寄信</p>"
};
message.Body = builder.ToMessageBody();
using (var client = new MailKit.Net.Smtp.SmtpClient())
{
try
{
client.Connect("123.234.222.113", 465, true);
// 設定傳送人的信箱帳號密碼
// IIS SMTP 預設不用帳號密碼,跟用舊的 SmtpClient 不同, 此時在 Mailkit 中仍傳驗證的話會報錯,此時可直接註解這段...
client.Authenticate(new System.Net.NetworkCredential("dannyliu@test.com", "yourPassword"));
client.Send(message);
Console.WriteLine($"成功:寄給 {toEmail.Name} 主旨:{message.Subject}");
}
catch (Exception ex)
{
Console.WriteLine("失敗!");
Console.WriteLine(ex.ToString());
}
}
遇到 The SMTP server does not support authentication 錯誤
錯誤訊息:
“title”: “The SMTP server does not support authentication.”, “status”: 500,
“detail”: " at MailKit.Net.Smtp.SmtpClient.ValidateArguments(Encoding encoding, ICredentials credentials)
at MailKit.Net.Smtp.SmtpClient.Authenticate(Encoding encoding, ICredentials credentials, CancellationToken cancellationToken) at MailKit.MailService.Authenticate(ICredentials credentials, CancellationToken cancellationToken)
一開始看到這個訊息其實滿頭問號,查到的答案是 IIS SMTP Server 預設不會驗證帳號密碼
當不需要密碼時仍傳密碼的話,傳統的 SmtpClient 是可以正常使用
但 Mailkit 這邊會報錯…,直接註解 client.Authenticate()
這段就可以了