如何使用 SmtpClient 和 DefaultNetworkCredentials 将邮件发送到仅允许经过身份验证的发件人的通讯组列表?

rus*_*ier 6 c# windows-authentication exchange-server-2007 smtpclient

我试图通过我们的内部 Exchange 2007 服务器(使用 SMTP)从 C# 控制台应用程序将自动电子邮件从计算机发送到同一域中的所有客户端,但我遇到了只允许经过身份验证的发件人的通讯组列表的障碍。基本上,我发送的邮件被 Exchange 拒绝:

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com

我正在使用System.Net.Mail.SmtpClientCredentials 属性并将其设置为System.Net.CredentialCache.DefaultNetworkCredentials,但在某个地方,运行此程序的帐户的凭据(我,具有有效邮箱的有效域用户)没有正确传递到 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("AuthTESTGroup@example.com");

            smtpClient.Send(mailMessage);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com

我与我们的 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
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?

提前致谢!

Met*_*Man 4

你需要传递用户名,密码

这是我将如何做到这一点的代码片段...请记住,这是您需要进行必要的更改以适合您的用例的代码片段

MailClient = new SmtpClient();
MailClient.Credentials = new System.Net.NetworkCredential(username, password);
Run Code Online (Sandbox Code Playgroud)

下面是另一个示例,但使用服务器变量..这可能是您需要做的尝试并让我知道服务器,例如您可以作为您的domain.com示例传递: //SmtpClient client = new SmtpClient("smtp.contoso. com");//这将是服务器 //client.Credentials = CredentialCache.DefaultNetworkCredentials;

    public static void CreateBccTestMessage(string server)
    {
        MailAddress from = new MailAddress("ben@contoso.com", "Ben Miller");
        MailAddress to = new MailAddress("jane@contoso.com", "Jane Clayton");
        MailMessage message = new MailMessage(from, to);
        message.Subject = "Using the SmtpClient class.";
        message.Body = @"Using this feature, you can send an e-mail message from an application very easily.";
        MailAddress bcc = new MailAddress("manager1@contoso.com");
        message.Bcc.Add(bcc);
        SmtpClient client = new SmtpClient(server);
        client.Credentials = CredentialCache.DefaultNetworkCredentials;
        Console.WriteLine("Sending an e-mail message to {0} and {1}.",
            to.DisplayName, message.Bcc.ToString());
        try
        {
            client.Send(message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught in CreateBccTestMessage(): {0}",
                        ex.ToString());
        }
    }
Run Code Online (Sandbox Code Playgroud)