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-data
和chown www-data:www-data /etc/msmtprc
可以访问该文件。在CentOS上,该用户可能是httpd
。因此,请确保正确设置了该用户。
在这样做之后,我可以使用PHP用MSMTP发送邮件,没有任何问题。
我遇到了从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 中评论了SMTP
和smtp_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 .....