180

我看到了不同版本的构造函数,一个使用来自 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());
    }              
}
4

5 回答 5

333

SmtpClient 可以通过代码使用:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");
于 2010-05-04T16:10:11.513 回答
33

采用NetworkCredential

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

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

client.Credentials = credentials;
于 2010-05-04T16:09:41.097 回答
8
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);
于 2016-02-09T21:33:48.637 回答
0

其他答案中没有提到几件事。

首先,为了指定不同的身份验证方案,可能需要使用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;

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

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

于 2022-03-04T00:28:00.100 回答
-3

由于并非所有客户都使用经过身份验证的 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)
于 2016-12-14T05:20:34.083 回答