通过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 = False
行SMTPClientObj.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帐户。 这是我的问题。 要允许访问,请执行以下操作:
- login到您的Gmail帐户。
- 访问此页https://accounts.google.com/DisplayUnlockCaptcha并点击button以允许访问。;
- 访问此页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一个新的帐户,并没有连接到我的主要帐户,按照上述所有适当的步骤后,我发现它工作正常!
我还没有证实这一点(即转载),但它显然是为我做的…希望它有帮助。
- 首先检查您的Gmail帐户设置,并从“访问不太安全的应用程序”
我们强烈build议您使用Gmail等安全应用来访问您的帐户。 Google制作的所有应用都符合这些安全标准。 另一方面,使用安全性较低的应用可能会使您的帐户容易受到攻击。 学到更多。
-
组
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密码,然后再试一次,应该在那之后工作。
不知道为什么,但每次你改变你的主机,你必须改变你的密码。