3

linux(fedora 20)msmtp配置从shell发送但从PHP / apache失败,我很难过......我的目标只是通过我的本地开发网络服务器的gmail smtp发送电子邮件,以测试发送邮件的代码输出

php.ini sendmail 文件读取: sendmail_path = /usr/bin/msmtp --debug -C /etc/msmtprc --read-recipients

系统上只有一个 php.ini,用于 CLI 和位于 /etc/php.ini 的 web 服务器

/etc/msmtprc 的权限设置为 apache:apache 600

以下命令作为 root 工作并生成测试电子邮件:

  • php -r "mail('emily@emilytinch.net', '最新测试电子邮件', '测试电子邮件正文');"
  • runuser -l apache -c '/usr/bin/msmtp --debug -C /etc/msmtprc --read-recipients < /var/www/html/test.mail' (test.mail 包括往返行)

但是当从以下脚本调用 php 邮件函数时 apache/php 会产生错误:

if (mail('emily@emilytench.net', 'Newest Test Email', 'Test email body'))
print "Email successfully sent";
else
print "An error occured";

错误期间的日志文件如下所示:

  • /var/log/httpd/error_log:msmtp:无法连接到 smtp.gmail.com,端口 587:权限被拒绝 msmtp:无法发送邮件(帐户默认来自 /etc/msmtprc)

/etc/msmtprc 包含:

defaults
auth on
tls on
tls_trust_file /etc/pki/tls/cert.pem
account default
host smtp.gmail.com
port 587
user emily@emilytench.net
from emily@emilytench.net
password [******]
auth on
syslog on

欢迎任何指向正确方向的指针...仅尝试实现 localhost php 邮件功能通过我的 gmail smtp 服务器发送电子邮件的简单途径 - 这不是生产服务器配置,它是我的本地 apache/php 网络服务器发展

4

6 回答 6

4

这么晚才回复很抱歉。我自己也为这个问题而苦苦挣扎。问题是配置文件的文件权限。

如果您没记错的话,我们会被要求访问chmod该文件,0600因为否则它将无法正常工作。而且您可能使用与您的 web-server/php.xml 不同的用户创建了该文件。

这意味着您的网络服务器或控制 PHP 的服务器无法读取该文件以获取您的电子邮件配置。

此外,如果您在该目录下创建了配置文件~/.msmtprc,也将无法正常工作。因为当与 PHP 一起使用时,MSMTP 只使用来自/etc/msmtprc

这意味着您必须在其中创建配置,/etc/msmtprc然后创建chown配置文件以匹配您的 webs-erver/php.ini 的用户。

由于我在 Debian 上并且使用了 NGINX,因此我必须在 CentOS 上使该用户可以www-data访问该文件,因此请确保您正确设置了该用户。chown www-data:www-data /etc/msmtprchttpd

之后,我可以毫无问题地使用 PHP 使用 MSMTP 发送邮件。

于 2015-03-01T20:35:45.093 回答
3

我遇到了从 shell 发送 MSMTP 的问题,但在 CentOS 7 上无法通过 PHP 工作。花了一整天的时间后,我的解决方案是......

sudo -u {apacheUser} -s which msmtp

对我来说,这/bin/msmtp 不是 user/bin 或任何本地 bin 输出的。一旦我用 Apache 用户使用的路径更新了 PHP.ini 中的 sendmail_path,一切都运行良好。

最终解决方案,对我来说:

sendmail_path = /bin/msmtp -t -i

另外,也许应该注意我已经在我的 php.ini中评论SMTPsmtp_port

于 2015-07-10T20:26:16.750 回答
2

由于 mstmprc 是从 kubernetes 秘密挂载的,我无法更改文件所有者。用 passwordeval 替换密码就可以了。

passwordeval "echo the-password"

这显然不是最安全的方式,因此理想情况下应该用加密工具代替 echo。

于 2019-06-21T19:23:30.193 回答
1

我在许多论坛上看到这个问题被问到,但没有得到回答——甚至在一个从堆栈溢出中“抓取”内容的网站中遇到了我自己的问题——并为任何对此问题感到困惑的人发布了这个问题的答案。虽然这不是问题的确切答案,但它与添加到 msmtp 的 gnome 密钥环支持有关,因为它在没有 shell 和 tls 的情况下运行。无法也不愿意尝试说服代码以不符合设计的方式运行,我的解决方案是,有一些阻力,改为为 smtp 中继配置 exim。

于 2014-09-19T11:28:34.267 回答
1

我在 openSuse 中遇到了类似错误msmtp: /etc/msmtprc: must be owned by you,并且更改 /etc/msmtprc 的所有者不是一个选项,因为 cron 和其他服务将它用于其他目的,并导致另一个错误msmtp: /etc/msmtprc: must have no more than user read/write permissions

我的解决方案是:

1) 以 root 身份创建 msmtprc 的副本

cp /etc/msmtprc /etc/msmtprc_apache
chown wwwrun:www /etc/msmtprc_apache
chmod 0600 /etc/msmtprc_apache

2)更改apache php.ini设置(搜索sendmail_path)并强制配置文件(-C选项)

sendmail_path = "/usr/bin/msmtp -C /etc/msmtprc_apache -t"

3) 在 apache php.ini 设置中注释掉

; SMTP = localhost
; smtp_port = 25

对于简单的测试,作为root切换到wwwrun用户并使用php进行测试

sudo -u wwwrun -s
php -r "mail('test@test.com', 'PHP test', 'Test from PHP as wwwrun user');"
于 2015-05-21T22:16:35.313 回答
0

已修复 - msmtp:无法登录到 /var/log/msmtp:无法打开:权限被拒绝

这是给下一个遇到这个问题的人的。

msmtp 的系统配置文件 -rw-rw-rw- 1 root root 266 Jun 3 06:07 /etc/msmtprc

# mimecast
account mimecast
host smtp.mail.com
port 587
protocol smtp
from admin@company.com
auth on
user authuser@company.com
password mypassword
tls on
tls_certcheck off
logfile ~/.msmtp.log
syslog off
account default : mimecast

.#mimecast is just a section header and can be deleted
account mimecast - is a title if multiple send accounts are available or needed
account default : mimecast  - is saying this is the default account used

如果需要,每个用户的配置文件可以与具有不同用户 ID、密码和来自字段的系统文件相同。注意“。” 在 .msmtprc 之前

-rw------- 1 ubuntu ubuntu 267 六月 3 05:50 .msmtprc

日志文件是在每个用户的主目录中以正确的权限创建的 - 无需弄乱权限。

-rw-r--r-- 1 根 msmtp 344 Jun 3 06:09 .msmtp.log

从命令行发送电子邮件

echo -e "Subject: MySubject\r\n\r\nThis is mybody" |msmtp recipient@company.com

use the -C configfilename  to specify alternate local config files
use the -a account mimecast to switch between accounts to send from within the config file  ( did not try this option )

或使用

msmtp recipient@company.com
Subject: This is my subjectline
Blank line ( press enter )
Here is the body of the email

CTRL-D ( to send )

或使用此选项从命令行发送邮件

msmtp recipient@company.com < filename

文件名包含在哪里

To: recipient@company.com
From: sender@company.com
Subject: Here is the Subject

body body body .....
于 2020-06-03T06:45:41.637 回答