是否有任何库可以免费使用,以便使用隐式ssl协议发送电子邮件。我的托管服务提供商支持ssl电子邮件...但标准.net电子邮件客户端无法处理。
答案 0 :(得分:3)
System.Net.Mail支持“显式SSL”(也称为“StartTLS” - 通常在端口25或587上),但不支持“隐式SSL”(又名“SMTPS” - 通常在端口465上)。
据我所知,显式SSL从不安全的连接开始,然后给出STARTTLS命令,最后建立SSL安全连接。 另一方面,隐式SSL要求在双方开始谈话之前设置SSL连接。
某些服务器(如gmail)同时接受这两种服务器,因此您只需将EnableSsl设置为true并发送到正确的端口即可。但是,如果您的服务器不支持明确SSL,则这种“简单方法”不是一种选择。
我还在寻找使用带有隐式SSL的System.Net.Mail的一般解决方案,到目前为止没有运气。
无论如何看看this article,它可能会给你一些见解。
[编辑:@Nikita是对的,固定端口号以避免混淆]
答案 1 :(得分:1)
使用TLS端口(即587)而不是SSL端口。几个月来我遇到了同样的问题,直到我找到了这个解决方案。
答案 2 :(得分:1)
答案 3 :(得分:0)
您仍然可以使用已弃用的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服务器。
答案 4 :(得分:0)
作为选项之一,我们的SecureBlackbox包含SMTP组件,该组件通过隐式和显式SSL工作,并支持不同的身份验证机制(包括SASL,NTLM等)。
答案 5 :(得分:0)
AspNetEmail支持显式SSL和隐式ssl
答案 6 :(得分:0)
您可以使用AIM(Aegis Implicit Mail)通过隐式SSL发送电子邮件:
然后使用示例代码发送电子邮件
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);
}
}