【问题标题】:unable to send emails using port 25 in ssl mode?无法在 ssl 模式下使用端口 25 发送电子邮件?
【发布时间】:2018-04-19 10:07:53
【问题描述】:

您好,我正在使用 mvc5 c# 开发 Web 应用程序。我以 ssl 模式托管我的网站。我正在使用以下代码在生产服务器中发送电子邮件。

                string AdminEmail = ConfigurationManager.AppSettings["AdminEmail"].ToString();
                MailMessage mail = new MailMessage();
                mail.To.Add(emailid);
                mail.Bcc.Add(AdminEmail);
                mail.From = new MailAddress(MailID);
                mail.Subject = Subject;
                mail.Body = Body;
                mail.IsBodyHtml = true;
                SmtpClient smtp = new SmtpClient(hostserver);
                smtp.Credentials = new System.Net.NetworkCredential
                 (MailID, Password);
                smtp.Send(mail);
                return 1;

我加了

   if (IsInternalBuild)
                {
                    smtp.Host = hostserver;    mail.c3payroll.com
                    smtp.Port = Convert.ToInt32(portno);  465
                    smtp.UseDefaultCredentials = true;
                    smtp.EnableSsl = true;
                }

IsInternalBuild 在生产环境中为真。

以 ssl 模式发送时,我需要更改上述代码中的任何内容吗?有人可以帮我实现这个吗?任何帮助,将不胜感激。谢谢你。

【问题讨论】:

  • 您在寻找这个:smtp.EnableSsl = true;?我认为您需要通过设置该属性来启用 SSL 支持(也可用:smtp.Port = 25smtp.Host = "youremailaccount@domain.com")。
  • 您需要先弄清楚您指的是哪个 SSL。有所谓的隐式 SSL(端口 465,在 SMTP 会话开始之前协商 SSL,SmtpClient 不支持)和显式 SSL(端口 25,第一个 SMTP 会话开始未加密,然后协商 SSL - 由具有 EnableSSL 属性的 SmtpClient 支持)。跨度>
  • 谢谢evk。我在托管时使用了 ssl 证书。那么我应该在上面的代码中改变什么?
  • 感谢 EVK。我在我的本地主机中进行了测试。我得到服务器不支持安全连接。同样的错误是在 elmah 中登录。

标签: c# asp.net asp.net-mvc-5.2


【解决方案1】:

根据您的电子邮件主机提供商设置,使用SmtpClient 中的相应属性可以轻松设置主机名、端口号和 SSL 功能以发送邮件:

SmtpClient smtp = new SmtpClient(hostserver);
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Credentials = new System.Net.NetworkCredential(MailID, Password);
smtp.Host = hostserver; // host name as mail server
smtp.Port = Convert.ToInt32(portno); // some hosts doesn't support port 25 for SMTPS, try this port instead or use 587
smtp.EnableSsl = true; // use SSL configuration

smtp.Send(mail);

更新(显式和隐式 SSL)

请记住,System.Net.Mail.SmtpClient 仅支持显式 SSL,这需要通过端口 25 与 SMTP 服务器的不安全连接才能与 TLS 协商。端口 465 有基于 SSL 的 SMTP,它需要在建立与 SMTP 服务器的连接之前进行 TLS 协商,但仍然不支持使用标准 System.Net.Mail 库的隐式 SSL。原因解释at this reference

无法将隐式 SSL (SMTPS) 与 System.Net.Mail 一起使用。 隐式 SSL 会将整个连接包装在 SSL 中 层。将使用特定端口(端口 465 很常见)。有 没有涵盖隐式 SSL 的正式 RFC。

隐式 SSL 类似于:启动 SSL(启动加密) -> 连接 -> 验证 -> 发送数据

这不是错误,而是设计使然。有两种类型 SMTP 的 SSL 身份验证,我们只支持一种 System.Net.Mail(按设计)——显式 SSL。

要使用隐式 SSL,您需要使用启用 CDOSYS 的库,例如 System.Web.Mail.MailMessageSystem.Web.Mail.SmtpMail(这似乎已过时,但同时适用于显式和隐式 SSL,需要 CDO 配置模式才能工作):

System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();
mail.To = emailid;
mail.Bcc = AdminEmail;
mail.From = new MailAddress(MailID);
mail.Subject = Subject;
mail.Body = Body;
mail.BodyEncoding = System.Text.Encoding.UTF8;
mail.BodyFormat = System.Web.Mail.MailFormat.Html;
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", hostServer);
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 25);
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", 2);
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", true);
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1);
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", MailID);
mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", Password);

System.Web.Mail.SmtpMail.SmtpServer = hostServer;
System.Web.Mail.SmtpMail.Send(mail);

相关问题:

How can I send emails through SSL SMTP with the .NET Framework?

【讨论】:

  • 你真的尝试过吗?因为 SmtpClient 的文档声称不支持基于 SSL 的 SMTP(并且 EnableSSL 意味着不同的东西 - STARTTLS 扩展)。
  • 谢谢哲也。 SMTP 客户端不能与 SSL 一起使用?有没有其他方式发送邮件?
  • @NiranjanGodbole 更新了隐式和显式 SSL 解释,您似乎想使用服务器不支持的 implicit SSL。尝试使用支持隐式 SSL 和 TLS 方法的另一台服务器(使用您当前拥有的其他服务器更改 hostServer 值)。
  • 感谢您更新的答案。我在哪里可以找到 System.Web.Mail.MailMessage?我正在使用 vs2015!
  • System.Web.Mail 类已被标记为已过时,但我认为您仍然可以使用它。你不能在VS中输入System.Web.Mail类吗?该库在 4.7.1 中仍然可用:docs.microsoft.com/en-us/dotnet/api/….
【解决方案2】:

您不能在端口 25 上发送 SSL 电子邮件,您需要改用端口 465

你还需要设置smtp.EnableSsl = true

【讨论】:

  • 感谢 Alandar。我没有使用 gmail,但我使用的是我们自己的 mail.c3payroll.com 和 @host 25。所以这行不通?
  • 端口 465 是 SMTPS 的标准端口,如果您的主机支持 SMTPS,它将支持 465。您不能在端口 25 上发送 SMTPS,它不支持
  • 感谢您的信息!现在我们需要将 smtp 配置为 465 吗?我可以获取一些链接,以便我可以分享给客户并说服他们吗?
  • 只需使用smtp.Port = 465smtp.EnableSsl = true 即可。
  • 我已经编辑了我的问题。正如你所说,我已经添加了这些属性,但我仍然无法发送电子邮件。请问smtp有什么要配置的吗?
【解决方案3】:

在 smtp 中有多种使用 ssl 的方法。一种是在启动 SMTP 会话之前协商 ssl 时的“隐式”ssl(类似于 https)。为此,通常使用一个单独的端口 (465)。 SmtpClient 不支持这种方式,如documentation 所述:

另一种连接方法是建立 SSL 会话 在发送任何协议命令之前提前。这种连接方式 有时称为 SMTP/SSL、SMTP over SSL 或 SMTPS,默认情况下 使用端口 465。这种使用 SSL 的替代连接方法不是 目前支持。

另一个是 STARTTLS 扩展。这种方式将 ssl 协商为正常 SMTP 会话的一部分,该会话以未加密的方式开始(像往常一样在 25 端口上)。在通常的 HELO 交换客户端发出“250 STARTTLS”命令和(如果服务器支持)之后 - 协商 ssl 并且会话继续加密。这种方式由SmtpClient 及其EnableSsl 属性支持。当设置为 true - 它将尝试与 STARTTLS 协商 ssl。如果服务器不支持 - 抛出异常。

但是,您的mail.c3payroll.com smtp 服务器不支持上述任何一种方式。您可以在 25 端口上 telnet 到它,然后在 HELO 尝试执行“250 STARTTLS”后,它会告诉您它不受支持。端口 465 在那里也不可用。因此,如果您想在 smtp 会话中使用 ssl,请先找到普通的 smpt 服务器。

【讨论】:

  • 我愿意,但无论如何我不会通过 teamviewer 提供任何支持
  • 谢谢。但是你提供了非常有用的信息。所以首先我应该 telnet 到 SMTP 服务器进行测试对吗?
  • 你可以telnet,或者你可以使用一些在线工具(比如mxtoolbox.com/diagnostic.aspx——把你的smtp服务器的地址放在那里,它会告诉你不支持SSL)。但是您已经知道了,因为您收到错误“服务器不支持安全连接”。并且要验证您的服务器也不支持隐式 SSL,您可以尝试 telnet 到端口 465(并查看该端口未打开\可用)。
  • 我发现 SMTP TLS - 在 mxtoolbox.com 中不支持 TLS。现在有什么办法可以解决这个问题吗?
  • “修复”它的唯一方法是使用支持 TLS 的不同 smtp 服务器(不是 mail.c3payroll.com)。使用此服务器,您的所有 smtp 会话都将以纯文本形式通过网络传输。
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 2017-02-17
  • 2010-12-29
  • 1970-01-01
  • 2013-02-23
  • 2012-02-11
  • 2013-02-12
  • 2012-07-01
相关资源
最近更新 更多