繁体   English   中英

无法在 C# 中发送电子邮件 安全性较低的应用程序访问不再可用

[英]Unable to send email in C# Less secure app access not longer available

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

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

我检查了这篇文章SMTP 服务器需要安全连接或客户端未通过身份验证。 服务器响应是:5.5.1 需要身份验证?

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

某些应用和设备使用安全性较低的登录技术,这使您的帐户容易受到攻击。 您可以关闭我们推荐的这些应用程序的访问权限,或者如果您想在有风险的情况下使用它们,请打开它。 如果不使用,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 或其他方式的方法?

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

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

  1. 在您的 Google 帐户中开启两步验证 此步骤是必需的,因为 Google 仅允许为启用了两步验证的帐户上的应用生成密码。
  2. 转到生成应用密码 ( https://myaccount.google.com/apppasswords ) 并为您的应用生成密码

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

它完美地工作:

在此处输入图像描述

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

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

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

对于初学者,不要使用 SmtpClient。 该类已过时,Microsoft 本身建议不要在文档中使用它 SmptClient 根本不支持更新的协议,更不用说像 OAuth 这样的身份验证协议了。 建议的替代方法是使用MailKit

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM