.NET SMTP客户端 - 客户端无权发送此发件人
当我试图通过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
时,这是返回一个空字符串。
邮件服务器可能不支持发送匿名邮件,并且需要指定在邮件服务器上注册的凭证。
您可以指定凭据,像这样:
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential("username", "password");
希望这有助于。
嗨,但是我可以使用邮件服务器,而无需在我的开发机器或其他服务器上提供网络凭证。只有在Win2008服务器上,我遇到了问题。 – StrictlySocial
@StrictlySocial - 用于应用程序池标识的已配置帐户是否可能缺乏足够的特权? – jdavies
目前它被设置为ApplicationPoolIdentity - 我必须承认,当它达到IIS中的这个级别时,我迷路了 – StrictlySocial
什么是User.Identity.IsAuthenticated返回,如果它返回false,那是你的问题。您正尝试以未经身份验证的用户身份发送邮件。
嗨,它返回false。我将如何去回归真实?据我所知,Windows身份验证已启用。在web.config中,我有以下
您还需要禁用匿名身份验证。我通常通过IIS管理GUI而不是web.config在IIS级别执行此操作。你也是在这种情况下User.Identity.Name是一个空字符串,我希望它是空的。 –
在IIS7 GUI中,我禁用了Anonymouse身份验证,ASP.NET模拟和表单身份验证。只有Windows身份验证已启用。 – StrictlySocial
如果您使用的是交换服务器,并且登录帐户和发件人电子邮件不同,您将收到错误“无权发送...”。这是因为帐户权限。您必须授予登录帐户的“发送为”权限。
谢谢,这是有帮助的。看起来这里是关于如何授予权限的文章 - http://tom.603global.com/KB/a8/how-to-grant-send-as-permissions-one-account-ms-exchange.aspx。请注意,您需要访问AD和邮件服务器才能执行此操作,但这并不总是可用。 –
我解决这个问题,从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>
如果你有尝试一切,它仍然是失败的,一种可能性是,服务器只接受匿名用户。如果您尝试使用凭证连接:
defaultCredentials="true"
defaultCredentials="false" userName="foo" password="false"
则服务器将返回错误.NET SMTP Client - Client does not have permissions to send as this sender
。
这是不可思议的,但作为最后的手段,只是尽量简单:
defaultCredentials="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;
根据您的配置,您可能需要取消注释最后一行。
对我来说,它是使用不同的凭据 -
在网络凭据我用 -
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);
}
简单的解决方法是保留两个相同的网络凭据的一个邮件。
我有同样的问题。由于发件人地址与网络凭证不同,身份验证将失败。有没有解决的办法 ?请指导。 – juilee
有一件事情是使用Visual Studio 2013运行包为我工作的。 我在SMTP连接管理器编辑器中删除了“使用Windows身份验证”标签。
奇怪的是,您得到一个空的身份名称,尝试禁用匿名帐户,并让Web应用程序冒充某个用户,看看它是否工作。 –
嗨,如果我用以下代替:client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential(“myAccount”,“myPassword”,“myDomain”); 电子邮件通过罚款。 – StrictlySocial
好的,但我不会把代码中的pwd和用户名,在最小的web配置使用! –