Moodle提示发送成功但未收到验证邮件问题求助
这种情况我之前帮同事排查过类似的,结合你描述的细节——换服务器后出现问题、PHP mail()单独测试正常、不管SMTP配置与否都显示成功,给你几个逐步排查的方向:
先查Moodle内部的邮件日志
登录Moodle后台,找到站点管理 > 报告 > 邮件日志,看看有没有对应验证邮件的发送记录。如果日志里完全找不到这条邮件,那大概率是Moodle的业务逻辑没触发发送(比如用户状态异常、验证邮件的触发条件没满足),但前端错误返回了成功提示;如果日志里有记录,那问题就出在邮件从Moodle到服务器邮件系统的环节,或者后续投递阶段。确认Moodle的邮件传输配置是否生效
去站点管理 > 服务器 > 邮件页面,检查「邮件传输类型」是不是真的选了「PHP mail()」。有时候换服务器后,旧的SMTP配置可能残留,哪怕你觉得设不设都一样,Moodle说不定实际在调用一个配置错误的SMTP服务,而非PHP mail()。另外,留意「邮件返回地址」是不是用了和服务器域名匹配的邮箱,很多邮件服务商对发件人域名有校验,不匹配的话容易被拦截。查看服务器MTA的日志细节
PHP mail()调用成功,不代表邮件真的被投递出去了——可能被本地邮件传输代理(比如Postfix、Sendmail)拦截或排队。你可以实时查看MTA日志:- Debian/Ubuntu系统:执行
tail -f /var/log/mail.log - CentOS/RHEL系统:执行
tail -f /var/log/maillog
然后在Moodle里再触发一次验证邮件,盯着日志看有没有对应的发送记录。如果看到「relay denied」「rejected」这类关键词,就是MTA的问题(比如发件人域名没配置SPF记录、被本地系统判定为垃圾邮件);如果显示邮件已成功转发到收件方服务器,那就要去收件人的垃圾邮件箱找找,或者让对方联系邮箱服务商查拦截日志。
- Debian/Ubuntu系统:执行
检查Moodle临时目录的权限
虽然你说文件权限是755,但Moodle的moodledata/temp目录权限可能有问题——换服务器后,web服务器用户(比如www-data、apache)可能没有读写这个目录的权限,导致Moodle无法生成邮件内容的临时文件,虽然前端提示成功,但实际没完成发送。可以执行chown -R www-data:www-data /path/to/moodledata/temp(根据你的web用户调整)来修复权限。测试不同的收件邮箱
别死磕同一个邮箱,试试服务器本地邮箱(比如root@your-server-domain.com)或者其他主流邮箱(Gmail、Outlook)。如果本地邮箱能收到,那就是外部邮箱服务商拦截了你的邮件,这时候需要给服务器域名配置SPF、DKIM、DMARC记录,证明你的邮件是合法的。排查Moodle版本与服务器环境的兼容性
换服务器时有没有升级Moodle?或者服务器的PHP版本、MTA版本和当前Moodle版本不兼容?可以对照Moodle官方文档,确认你的PHP版本、系统环境是否符合要求,有些新版本Moodle对邮件发送的逻辑做了调整,可能和旧环境不兼容。
内容的提问来源于stack exchange,提问作者Renjith

