.NET 6使用System.Net.Mail发邮件遇5.7.57认证错误求助
我尝试通过System.Net.Mail发送邮件,代码如下:
var to = new MailAddress(notification.SendTo); var from = new MailAddress(_smtpSettings.SMTPSendFrom); var message = new MailMessage(from, to) { Subject = notification.Subject, Body = notification.Message, IsBodyHtml = true }; var client = new SmtpClient() { Host = _smtpSettings.SMTPServer, Port = _smtpSettings.SMTPPort, EnableSsl = _smtpSettings.SMTPUseSSL, UseDefaultCredentials = false, DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network }; if (_smtpSettings.SMTPDomain == string.Empty) { client.Credentials = new NetworkCredential(_smtpSettings.SMTPLogin, _smtpSettings.SMTPPassword); } else { client.Credentials = new NetworkCredential(_smtpSettings.SMTPLogin, _smtpSettings.SMTPPassword, _smtpSettings.SMTPDomain); } client.Send(message);
运行时遇到错误:5.7.57 Client was not authenticated to send anonymous MAIL FROM
我已参数化所有可配置的设置,尝试过传递域名、切换UseDefaultCredentials的true/false值。另外,我有一个PowerShell脚本,使用同一账号在同一机器上可成功发送邮件(我登录时运行脚本,而应用程序通过应用池ID登录)。补充信息:邮件服务器为Exchange服务器,发送机器是Azure托管Web服务器。
解决方案建议
检查应用池身份的Exchange权限:PowerShell脚本用你的登录账号运行,而应用程序依赖应用池ID。Exchange可能限制了该应用池对应AD账号的SMTP发信权限,需要在Exchange后台为该账号配置允许发信的权限,或者将应用池身份切换为能成功发信的账号(注意评估安全风险)。
核对SMTP端口与SSL配置:Exchange的SMTP常用端口为587(STARTTLS)或465(SSL),确保配置的
Port和EnableSsl与Exchange服务器要求完全匹配。例如使用587端口时,EnableSsl需设为true,确保先建立TLS连接再执行认证。显式指定NTLM认证规则:针对Exchange服务器,可尝试强制设置认证方式为NTLM,在配置
Credentials后添加以下代码:client.TargetName = "NTLM/" + _smtpSettings.SMTPServer;验证发件人地址与认证账号的一致性:Exchange可能要求发件人地址(
SMTPSendFrom)必须与认证账号(SMTPLogin)对应的邮箱一致,或者需要在Exchange中配置该账号允许代发目标地址的邮件。捕获详细异常定位问题:在发送代码外层添加异常捕获,获取更精准的错误信息:
try { client.Send(message); } catch (SmtpException ex) { // 记录ex.StatusCode、完整错误信息及堆栈 throw; }
内容的提问来源于stack exchange,提问作者Steve Schlichter

