【问题标题】:How to set username and password for SmtpClient object in .NET?如何在 .NET 中为 SmtpClient 对象设置用户名和密码?
【发布时间】:2011-02-15 13:15:41
【问题描述】:

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

【问题讨论】:

    标签: c# smtpclient


    【解决方案1】:

    SmtpClient 可以被代码使用:

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

    【讨论】:

    • 如果我不设置,它会默认使用 web.config 中的那些吗?
    • @pipelinecache Ryan 是对的,如果没有提供凭据,它将查看 web.config 中的
    • 我相信如果UseDefaultCredentials 设置为true,它将使用默认值,否则它将首先查看Credentials 属性,然后查看web.config。如果没有设置,它将匿名发送电子邮件。
    • 在c#代码中硬编码用户名和密码安全吗?
    • 警告:如果您设置“UseDefaultCredentials = false”,则必须在设置凭据之前执行此操作,因为更改会使任何现有凭据集无效。
    【解决方案2】:

    使用NetworkCredential

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

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

    【讨论】:

    • 为什么不只有一行?
    【解决方案3】:
    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);
    

    【讨论】:

    • 您应该尝试仅将相关代码发布到答案
    • @johnny5 上下文并不是世界上最大的犯罪
    • @shiv 你是对的,但是上下文会写一个答案的解释,这也不在这里。
    • @johnny5 其他最佳答案没有解释 - 该示例非常自我解释,因为代码是自我记录的。
    • @Shiv 最重要的答案是自我记录,因为他们只发布相关代码。我的原始评论与这个答案一样多,出于某种原因,我不明白为什么我必须筛选 15 行代码,而只需要 2 行来回答这个问题,如果你发现这个答案有用,赞成它。否则,争论我 2 年前发表的评论是没有意义的,其他发现是有用的
    【解决方案4】:

    由于并非所有客户都使用经过身份验证的 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多