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


160

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

Answers:


301

SmtpClient可以通过以下代码使用:

SmtpClient mailer = new SmtpClient();
mailer.Host = "mail.youroutgoingsmtpserver.com";
mailer.Credentials = new System.Net.NetworkCredential("yourusername", "yourpassword");

如果我不设置,默认情况下会使用web.config中的设置吗?
CloudMeta 2010年

3
@pipelinecache Ryan是正确的,如果没有提供凭据,它将查看web.config中的<system.net> <mailSettings>
Tomas

1
我相信,如果UseDefaultCredentials将其设置为true,它将使用默认值,否则它将首先在Credentials属性中查找,然后在web.config中查找。如果未设置,它将匿名发送电子邮件。
TheGateKeeper

1
用C#代码硬编码用户名和密码是否安全?
kudlatiger

3
警告:如果您设置“ UseDefaultCredentials = false”,则必须在设置凭据之前执行此操作,因为更改将使所有现有凭据集为空。
WhoIsRich

26

NetworkCredential

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

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

client.Credentials = credentials;

4
为什么不只一行?
JSON

7
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);

4
您应该尝试将仅相关的代码发布到答案
johnny

1
@ johnny5上下文并不是世界上最大的犯罪
Shiv

@shiv你是正确的,但是上下文会在写答案的解释,这里也没有。
约翰尼

1
@ johnny5其他最重要的答案没有解释-该示例是很容易解释的代码,因为代码是自我记录。
Shiv

@Shiv最佳答案是自我记录,因为它们仅发布相关代码。我的原始评论与该答案一样多,因为一个原因,我不明白为什么我只需要筛选15行代码(如果只需要2行即可回答这个问题),如果您发现此答案有用的话,支持它。否则,这些在争论我两年前发表的评论时毫无意义,其他人认为这很有用
约翰尼

-2

由于并非我的所有客户端都使用经过身份验证的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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.