Gmail错误:SMTP服务器需要安全连接或客户端未经过身份验证。服务器的响应是:5.5.1需要身份验证

我正在使用以下代码发送电子邮件。代码在我的本地机器上正常工作。但是在生产服务器上,我得到了错误消息

var fromAddress = new MailAddress("mymailid@gmail.com");
var fromPassword = "xxxxxx";
var toAddress = new MailAddress("yourmailid@yourdoamain.com");


string subject = "subject";
string body = "body";


System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};


using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})


smtp.Send(message);

在我的Gmail A/c上,我从生产服务器运行代码后收到了以下电子邮件

你好,

有人最近使用你的密码试图登录你的谷歌 账户mymailid@gmail.com。这个人正在使用这样的应用程序 作为电子邮件、客户端或移动设备。< / p > 我们阻止了登录的尝试,以防这是一个劫机者试图 访问您的帐户。请查看登录尝试的详细信息:

星期五,2014年1月3日13:56:08 UTC IP地址:xxx.xx.xx.xxx .xxx (abcd.net)。地点:美国宾夕法尼亚州费城

如果您不识别此登录尝试,其他人可能正在识别 正在访问您的帐户。你应该登录你的账户 请立即重置密码。< / p >

重置密码

如果这是你的问题,你无法访问你的帐户, 完成下列故障排除步骤 http://support.google.com/mail?p=client_login < / p >

您诚挚的谷歌账户团队

712460 次浏览

当您尝试从不同的时区或IP地址计算机登录时,通常会发生这种情况。您的生产服务器和您使用的邮件id都位于不同的时区。以下两种方案任选其一:

1)通过远程访问登录生产服务器,并使用您的凭证登录gmail一次。他们会要求确认,确认后注销。

或者2)登录gmail到你的本地计算机,遵循这个链接并选择回顾此活动并采取适当的行动。

我真的看过很多想法,唯一的解决方案是这种方式(适用于不同的电子邮件提供商):

            try
{
ViewProgressbar("Try to connect mail-server...", progressBar1.Value = 20);
string host = dsProvider.Rows[y]["POP_hostOut"].ToString();
int port = int.Parse(dsProvider.Rows[y]["POP_portOut"].ToString());  //587
string[] email = von1.Split('@');
string userName = (dsProvider.Rows[y]["login"].ToString() == "email[0]@email[1]")? email[0]+"@"+email[1] : email[0];
string password = layer.getUserPassword(listSender.SelectedValue.ToString());
SmtpClient client = new SmtpClient(host, port);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
//A idea from MSDN but it not works. You got "The server response was: 5.5.1 Authentication Required."
//System.Net.NetworkCredential myCreds = new System.Net.NetworkCredential(userName, password, host);
//System.Net.CredentialCache cache = new System.Net.CredentialCache();
//cache.Add(host, port, "NTLM", myCreds);
///cache.GetCredential(host, port, "NTLM");   //NTLM
client.Credentials = new System.Net.NetworkCredential(userName, password);
client.Host = host;
client.Port = port;
client.EnableSsl = true;
client.Send(message);
ViewProgressbar();
}
catch (SmtpException ex)...

下面是我的代码。我也有同样的错误,但问题是我给我的密码错误。下面的代码将完美地工作..尝试一下

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

你可以在我的博客中引用它

我也遇到过同样的问题。当您打开2步验证(MFA)时,就会发生这种情况。 只要关闭2步验证,你的问题就应该解决了

只需遵循谷歌电子邮件中的步骤,启用不太安全的应用程序。

当您尝试从代码发送邮件时,发现错误“SMTP服务器需要安全连接或客户端未经过身份验证。服务器的响应是:5.5.1 Authentication Required”,错误可能发生在以下情况下。

案例1:当密码错误时

案例2:当你试图从一些应用程序登录

案例3:当你试图从你的时区/域/计算机以外的域登录时 (当从代码发送邮件时,这是大多数情况下的情况)

每个问题都有解决方案

情况1的解:输入正确的密码。

情况2的解1:在下面的链接https://www.google.com/settings/security/lesssecureapps进入安全设置,启用不太安全的应用程序。这样你就可以从所有的应用程序登录。

情形2的解2:(参见https://stackoverflow.com/a/9572958/52277)启用双因素身份验证(又名两步验证),然后生成一个特定于应用程序的密码。使用新生成的密码通过SMTP进行身份验证。

情况3的解决方案1:(这可能有帮助)你需要检查活动。但由于最新的安全标准,审查活动将没有帮助,链接将没有用处。所以试试下面的例子。

情形3的解2:如果你已经在生产服务器上的某个地方托管了你的代码,并且如果你可以访问生产服务器,那么请将远程桌面连接到生产服务器,并尝试从生产服务器的浏览器登录一次。 这将增加登录谷歌的奖励,您将被允许从代码登录

< >强但是如果您无法访问生产服务器呢? 尝试解决方案3

solution 3 for case 3:您必须为您的谷歌帐户启用从其他时区/ ip登录。

要做到这一点,请点击链接< a href = " https://g。有限公司/ allowaccess noreferrer“rel = > https://g.co/allowaccess < / >并通过单击continue按钮允许访问。

就是这样。给你。现在,您将能够从任何一台计算机和任何方式的应用程序登录到您的谷歌帐户。

尝试改变主机,这是一个新的,我得到了这个配置mozilla雷鸟

Host = "smtp.googlemail.com"

这对我很有用

更新2022

更不安全的应用程序方法不再工作

你应该迁移到GMail SMTP接口

仅使用gmail id和密码发送电子邮件不再有效。你必须从谷歌云控制台设置api,并创建OAuth凭证。

链接到谷歌云控制台

链接到官方指南

链接到简单指南

enter image description here

原来的答案

这是一个安全问题。Gmail默认情况下阻止自定义应用程序访问您的电子邮件帐户。您可以将其设置为接受应用程序的登录。

在登录到你的电子邮件后,点击这里

这将带您到下面的页面

Less Secure Apps Page

嗨,我也有同样的问题,

我做了什么来解决它。就是打开不太安全的应用。 在连接到我的gmail帐户后。我输入了这个链接:https://www.google.com/settings/security/lesssecureapps

然后我打开安全应用程序,它工作了。 上面也说过

我在部署到Microsoft Azure的应用程序中遇到了同样的问题。

SmtpException: SMTP服务器需要安全连接,否则SMTP服务器不需要安全连接 客户端未被验证。服务器的响应是:5.5.1 认证需要。< / p >

首先,我在以下页面上批准了所有未知设备(一些来自爱尔兰的ip地址)(作为gmail用户登录): https://security.google.com/settings/u/1/security/secureaccount < / p >

我对客户端进行了如下设置:

var client = new SmtpClient("smtp.gmail.com");
client.Port = 587;
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("my_user_name@gmail.com", "my_password");

只有当我在smtp-client上设置了以下属性后,它才开始工作:

client.TargetName = "STARTTLS/smtp.gmail.com";

对我有效的是激活不太安全的应用程序的选项(我使用VB.NET)

Public Shared Sub enviaDB(ByRef body As String, ByRef file_location As String)
Dim mail As New MailMessage()
Dim SmtpServer As New SmtpClient("smtp.gmail.com")
mail.From = New MailAddress("from@gmail.com")
mail.[To].Add("to@gmail.com")
mail.Subject = "subject"
mail.Body = body
Dim attachment As System.Net.Mail.Attachment
attachment = New System.Net.Mail.Attachment(file_location)
mail.Attachments.Add(attachment)
SmtpServer.Port = 587
SmtpServer.Credentials = New System.Net.NetworkCredential("user", "password")
SmtpServer.EnableSsl = True
SmtpServer.Send(mail)
End Sub

所以登录你的账户,然后转到 google.com/settings/security/lesssecureapps < / p >

在今天花了几个小时尝试了这里的每个解决方案之后,我仍然无法克服这个错误。我以这种方式多次使用gmail,所以我知道这是一个愚蠢的东西,但我没有做任何事情来解决这个问题。我终于偶然发现了我的解决方案,所以我想分享一下。

首先,上面的大多数答案也是必需的,但在我的例子中,这只是创建SmtpClient类时对代码进行排序的简单问题。

在下面的第一个代码片段中,注意Credentials = creds行所在的位置。这个实现将生成这个问题中引用的错误,即使您已经正确设置了其他所有内容。

System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
Host = Emailer.Host,
Port = Emailer.Port,
Credentials = creds,
EnableSsl = Emailer.RequireSSL,
UseDefaultCredentials = false,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
}

但是,如果您将凭证设置调用移到底部,则电子邮件将正常发送。我没有改变周围的代码…用户名/密码等。显然,要么EnableSSL, UseDefaultCredentials, or the DeliveryMethod依赖于先设置Credentials…不过,我并没有全部测试以确定是哪一个。

System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
Host = Emailer.Host,
Port = Emailer.Port,
EnableSsl = Emailer.RequireSSL,
UseDefaultCredentials = false,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
Credentials = creds
}

希望这能帮助其他人在未来避免一些头痛。

你可能需要从gmail中创建/生成一个特定的APP密码。 您的应用程序或脚本将使用这个新密码,而不是您的常规密码。

.

.

这就是我所做的。 我仍然使用相同的电子邮件帐户,但必须生成一个新的应用程序特定密码

https://support.google.com/accounts/answer/185833?hl=en

截图

基本上你可以在这里做: https://security.google.com/settings/security/apppasswords < / p >

我尝试了这里找到的所有建议,从启用不太安全的应用程序,到尝试587端口……毫无效果。最后,我只是注释掉了UseDefaultCredentials = false行。如果我不碰这个布尔值,一切都能正常工作。

Tomasz Madeyski的评论解决了我的问题…他告诉存在一个错误的SetDefaultCredential,他说:

问题是在UseDefaultCredentials setter中有这样的代码:this.transport. credentials = value ?(ICredentialsByHost) CredentialCache。DefaultNetworkCredentials: (ICredentialsByHost) null;它覆盖由凭证设置器设置的凭证。对我来说,它看起来像SmtpClient的bug。”

如果你把smtpClient.UseDefaultCredentials = false放在set credentials之后…这一行设置为空这些凭据…

我有一个以前工作的代码,现在抛出这个错误。密码没有问题。也不需要将消息转换为base64。事实证明,我需要做以下几点:

  1. 关闭双因素身份验证
  2. 将“允许不太安全的应用程序”设置为“开启”
  3. 从生产服务器登录到您的gmail帐户
  4. 在这里来批准登录活动
  5. 在生产服务器上运行应用程序

工作代码

    public static void SendEmail(string emailTo, string subject, string body)
{
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("youremail@gmail.com", "secretpassword"),
EnableSsl = true
};


client.Send("youremail@gmail.com", emailTo, subject, body);
}

关闭双因素认证  off two -factor authentication < / p >

设置“允许不太安全的应用程序”为打开(同一页,需要滚动到底部) 允许较不安全的应用程序 < / p >

2018年11月,已经尝试了以上一切都没有成功。

下面是最终有效的解决方案。不幸的是,它不使用SSL,但它工作!!

var fromAddress = new MailAddress(asd@asd.com, "From Name");
var toAddress = new MailAddress("tosend@asd.com", "To Name");


const string subject = "Subject";
const string body = "Body";


var smtp = new SmtpClient
{
Host = "aspmx.l.google.com",
Port = 25,
EnableSsl = false
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}

不要在等待smtp.SendMailAsync(邮件)前设置断点;

:)

当它等待一个断点给出这个错误时,当我删除断点时,它已经工作了

在2022年5月30日之后,Gmail改变了它对外部应用程序的政策 使用谷歌SMTP发送电子邮件有关详细信息,。 解决方案是登录谷歌帐户,您想发送电子邮件,启用谷歌两步验证,并为外部应用程序创建密码

因此,正如其他人所说的那样,自5月30日起,谷歌不再支持使用第三方应用程序访问该帐户。

enter image description here

为了能够从我的代码访问帐户,我必须做的是首先启用2步验证。 enter image description here < / p > 一旦完成了这一步,我就创建了一个应用程序的密码enter image description here < / p >

然后我将生成的密码替换为我用来访问我的帐户的密码。换句话说,你需要用这个新的应用程序密码删除gmail帐户密码(我们用来登录gmail的密码),功能就重新上线了!

我希望这能帮助到一些人:-)

Gmail/谷歌最近删除了(从2022年5月起)不安全的应用程序访问。他们是这么说的:

为确保您的账户安全,自2022年5月30日起,谷歌将不再支持仅使用用户名和密码登录谷歌账户的第三方应用程序或设备。

现在任何有直接SMTP电子邮件发送的电子邮件将抛出错误“535-5.7.8用户名和密码不接受”。这是因为现在谷歌要求应用程序特定的密码和电子邮件帐户密码不是应用程序密码,所以他们显示用户名/密码不接受。

您需要创建和使用应用程序特定的密码。应用程序密码就像你账户的备用密码一样。它只能被与您共享它的应用程序使用,因此它比共享您的主密码更安全。

创建应用程序特定的密码:

  1. 启用2因素认证。
  2. 进入Gmail的帐户设置,选择应用程序密码。
  3. 命名为任何您想要的名称,并创建密码。
  4. 使用这个新的16位密码和gmail电子邮件SMTP(在密码的地方使用这个16位密码)

享受发送邮件的乐趣!!

enter image description here

enter image description here

enter image description here