.NET中MailKit连接Exchange Server超时,EASendMail可正常发件的问题
解决MailKit/System.Net.Mail超时但EASendMail成功发送邮件的问题
核心差异在于协议选择:EASendMail明确使用了ServerProtocol.ExchangeEWS(Exchange Web Services)协议,而你当前的MailKit和System.Net.Mail代码都采用SMTP协议连接,但你的邮件服务器可能仅支持EWS而非SMTP(或SMTP端口25未开放/受限)。
解决思路
1. 改用MailKit的Exchange EWS客户端
MailKit支持Exchange EWS协议,替换原SMTP客户端代码即可:
var host = "mail.company.com"; var userName = "username"; var password = "password"; var senderEmail = "username@company.com"; var message = new MimeMessage(); message.From.Add(new MailboxAddress("", senderEmail)); message.To.Add(new MailboxAddress("", "test@company.com")); message.Subject = "test email"; var body = new BodyBuilder { TextBody = "testBody" }; message.Body = body.ToMessageBody(); // 使用EWS客户端替代SMTP客户端 using (var client = new ExchangeWebServiceClient(new Uri($"https://{host}/EWS/Exchange.asmx"))) { client.Credentials = new NetworkCredential(userName, password); // 仅测试环境建议忽略证书验证,生产环境需配置合法证书 client.ServerCertificateValidationCallback = (s, cert, chain, errors) => true; client.Send(message); }
2. 验证SMTP服务可用性(可选)
如果坚持要用SMTP,先确认邮件服务器的SMTP服务状态:
- 用
telnet mail.company.com 25测试端口连通性 - 联系管理员确认SMTP服务是否开启、端口是否正确、是否需要NTLM等特殊认证
- 调整MailKit的连接参数尝试适配:
smtp.Timeout = 30000; // 设置30秒超时 smtp.Connect(host, port, SecureSocketOptions.None); // 端口25通常不加密 // 若需NTLM认证 smtp.Authenticate(new SaslMechanismNtlm(userName, password));
内容的提问来源于stack exchange,提问作者mertk
相关产品推荐
相关产品推荐

