【问题标题】:SmtpClient is unable to connect to Gmail using SSLSmtpClient 无法使用 SSL 连接到 Gmail
【发布时间】:2015-10-31 02:55:29
【问题描述】:

我在 SMTPClient 上看到很多帖子,但我仍然卡住了。 我正在创建一个针对 .NET 4.0 框架并在 Windows 2008 R2 数据中心(服务器)上运行的 C# 控制台应用程序。

我想从我刚刚创建的 gmail 帐户使用 SSL 发送电子邮件。

如果我使用端口 587,我会得到一个异常:

SMTP 服务器需要安全连接或客户端未通过身份验证

如果我使用端口 465,我会得到另一个:

无法从传输连接读取数据:阻塞操作被 WSACancelBlockingCall 调用中断。

我知道这个问题过去已经被问过好几次了。我看到的所有答案都与设置 UseDefaultCredentials 的顺序有关。它必须设置为 false BEFORE 设置真实凭据。我已经遵循了这个建议(根据下面的代码),但我仍然失败了。

其他答案包括将端口从 465 切换到 587...我已经尝试过,只是导致不同的错误(如上所述)。

这是我的代码:

NetworkCredential credentials = new NetworkCredential("something@gmail.com", "2-step-auth-Password");
MailAddress address = new MailAddress("something@gmail.com");

SmtpClient client = new SmtpClient("smtp.gmail.com", 465); // or 587
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = credentials;
client.Timeout = 10000; // 10 seconds.
client.Host = "smtp.gmail.com";
//client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

MailMessage message = new MailMessage("example@gmail.com", recipients);
message.Subject = "Hello";
message.Body = "Goodbye";
message.BodyEncoding = Encoding.UTF8;
try
{
    client.Send(message);
}
catch (Exception ex) 
{
    Console.WriteLine("Exception caught in CreateTestMessage2(): {0}", ex.ToString());  
}
message.Dispose();

更新 2: 我看到另一个答案,这可能是我的问题:gmail 需要一个特定于应用程序的密码(这显然不适用于我当前的 gmail 帐户。不知道为什么)。但这可能是我的问题。

更新 3: 我已按照所有说明进行操作。使用 Gmail 生成两步验证,但仍然失败。

【问题讨论】:

  • 您的凭据不需要来自 gmail 帐户吗?
  • 我不相信它是重复的,因为上面的代码遵循提供的解决方案:在我设置凭据之前,'UseDefaultCredentials' 设置为 false,但它仍然失败。这就是我问的原因。
  • me@me.com 只是placeolders,所以我不会在这个公共论坛上发布我的凭据。 “...@gmail.com”处的凭据。编辑我的帖子以反映。

标签: c# .net gmail smtpclient


【解决方案1】:

下面的代码对我有用,你可以试试这个:

SmtpClient smtp = new SmtpClient("smtp.office365.com");

//Your Port gets set to what you found in the "POP, IMAP, and SMTP access" section from Web Outlook
smtp.Port = 587;
//Set EnableSsl to true so you can connect via TLS
smtp.EnableSsl = true;

System.Net.NetworkCredential cred = new System.Net.NetworkCredential("Username", "Password");

smtp.Credentials = cred;

MailMessage mail = new MailMessage();

mail.From = new MailAddress("Sender Email Address", "Sender Name");

StringBuilder mailBody = new StringBuilder();

mail.To.Add("ToEmailAddress");

mail.Subject = "Subject";
mail.IsBodyHtml = true;
mail.Body = "Body Text";

try
{
    smtp.Send(mail);
}
catch (Exception ex)
{

}

【讨论】:

  • 这行得通。我将它与我的答案进行了比较,它似乎是一样的。我的解决方案现在有效。我讨厌这种情况发生。这就像烤面包机,只与你想展示它被打破的人一起工作,就站在那里。感谢您的回复!!
猜你喜欢
  • 2013-09-11
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2021-04-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多