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

C# 检查邮件服务器是否使用SSL而不尝试发送电子邮件,c#,.net,ssl,smtp,email,C#,.net,Ssl,Smtp,Email,我正在使用C#,在使用.NET Framework上可用的工具处理发送邮件例程时,我总结了两种情况 一个需要SSL的邮件服务器 一个不支持SSL的邮件服务器 因此,当使用通用邮件发送工具时,我注意到我应该询问用户是否应该使用SSL,或者通过编码来计算 当我试图通过需要SSL的邮件服务器发送不使用SSL的电子邮件时,会出现异常。 当我试图通过不支持SSL的邮件服务器使用SSL发送电子邮件时,会出现异常 通过这样做,应该很容易检查我是否应该使用它 但我想要一个更聪明的方法来做这件事。我没有找到任

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

  • 一个需要SSL的邮件服务器
  • 一个不支持SSL的邮件服务器
因此,当使用通用邮件发送工具时,我注意到我应该询问用户是否应该使用SSL,或者通过编码来计算

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

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


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

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

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

您可以通过开箱即用的.NET SMTP看到这种行为,您必须告诉它它是如何发生的


为了进一步说明这一点,有些服务具有不同的SSL和非SSL URL,可能用户应该使用SSL,但您可能会让他们意外地以错误的方式发送。就个人而言,我不认为您的代码应该“自动”确定是否应使用SSL

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

您可以通过开箱即用的.NET SMTP看到这种行为,您必须告诉它它是如何发生的


为了进一步说明这一点,有些服务具有不同的SSL和非SSL URL,用户可能应该使用SSL,但您可能会让他们意外地以错误的方式发送。

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

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

但这可能会带来更多麻烦,因为如果SMTP库不支持使用已建立的连接,则可能需要将SMTP功能附加到新的连接类型。这是一条很长的路要说,你可能做得足够好,捕捉异常,然后再试一次


关于@Mitchel的回答,我想说,如果它是automagic,只要发出了正确的通知,当然上下文也是正确的,那就完全可以了。SMTP通常仍然是纯文本,因此对电子邮件加密的期望很低。登录凭证是另一回事。如果这是一个终端用户会使用的应用程序,如果要交换凭据,您当然应该确保他们通过SSL连接。

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

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

try
{
   ((SslStream)stream).AuthenticateAsClient("pop3.xyz.com");
}
catch (Exception e)
{
   supportsSSL =false;
}
我认为您之所以担心,是因为您不知道抛出异常时在幕后发生了什么,如果是这样,我也有同感。我不知道您的.net工具包是否提供了这些功能,但您应该能够使用较低级别的类型连接对象进行连接,该对象允许您测试是否可以进行ssl连接并检查尝试的返回值,然后根据该值决定如何继续

但这可能会带来更多麻烦,因为如果SMTP库不支持使用已建立的连接,则可能需要将SMTP功能附加到新的连接类型。这是一条很长的路要说,你可能做得足够好,捕捉异常,然后再试一次


关于@Mitchel的回答,我想说,如果它是automagic,只要发出了正确的通知,当然上下文也是正确的,那就完全可以了。SMTP通常仍然是纯文本,因此对电子邮件加密的期望很低。登录凭证是另一回事。如果这是一个最终用户将使用的应用程序,您当然应该确保他们在交换凭据时通过SSL连接。

AFAIK,OpenSSL可以做到这一点,并且是一个开源项目,因此您可能可以提取一些代码。。。然而,这可能需要做很多工作。ihmo,您应该提前知道哪个服务器需要什么,所以对于一个通用方法,您需要添加一个参数,例如
bool usesl
。好的,OpenSSL可以做到这一点,并且是一个开源项目,因此您可能可以提取一些代码。。。然而,这可能需要做很多工作。ihmo,您应该提前知道哪个服务器需要什么,因此对于一般方法,您需要添加一个参数,例如
bool usesl
bool supportsSSL = true;
Stream stream = new SslStream(client.GetStream(), false);

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