2011-09-01 246 views
20

当我试图通过ASP MVC3项目使用SmtpClient类发送电子邮件时,我在服务器上发生了奇怪的事件。这是我正在使用的代码。.NET SMTP客户端 - 客户端无权发送此发件人

try 
{ 
    var client = new SmtpClient("MailServer"); 
    client.UseDefaultCredentials = true; 

    MailMessage message = new MailMessage("[email protected]", "[email protected]", "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时,这是返回一个空字符串。

+0

奇怪的是,您得到一个空的身份名称,尝试禁用匿名帐户,并让Web应用程序冒充某个用户,看看它是否工作。 –

+0

嗨,如果我用以下代替:client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential(“myAccount”,“myPassword”,“myDomain”); 电子邮件通过罚款。 – StrictlySocial

+0

好的,但我不会把代码中的pwd和用户名,在最小的web配置使用! –

回答

15

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

您可以指定凭据,像这样:

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

希望这有助于。

+1

嗨,但是我可以使用邮件服务器,而无需在我的开发机器或其他服务器上提供网络凭证。只有在Win2008服务器上,我遇到了问题。 – StrictlySocial

+0

@StrictlySocial - 用于应用程序池标识的已配置帐户是否可能缺乏足够的特权? – jdavies

+0

目前它被设置为ApplicationPoolIdentity - 我必须承认,当它达到IIS中的这个级别时,我迷路了 – StrictlySocial

0

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

+0

嗨,它返回false。我将如何去回归真实?据我所知,Windows身份验证已启用。在web.config中,我有以下 StrictlySocial

+0

您还需要禁用匿名身份验证。我通常通过IIS管理GUI而不是web.config在IIS级别执行此操作。你也是在这种情况下User.Identity.Name是一个空字符串,我希望它是空的。 –

+0

在IIS7 GUI中,我禁用了Anonymouse身份验证,ASP.NET模拟和表单身份验证。只有Windows身份验证已启用。 – StrictlySocial

6

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

+0

谢谢,这是有帮助的。看起来这里是关于如何授予权限的文章 - http://tom.603global.com/KB/a8/how-to-grant-send-as-permissions-one-account-ms-exchange.aspx。请注意,您需要访问AD和邮件服务器才能执行此操作,但这并不总是可用。 –

5

我解决这个问题,从web.config中删除

认证证书
<system.net> 
<mailSettings> 
    <smtp from="[email protected]"> 
    <!--network host="EXCH-SERVER" port="25" userName="userName" password="password" defaultCredentials="false" /--> 
    <network host="EXCH-SERVER" port="25" /> 
    </smtp> 
</mailSettings> 

1

如果你有尝试一切,它仍然是失败的,一种可能性是,服务器只接受匿名用户。如果您尝试使用凭证连接:

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

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

这是不可思议的,但作为最后的手段,只是尽量简单:

  • defaultCredentials="false"
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; 

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

0

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

在网络凭据我用 -

new NetworkCredential(smtpUser, smtpPassword) 

和FROMADDRESS

var fromAddress = new MailAddress("[email protected]", string.Empty); 

,其中,发送电子邮件,其中FROMADDRESS比实际不同的时网络凭证将导致此问题。 见下文 -

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

       } 

简单的解决方法是保留两个相同的网络凭据的一个邮件。

+0

我有同样的问题。由于发件人地址与网络凭证不同,身份验证将失败。有没有解决的办法 ?请指导。 – juilee

0

有一件事情是使用Visual Studio 2013运行包为我工作的。 我在SMTP连接管理器编辑器中删除了“使用Windows身份验证”标签。

相关问题