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

出于某种原因,接受的答案或其他任何工作对我来说都不是“ 通过Gmail发送.NET邮件 ”。 为什么他们不工作?

更新:我已经尝试了所有的答案(接受和否则)在另一个问题,但没有一个工作。

我只想知道它是否适用于其他人,否则Google可能会改变某些事情(之前已经发生过)。

当我尝试使用SmtpDeliveryMethod.Network的代码SmtpDeliveryMethod.Network ,我很快收到发送(消息)SmtpException。 消息是

SMTP服务器需要安全的连接或者客户端没有被authentication。

服务器的回应是:

5.5.1需要validation。 了解更多“< – 严重的是,它结束了。

更新:

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

我已经采取了这个职位和其他EmailSender项目的一些想法在Codeplex创build一个EmailSender项目 。 它专为可testing性而devise,支持我最喜欢的SMTP服务,如GoDaddy和Gmail。

CVertex,请务必检查您的代码,如果没有显示任何内容,请将其发布。 我只是在我正在testing的ASP.NET网站上启用这个function,并且工作正常。

其实,在某些时候,我的代码有问题。 我没有发现它,直到我有一个控制台程序更简单的版本,并看到它的工作(没有任何变化,你担心的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和代码(因为configuration文件;:()中没有匹配的EnableSsl )。

以下几乎一定是对问题的回答, 如果 一切都 失败了

我得到了完全相同的错误,原来Google的新密码强度测量algorithm已经改变认为我目前的密码太弱,不告诉我一件事情(甚至没有消息或警告)…我怎么发现这个? 那么,我select改变我的密码,看看是否会有所帮助(尝试一切无济于事),当我改变我的密码,它的工作!

然后,为了进行实验,我尝试将密码更改回以前的密码,以查看将要发生的情况,而Gmail实际上并未允许我这样做,理由是“抱歉,我们不能让您保存这个更改密码太弱“,不会让我回到我的旧密码。 我从中得出这样的结论:由于a)你需要每x个月更换一次密码,或b)。 正如我之前所说的那样,他们的密码强度algorithm发生了变化,因此我没有接受弱密码,尽pipe他们在任何地方尝试login都没有提到这个问题! 这个(数字2)是最有可能的情况,因为我的弱密码大约4个月大,它让我在Gmail中使用它。

他们对此一言不发,但这很有道理。 由于大多数被劫持的电子邮件是使用gmail之外的软件login的,而且我猜想如果您想在Gmail环境之外使用Gmail,则需要使用更强的密码。

我希望这有帮助!

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

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

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

链接到Gmail设置

在这里输入图像描述

我也有一些问题,从我的Gmail帐户也发送电子邮件,这是由于上述几种情况。 下面是我如何使用它的一个总结,并同时保持它的灵活性:

  • 首先设置你的GMail账号:
    • 启用IMAP并断言正确的最大数量的消息(你可以这样做)
    • 确保您的密码至less有7个字符,并且很强大(根据Google)
    • 确保您不必首先inputvalidation码。 您可以通过从浏览器发送testing邮件来完成。
  • 在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"}) 

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

 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服务器需要安全连接或客户端未经过身份validation”的错误,服务器响应为:“5.5.1需要身份validation”,在此之前了解详情,请确保SMTPClientObj.UseDefaultCredentials = FalseSMTPClientObj.UseDefaultCredentials = False包含SMTPClientObj.UseDefaultCredentials = False并且该行应在SMTPClientObj.Credentials之前。

我曾尝试以相反的方式切换这两行,并返回5.5.1身份validation错误

哦,这真是太神奇了…首先,我不能以任何理由发送电子邮件。 但是在改变了下面这两行的顺序之后,它就完美了。

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

希望这个帮助! 🙂

问题不在于通过Gmail发送技术能力。 这适用于大多数情况。 如果无法发送机器,通常是由于机器至less一次没有通过控制器与人员进行身份validation。

大多数用户面临的问题是Google决定一直改变出站限制。 你应该总是添加防御性的代码到你的解决scheme。 如果您开始看到错误,请closures发送速度,停止发送一段时间。 如果您继续尝试发送Google,则有时会在延迟期间增加额外的时间,然后才能再次发送。

我现在的系统做的是在每条消息之间发送1.5秒的延迟。 然后,如果我得到任何错误,停止5分钟,然后再次开始。 这通常有效,并将允许您发送到帐户的限制(最后我检查了2000是主要的客户login每天)。

我有同样的问题,但事实certificate,我的病毒保护阻止传出的“垃圾邮件”电子邮件。 closures这个function让我可以使用端口587通过GMail发送SMTP电子邮件

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

 <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

我build议先用一个普通的邮件客户端尝试它…

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

  1. login到您的Gmail帐户。
  2. 访问此页https://accounts.google.com/DisplayUnlockCaptcha并点击button以允许访问。;
  3. 访问此页https://www.google.com/settings/security/lesssecureapps并启用访问安全性较低的应用程序。;

这对我工作希望它适用于别人!

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

1)login到您的Gmail

2)导航到此页https://www.google.com/settings/security/lesssecureapps并设置为“打开”;

我还发现,由于某种原因,我用来login的帐户被google取消激活。 一旦我重设我的密码(和以前一样),那么我就可以发送电子邮件了。 我也收到5.5.1消息。

我也尝试了许多解决scheme,但做了一些改变,它将工作

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

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

@Andres Pompiglio:是的这是正确的,你必须改变你的密码至less一次..这个代码工作得很好:

 //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服务器需要一个安全的连接,或者客户端没有被authentication,服务器响应是:5.5.1 Authentication Required。” ),并发现我使用了错误的密码。 我修正了login凭证,并且发送正确。

我知道这是迟到的,但也许这会帮助别人。

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

我正在使用公司VPN连接。 这是我无法从我的应用程序发送电子邮件的原因。 如果我从VPN断开连接,它将起作用。

我得到了同样的错误,并没有上述解决scheme的帮助。

我的问题是,我从远程服务器运行代码,从来没有用过login到Gmail帐户。

我在远程服务器上打开浏览器,并从那里login到Gmail。 它提出了一个安全问题来validation这是我自己,因为这是一个新的位置。 在做安全检查之后,我可以通过代码进行身份validation。

还有另一种可能的解决scheme。 我有类似的问题通过IMAP连接到Gmail。 在尝试了所有我遇到的解决scheme之后,您将在此处和其他地方阅读有关SO(例如,启用IMAP,启用不太安全的邮件访问,使用https://accounts.google.com/b/0/displayunlockcaptcha和等等),我实际上又build立了一个新的Gmail帐户。;

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

所以,当我创build一个新的帐户,并没有连接到我的主要帐户,按照上述所有适当的步骤后,我发现它工作正常!

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

  1. 首先检查您的Gmail帐户设置,并从“访问不太安全的应用程序” 在这里输入图像描述

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

  1.  smtp.UseDefaultCredentials = false; 

    之前

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

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

我有这个问题解决。 该消息用于多种错误types。 我的问题是,我已经达到了最多500封邮件。

login到帐户并手动尝试发送邮件。 如果已达到限制,则会通知您

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

  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(或任何其他的)login到你的本地系统。

  • 另外检查不太安全的应用程序,并将其设置为“打开”这里是GMAIL的链接。 https://www.google.com/settings/security/lesssecureapps

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

     smtp.EnableSsl = true; 
  • 还要检查你目前使用哪个端口。 25是全球的,但你也可以像587一样检查他人。在这里检查。 所有SMTP通讯是否发生在25以上?

  • 如果你在远方 :检查上面Vlad Tamas的答案。

改变你的Gmail密码,然后再试一次,应该在那之后工作。

不知道为什么,但每次你改变你的主机,你必须改变你的密码。