linux-msmtp配置从shell发送,但从PHP/apache发送失败



linux(fedora 20)msmtp配置从shell发送,但从PHP/apache失败,我被难住了。。。我的目标只是通过本地主机开发Web服务器上的gmailsmtp发送电子邮件,以测试发送邮件的代码输出

php.ini sendmail文件读取:sendmail_path=/usr/bin/msmtp--调试-C/etc/msmtprc--读取收件人

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

/etc/msmtprc上的权限设置为apache:apache600

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

  • php-r"邮件('emily@emilytench.net','最新测试电子邮件','测试电子邮件正文');"
  • runuser-l apache-c'/usr/bin/msmtp--debug-c/etc/msmtprc--读取收件人<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 web服务器,用于web开发

很抱歉回复延迟。我自己也在这个问题上挣扎。问题是配置文件的文件权限。

如果你没有记错的话,我们会被要求将文件chmod转换为0600,因为否则它将不起作用。您可能使用不同于web服务器/php的用户创建了该文件。

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

此外,如果您在~/.msmtprc下创建了配置文件,也不会起作用。因为当与PHP一起使用时,MSMTP只使用来自/etc/msmtprc 的全局

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

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

在这样做之后,我可以使用PHP用MSMTP发送邮件,没有任何问题。

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

sudo -u {apacheUser} -swhich msmtp

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

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

sendmail_path = /bin/msmtp -t -i

此外,也许应该注意的是,我在php.ini 中评论了SMTPsmtp_port

我在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) 更改apachephp.ini设置(搜索sendmail_path)并强制配置文件(-C选项)

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

3) 在apachephp.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');"

我无法更改文件所有者,因为msmprc是从kubernetes机密安装的。用passwordeval替换密码成功了。

passwordeval "echo the-password"

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

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

固定-msmtp:无法登录/var/log/msmtp:无法打开:权限拒绝

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

msmtp的系统配置文件-rw-rw rw-1根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

如果需要,每个用户的配置文件可以与具有不同userid、密码和from字段的系统文件相同。注意.msmtprc 前的"."

-rw-------1 ubuntu ubuntu 267 Jun 3 05:50.msmtprc

日志文件是按每个用户在其主目录中使用正确的权限创建的,无需破坏权限。

-rw-r--r--1根msmtp 344 6月3日06:09.msmtp.log

从命令行发送电子邮件

echo -e "Subject: MySubjectrnrnThis 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 .....

相关内容

  • 没有找到相关文章

最新更新