提问人:CVertex 提问时间:4/1/2009 最后编辑:CommunityCVertex 更新时间:9/17/2022 访问量:542225
使用 C 通过 Gmail SMTP 服务器发送电子邮件#
Sending email through Gmail SMTP server with C#
问:
出于某种原因,接受的答案或任何其他答案都不适合我“通过 Gmail 在 .NET 中发送电子邮件”。为什么他们不行?
更新:我已经尝试了另一个问题中的所有答案(接受的和其他答案),但没有一个有效。
我只想知道它是否适用于其他任何人,否则谷歌可能已经改变了一些东西(以前发生过)。
当我尝试使用 的一段代码时,我很快就会收到 SmtpException on Send(message)。消息是SmtpDeliveryMethod.Network
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("[email protected]", "mypwd"),
EnableSsl = true
};
client.Send("[email protected]", "[email protected]", "test", "testbody");
Console.WriteLine("Sent");
Console.ReadLine();
}
}
}
我还使用 web.config、http://msdn.microsoft.com/en-us/library/w355a94k.aspx 和代码的组合让它工作(因为配置文件 :( 中没有匹配项)。EnableSsl
2021年更新
默认情况下,您还需要在 gmail 设置页面中启用“安全性较低的应用程序”的访问权限:google.com/settings/security/lesssecureapps。如果您收到异常“'服务器响应为:5.5.1 需要身份验证,则这是必需的。– 感谢 @Ravendarksky
评论
问题不在于通过 gmail 发送的技术能力。这适用于大多数情况。如果您无法让机器发送,通常是因为机器至少没有经过一次人工控制的身份验证。
大多数用户面临的问题是,谷歌决定一直更改出站限制。应始终向解决方案添加防御性代码。如果您开始看到错误,请降低发送速度并停止发送一段时间。如果您一直尝试发送,Google 有时会在您的延迟期内增加额外的时间,然后您才能再次发送。
我在当前系统中所做的是每条消息之间有 1.5 秒的延迟发送。然后,如果我遇到任何错误,请停止 5 分钟,然后重新开始。这通常有效,并允许您发送最多帐户的限制(上次我检查的是每天 2,000 次高级客户登录)。
评论
我发现的另一件事是您必须至少更改一次密码。 并尝试使用安全级别密码(不要使用与密码相同的用户,123456等)
我遇到了同样的错误(“SMTP 服务器需要安全连接或客户端未经过身份验证。服务器响应为:5.5.1 需要身份验证。了解更多信息“),并发现我使用了错误的密码。我修复了登录凭据,并且它正确发送。
我知道这已经晚了,但也许这会帮助其他人。
我不确定这需要哪个 .NET 版本,因为 eglasius 提到没有匹配的设置(我使用的是 .NET 4.0,但我怀疑它可以在 .NET 2.0 或更高版本中工作),但此配置对我有用(并且不需要您使用任何编程配置):enableSsl
<system.net>
<mailSettings>
<smtp from="[email protected]" deliveryMethod="Network">
<network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
</smtp>
</mailSettings>
</system.net>
您可能需要先在 Gmail 帐号上启用 POP 或 IMAP:https://mail.google.com/mail/?shva=1#settings/fwdandpop
我建议先用普通的邮件客户端尝试一下......
评论
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("my[email protected]","[email protected]","test","testbody")
如果您收到类似“SMTP 服务器需要安全连接或客户端未经过身份验证。服务器响应为:5.5.1 需要身份验证。了解更多信息“,正如我在此之前所得到的,请确保包含该行,并且此行应在 .SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials
我确实尝试以相反的方式切换这 2 条线路,并返回了 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 中进行了讨论,我在另一个讨论中提供了一个如何使用 CDO(协作数据对象)的示例(所有端口上都存在 GMail SMTP via C# .Net 错误)。
@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, "[email protected]", "ccList if any", "subject", "body"))
评论
我还发现我用来登录的帐户由于某种原因被谷歌停用了。一旦我重置了我的密码(与以前相同),我就可以很好地发送电子邮件了。我也收到了 5.5.1 消息。
如果所有其他方法都失败了,以下几乎可以肯定是您问题的答案:
我得到了完全相同的错误,事实证明,谷歌的新密码强度测量算法已经改变,认为我当前的密码太弱了,并且没有告诉我任何事情(甚至没有消息或警告)......我是怎么发现的?好吧,我选择更改我的密码,看看它是否有帮助(尝试了其他所有方法都无济于事),当我更改密码时,它起作用了!
然后,为了进行实验,我尝试将密码更改回以前的密码,看看会发生什么,而 Gmail 实际上不允许我这样做,理由是“对不起,我们不能允许您保存此更改,因为您选择的密码太弱”并且不会让我回到我的旧密码。我从中发现它出错了,因为 a) 您需要每 x 个月更改一次密码或 b)。正如我之前所说,他们的密码强度算法发生了变化,因此我的弱密码不被接受,即使他们在尝试登录任何地方时没有说任何话!这(第 2 个)是最有可能的情况,因为我的弱密码大约有 4 个月大了,它让我可以在 Gmail 中使用它。
他们对此一无所知,这很糟糕,但这是有道理的。因为大多数被劫持的电子邮件都是使用Gmail以外的软件登录的,我猜如果你想在Gmail环境之外使用Gmail,你需要有一个更强的密码。
评论
我解决了这个问题。此外,该消息用于多种错误类型。 我的问题是我已经达到了最多 500 封发送的邮件。
登录帐户并手动尝试发送邮件。如果已达到限制,它将通知您
我也尝试过许多解决方案,但进行一些更改它会起作用
host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true
使用smtpclient,上述参数在Gmail中有效
我在从我的 gmail 帐户发送电子邮件时也遇到了一些问题,这是由于上述几种情况造成的。 以下是我如何让它工作并同时保持灵活性的摘要:
- 首先设置您的 GMail 帐户:
- 启用 IMAP 并断言正确的最大邮件数(您可以在此处执行此操作)
- 确保您的密码至少为 7 个字符并且强度高(根据 Google 的说法)
- 确保您不必先输入验证码。您可以通过从浏览器发送测试电子邮件来执行此操作。
- 在 web.config(或 app.config,我还没有尝试过,但我认为让它在 Windows 应用程序中工作同样容易):
<configuration>
<appSettings>
<add key="EnableSSLOnMail" value="True"/>
</appSettings>
<!-- other settings -->
...
<!-- system.net settings -->
<system.net>
<mailSettings>
<smtp from="[email protected]" deliveryMethod="Network">
<network
defaultCredentials="false"
host="smtp.gmail.com"
port="587"
password="stR0ngPassW0rd"
userName="[email protected]"
/>
<!-- 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("web[email protected]")
SSLMail.SendMail(e)
End Sub
End Class
或者在代码中的任何位置都可以调用:
SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]", "Subject", "Body"})
我希望这对任何遇到这篇文章的人有所帮助!(我用过 VB.NET 但我认为将其转换为任何 .NET 语言都是微不足道的。
评论
哦。。。太神奇了...... 首先,由于任何原因我无法发送电子邮件。 但是在我更改了这两行的顺序如下之后,它运行良好。
//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]", "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;
为您提供另一种可能的解决方案。我在通过IMAP连接到Gmail时遇到了类似的问题。在尝试了我遇到的所有解决方案之后,您将在这里和SO的其他地方读到(例如,启用IMAP,启用对邮件的安全性较低的访问,使用 https://accounts.google.com/b/0/displayunlockcaptcha 等),我实际上再次设置了一个新的gmail帐户。
在我最初的测试中,我创建的第一个 gmail 帐户,我已经连接到了我的主 gmail 帐户。这导致了不稳定的行为,谷歌引用了错误的帐户。例如,运行 https://accounts.google.com/b/0/displayunlockcaptcha 打开了我的主帐户,而不是我为此目的创建的帐户。
因此,当我创建一个新帐户并且没有将其连接到我的主帐户时,在执行上述所有适当步骤后,我发现它运行良好!
我还没有证实这一点(即复制),但它显然为我做到了......希望它有所帮助。
为安全性较低的应用程序打开访问权限,它将适用于所有不需要的应用程序 更改密码。
评论
如果这里没有其他方法适合您,您可能需要允许从第三方应用程序访问您的Gmail帐户。这是我的问题。要允许访问,请执行以下操作:
- 登录您的 gmail 帐户。
- https://accounts.google.com/DisplayUnlockCaptcha 访问此页面,然后单击按钮以允许访问。
- https://www.google.com/settings/security/lesssecureapps 访问此页面,并为安全性较低的应用启用访问权限。
这对我有用,希望它对其他人有用!
评论
为您的帐号启用安全性较低的应用:https://www.google.com/settings/security/lesssecureapps
我们强烈建议您使用 Gmail 等安全应用来访问您的帐号。Google 开发的所有应用都符合这些安全标准。另一方面,使用安全性较低的应用程序可能会使您的帐户容易受到攻击。了解更多信息。
设置
smtp.UseDefaultCredentials = false;
以前
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
评论
解决此问题的简单步骤:
1)登录您的Gmail
2)导航到此页面 https://www.google.com/settings/security/lesssecureapps 并设置为“打开”
更改您的 gmail 密码并重试,之后它应该可以工作。
不知道为什么,但每次更改主机时,都必须更改密码。
这些错误有一个或多个原因。
在本地系统中使用您的Gmail(或任何其他如果)登录。
还要检查安全性较低的应用程序并将其设置为“打开”,这是GMAIL的链接。https://www.google.com/settings/security/lesssecureapps
检查电子邮件代码中的 EnableSsl,并将其设置为 true。
smtp.EnableSsl = true;
还要检查您当前使用的端口。25 是全局的,但您也可以检查其他的,例如 587。 请点击这里查看。所有 SMTP 通信是否都发生在 25 以上?
如果您在远程:查看上面 Vlad Tamas 的答案。
评论
如果您的 Gmail 帐号升级了两步验证,则需要生成应用专用密码。https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1选择“如何生成应用密码”选项,然后按照提供的步骤操作。将生成的应用程序密码复制并粘贴到某处,因为单击“完成”后将无法恢复它。
此代码适用于我,还允许从不安全的应用程序访问 gmail,并通过 2 个步骤删除身份验证:
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(MailAddress, Password)
Google不再允许“安全性较低的应用程序”,因此对于普通Gmail用户来说,这是不可能的。
Google 在 2022 年 5 月之后所做的更改。
对于这些更改,我们必须对代码进行以下更改。
首先转到Gmail帐户安全。
启用双因素身份验证。
在 google 帐户中配置应用密码。
在应用程序中使用应用密码。
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);
评论