出于某种原因,“Sending email in .NET through Gmail”既没有接受的答案也没有其他人为我工作。他们为什么不工作?
更新:我已经在另一个问题中尝试了所有答案(已接受和否则),但它们都没有工作。
我想知道它是否适用于其他任何人,否则谷歌可能已经改变了一些事情(以前发生过)。
当我尝试使用SmtpDeliveryMethod.Network
的代码时,我很快就收到了发送(消息)的SmtpException。消息是
SMTP服务器需要安全连接,或者客户端未经过身份验证。
服务器响应是:
5.5.1需要验证。在“< - 了解更多信息,它会在那里结束。
更新
这是我很久以前问过的一个问题,接受的答案是我在不同项目中多次使用的代码。
我已经在本文和其他EmailSender项目中采用了一些想法来创建EmailSender project at Codeplex。它专为可测试性而设计,支持我最喜欢的SMTP服务,如GoDaddy和Gmail。
答案 0 :(得分:283)
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
:()。
答案 1 :(得分:66)
以下几乎可以回答对您的问题如果所有人都失败:
我得到了完全相同的错误,结果显示谷歌的新密码强度测量算法已经改变,认为我当前的密码太弱了,并没有告诉我一件事情(甚至没有消息或警告)......怎么办?我发现了这个?好吧,我选择更改密码以查看它是否会有所帮助(尝试其他所有内容都无济于事),当我更改密码时,它确实有效!
然后,为了进行实验,我尝试将密码更改回以前的密码以查看会发生什么,并且Gmail实际上不允许我这样做,理由是“抱歉我们不能允许您保存此更改因为您选择的密码太弱了“并且不会让我回到我的旧密码。我认为这是错误的,因为a)你需要每x个月或b)更改一次密码。正如我之前所说,他们的密码强度算法发生了变化,因此我所接受的弱密码未被接受,即使他们在尝试登录时没有说出任何相关信息!这个(数字2)是最可能的情况,因为我的弱密码大约有4个月的时间,它允许我在Gmail中使用它。
他们对此一无所知是非常糟糕的,但这是有道理的。因为大多数被劫持的电子邮件是使用gmail以外的软件登录的,我猜你要在Gmail环境之外使用Gmail时需要更强的密码。
我希望这有帮助!
答案 2 :(得分:64)
除了上述其他问题排查步骤之外,我还想补充一点,如果您在GMail帐户中启用了双因素身份验证(也称为two-step verification),那么必须生成一个应用程序 - 特定密码并使用新生成的密码通过SMTP进行身份验证。
要创建一个,请访问:https://www.google.com/settings/并选择授权应用程序&网站生成密码。
答案 3 :(得分:50)
Turn On Access For Less Secure Apps and it will work for all no need to change password.
答案 4 :(得分:29)
我在从我的Gmail帐户发送电子邮件时遇到了一些问题,这是由于上述几种情况造成的。 以下是我如何使其工作并同时保持灵活性的摘要:
<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
:
e.g。在具有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 :(得分:13)
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需要身份验证。请参阅”在此之前了解详情,请确保行{已包含{1}},此行应位于SMTPClientObj.UseDefaultCredentials = False
。
我确实尝试以相反的方式切换这两行,并且返回了 5.5.1 Authentication Required错误。
答案 6 :(得分:12)
哦......太神奇了...... 首先,我无法出于任何原因发送电子邮件。 但是在我改变了这两行的顺序之后,它完美地运行了。
//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");
希望这有帮助!!! :)
答案 7 :(得分:9)
问题不在于通过gmail发送的技术能力。这适用于大多数情况。如果你不能让机器发送,通常是由于机器没有在控件上至少一次验证过。
大多数用户面临的问题是Google决定始终更改出站限额。您应该始终为您的解决方案添加防御性代码。如果您开始看到错误,请停止发送速度,然后停止发送一段时间。如果您一直试图发送Google,有时会在延迟期间增加额外的时间,然后再发送。
我在当前系统中所做的是在每条消息之间发送1.5秒的延迟。然后,如果我收到任何错误,请停止5分钟,然后重新开始。这通常有效,并允许您发送帐户的限制(最后我检查它是每天首要客户登录2,000。)
答案 8 :(得分:9)
答案 9 :(得分:9)
我遇到了同样的问题,但事实证明我的病毒防护是阻止传出的“垃圾邮件”电子邮件。关闭它允许我使用端口587通过GMail发送SMTP电子邮件
答案 10 :(得分:8)
我不确定这需要哪个.NET版本,因为eglasius提到没有匹配的enableSsl
设置(我使用的是.NET 4.0,但我怀疑它可以在.NET 2.0或更高版本中运行),但这个配置justed为我工作(并且不要求你使用任何编程配置):
<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
我建议先使用普通邮件客户端尝试...
答案 11 :(得分:6)
@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"))
答案 12 :(得分:6)
我正在使用公司VPN连接。这就是为什么我无法从我的应用程序发送电子邮件的原因。如果我从VPN断开连接,它就可以工作。
答案 13 :(得分:5)
我也试过很多解决方案,但做了一些改变它会起作用
host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true
上面的smtpclient参数可以在gmail中使用
答案 14 :(得分:5)
我还发现,我以前登录的帐户由于某种原因被谷歌取消激活。一旦我重置密码(与以前一样),我就可以发送电子邮件了。我也收到了5.5.1的消息。
答案 15 :(得分:4)
我得到了同样的错误,上述解决方案都没有帮助。
我的问题是我从远程服务器运行代码,该服务器从未用于登录gmail帐户。
我在远程服务器上打开了一个浏览器并从那里登录了gmail。它问了一个安全问题,以确认这是我,因为这是一个新的位置。在进行安全检查后,我能够通过代码进行身份验证。
答案 16 :(得分:4)
另一种可能的解决方案。我在通过IMAP连接到gmail时遇到了类似的问题。在尝试了我遇到的所有解决方案后,您将在此处和其他地方阅读SO(例如,启用IMAP,使用https://accounts.google.com/b/0/displayunlockcaptcha启用对邮件的安全性较低的访问等),我实际上已经设置了一个新的解决方案gmail帐户再一次。
在我原来的测试中,我创建了第一个gmail帐户,我已经连接到我的主要Gmail帐户。这导致了谷歌引用错误帐户的不稳定行为。例如,运行https://accounts.google.com/b/0/displayunlockcaptcha打开了我的主帐户而不是我为此目的创建的帐户。
因此,当我创建一个新帐户并且未将其连接到我的主帐户时,按照上述所有相应步骤后,我发现它工作正常!
我还没有证实这一点(即转载),但它显然是为我做的...希望它有所帮助。
答案 17 :(得分:4)
我遇到了同样的错误(“SMTP服务器需要安全连接或客户端未经过身份验证。服务器响应为:5.5.1需要身份验证。请在”了解详情)并找到我使用了错误的密码。我修复了登录凭据,并且发送正确。
我知道这已经很晚了,但也许这会帮助其他人。
答案 18 :(得分:4)
为您的帐户开启安全性较低的应用:https://www.google.com/settings/security/lesssecureapps
答案 19 :(得分:4)
答案 20 :(得分:4)
我发现的另一件事是您必须至少更改一次密码。 并尝试使用安全级别的密码(不要使用与密码相同的用户,123456等)
答案 21 :(得分:3)
我解决了这个问题。显然,该消息用于多种错误类型。 我的问题是我已经发送了最多500封邮件。
登录帐户并手动尝试发送邮件。如果已达到限制,它将通知您
答案 22 :(得分:3)
您也可以通过端口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 via C# .Net errors on all ports)。
答案 23 :(得分:2)
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;
答案 24 :(得分:2)
出现这些错误有一个或多个原因。
使用您本地系统中的Gmail(或任何其他if)登录。
同时检查Less Secure App并将其设置为“Turn On”,这里是GMAIL的链接。 https://www.google.com/settings/security/lesssecureapps
检查电子邮件代码中的EnableSsl,并将其设置为true。
self.navigationController?.popViewControllerAnimated(true)
还要检查您当前使用的是哪个端口。 25是Global,但你也可以像587一样检查其他人。 检查一下Does all SMTP communication happen over 25?
如果您正在进行远程:请检查上面 Vlad Tamas 的答案。
答案 25 :(得分:1)
更改您的Gmail密码,然后重试,之后应该可以使用。
不知道原因,但每次更改主机时都必须更改密码。
答案 26 :(得分:1)
此代码对我有用,并且还允许从不安全的应用程序进行gmail访问,并通过两个步骤删除身份验证:
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(MailAddress, Password)
答案 27 :(得分:0)
如果您要通过Gmail帐户进行两步验证,则需要生成一个应用密码。 https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 选择如何生成应用密码选项,然后按照提供的步骤操作。将生成的应用密码复制并粘贴到某处,因为单击“完成”后将无法恢复。