it-swarm.cn

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

出于某种原因,“ 通过Gmail发送电子邮件 ”,接受的答案或其他任何一个都不适合我。他们为什么不工作?

更新:我在另一个问题中尝试了所有答案(接受和否则),但没有一个能够奏效。

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

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

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

服务器响应是:

5.5.1需要验证。了解更多“< - 认真,它在那里结束。

更新: /

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

我已经在这篇文章和其他EmailSender项目中采用了一些想法,在Codeplex创建一个 EmailSender项目 。它专为可测试性而设计,支持我最喜欢的SMTP服务,如GoDaddy和Gmail。

229
CVertex

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("[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 和代码(因为配置文件中没有匹配的EnableSsl)的组合工作: ()。

283
eglasius

以下意思 几乎可以作为回答 对您的问题 如果所有人都失败

我得到了完全相同的错误,结果显示谷歌的新密码强度测量算法已经改变,认为我当前的密码太弱了,并没有告诉我一件事情(甚至没有消息或警告)......我怎么发现这个?好吧,我选择更改我的密码以查看它是否有用(尝试其他一切无济于事),当我更改密码时,它有效!

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

他们对此没有说什么是非常糟糕的,但这是有道理的。因为大多数被劫持的电子邮件是使用gmail以外的软件登录的,我猜你要在Gmail环境之外使用Gmail时需要更强的密码。

我希望这有帮助!

66
Erx_VB.NExT.Coder

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

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

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

链接到Gmail设置

enter image description here

50
Suhail Mumtaz Awan

我在从我的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="[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>
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("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

或者您可以在代码中的任何地方致电:

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

我希望这可以帮助任何遇到这篇文章的人! (我使用VB.NET,但我认为将它转换为任何.NET语言都是微不足道的。)

29
Sebas
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 Authentication Required错误 返回。

13
Terry Chng

哦......真是太棒了......首先我无法发送任何理由的电子邮件。但是在我改变了这两行的顺序之后,它完美地工作了。

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

希望这有帮助!!! :)

12
Wirol

我遇到了同样的问题,但结果是我的病毒防护阻止了传出的“垃圾邮件”电子邮件。关闭它允许我使用端口587通过GMail发送SMTP电子邮件

9
user464329

解决这个问题的简单步骤:

1)登录您的Gmail

2)导航到此页面 https://www.google.com/settings/security/lesssecureapps &设置为“开启”

9
Kevin

问题不在于通过gmail发送的技术能力。这适用于大多数情况。如果您无法让机器发送,通常是因为机器未在控件上至少进行过一次人工认证。

大多数用户面临的问题是Google决定始终更改出站限额。您应该始终为您的解决方案添加防御性代码。如果您开始看到错误,请停止发送速度,然后停止发送一段时间。如果您一直试图发送Google,有时会在延迟期间增加额外的时间,然后再发送。

我在当前系统中所做的是在每条消息之间发送1.5秒的延迟。然后,如果我收到任何错误,请停止5分钟,然后重新开始。这通常有效,并允许您发送帐户的限制(最后我检查它是每天首要客户登录2,000。)。

9
Jason Short

我不确定这需要哪个.NET版本,因为eglasius提到没有匹配的enableSsl设置(我使用的是.NET 4.0,但我怀疑它可以在.NET 2.0或更高版本中运行),但这个配置值得一试对我来说(并且不要求你使用任何程序化配置):

<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#settings/fwdandpop

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

8
Wiebe Tijsma

如果此处没有其他任何内容可供您使用,则可能需要允许从第三方应用程序访问您的Gmail帐户。这是我的问题。要允许访问,请执行以下操作:

  1. 登录您的Gmail帐户。
  2. 访问此页面 https://accounts.google.com/DisplayUnlockCaptcha 并单击按钮以允许访问。
  3. 访问此页面 https://www.google.com/settings/security/lesssecureapps 并启用对安全性较低的应用的访问权限。

这对我有用,希望它适用于其他人!

8
Celt

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

6
Ned

@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, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

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

5
RKL

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

Host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true

使用smtpclient以上参数在gmail中工作

5
Suresh

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

在我原来的测试中,我创建的第一个gmail帐户,我已经连接到我的主要Gmail帐户。这导致了谷歌引用错误帐户的不稳定行为。例如,运行 https://accounts.google.com/b/0/displayunlockcaptcha 打开了我的主帐户,而不是我为此目的创建的帐户。

因此,当我创建一个新帐户并且未将其连接到我的主帐户时,按照上述所有相应步骤后,我发现它工作正常!

我还没有证实这一点(即转载),但它显然是为我做的...希望它有所帮助。

4
sinewave440hz

我得到了同样的错误,上述解决方案都没有帮助。

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

我在远程服务器上打开了一个浏览器并从那里登录了gmail。它问了一个安全问题,以确认这是我,因为这是一个新的位置。在进行安全检查后,我能够通过代码进行身份验证。

4
Vlad Tamas

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

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

4
Albert Bori

为您的帐户开启安全性较低的应用: https://www.google.com/settings/security/lesssecureapps

4
Burak Kalkan
  1. 首先检查您的Gmail帐户设置,然后从“访问安全性较低的应用程序”开启 enter image description here

我们强烈建议您使用Gmail等安全应用访问您的帐户。 Google生产的所有应用均符合这些安全标准。另一方面,使用安全性较低的应用可能会使您的帐户容易受到攻击。学到更多。

  1. smtp.UseDefaultCredentials = false;
    

    之前

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

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

4
Andres Pompiglio

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

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

3
Ayson Baxter

您也可以通过端口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进行讨论。 ,我提供了一个如何在另一个讨论中使用CDO(协作数据对象)的示例( GMail SMTP通过所有端口上的C#.Net错误 )。

3
Bryan Allred

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

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

  • 同时检查Less Secure App并将其设置为“Turn On”,这里是GMAIL的链接。 https://www.google.com/settings/security/lesssecureapps

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

    smtp.EnableSsl = true;
    
  • 还要检查您当前使用的是哪个端口。 25是Global,但你也可以像587一样检查其他人。点击这里。 所有SMTP通信是否都发生在25以上?

  • 如果您正在远程 :检查 Vlad Tamas 上面的答案。

2
Bharat
  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;
2
somesh

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

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

1
Jo Smo

如果您在Gmail帐户中启用了两步验证,则需要生成应用密码。 https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=zh-CN&visit_id=636903322072234863-1319515789&rd=1 选择如何生成应用密码选项并按照提供的步骤操作。将生成的应用程序密码复制并粘贴到某处,因为单击“完成”后将无法恢复该密码。

0
Faith Nassiwa