【问题标题】:How to check if a recipient email address domain has TLS implemented?如何检查收件人电子邮件地址域是否实施了 TLS?
【发布时间】:2019-10-17 14:32:22
【问题描述】:

我们正在尝试检查收件人电子邮件 ID(给定电子邮件 ID 的域)是否已实施 TLS。如果未实施,我们将无法发送电子邮件。在 C# 中有什么方法可以检查它吗?例如以下是一项服务,我们可以在其中输入任何电子邮件 ID,它会告诉我们该电子邮件域是否实施了 TLS。 https://www.checktls.com/TestReceiver 如何在 C# 中做到这一点? C# 电子邮件客户端带有属性 smtpClient.EnableSsl = true;问题是如果在接收方没有实施 TLS 会发生什么?它会失败还是会通过?如果它失败了,这就是我们想要的。我们的 SMTP 服务器实现了 TLS。

我从 telnet 尝试了 STARTTLS 命令和 EHLO。它给出了 250 个 STARTTLS,它告诉我目标服务器已实现 TLS。如何以编程方式进行?

smtpClient.EnableSsl = true;

【问题讨论】:

  • 邮件不是从您的客户端端到端传递到收件人邮箱,而是从您的客户端到您域的邮件服务器,然后可能通过多个跃点将其发送到收件人的邮件服务器领域。虽然收件人域中缺少对 TLS 的支持意味着在交付的某些部分中肯定不会使用 TLS,但这并不意味着收件人域中对 TLS 的支持可以保证通过 TLS 交付。即使所有传递都使用 TLS 完成,途中的每个跃点都可以读取邮件,因为 TLS 仅在跃点之间使用,而不是端到端。
  • 感谢您的回复。如果我理解正确,您所说的是,当 smtpClient.EnableSsl = true;已设置,我的域服务器将检查是否所有跃点,直到收件人服务器启用 TLS 并且任何希望不安全的人交付将失败,对吗?那么我的 c# 代码会生成异常吗?我可以使用这个异常作为信号来确认 TLS 是否在某处未启用?我了解 TLS 不是端到端的,它仅从我的域服务器到接收服务器。我们只是在寻找服务器到服务器的 TLS,而不是端到端,所以这不是问题。谢谢
  • 不,如果您设置smtpClient.EnableSsl = true,它只会确保从您的客户端到第一个邮件跃点的连接受到 TLS 的保护。与您所指的站点类似,仅检查收件人域是否可以接受使用 TLS 的连接,但它并没有说与它的每个连接实际上都会受到 TLS 的保护。这些方法都不能确保完整路径受到 TLS 保护,即使您同时使用这两种方法也是如此。
  • 谢谢。我们知道我们的 SMTP 服务器实现了 TLS。所以我们要做的是,我们只想向那些实施了 TLS 的域发送电子邮件。这样我们就可以确保当我们从我们的服务器向目的地发送电子邮件时,它会从我们的服务器一直加密到收件人的 SMTP 服务器。正确的?为此,我们需要检查收件人的域服务器是否实施了 TLS。再次感谢..
  • “这样我们就可以保证当我们从我们的服务器向目的地发送电子邮件时,它会从我们的服务器一直加密到收件人的 SMTP 服务器。对吗?” i> - 错误。确保从客户端到第一跳的传递将使用 TLS 并且最后一跳支持 TLS 是不够的。首先,它没有说明中间的所有其他跃点。此外,仅在一个跃点中支持 TLS 并不能保证 TLS 将被提交到该跃点的邮件服务器实际使用。

标签: c# email ssl smtp


【解决方案1】:

如果你使用像MailKit 这样的库,你可以这样做:

bool supportsStartTls;

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.host.com", 587, SecureSocketOptions.None);
    supportsStartTls = client.Capabilities.HasFlag (SmtpCapabilities.StartTls);
    client.Disconnect (true);
}

如果您想使用 MailKit 发送邮件,您可以完全控制在 STARTTLS 不可用时会发生什么。

例如,如果您希望它在不支持 STARTTLS 时失败,则使用 SecureSocketOptions.StartTls 作为 Connect 方法的第三个参数。

如果您希望 MailKit 在可用时使用 STARTTLS,但在不可用时不失败,请改用 SecureSocketOptions.StartTlsWhenAvailable

【讨论】:

  • 谢谢。在下面的代码中,我认为您指的是我的 SMTP 服务器对吗? client.Connect ("smtp.host.com", 587, SecureSocketOptions.None);我们知道我们公司的 SMTP 服务器实现了 TLS。我们要检查的是,收件人的服务器是否具有 TLS 功能并决定是否必须发送电子邮件。
  • 您知道收件人的 SMTP 服务器的主机地址/端口是什么吗?如果不是,那么您唯一的选择是尝试使用 MX DNS 记录来解决问题,然后在我的回答中使用 MailKit 逻辑进行连接。仅通过连接到您自己的服务器,无法强制从您的 SMTP 服务器到最终收件人的 SMTP 服务器的 TLS。
  • 是的,我可以通过 MX DNS 记录找到收件人服务器的主机地址,我可能不知道端口。但我假设我可以连接到 25 或 587,然后在该服务器上使用 MailKit 逻辑来检查是否启用了 TLS?我的另一个问题是,如果目标服务器启用了 TLS,从我的服务器到该服务器的传输会一直加密吗?谢谢
  • 实际上没有办法知道,你真正能做的就是假设它会,如果可以的话。
猜你喜欢
  • 2023-03-10
  • 2018-10-21
  • 2017-07-21
  • 1970-01-01
  • 2016-11-17
  • 2016-08-20
  • 2012-09-09
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多