Mailkit在Ubuntu20.04服务器发送邮件抛出TimeoutException超时异常
排查解决思路
- 先验证Ubuntu服务器的出站连通性
你本地能连通不代表服务器可以,先在Ubuntu服务器上执行命令测试目标SMTP服务465端口的连通性:
注意你之前开放的ufw规则是入站465端口,和程序主动对外连接的出站规则无关,默认ufw允许所有出站,如果你改了出站规则需要单独放行465端口的出站请求。# 用netcat测试 nc -zv 你的SMTP主机地址 465 # 用telnet测试 telnet 你的SMTP主机地址 465 # 验证DNS解析是否正确 nslookup 你的SMTP主机地址 - 修正SecureSocketOptions配置
465端口默认是隐式SSL的SMTPS协议,不要用SecureSocketOptions.Auto的自动识别逻辑,Linux环境下自动识别经常出现协议匹配错误,直接显式指定为SecureSocketOptions.SslOnConnect即可。 - 验证SSL/TLS握手是否正常
执行openssl命令测试TLS握手是否能正常完成,排除CA证书缺失的问题:
如果返回证书错误,更新Ubuntu的CA证书库即可:openssl s_client -connect 你的SMTP主机地址:465sudo update-ca-certificates - 代码层面优化
显式设置SMTP连接超时时间,避免默认超时过短导致的异常,调整后的连接代码示例:
还可以开启Mailkit的调试日志,打印连接全流程的细节,定位具体卡在哪一步。using (var smtp = new SmtpClient()) { // 显式设置30秒超时 smtp.Timeout = 30000; // 改用显式SslOnConnect参数 smtp.Connect(Options.HostAddress, Options.HostPort, SecureSocketOptions.SslOnConnect); smtp.Authenticate(Options.HostUsername, Options.HostPassword); smtp.Send(email); smtp.Disconnect(true); } - 检查上层安全策略限制
这是最常见的问题:几乎所有主流云服务商都会默认封禁服务器对外的25、465、587等邮件端口的出站请求,你需要登录云服务商的控制台,在安全组/网络防火墙规则中放行465端口的出站请求。
另外检查Ubuntu的AppArmor、SELinux等安全模块是否限制了你的程序对外发起网络请求,如果是容器部署还需要检查容器的网络策略是否允许对外访问465端口。 - 代理配置检查
如果你的Windows本地配置了全局代理可以正常访问SMTP服务,Ubuntu服务器没有配置对应代理也会导致连接失败,需要为程序配置对应代理后再测试。
内容的提问来源于stack exchange,提问作者Severin.Hersche
相关产品推荐
相关产品推荐

