ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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 日星期五 13:56:08 点 UTC IP 地址:xxx.xx.xx.xxx (abcd.net.) 地点:Philadelphia PA, Philadelphia, PA,美国 如果您无法识别此登录尝试,则其他人可能正在尝试访问您的帐户。您应该立即登录您的帐户并重置密码。重置密码 如果这是您本人,并且您在访问自己的帐户时遇到问题,请完成 http://support.google.com/mail?p=client_login 上列出的问题排查步骤 Google 帐户团队此致

关闭两步验证..
此外,请确保禁用 google“Captcha” - 如果您在远程服务器上运行脚本,这可能是必需的(在本地计算机上运行时不需要):accounts.google.com/DisplayUnlockCaptcha
对我来说遇到同样的错误。看了几篇帖子后,我尝试将现有的周密码更改为强密码。然后它起作用了。更改密码后,它还会询问诸如您可以从不太安全的应用程序访问您的邮件之类的问题吗?我说了可以。
谷歌放弃了对不太安全的应用程序的支持。您需要使用以下方法生成密码:stackoverflow.com/a/72553362

C
Community

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

案例一:密码错误时

案例2:当您尝试从某个应用程序登录时

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

每个人都有一个解决方案

案例一的解决方法:输入正确的密码。

案例 2 的解决方案 1:转到以下链接中的安全设置 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 并通过点击继续按钮允许访问。

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


解决方案2!你这个小美女!
上面的lesssecureapps链接有帮助:)
尝试了解决方案 2,打开安全性较低的应用程序 - 仍然出现相同的错误。然后,我尝试了解决方案 3,在生产服务器上登录 - 已解决。
托管在 azure 上的站点需要遵循案例 3 的解决方案 3:帮助 g.co/allowaccess 的最终链接
案例 3 的解决方案 2 - 对我来说就像一个魅力。谢谢。
C
CodeChops

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

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

或者 2) 将 gmail 登录到您的本地计算机,按照此 Link 并选择 review this activity 并采取适当的措施。


一点评论:转到 security.google.com/settings/security/activity,在这里您会看到代码中的连接被阻止。允许他们,在这种情况下应该会有所帮助。
这也会有很大帮助:google.com/settings/security/lesssecureapps
是的,原因是为 gmail 帐户打开了两步验证。选择应用程序/设备并单击生成按钮 support.google.com/accounts/answer/185833
此外,请确保禁用 google“Captcha” - 如果您在远程服务器上运行脚本,这可能是必需的(在本地计算机上运行时不需要):accounts.google.com/DisplayUnlockCaptcha
A
Abdul Saleem

2022 年更新

此方法不再有效

https://i.stack.imgur.com/SZwTm.jpg

原始答案

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

登录到您的电子邮件后,CLICK HERE

这将带您到以下页面

https://i.stack.imgur.com/6C0rU.jpg


此外,如果您有自定义域,用户首先需要由域管理员启用以允许访问不太安全的应用程序。如果您是域管理员,请转到以下链接以启用此 admin.google.com/AdminHome#ServiceSettings/…
这个答案很棒。它就像一个魅力。谢谢你。
虽然这对我来说是启用的,但它最初并没有工作。后来我把它关了,然后再打开。关闭刷新页面然后打开它后,这对我有用。
A
A. Gladkiy

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

但是,如果您将 Credentials setter 调用移至底部,则电子邮件将正确发送。我没有对周围的代码进行任何更改...即...用户名/密码等。显然,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
}

希望这有助于在将来帮助其他人避免一些头痛。


就我而言,我遇到了与您相同的问题,重新排序代码,以便凭据最后一次为我工作。
我不敢相信,但它奏效了!我启用了两步,因为不想启用不太安全的标志,但是直到我在发送之前将凭据放在最后,它不想工作。极好的!
问题是在 UseDefaultCredentials setter 中有这样的代码:this.transport.Credentials = value ? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials : (ICredentialsByHost) null; 覆盖由 Credentials setter 设置的 credentials。对我来说,它看起来像 SmtpClient 的错误
@TomaszMadeyski 这必须是答案而不是评论!那是我的问题...我怎么能认为如果我在构造函数上设置凭据然后再次分配给错误值 UseDefaultCredentials = false 它会覆盖凭据...疯了!但这会发生....谢谢你uuuu
这个解决方案似乎不再起作用了!
B
Barak Rosenfeld

你好我也有同样的问题

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

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


那么与您对 above 答案的答案有何不同? 2015 年 1 月 12 日 10:36 在您面前给出了相同的答案。
谷歌帐户页面中不再提供此设置!
@SotirisZegiannis 这为我解决了这个问题:stackoverflow.com/a/72553362
J
Jeson Martajaya

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

关闭 2 因素身份验证 将“允许安全性较低的应用程序”设置为 ON 从生产服务器登录到您的 gmail 帐户 前往此处以及批准登录活动 在生产服务器中运行您的应用程序

工作代码

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

https://i.stack.imgur.com/cdoNO.png

https://i.stack.imgur.com/wxBTc.png


据谷歌称,“不太安全的应用程序”设置不再可用。
G
George Stocker

只需按照谷歌电子邮件中的步骤并启用安全性较低的应用程序即可。


f
fortran

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


我没有为此帐户启用两步,并且遇到了这个问题。
G
Ganesh Pillai N

下面是我的代码。我也有同样的错误,但问题是我输入了错误的密码。下面的代码将完美运行..试试看

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

您可以在 my blog 中引用它


我正在使用在我的本地机器上工作但在服务器上不工作的相同代码。出现错误 SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.5.1 Authentication Required..
我联系了我的托管服务提供商,他们说:我们可以看到您配置了第三方 SMTP (smtp.gmail.com),这在我们的共享服务器环境中不支持。由于过度滥用邮件功能或垃圾邮件问题,不支持邮件功能。您可以使用非常流行且经常使用的 PHPMailer 发送电子邮件。但是我的网站是用 mvc c# 构建的,那么我该如何使用 phpmailer 呢?
h
haiiaaa

对于部署到 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";

c
cancan

2022 年 5 月 30 日之后,Gmail 更改了针对使用 google SMTP 发送电子邮件 For details 的外部应用程序的政策。 Solition是您要发送电子邮件的登录google帐户,启用google两步验证并为外部应用程序创建密码。 For details


J
JackSparrow

Gmail/Google 最近(从 2022 年 5 月起)移除了安全性较低的应用访问权限。这就是他们所说的:

为帮助确保您的帐户安全,自 2022 年 5 月 30 日起,Google 不再支持使用第三方应用或设备,这些应用或设备要求您仅使用您的用户名和密码登录您的 Google 帐户。

现在,任何直接发送 SMTP 电子邮件的电子邮件发送者都会抛出错误“535-5.7.8 用户名和密码不被接受”。这是因为现在 Google 要求输入应用程序专用密码,而电子邮件帐户密码不是应用程序密码,因此它们显示用户名/密码不被接受。

您需要创建和使用 App 专用密码。应用密码的作用类似于您帐户的备用密码。它只能由您与之共享的应用程序使用,因此它比共享您的主密码更安全。

要创建应用专用密码:

启用 2 因素身份验证。转到 Gmail 的帐户设置,然后选择应用程序密码。将其命名为您想要的任何名称并创建密码。将此新的 16 位密码与 SMTP 的 gmail 电子邮件一起使用(在密码处使用此 16 位密码)

享受发送电子邮件..!!

https://i.stack.imgur.com/KkpiS.png

https://i.stack.imgur.com/fM1Es.png

https://i.stack.imgur.com/7qFdt.png


E
Edgar

对我有用的是激活不太安全的应用程序的选项(我使用的是 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


F
FabianSilva

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

“问题是在 UseDefaultCredentials setter 中有这个代码:this.transport.Credentials = value ? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials : (ICredentialsByHost) null; 它覆盖了 Credentials setter 设置的凭据。对我来说,它看起来像 SmtpClient 的错误”

如果您在设置凭据之后放置 smtpClient.UseDefaultCredentials = false... 此行设置为 null 这些凭据...


I
InGeek

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

S
Sotiris Zegiannis

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

https://i.stack.imgur.com/RVB2o.png

https://i.stack.imgur.com/sKZac.png

https://i.stack.imgur.com/Hzrx2.png

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

我希望这可以帮助别人:-)


K
Kris Coleman

我尝试了这里找到的所有建议,从启用不太安全的应用程序到尝试端口 587 ......没有任何效果。最后,我只是注释掉了 UseDefaultCredentials = false 行。如果我不碰那个布尔值,一切都会奏效。


s
samiup

您可能需要从 gmail 创建/生成特定的 APP 密码。然后,您的应用程序或脚本将使用此新密码而不是您的常规密码。您的常规密码仍然可以正常使用。

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

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

https://i.stack.imgur.com/H3vMQ.png

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


H
Hamit YILDIRIM

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

:)

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


H
HoldOffHunger

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

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

V
Vivek S.

尝试更换主机,这是新的,我得到了这个配置 Mozilla Thunderbird

Host = "smtp.googlemail.com"

那对我有用


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅