如何在C#中对SMTP进行身份验证


75

我创建使用SMTP发送消息的新ASP.NET Web应用程序。问题是smtp未被发送邮件的人验证。

如何在程序中对SMTP进行身份验证?C#是否具有一个具有用于输入用户名和密码的属性的类?

Answers:


156
using System.Net;
using System.Net.Mail;

using(SmtpClient smtpClient = new SmtpClient())
{
    var basicCredential = new NetworkCredential("username", "password"); 
    using(MailMessage message = new MailMessage())
    {
        MailAddress fromAddress = new MailAddress("from@yourdomain.com"); 

        smtpClient.Host = "mail.mydomain.com";
        smtpClient.UseDefaultCredentials = false;
        smtpClient.Credentials = basicCredential;

        message.From = fromAddress;
        message.Subject = "your subject";
        // Set IsBodyHtml to true means you can send HTML email.
        message.IsBodyHtml = true;
        message.Body = "<h1>your message body</h1>";
        message.To.Add("to@anydomain.com"); 

        try
        {
            smtpClient.Send(message);
        }
        catch(Exception ex)
        {
            //Error, could not send the message
            Response.Write(ex.Message);
        }
    }
}

您可以使用上面的代码。


2
用户名和密码来自哪里?什么是mail.mydomain.com?他是DNS名称吗?
Shyju 2012年

5
它们是您的电子邮件地址和密码,mail.mydomain.com是您的SMTP服务器(例如smtp.gmail.com)。
Arief 2012年

2
您应该将MailMessage对象包装在using语句中(或在完成后调用Dispose),对吗?
2013年

通常,您还需要配置端口。这可以通过使用港口属性来完成,例如smtpClient.Port(123)
Wouter Vanherck,

@Arief:嗨,你能检查我的问题吗?stackoverflow.com/questions/56604850/… 关于如何使我们的发送邮件功能(不是作为外部发件人)有任何建议吗?
阿米尔(Amir)

89

确保SmtpClient.Credentials 致电设置SmtpClient.UseDefaultCredentials = false

该顺序很重要,因为设置SmtpClient.UseDefaultCredentials = false将重置SmtpClient.Credentials为null。


当使用Sendgrid时,顺序是错误的-它会返回错误:“邮箱不可用。服务器响应为:不允许未经身份验证的发件人”。在UseDefaultCredentials标志之后设置凭据可解决此问题
Marcinu


2

要通过TLS / SSL发送消息,您需要将SmtpClient类的Ssl设置为true。

string to = "jane@contoso.com";
string from = "ben@contoso.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "Using the new SMTP client.";
message.Body = @"Using this new feature, you can send an e-mail message from an application very easily.";
SmtpClient client = new SmtpClient(server);
// Credentials are necessary if the server requires the client 
// to authenticate before it will send e-mail on the client's behalf.
client.UseDefaultCredentials = true;
client.EnableSsl = true;
client.Send(message);

编写一些有关SSL vs SMTP Client的代码示例,以得出更好的答案
Nikola Lukic,2017年

1

您如何发送消息?

System.Net.Mail命名空间中的类(可能是您应该使用的类)完全支持身份验证,可以在Web.config中指定,也可以使用SmtpClient.Credentials属性。


0

就我而言,即使遵循了以上所有条件。我必须将我的项目从.net 3.5升级到.net 4,以针对我们的内部Exchange 2010邮件服务器进行授权。

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.