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


260

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

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上收到了以下电子邮件

嗨,

最近有人使用您的密码尝试登录您的Google帐户mymailid@gmail.com。此人正在使用电子邮件,客户端或移动设备等应用程序。

万一这是一个劫机者试图访问您的帐户,我们阻止了登录尝试。请查看登录尝试的详细信息:

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

如果您不识别此登录尝试,则可能是其他人正在尝试访问您的帐户。您应该登录自己的帐户并立即重设密码。

重设密码

如果是您,并且您在访问帐户时遇到问题,请完成http://support.google.com/mail?p=client_login中列出的故障排除步骤

此致Google帐户小组敬上


您可以访问生产服务器吗
Arshad 2014年

我无权访问生产服务器
vcs 2014年

关闭两步验证..
Mangesh


1
另外,请确保已禁用google“ Captcha”-如果您是在远程服务器上运行脚本(在本地计算机上运行时不需要),则可能有必要:accounts.google.com/DisplayUnlockCaptcha
Jens,2016年

Answers:


197

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

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

或者2)登录gmail到您的本地计算机,点击此链接并选择查看此活动并采取适当的措施。


21
一点评论:转到 security.google.com/settings/security/activity,在这里您将看到代码被阻止的连接。允许他们,在这种情况下应该会有所帮助。
Alex Zhukovskiy 2014年


是的,原因是为Gmail帐户启用了2步验证功能。选择应用程序/设备,然后单击生成按钮support.google.com/accounts/answer/185833
smily


8
另外,请确保已禁用Google“ Captcha”功能-如果您是在远程服务器上运行脚本(在本地计算机上运行时不需要),则可能有必要:account.google.com/DisplayUnlockCaptcha
Jens

300

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

情况1:密码错误

情况2:当您尝试从某个App登录时

情况3:当您尝试从时区/域/计算机以外的域登录时 (在大多数情况下,从代码发送邮件时就是这种情况)

每个都有解决方案

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

情况2的解决方案1:进入followig链接的安全设置 以下 https://www.google.com/settings/security/lesssecureapps并启用安全性较低的应用。这样您就可以从所有应用程序登录。

情况2的解决方案2:(请参阅https://stackoverflow.com/a/9572958/52277)启用两因素身份验证(又称为两步验证),然后生成特定于应用程序的密码。使用该新生成的密码通过SMTP进行身份验证。

情况3的解决方案1:(这可能会有所帮助),您需要查看活动。但由于最新的安全标准,因此对活动进行回顾将无济于事,该链接将无用。因此,请尝试以下情况。

情况3的解决方案2:如果您将代码托管在生产服务器上的某个位置并且可以访问生产服务器,则可以将远程桌面连接到生产服务器,然后尝试从生产服务器的浏览器登录一次。这将为您添加登录谷歌的特权,并且您将被允许从代码登录。

但是,如果您无权访问生产服务器怎么办。 尝试解决方案3

情况3的解决方案3:您必须为您的Google帐户启用其他时区/ ip的登录。

为此,请点击链接https://g.co/allowaccess,然后单击继续按钮以允许访问。

就是这样。干得好。现在,您将可以从任何计算机上通过任何应用程序登录到您的Google帐户。


10
解决方案2!你这个小美女!
乔治·哈恩威尔

2
lesssecureapps上面的链接有所帮助:)
Gautam Jain

哇,这应该标记为已接受的答案。谢谢。
Nic 2015年

5
天青托管的站点需要针对情况3遵循解决方案3:有助于g.co/allowaccess的
Ravi Anand

1
情况3的解决方案2-对我来说就像是一种魅力。谢谢。
ss_mj

106

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

登录到您的电子邮件后,请点击这里

这将带您到下一页

安全性较低的应用页面


1
另外,如果您具有自定义域,则首先需要由域管理员启用用户以允许访问安全性较低的应用。如果您是域管理员,请转到以下链接启用此admin.google.com/AdminHome#ServiceSettings/…–
user551113

2
这个答案很好。它像一种魅力。谢谢。
Thomas.Benz

24

今天花了几个小时在这里尝试所有解决方案后,我仍然无法摆脱这个确切的错误。我已经以这种方式使用了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
}

希望这有助于将来减轻别人的麻烦。


2
就我而言,我遇到了与您相同的问题,因此对代码重新排序,以使凭据最后对我有用。
2016年

1
我不敢相信,但是成功了!我启用了两步操作,因为不想启用安全性较低的标志,但是直到我将凭据放在“发送”之前不希望它起作用为止。难以置信!
Čikić雷纳德-

6
问题是在UseDefaultCredentialssetter中有以下代码:this.transport.Credentials = value ? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials : (ICredentialsByHost) null;覆盖setter credentials设置的代码Credentials。对我来说,这似乎SmtpClient是个虫子
Tomasz Madeyski '17

@TomaszMadeyski这必须是一个答案而不是评论!那是我的问题...我怎么会想到,如果我在构造函数上设置凭据,然后再次将其赋给一个假值UseDefaultCredentials = false,它将覆盖凭据...疯狂!但那确实发生了....谢谢youuuuu
FabianSilva '18



11

我有一个以前可以正常工作的代码,现在抛出此错误。密码没有问题。也无需将消息转换为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);
    }

关闭2要素身份验证 关闭2要素身份验证

将“允许不太安全的应用程序”设置为“开启”(同一页面,需要滚动到底部) 允许安全性较低的应用


9

只需按照Google电子邮件中的步骤操作,然后启用安全性较低的应用即可。


6

我也遇到过同样的问题。当您打开两步验证(MFA)时会发生这种情况。只需关闭“两步验证”即可解决您的问题。


我没有为此帐户启用两步操作,并且遇到了这个问题。
2015年

4

下面是我的代码。我也有同样的错误,但问题是我输入密码错误。下面的代码将正常工作..尝试

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

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


我正在使用在我的本地计算机上工作的相同代码,但在服务器上却不工作。收到错误消息SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:5.5.1需要身份验证。
Akshay Chawla

1
我联系了我的托管服务提供商,他们说: 我们可以看到您已配置了第三方SMTP(smtp.gmail.com),它将在我们的共享服务器环境中不支持。由于过度滥用邮件功能或垃圾邮件问题,因此不支持邮件功能。您可以使用PHPMailer发送电子邮件,PHPMailer非常流行并且经常使用。 但是我的网站是在mvc c#中构建的,所以如何使用phpmailer?
Akshay Chawla


2

对于部署到Microsoft Azure的应用程序,我遇到了同样的问题。

SmtpException:SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:5.5.1需要身份验证。

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

我为客户端使用了以下设置:

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

2

对我有用的是激活安全性较低的应用程序的选项(我正在使用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


2

Tomasz Madeyski的一条评论修正了我的问题……他说SetDefaultCredential上存在一个错误,他说:

“问题在于,UseDefaultCredentials设置程序中有以下代码:this.transport.Credentials = value?(ICredentialsByHost)CredentialCache.DefaultNetworkCredentials:(ICredentialsByHost)null;它将覆盖Credentials设置程序设置的凭据。对我来说,这就像SmtpClient的错误。”

如果您将smtpClient.UseDefaultCredentials = false设置的凭据放在后面...此行将这些凭据设置为空...


2

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

1

我尝试了这里发现的所有建议,从启用安全性较差的应用程序到尝试使用端口587 ...都没有用。最后我只是注释掉了界线UseDefaultCredentials = false。如果我不碰布尔值,一切都会正常。


1
同样在这里..我真不敢相信单行花费了我一个小时!
Wahid Masud

0

我确实研究了很多想法,唯一的解决方案是这种方式(与其他电子邮件提供商一起使用):

            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 "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)...

0

我是面向企业订阅者的Google Apps,即使有所有正确的设置(smtp,端口,enableSSL等),我也花了最后几个小时来处理。这是对我和尝试发送电子邮件时抛出5.5.1错误的网站有用的方法:

  1. 登录到您的admin.google.com
  2. 单击“安全<-”(如果看不到),然后单击“更多控件”,然后从列表中添加
  3. 单击基本设置
  4. 滚动到“基本设置”框的底部,单击链接:“转到设置以获取不太安全的应用程序”
  5. 选择选项#3:强制所有用户访问安全性较低的应用(不推荐)
  6. 按窗口底部的保存

完成此操作后,我从网站发送的电子邮件表单再次可用。祝好运!





0

不要在等待smtp.SendMailAsync(mail)之前放置断点;

:)

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



-5

尝试更改主机,这是新主机,我配置了mozilla thunderbird

Host = "smtp.googlemail.com"

对我有用

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.