. net SMTP客户端-客户端没有作为发件人发送的权限

本文关键字:客户端 权限 SMTP net | 更新日期: 2023-09-27 18:07:28

当我试图通过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时,这返回一个空字符串。

. net SMTP客户端-客户端没有作为发件人发送的权限

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

您可以这样指定凭据:

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

如果您使用的是exchange服务器,并且登录帐户和发件人电子邮件不同,您将得到错误"does not have permissions to send…"这是由于帐户权限的原因。您必须授予登录帐户"send as"权限。

我解决了这个问题,从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>

如果您尝试了所有方法,但仍然失败,一种可能性是服务器只接受匿名用户。如果您尝试连接凭据:

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

and in 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,那是你的问题。您正在尝试以未经身份验证的用户发送邮件。

有同样的问题-来自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身份验证"标签。