首页 文章

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

提问于
浏览
220

出于某种原因,接受的答案或其他任何一个都不适用于“Sending email in .NET through Gmail” . 他们为什么不工作?

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

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

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

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

服务器响应是:

5.5.1需要验证 . 在< - - 认真地了解更多内容 .

UPDATE:

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

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

27 回答

  • 4

    我不确定这需要哪个.NET版本,因为eglasius提到没有匹配的 enableSsl 设置(我需要你使用任何编程配置):

    <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

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

  • 9

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

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

  • 2

    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 :() .

  • 3

    以下将 ALMOST CERTAINLY BE THE ANSWER 给你的问题 IF ALL ELSE HAS FAILED

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

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

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

    我希望这有帮助!

  • 2

    除了上面的其他疑难解答步骤之外,我还想补充一点,如果您在GMail帐户上启用了双因素身份验证(也称为two-step verification),那么 must generate an application-specific password and use that newly generated password to authenticate via SMTP .

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

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

    Link to Gmail Setting

    enter image description here

  • 6

    我在从我的Gmail帐户发送电子邮件时遇到了一些问题,这是由于上述几种情况造成的 . 以下是我如何使其工作并同时保持灵活性的摘要:

    • 首先设置您的GMail帐户:

    • 启用IMAP并断言正确的最大消息数(you can do so here)

    • 确保您的密码至少为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语言都是微不足道的 . )

  • 5
    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")
    

    如果你得到像我之前得到的"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at"这样的错误,请确保包含 SMTPClientObj.UseDefaultCredentials = False 行,并且该行应该在 SMTPClientObj.Credentials 之前 .

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

  • 64

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

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

    希望这个帮助!!! :)

  • 1

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

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

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

  • 6

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

  • 28

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

    1)登录您的Gmail

    2)导航到此页面https://www.google.com/settings/security/lesssecureapps并设置为"Turn On"

  • 4

    @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"))
    
  • 4

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

  • 9

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

  • 4

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

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

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

  • 8

    我遇到了同样的错误("The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at")并发现我使用了错误的密码 . 我修复了登录凭据,并正确发送 .

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

  • 46

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

  • 60

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

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

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

  • 9

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

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

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

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

  • 3

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

  • 5
    • 首先检查您的Gmail帐户设置并从"Access for less secure apps"
      enter image description here
      开启

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

    • 设置
    smtp.UseDefaultCredentials = false;
    

    之前

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

    您也可以通过端口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(协作数据对象)的示例 .

  • 13

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

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

  • 8

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

    smtp.EnableSsl = true;
    
    • 还要检查您当前使用的是哪个端口 . 25是全球,但你也可以像587一样检查其他人 . 点击这里 . Does all SMTP communication happen over 25?

    • IF YOU ARE ON REMOTE :检查上面 Vlad Tamas 的答案 .

  • 4
    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;
    
  • 4

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

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

相关问题