145

我想从我的应用程序中发送一封电子邮件,并且我已经编写了以下用于发送邮件的代码

    MailMessage msg = new MailMessage();

    msg.From = new MailAddress("mymailid");
    msg.To.Add("receipientid");
    msg.Subject = "test";
    msg.Body = "Test Content";
    msg.Priority = MailPriority.High;

    SmtpClient client = new SmtpClient();

    client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
    client.Host = "smtp.gmail.com";
    client.Port = 587;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.EnableSsl = true;
    client.UseDefaultCredentials = true;

    client.Send(msg);

我在本地主机上运行它,所以我在发送它时犯了什么错误。

当我发送按钮时,它会给出一个错误,例如

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

Web.config 文件中的代码

 <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />   
    <add key="smtpServer" value="smtp.gmail.com" />
    <add key="EnableSsl" value = "true"/>
    <add key="smtpPort" value="587" />
    <add key="smtpUser" value="sender@gmail.com" />
    <add key="smtpPass" value="mypassword" />
    <add key="adminEmail" value="sender@gmail.com" />
  </appSettings>
  <system.net>
    <mailSettings>
      <smtp from="sender@gmail.com">
        <network host="smtp.gmail.com" password="mypassword" port="587" userName="sender@gmail.com"  enableSsl="true"/>
      </smtp>
    </mailSettings>
  </system.net>

我应该怎么做才能解决这个错误并发送邮件?

4

27 回答 27

207

我也有同样的问题。

我找到了这个解决方案:

Google 可能会阻止来自不使用现代安全标准的某些应用或设备的登录尝试。由于这些应用程序和设备更容易被入侵,因此阻止它们有助于确保您的帐户更安全。

一些不支持最新安全标准的应用示例包括:

  • 装有 iOS 6 或更低版本的 iPhone 或 iPad 上的邮件应用
  • 8.1 版本之前的 Windows 手机上的邮件应用程序
  • 一些桌面邮件客户端,如 Microsoft Outlook 和 Mozilla Thunderbird

因此,您必须在您的 google 帐户中启用较不安全的登录(或较不安全的应用程序访问)。

登录谷歌账号后,访问:

https://www.google.com/settings/security/lesssecureapps

https://myaccount.google.com/lesssecureapps

在 C# 中,您可以使用以下代码:

using (MailMessage mail = new MailMessage())
{
    mail.From = new MailAddress("email@gmail.com");
    mail.To.Add("somebody@domain.com");
    mail.Subject = "Hello World";
    mail.Body = "<h1>Hello</h1>";
    mail.IsBodyHtml = true;
    mail.Attachments.Add(new Attachment("C:\\file.zip"));

    using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
    {
        smtp.Credentials = new NetworkCredential("email@gmail.com", "password");
        smtp.EnableSsl = true;
        smtp.Send(mail);
    }
}
于 2014-08-09T06:20:19.193 回答
83

首先检查 gmail 的安全相关问题。您可能在 gmail 中启用了双重身份验证。如果您收到任何安全警报,还请检查您的 gmail 收件箱。在这种情况下,请检查@mjb 的其他答案,如下所示

以下是我总是首先检查此类问题的非常普遍的事情

client.UseDefaultCredentials = true;

将其设置为假。

注意@Joe King 的回答- 您必须在设置 client.Credentials之前设置client.UseDefaultCredentials

于 2013-08-29T06:16:31.333 回答
54

确保您SmtpClient.Credentials 调用后设置SmtpClient.UseDefaultCredentials = false

顺序很重要,因为设置SmtpClient.UseDefaultCredentials = false将重置SmtpClient.Credentials为空。

于 2015-01-12T07:12:06.790 回答
48

我已经搜索并尝试了几个小时的不同事物。总而言之,我必须考虑以下几点:

  1. 使用smtp.gmail.com代替smtp.google.com
  2. 使用端口 587
  3. 在设置client.UseDefaultCredentials = false;凭据之前设置
  4. 为不太安全的应用打开Access
  5. client.EnableSsl = true;

如果这些步骤没有帮助,请检查此答案
也许,您也可以在此System.Net.Mail 常见问题解答中找到有用的信息。

于 2016-06-25T02:32:52.820 回答
13

尝试登录您的 gmail 帐户。如果您使用 gmail SMTP 发送电子邮件,它会被锁定。我不知道在它被锁定之前你可以发送的电子邮件的限制,但如果你登录一次,它就会再次从代码中工作。确保您的 webconfig 设置良好。

于 2013-10-23T03:57:42.283 回答
11

试试这种方式,我只是做了一些轻微的改变:

MailMessage msg = new MailMessage();

msg.From = new MailAddress("mymailid@gmail.com");
msg.To.Add("receipientid@gmail.com");
msg.Subject = "test";
msg.Body = "Test Content";
//msg.Priority = MailPriority.High;


using (SmtpClient client = new SmtpClient())
{
    client.EnableSsl = true;
    client.UseDefaultCredentials = false;
    client.Credentials = new NetworkCredential("mymailid@gmail.com", "mypassword");
    client.Host = "smtp.gmail.com";
    client.Port = 587;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;

    client.Send(msg);
}

如果您在那里有邮件设置,请同时显示您的 app.config 文件。

于 2013-08-29T13:51:05.770 回答
8

从此链接打开不太安全的应用程序并繁荣...

于 2016-06-24T07:50:41.757 回答
7

尝试启用允许不太安全的应用程序访问。

在这里,您可以在使用 Gmail 登录后启用安全性较低的应用程序。

https://myaccount.google.com/lesssecureapps

谢谢。

于 2018-10-20T12:54:16.710 回答
5

在此处输入图像描述 确保允许访问不太安全的应用程序。

        MailMessage mail = new MailMessage();
        mail.From = new MailAddress("xx@gmail.com");
        mail.Sender = new MailAddress("xx@gmail.com");
        mail.To.Add("external@emailaddress");
        mail.IsBodyHtml = true;
        mail.Subject = "Email Sent";
        mail.Body = "Body content from";

        SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
        smtp.UseDefaultCredentials = false;

        smtp.Credentials = new System.Net.NetworkCredential("xx@gmail.com", "xx");
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
        smtp.EnableSsl = true;

        smtp.Timeout = 30000;
        try
        {

            smtp.Send(mail);
        }
        catch (SmtpException e)
        {
            textBox1.Text= e.Message;
        }
于 2015-04-03T10:41:23.060 回答
3

即使我将“UseDefaultCredentials”设置为 false,我也遇到了同样的问题。后来我发现根本原因是我在我的帐户中打开了“两步验证”。我关掉后问题就消失了。

于 2014-07-14T16:15:29.557 回答
2

我多次遇到同样的问题。启用不太安全的应用程序选项后,问题解决了。从这里启用不太安全的应用程序: https ://myaccount.google.com/lesssecureapps

希望这会有所帮助。

于 2020-02-10T05:45:32.063 回答
2

应用密码帮助了我。

  1. 转到https://myaccount.google.com/security
  2. 向下滚动到“登录 Google”。
  3. 启用两步验证。
  4. 添加应用密码。
  5. 在您的代码中使用生成的密码。
于 2021-02-12T09:54:23.510 回答
1

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

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

您可以在发送邮件中引用它

于 2014-05-13T02:17:46.663 回答
1

如果它是一个新的 google 帐户,您必须通过常规用户界面发送一封电子邮件(第一个)。之后,您可以使用您的应用程序/机器人发送消息。

于 2016-03-15T17:33:48.233 回答
1

您应该考虑在配置文件中指定 SMTP 配置数据,并且不要在代码中覆盖它们 - 请参阅http://www.systemnetmail.com/faq/4.1.aspx上的 SMTP 配置数据

<system.net>
            <mailSettings>
                <smtp deliveryMethod="Network" from="admin@example.com">
                    <network defaultCredentials="false" host="smtp.example.com" port="25" userName="admin@example.com" password="password"/>
                </smtp>
            </mailSettings>
        </system.net>
于 2016-06-11T05:23:11.383 回答
1

如果您在测试环境中并且不想设置安全设置,则必须允许安全性较低的应用程序通过。Gmail 中的此链接。

https://myaccount.google.com/lesssecureapps

于 2020-07-06T08:33:00.007 回答
1

我今天早上创建了一个Microsoft 365 开发人员订阅 (E5),并使用它使用以下设置发送测试电子邮件

using (SmtpClient client = new SmtpClient())
{
    client.EnableSsl = true;
    client.UseDefaultCredentials = false;
    client.Credentials = new NetworkCredential(username, password);
    client.Host = "smtp.office365.com";
    client.Port = 587;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;

    client.Send(msg);
}

一开始它不起作用,因为我不断收到此错误消息以及此代码引发的异常。然后,我花了大约 4 个多小时来使用 Microsoft 365 管理中心设置并阅读文章以找出问题所在。最终,我更改了我的 Microsoft 365 管理中心密码,它就像一个魅力。因此,在考虑任何高级解决方案之前,有必要在收到此消息时尝试更改密码。

请注意,当我毫无问题地登录到我的 Microsoft 365 帐户时,密码肯定不是无效的。但是,密码更改解决了这个问题。

于 2020-08-12T04:26:07.870 回答
0

一些 smtp 服务器(安全的)要求您同时提供用户名和电子邮件,如果它的 gmail 则很可能是您需要解决的“不太安全的登录”问题,否则您可以尝试:

public static void SendEmail(string address, string subject, 
    string message, string email, string username, string password, 
    string smtp, int port)
{
    var loginInfo = new NetworkCredential(username, password);
    var msg = new MailMessage();
    var smtpClient = new SmtpClient(smtp, port);

    msg.From = new MailAddress(email);
    msg.To.Add(new MailAddress(address));
    msg.Subject = subject;
    msg.Body = message;
    msg.IsBodyHtml = true;

    smtpClient.EnableSsl = true;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = loginInfo;
    smtpClient.Send(msg);
}

请注意,来自的电子邮件和用户名是不同的,这与某些将它们称为相同的实现不同。

调用此方法可以这样完成:

SendEmail("to-mail@gmail.com", "test", "Hi it worked!!", 
   "from-mail", "from-username", "from-password", "smtp", 587);
于 2015-01-20T12:39:10.317 回答
0

打开不太安全的选项并尝试其他解决方案后,如果您仍然面临同样的问题,请尝试使用此重载:

client.Credentials = new NetworkCredential("mymailid", "mypassword");

代替:

client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
于 2017-09-28T00:53:27.270 回答
0

我有同样的问题,通过将密码更改为强密码解决了。

于 2020-12-13T05:53:58.140 回答
0

如果您在使用 Office 365 帐户时遇到此问题。在 Exchange Online 中,默认情况下,将为所有 Office 365 邮箱帐户禁用 SMTP 客户端身份验证。您必须为有问题的帐户手动启用 SMTP Auth 并再次检查案例。检查以下线程。

https://morgantechspace.com/2021/01/the-smtp-server-requires-a-secure-connection-or-the-client.html

https://docs.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission

于 2021-01-19T08:48:09.203 回答
0

我已经使用了这个问题中的步骤,它对我有用。

我的问题是 G Suite 认为我的密码不安全,更改后它运行良好。

于 2021-02-06T20:03:47.977 回答
0

如果所有提到的解决方案都没有帮助,请尝试使用此 URL - 它帮助我解除阻止在我的网站上发送电子邮件

https://g.co/allowaccess

于 2021-04-14T05:50:33.923 回答
0

这可能是:1)用户或密码错误 2)未启用 SSL 3)安全应用程序未启用 4)您尚未使用此邮件登录服务器 5)您尚未设置 client.UseDefaultCredentials = false

于 2021-04-19T20:41:56.493 回答
0

在浏览了每个提出的解决方案之后,我意识到正确的答案取决于您当前的服务器和电子邮件客户端情况。就我而言,我的 MX 记录指向我的本地出站服务器。此外,由于我使用 G Suite 而不是 Gmail 来发送通知电子邮件,因此我必须遵循以下配置:https ://support.google.com/a/answer/2956491?hl=en 。

话虽如此,我找到了完成这项工作的正确方法,确实是首先从我的 G Suite 帐户配置 SMTP 中继服务:

SMTP_Relay 配置 G Suite

继电器设置详细信息

IPv6 地址是 MX 记录指向的网络服务器的地址(例如:1234:454:c88a:d8e7:25c0:2a9a:5aa2:104)。

完成后,使用此代码补充解决方案:

 //Set email provider credentials
 SmtpClient smtpClient = new SmtpClient("smtp-relay.gmail.com", "587");                   

 smtpClient.EnableSsl = true;
 smtpClient.UseDefaultCredentials = true;
 
 MailAddress from = new MailAddress("username@yourdomain.com", "EmailFromAlias");
 MailAddress to = new MailAddress("destination@anydomain.com");

 MailMessage = new MailMessage(from, to);

 MailMessage.Subject = subject;
 MyMailMessage.Body = message;

 MyMailMessage.IsBodyHtml = false;

 smtpClient.Send(MyMailMessage);

请注意,使用此方法smtpClient.UseDefaultCredentials = true ; 而不是其他解决方案中建议的错误。此外,由于我们使用 IPv6 地址连接 SMTP 客户端,因此不需要指定用户名或密码。因此,在我看来,这是一种更安全、更安全的方法。

于 2021-09-13T20:45:45.110 回答
0

就我而言,我面临着同样的问题。经过长时间的研究,不要将 UseDefaultCredentials 值设置为 false。因为 UseDefaultCredentials 的默认值为 false。

另一个关键点是在 client.send(message) 语句之前设置网络凭据。

错误代码:

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
client.Send(message);

错误代码:

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = true;
client.Send(message);

正确的代码

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
// client.UseDefaultCredentials = true;
client.Send(message);

正确的代码

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Send(message);

现在它与两个更正的代码都可以正常工作。所以在这种情况下,顺序很重要。

干杯!

于 2021-12-01T11:25:55.937 回答
-1

我还面临着“SMTP 服务器需要安全连接或客户端未通过身份验证”之类的问题。服务器响应是:5.5.0 Authentication Required' 然后浏览了很多互联网资料,但它并没有完全帮助我。我是如何解决的

step1:smtp.gmail.com 是 gmail 服务器,所以转到您的帐户 gmail 设置->单击查看所有设置->转发和 IMAP/POP->检查弹出和 imap 是否已启用,如果未启用它->保存更改。step2-单击您的gmail个人资料图片->单击管理您的google帐户->转到安全选项卡->检查访问安全性较低的应用程序(如果您没有选择两步验证,则此选项可用)->默认情况下谷歌将其设置为禁用,使其能够使用您的真实 gmail 密码来发送电子邮件。注意:-为不太安全的应用程序启用 gmail 访问,可能对您很危险,所以我不推荐这样做

第 3 步:-如果您的帐户启用了两步验证,或者想要使用您的 gmail 真实密码以外的密码,请尝试以下操作:- 单击您的 gmail 个人资料图片->单击管理您的 google 帐户->转到安全性选项卡->搜索应用程序密码->选择任何给定的应用程序名称->选择任何设备名称->单击生成->复制 16 位密码并将其粘贴到您必须输入 gmail 密码的应用程序中您真正的 gmail 密码。

于 2020-07-19T09:22:28.757 回答