使用c#通过Gmail SMTP服务器发送邮件

出于某种原因,既不是接受的答案,也不是其他任何工作为我“通过Gmail在。net中发送电子邮件”。为什么它们不会起作用?

更新:我已经在另一个问题中尝试了所有的答案(接受的和其他的),但没有一个有效。

我只是想知道它是否适用于其他人,否则谷歌可能已经改变了一些东西(以前发生过)。

当我尝试使用SmtpDeliveryMethod.Network的代码段时,我很快在Send(message)上收到一个SmtpException。信息是

SMTP服务器需要安全连接,否则客户端未经过身份验证。

服务器的回复是:

5.5.1认证要求在“<”上了解更多——说真的,到此为止。

更新:

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

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

525129 次浏览

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();
}
}
}

我还得到了它的工作使用网络的组合。config, http://msdn.microsoft.com/en-us/library/w355a94k.aspx和code(因为在配置文件中没有匹配的EnableSsl:)。

2021年更新

默认情况下,您还需要启用“较不安全的应用程序”。在您的gmail设置页面:google.com/settings/security/lesssecureapps。这是必要的,如果你正在得到异常" '服务器的反应是:5.5.1身份验证需要。-感谢@Ravendarksky

问题不是通过gmail发送的技术能力问题。这在大多数情况下都适用。如果你不能让机器发送,通常是由于机器没有经过至少一次人工控制的验证。

大多数用户面临的问题是,谷歌总是决定更改出站限制。您应该始终在解决方案中添加防御性代码。如果你开始看到错误,放慢你的发送速度,只是停止发送一段时间。如果您继续尝试发送谷歌,有时会在您再次发送之前增加额外的延迟时间。

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

我发现的另一件事是你必须至少修改一次密码。 并尽量使用安全级别的密码(不要使用相同的用户密码,123456等)

我遇到了同样的错误(" SMTP服务器需要安全连接,否则客户端未经过身份验证。服务器的响应是:5.5.1需要身份验证。了解更多信息,请访问“),并发现我使用了错误的密码。我修复了登录凭证,发送正确。

我知道有点晚了,但也许这能帮到别人。

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

<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 < / p >

我建议先用普通的邮件客户端尝试一下…

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认证提示错误

我也遇到了同样的问题,但原来是我的病毒防护程序阻止了发出的“垃圾邮件”。关闭这个允许我使用端口587通过GMail发送SMTP电子邮件

您也可以通过端口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讨论的,我已经在另一个讨论(在所有端口上通过c# .Net发送SMTP错误)中提供了如何使用CDO(协同数据对象)的示例。

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

我还发现我曾经登录的账号被谷歌出于某种原因停用了。一旦我重置了密码(和以前一样),我就可以正常发送电子邮件了。我也收到了5.5.1的消息。

下面将__abc0转换到你的问题__abc1:

我得到了完全相同的错误,原来谷歌的新密码强度测量算法已经改变,认为我目前的密码太弱,并没有告诉我一件事(甚至没有消息或警告)…我是怎么发现的?好吧,我选择更改密码,看看它是否有帮助(尝试了所有其他方法都无济于事),当我更改密码时,它起作用了!

然后,作为一个实验,我试着把我的密码改回我以前的密码,看看会发生什么,Gmail实际上不允许我这样做,理由是“抱歉,我们不能让您保存此更改,因为您选择的密码太弱”。还不让我用旧密码。我从中发现,它出错是因为a)你需要每x个月更改一次密码或b)。正如我之前说过的,他们的密码强度算法发生了变化,因此我的弱密码不被接受,即使他们在尝试登录任何地方时没有说什么!这(2)是最有可能的情况,因为我的弱密码大约是4个月前的,它让我在Gmail中使用它。

他们对此只字不提是很糟糕的,但这也说得通。因为大多数被劫持的电子邮件都是使用gmail之外的软件登录的,我猜如果你想在gmail环境之外使用gmail,你需要一个更强的密码。

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

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

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

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

与smtpclient上述参数工作在gmail

我用我的gmail账户发邮件也遇到了一些问题,这是由于前面提到的一些情况。 下面是我如何让它工作的总结,同时保持它的灵活性:

    首先设置你的GMail账号:
    • 启用IMAP并断言正确的消息最大数量(你可以在这里这样做)
    • 确保你的密码至少有7个字符,并且是强密码(根据谷歌)
    • 确保你不需要先输入验证码。您可以通过从浏览器发送测试电子邮件来做到这一点。
    • 李< / ul > < / >
    • 在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控件的Page中:

    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语言都很简单。)

< p >哦…令人惊奇的… 首先,我不知道为什么不能发电子邮件。 但是在我改变了这两行的顺序之后,它就完美地工作了
//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

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

要创建密码,请访问:https://www.google.com/settings/并选择授权应用程序网站来生成密码。

我用的是企业VPN连接。这就是为什么我不能从我的应用程序发送电子邮件的原因。如果我断开VPN,它就可以工作。

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

我的问题是,我是从一个远程服务器上运行的代码,而这个服务器从未用于登录gmail帐户。

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

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通过IMAP。在尝试了我遇到的所有解决方案之后,你将在这里和其他地方读到SO(例如。启用IMAP,启用不太安全的邮件访问,使用https://accounts.google.com/b/0/displayunlockcaptcha等等),我实际上又建立了一个新的gmail帐户。

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

因此,当我创建了一个新帐户,并没有将它连接到我的主帐户,在遵循上述所有适当的步骤后,我发现它工作得很好!

我还没有证实这一点。转载),但它显然为我做到了……希望能有所帮助。

打开访问不太安全的应用程序,它将为所有不需要的工作

.使用实例

Gmail设置链接 . bref ="https://www.google.com/settings/security/lesssecureapps" rel="nofollow noreferrer"> Gmail链接

enter image description here

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

  1. 登录您的gmail帐户。
  2. 访问此页面https://accounts.google.com/DisplayUnlockCaptcha并单击按钮允许访问。
  3. 访问此页面https://www.google.com/settings/security/lesssecureapps并启用对不太安全的应用程序的访问。

这对我有用,希望对其他人也有用!

为您的帐户打开不太安全的应用程序:https://www.google.com/settings/security/lesssecureapps

  1. 首先检查您的gmail帐户设置&从“访问不太安全的应用程序”打开 李enter image description here < / >

我们强烈建议您使用安全的应用程序,如Gmail,来访问您的帐户。谷歌的所有应用程序都符合这些安全标准。另一方面,使用不太安全的应用程序可能会让你的账户容易受到攻击。学习更多的知识。

  1. < p >设置

    smtp.UseDefaultCredentials = false;
    

    之前

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

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

1)登录你的Gmail

2)导航到此页面https://www.google.com/settings/security/lesssecureapps &设置为“开启”

更改您的gmail密码,再试一次,它应该工作之后。

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

这些错误有一个或多个原因。

  • 使用本地系统中的Gmail(或任何其他if)登录。

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

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

    smtp.EnableSsl = true;
    
  • Also check which port are you using currently. 25 is Global, but you can check it for others too like 587. check here. Does all SMTP communication happen over 25?

  • IF YOU ARE ON REMOTE : Check the answer of Vlad Tamas above.

如果您的Gmail帐户上有两步验证,您将需要生成一个应用程序密码。 https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 选择如何生成应用程序密码选项,并按照提供的步骤进行操作。复制并粘贴生成的应用程序密码的某个地方,因为你将无法恢复它后,你点击完成。< / p >

这段代码适用于我,也允许在gmail访问不安全的应用程序,并在2个步骤中删除身份验证:

Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(MailAddress, Password)

谷歌不再允许“较不安全的应用程序”,所以这对普通gmail用户来说是不可能的。

https://support.google.com/accounts/answer/6010255?hl=en#zippy=%2Cif-less-secure-app-access-is-on-for-your-account

从谷歌:

为了帮助保持您的帐户安全,从2022年5月30日,谷歌no long支持使用第三方应用程序或设备来询问您 仅使用您的用户名和登录您的谷歌帐户 密码。< / p >

重要:此截止日期不适用于谷歌Workspace或谷歌 云身份客户。这些客户的执行日期

欲了解更多信息,请继续阅读。

谷歌不再允许“较不安全的应用程序”,所以这对普通Gmail用户来说是不可能的。

2022年5月后谷歌更改。

对于这些更改,我们必须对代码进行以下更改。

  1. 首先执行Gmail帐号安全。

  2. 启用双因素认证。

  3. 配置谷歌帐号的App密码。

  4. 应用中使用App密码。

         MailMessage mail = new MailMessage();
    mail.To.Add(email.Text.ToString().Trim());
    mail.From = new MailAddress("your_Gmail_address");
    mail.Subject = "Hello test email";
    mail.Body = "<p>hello user<br/> How are you?</p>";
    mail.IsBodyHtml = true;
    
    
    SmtpClient smtp = new SmtpClient();
    smtp.Port = 587; // 25 465
    smtp.EnableSsl = true;
    smtp.UseDefaultCredentials = false;
    smtp.Host = "smtp.gmail.com";
    smtp.Credentials = new System.Net.NetworkCredential("your_Gmail_address", "Your_gmail_app_password");
    smtp.Send(mail);