Ubuntu系统中使用cronjob发送邮件失败问题求助
Ubuntu系统中使用cronjob发送邮件失败问题求助
嘿,我完全懂你现在的挫败感——为了学校项目折腾MTA配置,装了Postfix又加了mailx,测试邮件却连Gmail的影子都看不到,确实挺闹心的。咱们顺着你提供的信息一步步来排查解决:
先处理日志里的IPv6连接问题
从你贴的/var/log/mail.log内容来看,Postfix一直在尝试通过IPv6连接Gmail的邮件服务器,但报错Network is unreachable,这说明你的系统要么没配置IPv6,要么当前网络环境不支持IPv6。咱们先让Postfix优先用IPv4试试:
- 编辑Postfix的主配置文件:
sudo nano /etc/postfix/main.cf - 找到(如果没有就新增)这一行:
inet_protocols = ipv4 - 保存退出后,重启Postfix服务:
sudo systemctl restart postfix - 再次测试发邮件:
echo "testing email" | mail -s "test email" abdulhakeemyisa@gmail.com - 过几分钟查看日志:
sudo less /var/log/mail.log,看看是不是还报同样的网络不可达错误。
配置SMTP中继解决邮件拒收问题
就算解决了IPv6的问题,直接从你的Ubuntu主机发邮件,Gmail大概率会把它判定为垃圾邮件甚至直接拒收。所以更可靠的方式是配置Postfix用Gmail的SMTP服务器来中继发送,步骤如下:
- 准备Gmail的认证信息:
- 如果你的Gmail账号开启了两步验证,需要先生成一个应用专用密码(这是最安全的方式);如果没开两步验证,可以暂时开启“不太安全的应用访问”(但更推荐开启两步验证用专用密码)。
- 安装SMTP认证所需的模块:
sudo apt install libsasl2-modules - 编辑Postfix的
main.cf文件,添加或修改以下配置:relayhost = [smtp.gmail.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt smtp_use_tls = yes - 创建认证密码文件:
sudo nano /etc/postfix/sasl_passwd,写入以下内容(替换成你的账号和密码):[smtp.gmail.com]:587 你的gmail账号@gmail.com:你的应用专用密码 - 生成Postfix能识别的哈希数据库文件:
sudo postmap /etc/postfix/sasl_passwd - 设置文件权限(避免密码泄露):
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db - 重启Postfix服务:
sudo systemctl restart postfix - 再次测试发邮件,这次可以去Gmail的收件箱或垃圾邮件文件夹看看,应该能收到测试邮件了。
Cron发送邮件的额外注意事项
等测试邮件能正常发送后,配置cron的时候还要留意两点:
- cron的环境变量和你平时登录的shell不一样,建议在cron任务里使用命令的完整路径,比如:
/usr/bin/echo "Cron job test at $(date)" | /usr/bin/mail -s "Cron Test" abdulhakeemyisa@gmail.com - 可以先写一个简单的测试脚本,比如创建
/home/你的用户名/test_cron_mail.sh,内容如下:
给脚本加执行权限:#!/bin/bash echo "Cron job executed at $(date)" | mail -s "Cron Email Test" abdulhakeemyisa@gmail.comchmod +x /home/你的用户名/test_cron_mail.sh,然后通过crontab -e添加定时任务(比如每分钟执行一次):* * * * * /home/你的用户名/test_cron_mail.sh,过几分钟验证邮箱是否收到邮件。
备注:内容来源于stack exchange,提问作者Abdulhakeem Adekunle




