检查邮件服务器是否使用SSL而不尝试发送电子邮件

时间:2010-09-15 19:14:19

标签: c# .net ssl smtp email

我正在使用C#,在使用.NET Framework上提供的工具处理发送邮件例程时,我已经将两种情况相混淆

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

因此,当使用通用邮件发送工具时,我注意到我应该询问用户是否应该使用SSL,或者通过编码来计算。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

为了进一步说明,一些服务有不同的SSL和非SSL的URL,也许用户应该使用SSL,但你可能会让他们意外地发错。

答案 1 :(得分:2)

bool supportsSSL = true;
Stream stream = new SslStream(client.GetStream(), false);

try
{
   ((SslStream)stream).AuthenticateAsClient("pop3.xyz.com");
}
catch (Exception e)
{
   supportsSSL =false;
}

答案 2 :(得分:1)

听起来你有答案。只要您使用的SMTP库在抛出异常时做正确的事情,首先尝试ssl,然后回退到非ssl,并处理该错误情况(即完全失败),如果它发生。

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

它可能比它的价值更麻烦,因为如果您的SMTP库不支持使用已建立的连接,那么您可能需要将SMTP功能固定到新的连接类型。这是一个很长的路要走,你可能已经做好了捕捉异常并再次尝试。

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