如何使用自定义 .NET 应用程序和 Windows 身份验证将邮件发送到仅允许经过身份验证的发件人的分发列表?

如何使用自定义 .NET 应用程序和 Windows 身份验证将邮件发送到仅允许经过身份验证的发件人的分发列表?

这基本上是我的一篇转帖StackOverflow 问题看看我是否可以得到服务器端的视角。

我正在尝试通过我们内部的 Exchange 2007 服务器(使用 SMTP)从计算机向同一域中的客户端发送自动电子邮件,但遇到了分发列表只允许经过身份验证的发件人的问题。基本上,我发送的邮件被 Exchange 拒绝,原因是:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;[email protected]

我正在使用System.Net.Mail.SmtpClient并将 Credentials 属性设置为System.Net.CredentialCache.DefaultNetworkCredentials(它应该通过运行该过程的当前用户的 Windows 凭据),但在某个地方,运行该程序的帐户的凭据(我,一个具有有效邮箱的有效域用户)没有正确地传递给 Exchange。

我使用是System.Net.CredentialCache.DefaultNetworkCredentials因为我不想硬编码用户名或密码(无论是在代码本身中还是在任何类型的配置文件中);我希望该过程使用 Windows 身份验证通过我们的 SMTP 服务器进行身份验证。

下面是我用来重现该问题的测试程序(域名已被匿名化):

using System;
using System.Net.Mail;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            var smtpClient = new SmtpClient
                {
                    Host = "MAIL",
                    Port = 25,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
                };

            var mailMessage = new MailMessage
                {
                    Body = "Testing",
                    From = new MailAddress(Environment.UserName + "@example.com"),
                    Subject = "Testing",
                    Priority = MailPriority.Normal
                };

            mailMessage.To.Add("[email protected]");

            smtpClient.Send(mailMessage);
        }
    }
}

每当我以自己的身份运行此程序时(再次强调,我是域上的有效用户,并且在 Exchange 服务器上拥有现有邮箱),我都会收到来自 Exchange 的无法送达的退回邮件,其响应为:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;[email protected]

我与我们的 Exchange 服务器管理员进行了交谈,他从 Exchange 服务器的事件日志中看到了以下错误:

Account For Which Logon Failed:
  Security ID: NULL SID
  Account Name: 
  Account Domain: 

Failure Information:
  Failure Reason: Unknown user name or bad password.
  Status:         0xc000006d
  Sub Status:     0xC0000064

显然,该状态代码和子状态代码转换为:

0xc000006d This is either due to a bad username or authentication information.  Usually logged as status code with 0xc0000064 as substatus

0xC0000064 user name does not exist

因此,这又好像是在某些时候,我的 Windows 凭据没有传递到 Exchange 服务器,尽管我将其设置SmtpClient.CredentialsSystem.Net.CredentialCache.DefaultNetworkCredentials

有任何想法吗?

或者是否可以以某种方式在 Exchange 2007 中配置分发列表,以要求经过身份验证的发件人,除非该发件人在同一个域中?(我猜 Exchange 无法保证当邮件通过 SMTP 发送时,但我对 Exchange 管理知之甚少)

提前致谢!

答案1

尝试设置 smtpClient.UseDefaultCredentials = true。

此属性的默认值为 false。我不确定这是否能解决您的问题,但似乎很容易尝试。

答案2

我记得很久以前,必须在 Exchange 中根据每个帐户启用 SMTP 登录,因此尽管您可以使用其本机协议(基于 RPC?)连接到 Exchange,但您的帐户可能未配置为允许 SMTP 访问。

答案3

以下是来自 google smtp 配置

SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
SmtpServer.EnableSsl = true;

除了 SMTP,您还可以使用 CDOSYS,即 Windows 2000 库 (Cdosys.dll) 的协作数据对象 (CDO)。Cdosys.dll 库也称为 CDOSYS。请访问以下链接: C# CDO 电子邮件

相关内容