您好我正在使用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模式下发送时,我是否需要更改上述代码中的任何内容?有人可以帮我实现吗?任何帮助,将不胜感激。谢谢。
答案 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.MailMessage
和System.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服务器。