使用 msmtp 通过终端发送邮件工作正常,但不适用于 php mail()

use*_*171 5 php email gmail smtp

最近我在运行 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.';
}
?>
Run Code Online (Sandbox Code Playgroud)

Wir*_*lue 6

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

当我尝试从 CLI 运行 PHP 邮件发送脚本时root,它起作用了。但是,切换用户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
Run Code Online (Sandbox Code Playgroud)

通过向 Apache(或 Nginx 等)发出 HTTP 请求来触发 PHP 脚本将产生相同的结果(因为 msmtp 将由www-data)。

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

chown www-data:www-data /etc/msmtprc
chmod 600 /etc/msmtprc
Run Code Online (Sandbox Code Playgroud)

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


小智 1

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

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