如何在.NET 中设置 SmtpClient 对象的用户名和密码?

我看到构造函数的不同版本,一个使用来自 web.config 的信息,一个指定主机,一个指定主机和端口。但是如何将用户名和密码设置为与 web.config 不同的内容呢?我们有一个问题,我们的内部 smtp 被一些高安全性的客户端阻塞,我们想使用他们的 smtp 服务器,有没有办法从代码而不是 web.config 来做到这一点?

例如,在这种情况下,如果数据库中没有可用的 web.config 凭据,我将如何使用它?

public static void CreateTestMessage1(string server, int port)
{
string to = "jane@contoso.com";
string from = "ben@contoso.com";
string subject = "Using the new SMTP client.";
string body = @"Using this new feature, you can send an e-mail message from an application very easily.";
MailMessage message = new MailMessage(from, to, subject, body);
SmtpClient client = new SmtpClient(server, port);
// Credentials are necessary if the server requires the client
// to authenticate before it will send e-mail on the client's behalf.
client.Credentials = CredentialCache.DefaultNetworkCredentials;


try {
client.Send(message);
}
catch (Exception ex) {
Console.WriteLine("Exception caught in CreateTestMessage1(): {0}",
ex.ToString());
}
}
228852 次浏览

使用 NetworkCredential

是的,只需将这两行添加到代码中。

var credentials = new System.Net.NetworkCredential("username", "password");


client.Credentials = credentials;

代码可以使用 SmtpClient:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
SmtpClient MyMail = new SmtpClient();
MailMessage MyMsg = new MailMessage();
MyMail.Host = "mail.eraygan.com";
MyMsg.Priority = MailPriority.High;
MyMsg.To.Add(new MailAddress(Mail));
MyMsg.Subject = Subject;
MyMsg.SubjectEncoding = Encoding.UTF8;
MyMsg.IsBodyHtml = true;
MyMsg.From = new MailAddress("username", "displayname");
MyMsg.BodyEncoding = Encoding.UTF8;
MyMsg.Body = Body;
MyMail.UseDefaultCredentials = false;
NetworkCredential MyCredentials = new NetworkCredential("username", "password");
MyMail.Credentials = MyCredentials;
MyMail.Send(MyMsg);

由于并非所有客户机都使用经过身份验证的 SMTP 帐户,因此只有在 web.config 文件中提供了应用程序密钥值时,我才使用 SMTP 帐户。

下面是 VB 代码:

sSMTPUser = ConfigurationManager.AppSettings("SMTPUser")
sSMTPPassword = ConfigurationManager.AppSettings("SMTPPassword")


If sSMTPUser.Trim.Length > 0 AndAlso sSMTPPassword.Trim.Length > 0 Then
NetClient.Credentials = New System.Net.NetworkCredential(sSMTPUser, sSMTPPassword)


sUsingCredentialMesg = "(Using Authenticated Account) " 'used for logging purposes
End If


NetClient.Send(Message)

有些事情在其他答案中没有提到。

首先,为了指定不同的身份验证方案,可能需要直接使用 CredentialCache而不是 NetworkCredential

在文档中,SMTP 身份验证类型名称如下:

“ NTLM”、“摘要”、“ Kerberos”和“谈判”

然而,我必须在。NET 代码来查看为“ AUTH LOGIN”传递的值实际上是“ LOGIN”。无论如何,这似乎是自动发生的,因此只需要使用不同的方案。

其次,虽然这里没有人是,您可能不想指定一个域名在您的 NetworkCredential。这样做的结果是 SmtpClient传递一个形式为 example.com\username的用户名,这几乎保证不会被邮件服务器接受。(如果您的邮件服务器的身份验证要求不严格,您可能不知道您未能进行身份验证。)

var nc = new NetworkCredential(
username,
password
// no domain!
);


// only if you need to specify a particular authentication scheme,
// though it doesn't hurt to do this anyway if you use the right scheme name
var cache = new CredentialCache();
cache.Add(smtpServerName, port, "NTLM", nc);
// can add more credentials for different combinations of server, port, and scheme


smtpClient.Credentials = cache;

最后,请注意,如果您也设置 Credentials,则不需要设置 UseDefaultCredentials,因为它们都基于相同的底层值。设置两者都会导致问题,因为它们会相互覆盖。

如果有疑问,请使用 WireShark 并暂时禁用 SSL (以查看网络帧,否则它们将被加密) ,并确认您的 SMTP 身份验证正在工作。(在 WireShark 中使用“ smtp”过滤器)。