You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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服务器来中继发送,步骤如下:

  1. 准备Gmail的认证信息
    • 如果你的Gmail账号开启了两步验证,需要先生成一个应用专用密码(这是最安全的方式);如果没开两步验证,可以暂时开启“不太安全的应用访问”(但更推荐开启两步验证用专用密码)。
  2. 安装SMTP认证所需的模块:sudo apt install libsasl2-modules
  3. 编辑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
    
  4. 创建认证密码文件:sudo nano /etc/postfix/sasl_passwd,写入以下内容(替换成你的账号和密码):
    [smtp.gmail.com]:587 你的gmail账号@gmail.com:你的应用专用密码
    
  5. 生成Postfix能识别的哈希数据库文件:sudo postmap /etc/postfix/sasl_passwd
  6. 设置文件权限(避免密码泄露):sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
  7. 重启Postfix服务:sudo systemctl restart postfix
  8. 再次测试发邮件,这次可以去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.com
    
    给脚本加执行权限:chmod +x /home/你的用户名/test_cron_mail.sh,然后通过crontab -e添加定时任务(比如每分钟执行一次):* * * * * /home/你的用户名/test_cron_mail.sh,过几分钟验证邮箱是否收到邮件。

备注:内容来源于stack exchange,提问作者Abdulhakeem Adekunle

火山引擎 最新活动