【问题标题】:Checking if a Mail Server uses SSL without trying to send an e-Mail检查邮件服务器是否使用 SSL 而不尝试发送电子邮件
【发布时间】:2023-03-29 02:45:02
【问题描述】:

我正在使用 C#,并且在使用 .NET Framework 上可用的工具处理发送邮件例程时,我偶然发现了两种情况

  • 一个需要 SSL的邮件服务器
  • 一个不支持 SSL 的邮件服务器

所以在使用通用邮件发送工具时,我注意到我应该询问用户是否应该使用 SSL,或者通过编码来确定。

当我尝试通过需要的邮件服务器发送不使用 SSL 的电子邮件时,我得到一个异常。 当我尝试通过不支持 SSL 的邮件服务器使用 SSL 发送电子邮件时,出现异常。

通过这样做,应该很容易检查我是否应该使用它。

但我想要一个更聪明的方法来做到这一点。我没有找到任何方法。有吗?

【问题讨论】:

  • AFAIK,OpenSSL 可以做到这一点,并且是一个开源项目,因此您可能可以提升一些代码......但是,这可能需要大量工作。 ihmo,你应该提前知道哪个服务器需要什么,所以对于一个泛型方法你需要添加一个参数比如bool UseSSL

标签: c# .net ssl smtp email


【解决方案1】:

就个人而言,我不认为您的代码应该“自动”确定是否应使用 SSL。

当用户配置电子邮件服务时,他们应该告诉您它是如何工作的以及需要什么。

您可以通过开箱即用的 .NET SMTP 看到这种行为,您必须告诉它它是怎样的。

为了更进一步,一些服务对 SSL 和非 SSL 有不同的 URL,也许用户应该使用 SSL,但你可能会让他们不小心发送错误的方式。

【讨论】:

    【解决方案2】:

    听起来你有答案。只要您使用的 SMTP 库在引发异常时执行正确的操作,请先尝试 ssl,然后回退到非 ssl,并在发生错误情况时处理该错误情况(即完全失败)。

    我认为您很担心,因为您不知道抛出异常时幕后发生了什么,如果是这样,我也有同感。我不知道您的 .net 工具包是否提供了这些设施,但您应该能够与较低级别的类型连接对象建立连接,该对象允许您测试是否可以建立 ssl 连接并检查返回您尝试的价值,然后根据此决定如何进行。

    不过,这可能比它的价值更麻烦,因为如果您的 SMTP 库不支持使用已建立的连接,您可能需要将 SMTP 功能固定到新的连接类型。说来话长,你可能在捕获异常并重试方面做得足够好。

    关于@Mitchel 的回答,我想说,只要发出正确的通知,如果它是自动的,那完全没问题,当然上下文是正确的。 SMTP 仍然经常是纯文本,因此对电子邮件加密的任何期望都非常低。登录凭据是另一回事。如果这是最终用户将使用的应用程序,那么如果要交换凭据,您当然应该确保他们通过 SSL 进行连接。

    【讨论】:

      【解决方案3】:
      bool supportsSSL = true;
      Stream stream = new SslStream(client.GetStream(), false);
      
      try
      {
         ((SslStream)stream).AuthenticateAsClient("pop3.xyz.com");
      }
      catch (Exception e)
      {
         supportsSSL =false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 2021-04-19
        相关资源
        最近更新 更多