Docker容器中PHP通过msmtp发邮件存在场景兼容问题
PHP mail函数结合msmtp在Docker中兼容两种调用场景的解决方案
环境信息
- msmtp版本:1.8.22
- 平台:x86_64-pc-linux-gnu
- 目标:中继邮件到Postfix Docker容器,同时兼容两种PHP mail调用场景
问题梳理
- 不带-f参数的调用:
mail($to,$subject,$txt,$headers)allow_from_override on时正常工作allow_from_override off时报错:msmtp: account default from /usr/local/etc/msmtprc: envelope-from address is missing
- 带-f参数的调用:
mail($to, $subject, $txt, $headers, '-f '.$from)- 无论
allow_from_override开关状态,均报错:msmtp: cannot use both --from and --read-envelope-from
- 无论
解决步骤
1. 修改msmtprc配置文件
编辑/usr/local/etc/msmtprc,添加默认信封发件人并调整参数:
host postfix remove_bcc_headers off allow_from_override on from chris@phppointofsale.com # 设置全局默认信封发件人
from参数:指定默认的信封发件人,解决无-f参数时的发件人缺失问题allow_from_override on:允许通过-f参数覆盖默认发件人,兼容两种调用场景
2. 调整PHP的sendmail_path配置
在php.ini中修改sendmail_path,移除--read-envelope-from参数:
sendmail_path = "/usr/bin/msmtp -t"
- 默认PHP配置的sendmail_path可能包含
--read-envelope-from,该参数会强制从邮件内容读取信封发件人,与-f参数传递的--from冲突,移除后即可避免报错
3. 验证两种调用场景
- 不带-f参数:msmtp使用配置文件中的默认
from作为信封发件人,邮件头From保持headers中设置的值 - 带-f参数:msmtp使用-f传递的地址作为信封发件人,同时保留headers中的From头信息,无冲突报错
内容的提问来源于stack exchange,提问作者Chris Muench
相关产品推荐
相关产品推荐

