如何使用SmtpClient和DefaultNetworkCredentials将邮件发送到只允许经过身份验证的发件人的
本文关键字:许经过 经过 身份验证 SmtpClient 何使用 DefaultNetworkCredentials | 更新日期: 2023-09-27 18:26:33
我正试图通过我们的内部Exchange 2007服务器(使用SMTP)从C#控制台应用程序将自动电子邮件从机器发送到同一域上的客户端,但我遇到了一个问题,即通讯组列表只允许经过身份验证的发件人。基本上,我发送的邮件被Exchange拒绝了:
#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com
我正在使用System.Net.Mail.SmtpClient
并将Credentials属性设置为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);
}
}
}
每当我以自己的身份运行此操作时(同样,我是域上的有效用户,在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
显然,状态码和子状态码翻译成:
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
因此,即使我将SmtpClient.Credentials
设置为System.Net.CredentialCache.DefaultNetworkCredentials
,我的Windows凭据也不会传递到Exchange服务器
有什么想法吗?
提前感谢!
您需要传递用户名、密码
这是我将如何做到这一点的代码片段…请记住,这是一个代码片段,您需要进行必要的更改以适应您的用例
MailClient = new SmtpClient();
MailClient.Credentials = new System.Net.NetworkCredential(username, password);
下面是另一个示例,但使用了服务器变量。。这也许是你需要做的,试着让我知道你可以作为你的域名传递的服务器示例://SmtpClient客户端=新SmtpClient("smtp.contoso.com")//这将是服务器//client.Credential=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());
}
}