【问题标题】:.NET SMTP Client - Client does not have permissions to send as this sender.NET SMTP 客户端 - 客户端无权作为此发件人发送
【发布时间】:2011-11-08 07:26:35
【问题描述】:

当我尝试通过 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 NetworkCredential("myAccount", "myPassword", "myDomain");电子邮件发送正常。
  • 好的,但我不会把密码和用户名放在代码中,至少使用网络配置!
  • 你可能想看看这个问题并回答:stackoverflow.com/questions/5028728/c-how-to-send-email
  • 嗨,我看过那个问题,但我不确定它是否相关。顺便说一句,代码中的密码/用户名仅用于测试;)

标签: c# .net asp.net-mvc smtp


【解决方案1】:

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

您可以像这样指定凭据:

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

希望这会有所帮助。

【讨论】:

  • 嗨,但是当我在我的开发机器或我们的其他服务器之一上时,我可以使用邮件服务器而无需提供网络凭据。我只是在Win2008服务器上遇到问题。
  • @StrictlySocial - 用于应用程序池身份的配置帐户是否可能缺少足够的权限?
  • 目前它被设置为 ApplicationPoolIdentity - 我必须承认,当它在 IIS 中达到这个级别时,我迷路了
  • @StrictlySocial - 您需要为应用程序池 (ApplicationPoolIdentity) 指定一个帐户,该帐户具有使用邮件服务器发送电子邮件的必要权限,或者将您的邮件服务器配置为允许从以当前状态将 Web 服务器连接到邮件服务器。
  • @StrictlySocial - 您的帐户可能是域帐户,而 NetworkService 和 ApplicationPoolIdentity 帐户则不是。您可以创建一个受限域帐户来运行应用程序池,或者我确信可以配置您的 SMTP 服务器,以允许根据其 IP 地址从您的 Web 服务器发送未经身份验证的电子邮件。
【解决方案2】:

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

【讨论】:

  • 谢谢,这很有帮助。看起来这里有一篇关于如何授予权限的文章 - tom.603global.com/KB/a8/…。请注意,您需要访问 AD 和邮件服务器才能做到这一点,这并不总是可用的。
【解决方案3】:

我解决了从 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>

【讨论】:

    【解决方案4】:

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

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

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

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

    • defaultCredentials="false"

    【讨论】:

      【解决方案5】:

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

      在我使用的网络凭据中 -

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

      简单的解决方法是让两封邮件都与网络凭据的邮件相同。

      【讨论】:

      • 我也有同样的问题。身份验证失败,因为发件人地址与网络凭据不同。有没有解决的办法 ?请指导。
      • 完全相同的问题。谢谢你。很惊讶没有提到修复。
      【解决方案6】:

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

      【讨论】:

      • 嗨,它返回 false。我将如何返回真实?据我所知,Windows 身份验证已启用。在 web.config 我有以下
      • 您还需要禁用匿名身份验证。我通常通过 IIS 管理 GUI 在 IIS 级别而不是在 web.config 中执行此操作。你也是,在这种情况下 User.Identity.Name 是一个空字符串,我希望它为空。
      • 在 IIS7 GUI 中,我禁用了匿名身份验证、ASP.NET 模拟和表单身份验证。仅启用 Windows 身份验证。
      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        使用 Visual Studio 2013 运行包对我有用。 我删除了 SMTP 连接管理器编辑器中的“使用 Windows 身份验证”标签。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-02
          • 2017-10-30
          • 2015-06-23
          • 2015-02-05
          • 2013-02-22
          • 2018-01-13
          • 2017-05-26
          • 2011-11-08
          相关资源
          最近更新 更多