SMTP服务器需要安全的连接或者客户端没有被authentication。 服务器响应是:5.5.1需要身份validation?
我想从我的应用程序发送一封电子邮件,我已经编写了以下用于发送邮件的代码
MailMessage msg = new MailMessage(); msg.From = new MailAddress("mymailid"); msg.To.Add("receipientid"); msg.Subject = "test"; msg.Body = "Test Content"; msg.Priority = MailPriority.High; SmtpClient client = new SmtpClient(); client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com"); client.Host = "smtp.gmail.com"; client.Port = 587; client.DeliveryMethod = SmtpDeliveryMethod.Network; client.EnableSsl = true; client.UseDefaultCredentials = true; client.Send(msg);
我在本地主机上运行它,所以我正在做什么错误来发送它。
当我发送button,它会给出一个错误
SMTP服务器需要安全的连接或者客户端没有被authentication。 服务器响应是:5.5.1需要身份validation。
在Web.config文件中的代码
<appSettings> <add key="webpages:Version" value="2.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="PreserveLoginUrl" value="true" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="smtpServer" value="smtp.gmail.com" /> <add key="EnableSsl" value = "true"/> <add key="smtpPort" value="587" /> <add key="smtpUser" value="sender@gmail.com" /> <add key="smtpPass" value="mypassword" /> <add key="adminEmail" value="sender@gmail.com" /> </appSettings> <system.net> <mailSettings> <smtp from="sender@gmail.com"> <network host="smtp.gmail.com" password="mypassword" port="587" userName="sender@gmail.com" enableSsl="true"/> </smtp> </mailSettings> </system.net>
我该怎么办才能解决这个错误并发送邮件?
首先检查与Gmail的安全相关的问题。 您可能已经在Gmail中启用了双重身份validation。 如果您收到任何安全警报,请检查您的Gmail收件箱。 在这种情况下,请检查@mjb的其他答案如下
下面是我总是首先检查这些问题的一般事情
client.UseDefaultCredentials = true;
将其设置为false。
注意@Joe King的回答 – 您必须在设置client.Credentials 之前设置client.UseDefaultCredentials
我有同样的问题。
我find了这个解决scheme:
Google可能会阻止某些未使用现代安全标准的应用或设备进行login尝试。 由于这些应用程序和设备更容易侵入,阻止它们有助于保持您的帐户安全。
一些不支持最新安全标准的应用程序示例包括:
- iOS 6或更低版本的iPhone或iPad上的邮件应用程序
- 8.1版本之前的Windows手机上的邮件应用程序
- 一些桌面邮件客户端,如Microsoft Outlook和Mozilla Thunderbird
因此,您必须在Google帐户中启用安全性较低的login 。
login到Google帐户后,请转到:
https://www.google.com/settings/security/lesssecureapps
在C#中,您可以使用以下代码:
using (MailMessage mail = new MailMessage()) { mail.From = new MailAddress("email@gmail.com"); mail.To.Add("somebody@domain.com"); mail.Subject = "Hello World"; mail.Body = "<h1>Hello</h1>"; mail.IsBodyHtml = true; mail.Attachments.Add(new Attachment("C:\\file.zip")); using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587)) { smtp.Credentials = new NetworkCredential("email@gmail.com", "password"); smtp.EnableSsl = true; smtp.Send(mail); } }
——————-
Michael Freidgeim在以下评论区分享的信息:
与截图相似的答案https://stackoverflow.com/a/32457468/52277
确保在调用SmtpClient.UseDefaultCredentials = false
后设置SmtpClient.Credentials
。
顺序非常重要,因为设置SmtpClient.UseDefaultCredentials = false
会将SmtpClient.Credentials
重置为null。
我search了几个小时,尝试了不同的东西。总之,我必须考虑以下几点:
- 使用
smtp.gmail.com
而不是smtp.google.com
- 使用端口587
- 设置
client.UseDefaultCredentials = false;
在设置凭据之前 - 打开访问安全性较低的应用程序
- Set
client.EnableSsl = true;
如果这些步骤没有帮助,请检查这个答案 。
也许,你也可以在这个System.Net.Mail FAQ上find一些有用的东西。
尝试login你的Gmail帐户。 如果您使用Gmail SMTP发送电子邮件,它会被locking。 我不知道在locking之前可以发送的电子邮件数量是否有限,但是如果您login一次,则可以从代码重新开始工作。 确保你的webconfig设置是好的。
试试这样,我只是做了一些轻微的改变:
MailMessage msg = new MailMessage(); msg.From = new MailAddress("mymailid@gmail.com"); msg.To.Add("receipientid@gmail.com"); msg.Subject = "test"; msg.Body = "Test Content"; //msg.Priority = MailPriority.High; using (SmtpClient client = new SmtpClient()) { client.EnableSsl = true; client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential("mymailid@gmail.com", "mypassword"); client.Host = "smtp.gmail.com"; client.Port = 587; client.DeliveryMethod = SmtpDeliveryMethod.Network; client.Send(msg); }
如果你有邮件设置,请显示你的app.config文件。
我甚至将“UseDefaultCredentials”设置为false也遇到了同样的问题。 后来我发现,根本原因是我打开了我的帐户中的“两步validation”。 我把它关掉后,问题就没有了。
确保访问安全性较低的应用程序是允许的。
MailMessage mail = new MailMessage(); mail.From = new MailAddress("xx@gmail.com"); mail.Sender = new MailAddress("xx@gmail.com"); mail.To.Add("external@emailaddress"); mail.IsBodyHtml = true; mail.Subject = "Email Sent"; mail.Body = "Body content from"; SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587); smtp.UseDefaultCredentials = false; smtp.Credentials = new System.Net.NetworkCredential("xx@gmail.com", "xx"); smtp.DeliveryMethod = SmtpDeliveryMethod.Network; smtp.EnableSsl = true; smtp.Timeout = 30000; try { smtp.Send(mail); } catch (SmtpException e) { textBox1.Text= e.Message; }
下面是我的代码。我也有同样的错误,但问题是,我给我的密码wrong.The下面的代码将完美的工作..尝试
MailMessage mail = new MailMessage(); SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com"); mail.From = new MailAddress("fromaddress@gmail.com"); mail.To.Add("toaddress1@gmail.com"); mail.To.Add("toaddress2@gmail.com"); mail.Subject = "Password Recovery "; mail.Body += " <html>"; mail.Body += "<body>"; mail.Body += "<table>"; mail.Body += "<tr>"; mail.Body += "<td>User Name : </td><td> HAi </td>"; mail.Body += "</tr>"; mail.Body += "<tr>"; mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>"; mail.Body += "</tr>"; mail.Body += "</table>"; mail.Body += "</body>"; mail.Body += "</html>"; mail.IsBodyHtml = true; SmtpServer.Port = 587; SmtpServer.Credentials = new System.Net.NetworkCredential("sendfrommailaddress.com", "password"); SmtpServer.EnableSsl = true; SmtpServer.Send(mail);
您可以在发送邮件中重写
如果是新的Google帐户,则必须通过常规用户界面发送电子邮件(第一个)。 之后,您可以使用应用程序/机器人发送消息。
您应该考虑在configuration文件中指定SMTPconfiguration数据,而不要在代码中覆盖它们 – 请参阅http://www.systemnetmail.com/faq/4.1.aspx上的; SMTPconfiguration数据
<system.net> <mailSettings> <smtp deliveryMethod="Network" from="admin@example.com"> <network defaultCredentials="false" host="smtp.example.com" port="25" userName="admin@example.com" password="password"/> </smtp> </mailSettings> </system.net>
从这个链接和繁荣开启不那么安全的应用程序…
一些smtp服务器(安全的)要求你提供用户名和电子邮件,如果它的Gmail最有可能的“不太安全的login”的问题,你需要解决,否则你可以尝试:
public static void SendEmail(string address, string subject, string message, string email, string username, string password, string smtp, int port) { var loginInfo = new NetworkCredential(username, password); var msg = new MailMessage(); var smtpClient = new SmtpClient(smtp, port); msg.From = new MailAddress(email); msg.To.Add(new MailAddress(address)); msg.Subject = subject; msg.Body = message; msg.IsBodyHtml = true; smtpClient.EnableSsl = true; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = loginInfo; smtpClient.Send(msg); }
请注意,来自用户名和电子邮件地址的电子邮件地址不同,不同于将其引用为相同的一些实现。
调用这个方法可以这样做:
SendEmail("to-mail@gmail.com", "test", "Hi it worked!!", "from-mail", "from-username", "from-password", "smtp", 587);
在转换不太安全的选项并尝试其他解决scheme后,如果仍然面临同样的问题,请尝试使用此重载:
client.Credentials = new NetworkCredential("mymailid", "mypassword");
代替:
client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");