无法在ssl模式下使用端口25发送电子邮件?

时间:2017-11-07 05:31:13

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

您好我正在使用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为true。

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

3 个答案:

答案 0 :(得分:3)

根据您的电子邮件主机提供商设置,使用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上有SMTP over SSL,在建立连接到SMTP服务器之前需要进行TLS协商,但仍然不支持使用标准System.Net.Mail库的隐式SSL。原因解释为at this reference

  

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

     

隐式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?

答案 1 :(得分:2)

您无法在端口25上发送SSL电子邮件,而是需要使用端口465

您还需要设置override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)

答案 2 :(得分:1)

在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服务器。