Mutt通过msmtp发送邮件失败,遇TLS连接超时及远程协议错误
Mutt通过msmtp发送邮件失败,遇TLS连接超时及远程协议错误
我最近碰到了和你完全一样的问题,折腾了好一阵才摸清楚几个可行的排查和解决方向,分享给你试试:
先对齐下你的问题现状(方便确认排查方向)
你一直用这条命令发邮件:
mutt -s "Subject" email@gmail.com <<< "Text"
几天前突然失效,现在遇到TLS连接超时错误;切换到465端口后又出现远程协议错误,但swaks测试两个端口都能正常发件,也已经给开启2FA的Google账号配置了应用专用密码,网络连通性也没问题。
针对性解决方案
1. 修正msmtp的TLS配置细节
这是最可能解决问题的核心点,因为587和465端口的TLS工作模式完全不同:
- 对于587端口(STARTTLS模式):在
~/.msmtprc的gmail账号配置里,添加tls_starttls on,同时删掉重复的auth on行,修改后配置如下:
defaults logfile ~/msmtp.log account gmail auth on host smtp.gmail.com from my.email@gmail.com tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt user my.email@gmail.com password "你的应用专用密码" port 587 account default : gmail
- 对于465端口(SSL直连模式):需要把
tls_starttls off,确保端口设为465,配置示例:
account gmail auth on host smtp.gmail.com from my.email@gmail.com tls on tls_starttls off tls_trust_file /etc/ssl/certs/ca-certificates.crt user my.email@gmail.com password "你的应用专用密码" port 465
2. 查看msmtp日志定位具体问题
你的配置里已经开启了日志logfile ~/msmtp.log,执行发邮件命令后立刻查看日志详情:
tail -n 20 ~/msmtp.log
日志会显示TLS握手的每一步细节,比如是否是证书验证失败、握手阶段哪一步卡住,能帮你精准定位问题根源。
3. 调整Mutt调用msmtp的参数
有时候Mutt传递的参数会导致msmtp工作异常,在~/.muttrc里添加sendmail_flags配置:
set sendmail="/usr/bin/msmtp" set sendmail_flags="-t" set use_from=yes set from=my.email@gmail.com
-t参数让msmtp从邮件内容里读取收件人信息,和Mutt的发送逻辑更匹配。
4. 更新系统CA证书
虽然swaks能用,但msmtp可能依赖的CA证书存在过期或路径问题,执行命令更新系统证书:
sudo update-ca-certificates
快速验证方法
修改配置后,先跳过Mutt直接用msmtp测试发送,排除Mutt的问题:
echo -e "Subject: Test Mail\n\nThis is a test from msmtp" | msmtp email@gmail.com
如果msmtp能正常发送,再测试Mutt的命令,这样能快速定位是msmtp还是Mutt的问题。
备注:内容来源于stack exchange,提问作者s3idani
相关产品推荐
相关产品推荐

