【问题标题】:C# send email using implicit sslC# 使用隐式 ssl 发送电子邮件
【发布时间】:2012-02-11 07:03:04
【问题描述】:

是否有任何免费的库可用于使用隐式 ssl 协议来感知电子邮件。我的托管服务提供商支持 ssl 电子邮件……但标准的 .net 电子邮件客户端无法处理。

【问题讨论】:

标签: c# .net email ssl


【解决方案1】:

System.Net.Mail 确实支持“显式 SSL”(也称为“StartTLS” - 通常在端口 25 或 587 上),但不支持“隐式 SSL”(又名“SMTPS” - 通常在端口 465 上)。

据我所知,显式 SSL 从不安全的连接开始,然后给出 STARTTLS 命令,最后建立 SSL 安全连接。 另一方面,隐式 SSL 要求在双方开始通话之前建立 SSL 连接。

一些服务器(如 gmail)同时接受两者,因此您只需将 EnableSsl 设置为 true 并发送到正确的端口。但是,如果您的服务器不支持显式 SSL,则这种“简单方式”不是一种选择。

我还在四处寻找将 System.Net.Mail 与隐式 SSL 结合使用的通用解决方案,但到目前为止还没有运气。

无论如何看看this article,它可能会给你一些见解。

[编辑:@Nikita 是对的,固定端口号以避免混淆]

【讨论】:

  • implicit 通常在端口 465 上运行,explicit - 在端口 25/587
【解决方案2】:

您可以使用 AIM (Aegis Implicit Mail) 通过隐式 SSL 发送电子邮件:

  1. 首先安装包:Install-Package AIM
  2. 然后使用示例代码发送电子邮件

    class Mail
    {
        private static string mailAddress = "{you email address}";
        private static string host = "{your host server}";
        private static string userName = "{your user name}";
        private static string password = "{your password}";
        private static string userTo = "{to address}";
        private static void SendEmail(string subject, string message)
        {
            //Generate Message 
            var mailMessage = new MimeMailMessage();
            mailMessage.From = new MimeMailAddress(mailAddress);
            mailMessage.To.Add(userTo);
            mailMessage.Subject = subject;
            mailMessage.Body = message;
    
            //Create Smtp Client
            var mailer = new MimeMailer(host, 465);
            mailer.User = userName;
            mailer.Password = password;
            mailer.SslType = SslMode.Ssl;
            mailer.AuthenticationMode = AuthenticationType.Base64;
    
            //Set a delegate function for call back
            mailer.SendCompleted += compEvent;
            mailer.SendMailAsync(mailMessage);
        }
    
        //Call back function
        private static void compEvent(object sender, AsyncCompletedEventArgs e)
        {
            if (e.UserState != null)
                Console.Out.WriteLine(e.UserState.ToString());
    
            Console.Out.WriteLine("is it canceled? " + e.Cancelled);
    
            if (e.Error != null)
                Console.Out.WriteLine("Error : " + e.Error.Message);
        }
    }
    

【讨论】:

    【解决方案3】:

    尝试在https://sourceforge.net/p/netimplicitssl/wiki/Home/ 上检查 AIM(Aegis 隐式邮件)

    【讨论】:

      【解决方案4】:

      使用 TLS 端口(即 587)而不是 SSL 端口。几个月来我一直遇到同样的问题,直到我找到了这个解决方案。

      Sending email in .NET through Gmail

      【讨论】:

      • +1 我已经多次看到 587 端口,但没有消息来源提到即使您的邮件提供商推荐其他端口,您也应该选择它。
      • 太棒了,你救了我的命!!
      • 但是如果587被屏蔽了怎么办?但是465可用吗?
      【解决方案5】:

      AspNetEmail 支持显式 SSL 和隐式 ssl

      http://www.advancedintellect.com/download.aspx

      【讨论】:

        【解决方案6】:

        作为选项之一,我们的 SecureBlackbox 包括 SMTP 组件,该组件通过隐式和显式 SSL 工作,并支持不同的身份验证机制(包括 SASL、NTLM 等)。

        【讨论】:

          【解决方案7】:

          您仍然可以使用已弃用的 System.Web.Mail.MailMessage API(并设置其 "http://schemas.microsoft.com/cdo/configuration/smtpusessl" 选项,用于显式 SSL/TLS):

          System.Web.Mail.MailMessage mailMsg = new System.Web.Mail.MailMessage();
          // ...
          mailMsg.Fields.Add
                      ("http://schemas.microsoft.com/cdo/configuration/smtpusessl",
                           true);
          

          或者,如果可以,您可以在本地运行 stunnel 之类的东西,以建立从您的 localhost 到您的 SMTP 服务器的 SSL/TLS 隧道。然后,您必须正常连接(不使用 SSL/TLS)到隧道的 localhost 端作为您的 SMTP 服务器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-09-11
            • 2013-02-23
            • 2014-12-20
            • 2016-04-17
            • 1970-01-01
            • 2012-02-25
            • 2010-10-01
            相关资源
            最近更新 更多