.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”标记。