出于某种原因," 通过Gmail发送.NET中的电子邮件 "既没有被接受的答案也没有其他任何一个对我有用.他们为什么不工作?
更新:我在另一个问题中尝试了所有答案(接受和否则),但没有一个能够奏效.
我想知道它是否适用于其他任何人,否则谷歌可能已经改变了一些事情(之前发生过).
当我尝试使用的代码片段时SmtpDeliveryMethod.Network
,我会在Send(消息)上快速收到SmtpException.信息是
SMTP服务器需要安全连接或客户端未经过身份验证.
服务器响应是:
5.5.1需要验证.了解更多"< - 认真,它在那里结束.
更新:
这是我很久以前问过的一个问题,接受的答案是我在不同的项目中使用了很多次的代码.
我已经在这篇文章和其他EmailSender项目中采用了一些想法,在Codeplex上创建了一个EmailSender项目.它专为可测试性而设计,支持我最喜欢的SMTP服务,如GoDaddy和Gmail.
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
配置文件中没有匹配:().
如果所有人都失败了,以下几乎可以回答你的问题:
我得到了完全相同的错误,事实证明谷歌的新密码车力量测量算法已经改变了我的推定当前密码太弱了,没有告诉我关于它的事情(甚至不是一个消息或警告)......我是怎么发现这个?好吧,我选择更改我的密码以查看它是否有用(尝试其他一切无济于事),当我更改密码时,它有效!
那么,对于一个实验,我试图改变我的密码回到我以前的密码,看看会发生什么,和Gmail实际上并没有让我这样做,理由的理由"对不起,我们不能让你这个改变保存为您的选择密码太弱"并且不会让我回到我的旧密码.我认为这是错误的,因为a)你需要每x个月或b)更改一次密码.正如我之前所说,他们的密码强度算法发生了变化,因此我所接受的弱密码未被接受,即使他们在尝试登录时没有说出任何相关信息!这个(数字2)是最可能的情况,因为我的弱密码大约有4个月的时间,它允许我在Gmail中使用它.
他们对此没有说什么是非常糟糕的,但这是有道理的.因为大多数被劫持的电子邮件是使用gmail以外的软件登录的,我猜你要在Gmail环境之外使用Gmail时需要更强的密码.
我希望这有帮助!
除了上面的其他疑难解答步骤之外,我还想补充一点,如果您在GMail帐户上启用了双因素身份验证(也称为两步验证),则必须生成应用程序专用密码并使用新密码生成密码以通过SMTP进行身份验证.
要创建一个,请访问:https://www.google.com/settings/并选择授权应用程序和网站以生成密码.
Turn On Access For Less Secure Apps and it will work for all no need to change password.
链接到Gmail设置
我在从我的Gmail帐户发送电子邮件时遇到了一些问题,这是由于上述几种情况造成的.以下是我如何使其工作并同时保持灵活性的摘要:
首先设置您的GMail帐户:
启用IMAP并断言正确的最大消息数(您可以在此处执行此操作)
确保您的密码至少为7个字符并且非常强大(根据Google)
确保您不必先输入验证码.您可以通过从浏览器发送测试电子邮件来完成此操作.
在web.config(或app.config中进行更改,我还没有尝试过,但我认为它在Windows应用程序中运行起来同样容易):
...
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语言都是微不足道的.)
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服务器需要安全连接或客户端未经过身份验证.服务器响应为:5.5.1需要验证.了解更多信息",在此之前,请确保SMTPClientObj.UseDefaultCredentials = False
包含此行和此行应该在之前SMTPClientObj.Credentials
.
我确实尝试以相反的方式切换这两行,并返回5.5.1 Authentication Required错误.
哦......真是太棒了......首先我无法发送任何理由的电子邮件.但是在我改变了这两行的顺序之后,它完美地工作了.
//(1) client.UseDefaultCredentials = true; //(2) client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");
希望这有帮助!!! :)
解决这个问题的简单步骤:
1)登录您的Gmail
2)导航到此页面https://www.google.com/settings/security/lesssecureapps并设置为"开启"
问题不在于通过gmail发送的技术能力.这适用于大多数情况.如果您无法将机器发送,通常是由于机器未在控件上至少进行过一次人工认证.
大多数用户面临的问题是Google决定始终更改出站限额.您应该始终为您的解决方案添加防御性代码.如果您开始看到错误,请停止发送速度,然后停止发送一段时间.如果您一直试图发送Google,有时会在延迟期间增加额外的时间,然后再发送.
我在当前系统中所做的是在每条消息之间发送1.5秒的延迟.然后,如果我收到任何错误,请停止5分钟,然后重新开始.这通常有效,并允许您发送帐户的限制(最后我检查它是每天首要客户登录2,000.).
我遇到了同样的问题,但结果是我的病毒防护阻止了传出的"垃圾邮件"电子邮件.关闭它允许我使用端口587通过GMail发送SMTP电子邮件
我不确定这需要哪个.NET版本,因为eglasius提到没有匹配的enableSsl
设置(我使用的是.NET 4.0,但我怀疑它可以在.NET 2.0或更高版本中运行),但是这个配置可以用于我(并且不要求您使用任何编程配置):
您可能必须先在Gmail帐户中启用POP或IMAP:https://mail.google.com/mail/?shva = 1# settings/fwdandpop
我建议先用普通邮件客户端尝试...
如果此处没有其他任何内容可供您使用,则可能需要允许从第三方应用程序访问您的Gmail帐户.这是我的问题.要允许访问,请执行以下操作:
登录您的Gmail帐户.
访问此页面https://accounts.google.com/DisplayUnlockCaptcha并单击按钮以允许访问.
访问此页面https://www.google.com/settings/security/lesssecureapps并启用对安全性较低的应用的访问权限.
这对我有用,希望它适用于其他人!
@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
"; } 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"))
我正在使用企业VPN连接.这就是为什么我无法从我的应用程序发送电子邮件的原因.如果我从VPN断开连接,它会工作.
我还发现,我以前登录的帐户由于某种原因被谷歌取消激活.一旦我重置密码(与以前一样),我就可以发送电子邮件了.我也收到了5.5.1的消息.
我也试过很多解决方案,但做一些改变它会起作用
host = smtp.gmail.com port = 587 username = email@gmail.com password = password enabledssl = true
使用smtpclient以上参数在gmail中工作
我遇到了同样的错误,上述解决方案均无济于事。
我的问题是我正在从远程服务器运行代码,该服务器从未用于登录gmail帐户。
我打开了远程服务器上的浏览器,并从那里登录gmail。它询问了一个安全问题,以确认是我自己,因为这是一个新位置。完成安全检查后,我可以通过代码进行身份验证。
为您的帐户开启安全性较低的应用程序:https : //www.google.com/settings/security/lesssecureapps