使用msmtp通过终端发送邮件效果良好,但效果不佳;不要使用php-mail()


Sending mail through terminal using msmtp works fine, but doesn't work with php mail()

最近我在运行kubuntu桌面的ubuntu 12.04服务器上安装了msmtp。msmtp的安装运行良好,我甚至可以使用gmail的smtp服务器通过终端发送邮件。

我的问题是,尽管通过终端发送邮件是可行的,但它仍然不能使用php邮件。我尝试过使用phpmail()函数,但从未收到任何电子邮件。

我已经检查了apache错误日志(/var/log/apache2/error.log),但它们是空的
有人知道怎么解决这个问题吗?如果需要任何进一步的信息,只需这样说:)

此外,在执行php脚本时,不会出现任何错误。

下面的代码回声邮件发送,但我从未收到过电子邮件:

<?
if(mail( 'noreply.njmedia@gmail.com', 'Test mail from localhost', 'Working Fine.'))
{
    echo 'Mail sent';
}
else
{
    echo 'Error. Please check error log.';
}
?>

对我来说,原因是文件所有权不正确&msmtp配置文件上的权限。

当我尝试以root的身份从CLI运行PHP邮件发送脚本时,它成功了。但是,将用户切换到www-data并尝试再次运行脚本(也在CLI上)失败,并显示以下消息:

msmtp: /etc/msmtprc: contains secrets and therefore must be owned by you
msmtp: /etc/msmtprc: contains secrets and therefore must have no more than user read/write permissions

通过对Apache(或Nginx等)的HTTP请求触发PHP脚本将具有相同的结果(因为msmtp将由www-data用户调用)。

假设您的msmtp配置文件位于/etc/msmtprc,这些命令将修复这些问题:

chown www-data:www-data /etc/msmtprc
chmod 600 /etc/msmtprc

在进行这些更改之前,请考虑这些新权限是否适合您的情况(例如,是否存在安全隐患?)。

php邮件模块调用一个名为sendmail的系统命令来发送电子邮件。sendmail由各种邮件服务器实现,例如postfix或exim。正如我所看到的,msmtp不提供sendmail二进制文件。请检查是否可以通过命令行执行sendmail。如果没有,请尝试安装postfix。

更新:我明白了,msmtp-mta也提供了sendmail二进制文件。如果你不想要后缀,你可以试试这个。