PHP使用mail函数发送邮件及安装Sendmail服务
在PHP中,常有发送邮件功能。PHP中有mail()
函数,可以用来发送邮件。
但在本地使用时,我们常发送邮件发送失败。这是因为使用发送邮件功能,需要服务器支持。
在linux上,我们常使用sendmail
组件。
php中mail()
函数
1 | bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) |
安装sendmail
Yum安装
1 | yum install sendmail |
设置主机名,主机名要设置一个域名格式的,例如:jb51.net
1 | hostname jb51.net |
设置主机名后,需要重启sendmail服务
查看sendmail服务状态
1 | service sendmail status |
php配置
修改php.ini
文件
1 | vi /usr/local/php/etc/php.ini |
配置sendmail_path
1 | sendmail_path = /usr/sbin/sendmail -t -i |
重启PHP
1 | service php-fpm restart |
使用phpinfo()
查看服务是否配置成功
测试
测试 代码
1 | <?php |
错误
查看错误日志
1 | sudo tail -f /var/log/maillog |
得到错误信息
1 | Nov 2 16:26:36 Visitor sendmail[3159]: vA28QaFS003159: from=www, size=161, class=0, nrcpts=1, msgid=<201711020826.vA28QaFS003159@pangxieke.com>, relay=www@localhost |
“Service unavailable”所指什么服务呢?
可能是主机名DNS无法解析
修改主机名
1 | hostname 主机名 |
修改了主机名为服务器的域名后, 重启sendmail服务,重试,还是无法发送。
原来原因是因为 /etc/hosts.allow 和 /etc/hosts.deny 设置有问题。
把 /etc/hosts.deny 中的 ALL:ALL 注释掉后,可以正常发送。
telent localhost 25可以,
LINUX默认情况SMTP仅绑定127.0.0.1,因此不能从网络访问,要打开SMTP,如下即可:vi /etc/sendmail.cf
找到:
1 | # SMTP daemon options |
添加:
1 | # SMTP daemon options |
问题可能在于 /etc/hosts.deny 设置了 ALL:ALL 之后,在 /etc/hosts.allow 中没有对sendmail充分的授权。
在 /etc/hosts.allow 中加入以下行:
1 | sendmail : hostname (主机名,不一定需要是域名) |
这样就可以发送了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 螃蟹壳!