.NET SMTP客户端 – 客户端无权作为此发件人发送

当我尝试通过ASP MVC3项目使用SmtpClient类发送电子邮件时,我的服务器上出现了奇怪的现象。 这是我正在使用的代码。

try { var client = new SmtpClient("MailServer"); client.UseDefaultCredentials = true; MailMessage message = new MailMessage("me@mydomain.com", "friend@mydomain.com", "Test Message", "Test Body"); client.Send(message); } catch (Exception ex) { // Do Nothing } 

我已经部署在三个环境中; 在Windows 7上(使用VS 2010 IIS)它发送电子邮件很好,在Windows 2003 IIS6机器上它发送电子邮件很好,最后在Windows 2008 R2 II7服务器上我收到以下错误:

 Mailbox unavailable. The server response was: 5.7.1 Client does not have permissions to send as this sender using username 

任何人都可以就可能造成这种情况的原因提出建议。 我注意到当我查看User.Identity.Name ,这将返回一个空字符串。

邮件服务器可能不支持发送匿名电子邮件,并且需要指定在邮件服务器上注册的凭据。

您可以像这样指定凭据:

 client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential("username", "password"); 

希望这可以帮助。

如果您使用的是Exchange服务器且登录帐户和发件人电子邮件不同,则会收到错误“无权发送…”。 这是因为帐户权限。 您必须向登录帐户授予“发送为”权限。

我解决了从web.config中删除身份validation凭据的问题

        

如果你已经尝试了所有东西并且它仍然失败,那么一种可能性是服务器只接受匿名用户。 如果您尝试连接凭据:

  • defaultCredentials="true"
  • defaultCredentials="false" userName="foo" password="false"

然后服务器将返回错误.NET SMTP Client - Client does not have permissions to send as this sender

这很奇怪,但作为最后的手段,只需尝试简单:

  • defaultCredentials="false"

对我来说,它使用不同的凭据 –

在我使用的网络凭证中 –

 new NetworkCredential(smtpUser, smtpPassword) 

并在fromAddress中

  var fromAddress = new MailAddress("anotheruser@gmail.com", string.Empty); 

在发送电子邮件时,fromAddress与实际网络凭据不同将导致此问题。 见下文 –

  using (var message = new System.Net.Mail.MailMessage(fromAddress, toAddress) { Subject = Keys.MailSubject, Body = body, IsBodyHtml = true }) { smtp.Send(message); } 

简单的解决方法是将两个邮件保持为网络凭证的一个。

User.Identity.IsAuthenticated返回什么,如果它返回false就是你的问题。 您正在尝试以未经身份validation的用户身份发送邮件。

有同样的问题 – 来自ASP.Net的凭证永远不会成为可以在我的环境中发送电子邮件的东西。 所以我在混乱中找到了这条路径(其中还包括NTLM并不总是正常工作的可能性以及我将邮件配置信息放在web.config中):

 System.Net.Configuration.SmtpSection section = ConfigurationManager.GetSection("system.net/mailSettings/smtp") as System.Net.Configuration.SmtpSection; // set up SMTP client SmtpClient smtp = new SmtpClient(); System.Net.CredentialCache myCache = new System.Net.CredentialCache(); NetworkCredential myCred = new NetworkCredential(section.Network.UserName, section.Network.Password); string host = section.Network.Host; int port = section.Network.Port; // do this because NTLM doesn't work in all environments.... if (myCred != null) { myCache.Add(host, port, "Digest", myCred); myCache.Add(host, port, "Basic", myCred); myCache.Add(host, port, "Digest-MD5", myCred); myCache.Add(host, port, "Digest MD5", myCred); myCache.Add(host, port, "Plain", myCred); myCache.Add(host, port, "Cram-MD5", myCred); myCache.Add(host, port, "Cram MD5", myCred); myCache.Add(host, port, "Login", myCred); //myCache.Add(host, port, "NTLM", myCred); } smtp.Credentials = myCache; smtp.UseDefaultCredentials = false; //smtp.EnableSsl = true; 

根据您的配置,您可能需要取消注释最后一行。

使用Visual Studio 2013运行包有一件事对我有用。 我删除了SMTP连接管理器编辑器中的“使用Windows身份validation”标记。