【问题标题】:Unable to send email in C# Less secure app access not longer available无法在 C# 中发送电子邮件 安全性较低的应用程序访问不再可用
【发布时间】:2022-06-11 16:09:01
【问题描述】:

我在我们的生产车间运行了一个 winform 应用程序,它发送电子邮件进行报告,所以从昨天开始它无法发送电子邮件,我收到了这条消息

“SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.7.0 需要身份验证。”

我查看了这篇文章 The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required?

我发现 google 不再支持 3rd 方应用程序,它不允许安全性较低的应用程序 这是来自谷歌不太安全的应用程序 不太安全的应用访问:

某些应用和设备使用安全性较低的登录技术,这会使您的帐户容易受到攻击。您可以关闭我们推荐的这些应用程序的访问权限,或者如果您想在有风险的情况下使用它们,请将其打开。如果不使用,Google 会自动关闭此设置。 此设置不再可用。了解更多

所以我尝试添加 SmtpServer.UseDefaultCredentials = false;但没有任何效果,我认为问题在于谷歌不再支持第三方访问电子邮件。 这是我的代码

try
        {
            MailMessage mail = new MailMessage();
            System.Net.Mail.SmtpClient SmtpServer = new 
            System.Net.Mail.SmtpClient("smtp.gmail.com");
            string sender = "user@gmail.com";
            mail.From = new MailAddress(sender);
            mail.To.Add("receiver@plastikon.com");
       ;
            mail.Priority = MailPriority.High;
            mail.Subject = subject;
            mail.IsBodyHtml = true;
            mail.Body = ($"{body} \n Name of computer: { HostName} ");
            SmtpServer.Port = 587;
            SmtpServer.Credentials = new 
            System.Net.NetworkCredential("user@gmail.com", "Password");
            SmtpServer.EnableSsl = true;
            SmtpServer.UseDefaultCredentials = false;

            SmtpServer.Send(mail);

        }

问题是:是否有解决方案,或者任何人都可以向我推荐另一种发送电子邮件或 API 或其他方式的方法?

【问题讨论】:

  • GMAIL 的用户/密码身份验证已停用,afaik。您需要切换到另一种身份验证方法。我会试着找到一个谷歌文档。

标签: c# winforms


【解决方案1】:

停用不太安全的应用程序会阻止您使用您的用户名密码直接登录,但不会阻止您生成一个您的应用程序的特定密码。现在,您无需使用 Google 密码登录,而是使用为特定应用生成的密码登录。

解决方案很简单,不需要太多改动:

  1. Turn on 2-Step Verification 在您的 Google 帐户中。此步骤是必需的,因为 Google 只允许为启用了两步验证的帐户上的应用生成密码。
  2. 为您的应用生成应用密码 (https://myaccount.google.com/apppasswords) 和 generate a password

  1. 只需使用您的 gmail 用户名 (your_mail@gmail.com) 和在您的 c# 应用程序中生成的密码。

我已经测试过它可以与我附在下面的一个小型控制台应用程序一起使用:

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

string username = "your_mail@gmail.com";
string password = "generated_password";
ICredentialsByHost credentials = new NetworkCredential(username, password);

SmtpClient smtpClient = new SmtpClient()
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    Credentials = credentials
};

MailMessage mail = new MailMessage();
mail.From = new MailAddress(username);
mail.To.Add(username);
mail.Subject = "Testing less secure apps new configuration.";
mail.Body = "Hello stackoveflow!";

smtpClient.Send(mail);

而且效果很好:

【讨论】:

  • 我按照描述做了所有事情,但我仍然收到错误:发送邮件失败。无法从传输连接读取数据:连接已关闭。
  • @Maria 我刚刚附上了一个我亲自测试过的示例,它可以正常工作。
  • 它似乎对除我之外的所有人都有效。我发布了一个单独的问题,人们说他们运行了我的代码并且它有效。我用另一个 gmail 帐户尝试了它,设置了 2step 验证和应用程序密码,我得到了一个不同的错误:The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Authentication Required,状态码为 System.Net.Mail.SmtpStatusCode.MustIssueStartTlsFirst。 gmail还必须满足其他条件吗?
  • @Maria 您是否将EnableSsl 设置为true?您是否使用这个新帐户尝试了我的答案中的脚本?一个不同的错误已经向前迈进了一步。
  • 我做了,我的代码和你的几乎一样,这就是为什么我认为gmail帐户有问题,但我不知道可能是什么
【解决方案2】:

对于初学者,不要使用 SmtpClient。该类是文档中的obsolete and Microsoft itself advises against its use。 SmptClient 根本不支持更新的协议,更不用说像 OAuth 这样的身份验证协议了。建议的替代方法是使用MailKit

MailKit 可以以较不安全的模式使用 OAuth 连接两者。 FAQ 中描述了一般连接到 GMail。

文档页面Using OAuth2 With GMail (IMAP, POP3 or SMTP) 展示了如何创建 Google API 项目、配置它以进行 GMail 访问和 OAuth 身份验证,最后展示了如何发送电子邮件。文档页面显示了如何处理桌面和 Web 应用程序的身份验证

【讨论】:

    【解决方案3】:

    今天处理了这个。只需转到 gmail 帐户,然后转到管理您的 Google 帐户 > 安全性。

    从这里启用两步验证,完成后您将看到“应用密码”选项出现在两步验证选项下方。单击此按钮,命名您要使用的设备,然后将生成的密码复制并粘贴到您的代码中,以代替您使用的旧密码。

    我现在已经为我们的办公室打印机和 python 脚本完成了这项工作,我必须自动将时间表发送给每个人。

    【讨论】:

      【解决方案4】:

      如果您收到此错误 SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.7.0 Authentication Required

      您可能还需要检查您的电子邮件并确认您添加了应用程序密码。确认我能够发送电子邮件后。

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

      【讨论】:

        猜你喜欢
        • 2020-02-24
        • 2023-03-24
        • 2023-01-13
        • 2014-09-30
        • 2018-10-08
        • 1970-01-01
        • 2022-08-23
        • 2015-03-26
        • 1970-01-01
        相关资源
        最近更新 更多