![邮箱不可用,客户端无权以此发件人身份发送 - 仅限第一次](https://linux22.com/image/540100/%E9%82%AE%E7%AE%B1%E4%B8%8D%E5%8F%AF%E7%94%A8%EF%BC%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%97%A0%E6%9D%83%E4%BB%A5%E6%AD%A4%E5%8F%91%E4%BB%B6%E4%BA%BA%E8%BA%AB%E4%BB%BD%E5%8F%91%E9%80%81%20-%20%E4%BB%85%E9%99%90%E7%AC%AC%E4%B8%80%E6%AC%A1.png)
我们的用户只需单击按钮即可从我们的 ASP.NET Web 应用程序发送电子邮件。在我们的测试环境中,发生了一件奇怪的事情。
应用程序第一次尝试发送电子邮件时,我们收到异常:
邮箱不可用。服务器响应为:5.7.1 客户端无权以此发件人身份发送
有趣的是,当用户再次单击按钮时(因此应用程序尝试再次发送电子邮件),它会起作用,并且电子邮件会被发送。
如果您等待一段时间,您会再次收到错误,但第二次单击将发送电子邮件而不会出现问题。如果您足够快地发送新电子邮件,它就会成功。
这是我们使用的(简化)代码:
Dim smtpClient As New SmtpClient(<smtp mail server goes here>)
smtpClient.UseDefaultCredentials = True
mailMessage.From = New MailAddress(<from address>)
smtpClient.Send(mailMessage)
但这在生产环境中确实有效。我们使用 Microsoft Exchange,我们的客户(生产环境)也是如此。
有人遇到过类似的事情吗(第一次出错,第二次就成功了)?
答案1
我以前见过这种情况几次,以下是我见过的原因。请记住,这些只在大型环境中出现。如果您处于单个 dc、单个 exchange 服务器环境中,则这些不适用。
首先这里是关于此问题的 MS 文章:http://support.microsoft.com/kb/895853。在可能的原因下你可以看到有很多事情在起作用。
您的某个 Exchange 服务器中继权限设置不正确。
这很可能是原因。邮件在第一次和第二次尝试时可能采用不同的路由,虽然这听起来可能很愚蠢,但对两条消息运行消息跟踪,看看它们是否经过同一台服务器。如果您看到不同的路径,请检查错误路径上的设置,可能是没有选中简单的允许经过身份验证的用户中继。
AD权限错误
您必须对包含电子邮件发件人地址的帐户拥有“以身份发送”权限。如果有时可以正常工作,但有时不行,则可能是邮件路由的路径不同,它们之间的权限也不同。
身份验证无法正常工作。
在脚本的第一个实例中,身份验证可能会失败,在这种情况下,由于您没有权限,邮件会被拒绝。在脚本的第二次运行中,身份验证成功。不幸的是,我对 ASP 不够了解,无法理解上述代码或建议如何修复它。smtpClient.UseDefaultCredentials 可能不是适合您环境的代码。这只会在服务器请求时进行身份验证,并使用本地登录用户的凭据。如果服务器第一次没有要求进行身份验证,那么您将无法获得身份验证,并且可能没有发送权限。尝试将其更改为始终进行身份验证的代码。
您的一个 DC 或全局目录已过期或包含错误信息。
这种情况很少见,但您的域控制器可能存在信息不同步的情况。通过 ldap 或 adsi edit 仔细检查发件人和收件人帐户上的服务器信息,确保它们在所有 dc 中都相同。
在所有情况下,检查 Exchange 服务器上的日志,并确保所有字段都启用了 SMTP 日志记录。使用消息跟踪来准确查看此消息到达了哪些服务器。
答案2
在我看来,您可能在邮件服务器上启用了 SMTP 身份验证,但未将其包含在代码中。在这种情况下,您第一次尝试发送消息时,它会有效地执行身份验证,但无法发送消息。下次用户通过身份验证后,消息就会通过。
答案3
对我来说,问题是我的配置文件中已经指定了“发件人”帐户。当我尝试mailMessage.From = New MailAddress(<from address>)
在代码中执行此操作时,它失败了,因为我的代码中的“发件人”电子邮件与配置文件中的“发件人”电子邮件不匹配。
答案4
尝试这个 :
Dim client = New SmtpClient(<smtp mail server goes here>)
MailerManager.ServerSMTP = client.Host.ToString()
Try
client.Send(Mail)
Catch ex As Exception
'Error Message
End Try