Silverstripe生产环境找回/修改密码触发Sendmail错误求助
核心原因
错误提示显示系统仍在尝试使用sendmail发送邮件,而非你配置的Mailgun SMTP服务,说明生产环境下的邮件配置未生效。
具体排查点及解决步骤
验证环境变量匹配
确认生产服务器的SS_ENVIRONMENT_TYPE确实设置为live。如果环境变量是其他值(比如production),你的配置文件里的Only: environment: 'live'就不会触发,系统会沿用默认的sendmail配置。
可以在服务器上执行echo $SS_ENVIRONMENT_TYPE查看当前值,若不匹配,修改配置文件里的environment值,或者调整服务器的环境变量。检查配置加载优先级
确保你的myemailconfig.yml文件放置在正确的目录(一般是app/_config/下),且没有其他邮件配置文件在它之后加载、覆盖了SMTP设置。可以临时调整After参数为After: '*',确保它在所有邮件配置之后加载,测试是否生效,确认后再调回合理优先级。确认环境变量有效性
检查生产环境中MAILGUN_SMTP_USERNAME和MAILGUN_SMTP_PASSWORD这两个环境变量是否正确设置且能被SilverStripe读取。可以在代码里临时输出变量值(比如在控制器中执行var_dump(getenv('MAILGUN_SMTP_USERNAME'))),确认不是空值或错误值。如果是通过.env文件设置的,确保文件权限正确,服务器进程能读取该文件。检查服务器网络权限
生产服务器可能存在防火墙或安全组规则,拦截了到smtp.mailgun.org的587端口请求。可以在服务器上执行telnet smtp.mailgun.org 587测试连通性,如果无法连接,需要联系运维开放对应端口的出站权限。临时调整配置测试
可以先去掉配置文件里的Only: environment: 'live',在生产环境强制加载SMTP配置,测试是否能正常发送邮件。如果生效,再回头排查环境变量匹配的问题。
另外,也可以尝试在配置文件中直接写死Mailgun的用户名和密码(仅测试用,不要在生产环境长期保留),排除环境变量读取失败的可能:
calls: Username: [ setUsername, ['postmaster@yourdomain.com'] ] Password: [ setPassword, ['your-mailgun-password'] ]
内容的提问来源于stack exchange,提问作者galilee

