使用C#通过Gmail SMTP服务器发送电子邮件


242

由于某种原因,“ 通过Gmail在.NET中发送电子邮件 ”对我来说都无法接受,也没有其他答案。他们为什么不工作?

更新:我已经尝试了另一个问题中的所有答案(已接受和其他),但没有一个起作用。

我只想知道它是否对其他任何人都有效,否则Google可能已经更改了某些内容(以前发生过)。

当我尝试使用的代码段时SmtpDeliveryMethod.Network,我很快在Send(message)上收到SmtpException。消息是

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

服务器响应为:

5.5.1需要身份验证。要了解更多信息,请点击“ <-认真地到此为止。

更新:

这是我很久以前问过的一个问题,可接受的答案是我在不同项目上使用过很多次的代码。

我已经采用了本文和其他EmailSender项目中的一些想法,以在Codeplex创建一个EmailSender项目。它旨在实现可测试性,并支持我最喜欢的SMTP服务,例如GoDaddy和Gmail。


我尝试使用另一种语言的类似方法来执行此操作。遇到了相同类型的事情:以前有用的旧文档方法对我不起作用。因此,您不知道Google是否更改了某些内容,或者您​​做错了什么。
AaronLS

2
@aaronls唯一最近的更改似乎与465端口有关。我在寻找解决方案时尝试了这一点(我只是在做同样的事情),并且465端口超时一直存在。如果是这种情况,请尝试使用587端口。
eglasius

2
此问题是由于“单词验证”(验证码)引起的。如果您通过Web界面手动登录并填写验证码,则SMTP将开始工作。
罗伯特·科里特尼克

4
FWIW,为我工作。您需要使用587和.EnableSSL true。c#4 / .NET 4当前不支持备用465 / SSL。gmail要求配置其他邮件客户端
gerryLowry 2011年

1
遵循@eglasius答案,并确保您打开Gmail中的“允许安全程度较低的应用程序”设置,以允许gmail对您的帐户进行身份验证。
user2713706

Answers:


290

CVertex,请确保检查您的代码,如果没有显示任何内容,请将其发布。我只是在我正在测试的ASP.NET网站上启用了它,并且它可以正常工作。

实际上,在某些时候我的代码有问题。我没有发现它,直到在控制台程序上有了一个简单的版本并看到它正在工作(您担心的Gmail方面没有任何变化)。下面的代码就像您引用的示例一样工作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("myusername@gmail.com", "mypwd"),
                EnableSsl = true
            };
            client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

我还结合使用了web.config,http://msdn.microsoft.com/en-us/library/w355a94k.aspx和代码(因为EnableSsl配置文件:()中没有匹配项)来使它工作。


1
在C#winforms应用程序中为我出色地工作。谢谢,弗雷迪。
安德鲁2009年

13
只要记住这样的代码就可以有效地将纯文本的gmail凭据传输给用户...
Chris Marisic 2010年

3
实际上在web.config中有一个enableSsl的匹配设置,请参见下面的答案
Wiebe Tijsma 2010年

4
@Zidad,是在4.0中添加的。
eglasius

21
您可能还需要在gmail设置页面中启用对“安全性较低的应用程序”的访问:google.com/settings/security/lesssecureapps。如果你正在为例外“`服务器响应为这是必要的:5.5.1需要验证
Ravendarksky

73

如果所有其他操作均失败,则以下内容几乎可以解答您的问题:

我遇到了完全相同的错误,结果证明Google的新密码强度测量算法已更改,认为我当前的密码太弱,并且没有告诉我有关该信息的任何信息(甚至没有消息或警告)...我如何发现这一点?好吧,我选择更改密码以查看是否有帮助(尝试所有其他操作均无济于事),并且当我更改密码后,它可以正常工作!

然后,为了进行实验,我尝试将密码更改回以前的密码以查看会发生什么,而Gmail实际上不允许我这样做,原因是“抱歉,我们无法允许您将更改保存为您选择的原因密码太弱”,并且不会让我回到原来的密码。我发现这是错误的,因为a)您需要每x个月更改一次密码,或者b)。如我之前所说,他们的密码强度算法已更改,因此即使我在尝试以任何方式登录时都没有说任何有关我的弱密码,我也没有被接受!这种情况(第2个)是最有可能出现的情况,因为我的弱密码使用了大约4个月了,它使我可以在Gmail中使用它。

他们对此一言不发是很糟糕的,但这是有道理的。因为大多数被劫持的电子邮件都是使用gmail之外的软件登录的,所以我想,如果您想在Gmail环境之外使用Gmail,则需要使用更安全的密码。

我希望这有帮助!


2
谢谢,正如您说的那样,更改密码以使其强度高,并且一切正常。
加文

1
这正是我的问题-所有其他建议都是关于config的,但是我的配置从一开始就是正确的,但是我一直不断出错。更改密码使所有的差异,
安德烈·弗梅伦

谢谢,终于我能够解决这个问题了,我的情况实际上更复杂了,我能够从我的开发机器(位于乔治亚州,高加索地区)发送电子邮件,但是电子邮件从生产服务器(英国)发送失败。将密码更改为复杂的密码现在一切正常:)
Kirill Chilingarashvili 2014年

谢谢。我的Gmail帐户也有同样的问题,但没有密码强度。我用强大的代码对其进行了更新,并且我的代码正在运行。
Thomas.Benz

谢谢,是的,它只是将密码更改为强密码。
Misha Beskin '16

66

除了上述其他疑难解答步骤外,我还要补充一点,如果您已在GMail帐户上启用了两因素身份验证(也称为两步验证),则必须生成应用程序专用密码并重新使用该密码。生成的密码以通过SMTP进行身份验证

要创建一个,请访问:https : //www.google.com/settings/,然后选择“ 授权应用程序和网站生成密码”。


1
我没有启用两步验证,并且密码的安全性也没关系,这是解决问题的唯一方法。我能够使用没有两步密码的其他gmail帐户,并且密码没有问题...要使用我真正想要使用的帐户,我必须启用两步并使用应用程序专用密码。
伊恩·罗伯逊

确实是我在做什么,但仍然是相同的错误:-/好像我的密码不够强,但是我使用的是Gmail给我的应用密码!
杰里·道奇

54
Turn On Access For Less Secure Apps and it will work for all no need to change password.

链接到Gmail设置

在此处输入图片说明


1
这对我有用。更重要的是,当我尝试通过上述方式发送电子邮件时,我实际上收到了Google的电子邮件,他们明确表示他们阻止了安全性较差的应用程序的尝试,并提到了修复此问题的方式
Demarsch '17

1
这是难题中最重要的关键,因为我已经进行了所有其他设置,而且似乎没有用。一旦启用此设置,它就像是一种魅力。
失去了

1
这对我有用。应用密码+ SSL +网络凭据。(VB.NET)
CrazyIvan1974年

30

我也从我的gmail帐户发送电子邮件时遇到了一些问题,这是由于上述几种情况引起的。这是我如何使其工作并同时保持灵活性的摘要:

  • 首先,设置您的GMail帐户:
    • 启用IMAP并声明正确的最大消息数(您可以在此处这样做)
    • 确保您的密码至少7个字符且安全性高(根据Google)
    • 确保您不必先输入验证码。您可以通过从浏览器发送测试电子邮件来做到这一点。
  • 在web.config中进行更改(或app.config,我还没有尝试过,但是我想让它在Windows应用程序中工作同样容易):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="yourusername@gmail.com" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="yourusername@gmail.com"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class

现在,每当您要发送电子邮件时,您需要做的只是致电SSLMail.SendMail

例如在具有PasswordRecovery控件的页面中:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("webmaster@example.com")
    SSLMail.SendMail(e)
End Sub

End Class

您也可以在代码中的任何位置调用:

SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})

我希望这对遇到这篇文章的人有所帮助!(我使用了VB.NET,但我认为将其转换为任何.NET语言很简单。)


+1“ enableSsl =” true“-这适用于遗留应用程序,该应用程序无需重新编译程序集就不会专门​​设置Smtp.enableSsl属性。绝佳提示!
Metro Smurf

并且不要忘记防火墙。端口587不是打开的常用端口。
Guy Lowe

13
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")

如果您收到类似“我的SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.5.1要求身份验证。了解更多信息”之类的错误,请确保SMTPClientObj.UseDefaultCredentials = False包含此行和该行应该在之前SMTPClientObj.Credentials

我确实尝试以相反的方式切换这两行,并返回5.5.1 Authentication Required错误


这正是我发生的事情。谁认为设置属性的顺序会解决/破坏问题!
比尔·杨

这对我来说也是个问题,我按照建议的顺序切换了顺序,效果很好-头疼,嗯!
eth0

13

哦,这太了不起了……首先,我出于任何原因都无法发送电子邮件。但是,当我如下更改这两行的顺序后,它可以正常工作。

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

希望这个帮助!!!:)


1
是的,顺序很重要。尤其是当您设置属性凭据时,您不想使用默认凭据。
Stefan Cvetanovski

1
根据文档,要使用凭据,您需要设置UseDefaultCredentials = false。但是,这两种设置似乎是秘密地交织在一起的。如果将UseDefaultCredentials设置为true或false,将具有将Credentials设置为null的副作用。并显示设置凭据可能会有副作用,设置UseDefaultCredentials = false。但是,未记录为这样做,可能是bug或只是just脚的开发人员。
亚伦

10

问题不是通过gmail发送的技术能力之一。这适用于大多数情况。如果您无法发送机器,通常是由于该机器至少一次未在操作员的身份验证之下。

大多数用户面临的问题是Google决定一直更改出站限制。您应该始终在解决方案中添加防御性代码。如果您开始发现错误,请降低发送速度,然后暂时停止发送。如果您一直尝试发送邮件,则Google有时会在延迟时间上增加一些时间,然后才能再次发送。

我在当前系统中所做的是在每条消息之间发送1.5秒的延迟。然后,如果出现任何错误,请停止5分钟,然后重新开始。这通常可以正常工作,并且可以让您发送最多的帐户限制(上次我检查每天的主要客户登录次数是2,000)。


1
这正是我的问题!当我部署到生产环境时,我遇到了问题,并且在服务器本身上登录Gmail后,它又重新开始工作。
ThisGuy 2012年


9

我遇到了同样的问题,但事实证明我的病毒防护功能阻止了传出的“垃圾邮件”电子邮件。关闭此功能后,我可以使用端口587通过GMail发送SMTP电子邮件


我禁用了Windows Defender,它也开始工作。
MorioBoncz 2014年


8

我不确定为此需要哪个.NET版本,因为eglasius提到没有匹配的enableSsl设置(我使用的是.NET 4.0,但我怀疑它可以在.NET 2.0或更高版本中使用),但是此配置仅适用于我(并且不需要您使用任何编程配置):

<system.net>
  <mailSettings>
    <smtp from="myusername@gmail.com" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
    </smtp>
  </mailSettings>
</system.net>

您可能必须先在Gmail帐户上启用POP或IMAP:https : //mail.google.com/mail/?shva= 1# settings/fwdandpop

我建议先尝试使用普通的邮件客户端...



嗨,Eglasius ...好的,谢谢!奇怪的是,它们仅在4.0之前的版本中具有程序化方法。我想我们都会
时不时地

6

@Andres Pompiglio:是的,对,您必须至少更改一次密码。此代码可以正常工作:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

并且您可以使用以下命令调用该函数:

Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))

SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:5.5.1需要身份验证。了解更多信息
Savas Adar 2014年

6

我正在使用企业VPN连接。这就是为什么我无法从应用程序发送电子邮件的原因。如果我断开与VPN的连接,它将起作用。


5

我还发现,由于某些原因,我用来登录的帐户已被Google停用。一旦我重置了密码(恢复为以前的密码),就可以发送电子邮件了。我也收到了5.5.1消息。


5

我也曾尝试过许多解决方案,但进行一些更改将可以使用

host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true

与上面的smtpclient参数在gmail中工作


5

我遇到了同样的错误,上述解决方案均无济于事。

我的问题是我正在从远程服务器运行代码,而该服务器从未用于登录gmail帐户。

我打开了远程服务器上的浏览器,并从那里登录gmail。它询问了一个安全问题,以确认是我本人,因为这是一个新地点。完成安全检查后,我可以通过代码进行身份验证。



4

我遇到了同样的错误(“ SMTP服务器需要安全连接或未通过身份验证的客户端。服务器响应为:5.5.1需要身份验证。了解更多信息”),发现我使用了错误的密码。我修复了登录凭据,并正确发送了该凭据。

我知道这已经晚了,但是也许这会对别人有所帮助。


4

我发现的另一件事是,您必须至少更改一次密码。并尝试使用安全级别的密码(请勿与密码,123456等使用同一用户)


4

还有另一种可能的解决方案。我在通过IMAP连接到gmail时遇到类似的问题。在尝试了我遇到的所有解决方案之后,您将在此处和其他地方阅读有关SO的信息(例如,启用IMAP,启用对邮件的较低安全访问权限, https://accounts.google.com/b/0/displayunlockcaptcha和等等),实际上我再次设置了一个新的Gmail帐户。

在我最初的测试中,我创建的第一个Gmail帐户已连接到我的主要gmail帐户。这导致错误的行为,其中Google引用了错误的帐户。例如,跑步 https://accounts.google.com/b/0/displayunlockcaptcha可以打开我的主帐户,而不是我为此目的创建的帐户。

因此,当我按照上面的所有适当步骤创建了一个新帐户并没有将其连接到我的主帐户后,我发现它可以正常工作!

我尚未证实这一点(即转载),但显然对我有用。希望它会有所帮助。


4
  1. 首先检查您的Gmail帐户设置,然后从“访问安全性较低的应用程序”中启用 在此处输入图片说明

强烈建议您使用安全的应用程序(例如Gmail)来访问您的帐户。Google制作的所有应用均符合这些安全标准。另一方面,使用不太安全的应用程序可能会使您的帐户容易受到攻击。学到更多。

  1. smtp.UseDefaultCredentials = false;

    之前

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);

4

出现这些错误的一个或多个原因。

  • 在您的本地系统中使用您的Gmail(或任何其他)登录。

  • 还要检查“安全性较低的应用程序”并将其设置为“打开”,这是GMAIL的链接。 https://www.google.com/settings/security/lesssecureapps

  • 检查您的电子邮件代码中的EnableSsl,并将其设置为true。

    smtp.EnableSsl = true;
  • 还要检查当前使用的端口。25是Global,但您也可以像587一样检查它。在这里检查。是否所有SMTP通信都超过25?

  • 如果您处于远程状态:请检查上面的Vlad Tamas的答案。


如果我不想打开安全性较低的应用程序设置,其他电子邮件客户端该怎么办,为什么我不能使用C#进行相同操作?
user734028 '18

3

您也可以通过端口465连接,但是由于System.Net.Mail命名空间的某些限制,您可能必须更改代码。这是因为名称空间不提供建立隐式SSL连接的功能。这是在讨论http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx,和我在另一个讨论中(所有端口上的通过C#.Net错误的GMail SMTP错误),提供了如何使用CDO(协作数据对象)的示例。


3

我已经解决了这个问题。显然,该消息用于多种错误类型。我的问题是我已达到500封已发送邮件的最大值。

登录该帐户,然后手动尝试发送邮件。如果已达到限制,它将通知您



2
smtp.Host = "smtp.gmail.com"; //host name
smtp.Port = 587; //port number
smtp.EnableSsl = true; //whether your smtp server requires SSL
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;

1

更改您的Gmail密码,然后重试,之后应该可以使用。

不知道为什么,但是每次更改主机时,都必须更改密码。

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.