关于.net:使用C#通过Gmail SMTP服务器发送电子邮件

Sending email through Gmail SMTP server with C#

出于某种原因,这个被接受的答案和其他任何答案都不适合我"通过Gmail在.NET中发送电子邮件"。为什么他们不工作?

更新:我已经尝试了其他问题的所有答案(接受或其他),但没有一个有效。

我只想知道它是否适用于其他人,否则谷歌可能已经改变了一些事情(这以前发生过)。

当我尝试使用SmtpDeliveryMethod.Network的代码时,我很快就会收到一个smtpexception on send(消息)。信息是

The SMTP server requires a secure connection or the client was not authenticated.

服务器响应为:

5.5.1 Authentication Required. Learn more at" <-- seriously, it ends there.

更新:

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

我采纳了这篇文章和其他emailsender项目中的一些想法,在codeplex创建了一个emailsender项目。它是为可测试性而设计的,并且支持我最喜欢的SMTP服务,比如godaddy和gmail。


cvertex,一定要检查你的代码,如果没有发现任何东西,就发布它。我只是在一个测试用的ASP.NET网站上启用了这个功能,它工作正常。

实际上,在某个时候我的代码有问题。直到我在一个控制台程序上有了一个更简单的版本,并且看到它工作了,我才发现它(在Gmail方面没有改变,正如你担心的那样)。下面的代码与您提到的示例一样工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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("[email protected]","mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]","[email protected]","test","testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

我还使用了web.config、http://msdn.microsoft.com/en-us/library/w355a94k.aspx和code(因为配置文件中没有匹配的EnableSsl)。


如果所有其他问题都失败了,下面几乎肯定是您问题的答案:

我也犯了同样的错误,结果谷歌的新密码强度测量算法改变了,认为我当前的密码太弱,没有告诉我任何有关它的事情(甚至没有消息或警告)。我是怎么发现这个的?好吧,我选择更改我的密码来看看它是否有用(尝试了所有其他方法都无效),当我更改密码时,它起作用了!

然后,为了做一个实验,我尝试将我的密码改回以前的密码,看看会发生什么,Gmail实际上不允许我这样做,理由是"抱歉,我们不能允许您保存这个更改,因为您选择的密码太弱",并且不允许我返回到以前的密码。我从中发现这是一个错误,因为要么a)你需要每x个月更改一次密码,要么b)。正如我之前所说,他们的密码强度算法发生了变化,因此我没有接受弱密码,即使他们在尝试登录任何地方时没有对此发表任何评论!这(数字2)是最有可能的情况,因为我的弱密码大约4个月大,它让我在Gmail中使用它。

他们没说这件事很糟糕,但这是有道理的。因为大多数被劫持的电子邮件都是使用Gmail以外的软件登录的,我猜如果你想在Gmail以外的环境中使用Gmail,你需要有一个更强大的密码。

希望这有帮助!


除上述其他故障排除步骤外,我还想补充一点,如果您在Gmail帐户上启用了双因素身份验证(也称为双步骤验证),则必须生成应用程序特定的密码,并使用新生成的密码通过SMTP进行身份验证。

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


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

链接到Gmail设置

enter image description here


我也有一些问题,从我的Gmail帐户发送电子邮件,这是由于上述几种情况。以下是我如何使它工作的摘要,同时保持它的灵活性:

  • 首先,设置您的Gmail帐户:
    • 启用IMAP并断言正确的最大消息数(您可以在这里这样做)
    • 确保你的密码至少有7个字符并且是强的(根据谷歌)
    • 确保您不必先输入验证码。您可以通过从浏览器发送测试电子邮件来完成此操作。
  • 在web.config(或app.config)中进行更改,我还没有尝试过,但我认为在Windows应用程序中进行更改同样容易:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<configuration>
   
           
    </appSettings>

    <!-- other settings -->

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="[email protected]" deliveryMethod="Network">
                <network
                    defaultCredentials="false"
                    host="smtp.gmail.com"
                    port="587"
                    password="stR0ngPassW0rd"
                    userName="[email protected]"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

例如,在具有密码恢复控件的页面中:

1
2
3
4
5
6
7
8
9
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("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

或者在代码中的任何地方,您都可以调用:

1
SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]","Subject","Body"})

我希望这能帮助任何一个遇到这篇文章的人!(我使用了vb.net,但我认为将其转换为任何.NET语言都很简单。)


1
2
3
4
5
6
7
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]","mypwd")
SMTPClientObj.Host ="smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("[email protected]","[email protected]","test","testbody")

如果出现类似"SMTP服务器需要安全连接或客户端未经身份验证"的错误。服务器响应为:5.5.1需要身份验证。在"我在这之前了解到的更多信息,请确保包含行SMTPClientObj.UseDefaultCredentials = False,并且该行应在SMTPClientObj.Credentials之前"。

我确实尝试以相反的方式切换这两条线,并且返回了5.5.1身份验证所需的错误。


哦…太神奇了…首先,我因为任何原因都无法发送电子邮件。但是在我改变了下面这两行的顺序之后,它工作得很好。

1
2
3
4
//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]","password");

希望能帮上忙!!!!:)


问题不是通过Gmail发送的技术能力。这在大多数情况下都有效。如果你不能让一台机器发送,通常是因为这台机器至少有一次没有通过控制器上的人的身份验证。

大多数用户面临的问题是,谷歌决定随时更改出站限制。您应该始终在解决方案中添加防御代码。如果您开始看到错误,请停止发送速度,暂时停止发送。如果你继续尝试发送谷歌,有时会在你再次发送之前给你的延迟时间增加额外的时间。

我在当前系统中所做的就是在每条消息之间延迟1.5秒发送。如果我有任何错误,停5分钟,然后重新开始。这通常是有效的,并且允许您发送到帐户的限制范围内(我上次检查是每天2000次卓越理财客户登录)。


解决此问题的简单步骤:

1)登录您的Gmail

2)导航到此页面https://www.google.com/settings/security/lessecureapps&set to"turn on"


我也有同样的问题,但事实证明是我的病毒防护阻止了发送"垃圾邮件"的邮件。关闭此项允许我使用端口587通过gmail发送SMTP电子邮件


如果这里没有其他任何东西对您有效,您可能需要允许从第三方应用程序访问您的Gmail帐户。这是我的问题。要允许访问,请执行以下操作:

  • 登录您的Gmail帐户。
  • 访问此页面https://accounts.google.com/displayunlockcaptcha并单击按钮以允许访问。
  • 访问此页面https://www.google.com/settings/security/lessecureapps并启用对不太安全的应用程序的访问。
  • 这对我有用,希望对别人有用!


    我不确定这需要哪个.NET版本,因为eglasius提到没有匹配的EnableSsl设置(我使用的是.NET 4.0,但我怀疑它在.NET 2.0或更高版本中工作),但这个配置对我来说是有效的(并且不要求您使用任何编程配置):

    1
    2
    3
    4
    5
    6
    7
    <system.net>
      <mailSettings>
        <smtp from="[email protected]" deliveryMethod="Network">
          <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
        </smtp>
      </mailSettings>
    </system.net>

    您可能需要先在Gmail帐户上启用POP或IMAP:https://mail.google.com/mail/?shva=1设置/fwdandpop

    我建议先用一个普通的邮件客户端…


    我使用的是企业VPN连接。这就是我不能从我的申请中发送电子邮件的原因。如果我从VPN断开,它就会工作。


    @安德烈斯庞皮格里奥:是的,没错,你必须至少更改一次密码。这些代码工作得很好:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    //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";
        }
        catch (Exception ex)
        {
            msg = ex.Message;
        }
        return msg;
    }
    //End Send Email Function

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

    1
    Response.Write(SendMail(recipient Address,"[email protected]","ccList if any","subject","body"))


    我还发现我用来登录的账户由于某种原因被谷歌取消了激活。一旦我重新设置了密码(和以前一样),我就可以发送电子邮件了。我也收到了5.5.1条信息。


    我也尝试过很多解决方案,但是做一些改变,它会起作用的。

    1
    2
    3
    4
    5
    host = smtp.gmail.com
    port = 587
    username = email@gmail.com
    password = password
    enabledssl = true

    对于smtpclient,上述参数在gmail中有效。


    另一个可能的解决方案。我在通过imap连接到gmail时遇到了类似的问题。在尝试了我遇到的所有解决方案后,您将在这里和其他地方看到关于SO(例如,启用IMAP,启用对邮件的不安全访问,使用https://accounts.google.com/b/0/displayUnlockCaptcha等),我实际上再次设置了一个新的gmail帐户。

    在我最初的测试中,我创建了第一个Gmail帐户,我连接到了我的主Gmail帐户。这导致了错误的账户被谷歌引用时的不稳定行为。例如,运行https://accounts.google.com/b/0/displayUnlockCaptcha打开了我的主帐户,而不是我为此创建的主帐户。

    因此,当我创建了一个新帐户,但没有将其连接到我的主帐户时,在遵循上述所有适当的步骤之后,我发现它工作正常!

    我还没有证实这一点(即复制),但它显然是为我做的……希望它有帮助。


    我也犯了同样的错误,以上的解决方案都没有帮助。

    我的问题是我运行的代码来自一个远程服务器,它从未被用于登录gmail帐户。

    我在远程服务器上打开了一个浏览器,然后从那里登录到Gmail。它问了一个安全问题来确认是我,因为这是一个新的地点。做了安全检查之后,我可以通过代码进行身份验证。


    为您的帐户打开不太安全的应用程序:https://www.google.com/settings/security/lessecureapps


    我发现的另一件事是你必须至少更改一次密码。并尝试使用安全级别的密码(不要使用与密码、123456等相同的用户)


  • 首先检查您的Gmail帐户设置,并从"访问不太安全的应用程序"打开。氧化镁
  • We strongly recommend that you use a secure app, like Gmail, to access your account. All apps made by Google meet these security standards. Using a less secure app, on the other hand, could leave your account vulnerable. Learn more.

  • 集合

    1
    smtp.UseDefaultCredentials = false;

    之前

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


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

    我知道这很晚了,但也许这能帮助别人。


    您也可以通过端口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上讨论过,我在另一个讨论(gmail smtp via c.net errors on all ports)中提供了如何使用CDO(协作数据对象)的示例。


    我解决了这个问题。一方面,该消息用于多种错误类型。我的问题是我已经达到了500封邮件的上限。

    登录帐户并手动尝试发送邮件。如果达到限额,它会通知你


    这些错误有一个或多个原因。

    • 在本地系统中使用gmail(或任何其他if)登录。

    • 另外,检查安全性较低的应用程序并将其设置为"打开",这里是Gmail的链接。https://www.google.com/settings/security/lessecureapps

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

      1
      smtp.EnableSsl = true;
    • 还要检查您当前使用的端口。25是全球性的,但是你也可以为其他人检查它,比如587。在这里检查。所有的SMTP通信都是在25岁以上吗?

    • 如果你在远程:检查上面的vlad-tamas的答案。


    1
    2
    3
    4
    5
    6
      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;

    更改你的Gmail密码,然后再试一次,它会在那之后工作。

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


    如果你的Gmail账户有两步验证步骤,你需要生成一个应用密码。https://support.google.com/accounts/answer/185833?P=app_密码_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1选择如何生成应用程序密码选项,并按照提供的步骤操作。复制并粘贴生成的应用程序密码,因为单击"完成"后将无法恢复。