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

时间:2011-09-01 10:42:32

标签: c# .net asp.net-mvc 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时,这将返回一个空字符串。

8 个答案:

答案 0 :(得分:16)

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

您可以像这样指定凭据:

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

希望这有帮助。

答案 1 :(得分:6)

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

答案 2 :(得分:5)

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

<system.net>
<mailSettings>
  <smtp from="SystemAdmin@domain.do">
    <!--network host="EXCH-SERVER" port="25" userName="userName" password="password" defaultCredentials="false" /-->
    <network host="EXCH-SERVER" port="25" />
  </smtp>
</mailSettings>

答案 3 :(得分:1)

如果您已尝试所有内容并且仍然失败,则可能是服务器仅接受匿名用户。如果您尝试使用凭据进行连接:

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

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

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

  • defaultCredentials="false"

答案 4 :(得分:1)

对我而言,它使用了不同的凭据 -

在我使用的网络凭证中 -

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);

                }

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

有同样的问题 - 来自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;

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

答案 7 :(得分:0)

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