在 .NET 7 中,用 MailKit 寄信遇到 The SMTP server does not support authentication 錯誤

在 NET Core 上面,連到 SMTP Server 進行寄信操作,微軟已經不推薦使用System.Net.Mail.SmtpClient 來進行。

file

文中簡單寫的理由也只是 SmtpClient 不支援許多新式的通訊協定。
其對我現在做的內部服務來說,急迫性不高。
不過換一下不會花多少時間,也能避免未來可能被弱點掃描當成扣分的項目XD

安裝

在安裝時可能會看到 MimeKit 、 MailKit 名字相似。
MailKit 底層就是呼叫 MimeKit 這個 C# Libary,

在專案中直接用 NuGet 安裝 [MailKit] 就可以了(https://github.com/jstedfast/MailKit)。
file

程式碼範例

GitHub

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() 這段就可以了

資料來源

Facebook留言板