c#SmtpClient类无法使用gmail发送电子邮件

Vin*_*cio 43 c# gmail smtpclient

我使用我的Gmail帐户发送电子邮件时遇到问题.我把头发拉了出来.

相同的设置在Thunderbird中运行良好.

这是代码.我也试过没有运气的465端口.

SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.Credentials = new NetworkCredential("username", "pass");
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;

MailMessage mm = new MailMessage("donotreply@domain.com", "destination@domain.com", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);
Run Code Online (Sandbox Code Playgroud)

这是错误

"SMTP服务器需要安全连接或客户端未经过身份验证.服务器响应为:5.5.1需要身份验证.了解详情"

下面是堆栈跟踪

   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at email_example.Program.Main(String[] args) in C:\Users\Vince\Documents\Visual Studio 2008\Projects\email example\email example\Program.cs:line 23
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
Run Code Online (Sandbox Code Playgroud)

Vin*_*cio 60

你不会相信是什么解决了我的问题.

凭据属性

ss.Credentials = new NetworkCredential("username", "pass");
Run Code Online (Sandbox Code Playgroud)

必须在之后宣布

ss.UseDefaultCredentials = false;
Run Code Online (Sandbox Code Playgroud)

所以最终的工作代码清单是

SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
ss.Credentials = new NetworkCredential("username", "pass");

MailMessage mm = new MailMessage("donotreply@domain.com", "destination@domain.com", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?

  • 肯尼,你需要以正确的顺序声明属性,这似乎有点反直觉. (10认同)
  • 遇到相同的错误,必须先使用UseDefaultCredentials设置才能使用Credentials属性.有点反直觉,属性不应该依赖于顺序 (3认同)
  • 我会说不,因为当我改为UseDefaultCredentials = true时,我希望覆盖任何现有的凭据. (2认同)
  • @VincePanuccio我检查了使用反射器的情况.设置ss.UseDefaultCredentials = false本质上是将Credentials重置为null.这就是你遇到麻烦的原因.但这也意味着ss.UseDefaultCredentials = false根本不需要,它最终没有做任何事情 (2认同)
  • 你为什么在int上使用Convert.ToInt32? (2认同)

Bdi*_*iem 5

Stackoverflow之前说过

在您的情况下,这意味着您必须使用您登录Google的电子邮件地址发送它.

Stackoverflow也说

因此,可能存在干扰连接的防火墙.我正在测试你的代码时遇到这个问题.尝试建议的TELNET测试.