邮箱不可用,客户端无权以此发件人身份发送 - 仅限第一次

邮箱不可用,客户端无权以此发件人身份发送 - 仅限第一次

我们的用户只需单击按钮即可从我们的 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

相关内容