使用C# SmtpClient发邮件报5.7.54错误,求排查配置遗漏
SMTP无法中继收件人错误的配置遗漏分析
问题场景
使用以下C#代码发送邮件:
SmtpClient smtpClient = new SmtpClient(SMTPServer, SMTPPort); smtpClient.UseDefaultCredentials = true; smtpClient.Credentials = new NetworkCredential(SMTPUserName, SMTPassword); MailAddress mailAddress = null; if (!string.IsNullOrEmpty(sFromEmail)) mailAddress = new MailAddress(sFromEmail); else mailAddress = new MailAddress(SMTPEmailID); MailMessage mailMessage = new MailMessage(); mailMessage.From = mailAddress; mailMessage.Subject = sEmailSubject; foreach (string toAddress in sToEmail.Split(';')) { if (toAddress.Trim() != string.Empty) mailMessage.To.Add(toAddress); } mailMessage.IsBodyHtml = true; mailMessage.Body = sEmailBody; smtpClient.Send(mailMessage); logText.Add(Environment.NewLine); logText.Add("Mail sent successfully at " + DateTime.Now.ToString()); logCreation.createLogFileFromList(logText); logText.Clear(); sErrorMessage = "Mail sent successfully";
执行后出现错误:
Mailbox unavailable. The server response was: 5.7.54 SMTP; Unable to relay recipient in non-accepted domain
遗漏的配置/错误点
- 认证属性冲突:同时设置
UseDefaultCredentials = true和Credentials会导致认证逻辑混乱,应该将UseDefaultCredentials设为false,确保使用指定的账号密码进行认证。 - 缺少加密配置:多数现代SMTP服务器(如Office 365、企业自建服务器)强制要求SSL/TLS加密,需添加
smtpClient.EnableSsl = true;,并确保使用对应加密端口(如587、465)。 - SMTP服务器中继权限不足:错误核心是服务器不允许中继非信任域的收件人,需在SMTP服务器端配置:
- 允许当前认证账号向外部域发送邮件(开启中继权限)
- 将发件人所在域添加到服务器的“接受域”列表
- 发件人地址与认证账号不匹配:部分企业SMTP服务要求发件人
From地址必须与认证账号SMTPUserName属于同一域,否则会拒绝中继请求,需确保两者域名一致。
修正后的关键代码示例
SmtpClient smtpClient = new SmtpClient(SMTPServer, SMTPPort); smtpClient.UseDefaultCredentials = false; // 禁用默认凭证 smtpClient.Credentials = new NetworkCredential(SMTPUserName, SMTPassword); smtpClient.EnableSsl = true; // 启用SSL加密(根据服务器要求调整) // 后续邮件构建逻辑保持不变
内容的提问来源于stack exchange,提问作者Sachu
相关产品推荐
相关产品推荐

