由于邮箱服务商关闭了80端口,改为465端口,代码未动,但是邮件发送失败。
后查找原因:
-
.NET Framework的限制:.NET Framework的System.Net.Mail组件默认不支持Implicit SSL,而465端口通常使用Implicit SSL进行加密。因此,直接使用.NET Framework发送邮件时,可能会遇到不支持465端口的问题1。
-
邮件服务器的配置:某些邮件服务器(如阿里云)默认禁止了25端口,推荐使用465端口进行加密传输。然而,.NET Framework的SmtpClient类不支持Implicit SSL,导致无法通过465端口发送邮件12。
解决465端口发送邮件的方法:
-
使用CDO.Message组件:可以通过引用CDO.Message组件来发送邮件,该组件支持通过465端口发送邮件。具体步骤包括引用CDOSYS.DLL,设置SMTP服务器、端口、发件人等信息1。
-
使用第三方库:可以考虑使用如MailKit、MimeKit等第三方库,这些库提供了更灵活的邮件发送功能,支持包括465端口在内的多种加密方式
最终采用方法二,因为微软官方也是推荐此方法
示例代码:
using MailKit.Net.Smtp;
using MimeKit;
using System;
using System.IO;
public static void SendMailKit(string[] tos)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("发件人名称", AppConfig.From));
foreach (var s in tos)
{
if (!string.IsNullOrWhiteSpace(s))
{
message.To.Add(new MailboxAddress("收件人名称", s));
}
}
message.Subject = "邮件标题"; //邮件标题
var builder = new BodyBuilder
{
//TextBody = "Hey geffzhang<br>DennisDong"//不支持Html
HtmlBody = "Hey geffzhang<br>DennisDong"//支持Html
};
//添加附件
//builder.Attachments.Add($@"{Directory.GetCurrentDirectory()}\1.png");//包含图片附件,或者正文中有图片会被当成垃圾邮件退回,所以不建议放图片内容(跟Mail类库框架无关)
builder.Attachments.Add($@"{Directory.GetCurrentDirectory()}\ConsoleApp1.exe.config");
message.Body = builder.ToMessageBody();
using (var client = new SmtpClient())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
var mSendMail = "XXX@163.com";
var mSendPwd = "XXXXX";//163和qq都是授权码,不是邮箱密码
client.Connect("smtp.163.com", 465, true);//网易、QQ支持 25(未加密),465和587(SSL加密)
client.Authenticate(mSendMail, mSendPwd);
try
{
client.Send(message);//发送邮件
client.Disconnect(true);
}
catch (SmtpCommandException ex)
{
Console.WriteLine(ex.ErrorCode);
}
catch (Exception ex)
{
throw ex;
}
}
}