如何使用 PHP mail() 函数来使用 Gmail 或 Yahoo
红色代表什么
本教程中用户需要输入或自定义的行将以红色显示!
其余部分大部分都可以复制粘贴。
关于 PHP mail()
PHP mail()函数使用sendmail_path配置指令中的程序发送电子邮件。默认情况下,该程序设置为 sendmail。
虽然大多数 Linux 安装都预装了 sendmail,但总是需要设置 SPF/PTR 记录、生成 DKIM 密钥等,以确保 PHP 脚本发送的电子邮件不会被标记为垃圾邮件。可以使用名为 MSMTP 的 SMTP 客户端通过第三方 SMTP 服务器发送电子邮件,PHP 的 mail() 也可以使用它来代替 sendmail。
安装
要在 Fedora Linux 上安装 MSMTP,请使用yum:
yum install msmtp
CentOS 存储库没有 MSMTP 的 RPM 包,因此我们需要从源代码安装它:
yum install make gcc pkgconfig wget http://sourceforge.net/projects/msmtp/files/msmtp/1. tar -xvf msmtp-1.4.31.tar.bz2 cd msmtp-1.4.31 ./configure make make install4.31/msmtp-1.4.31.tar.bz2/ download
在撰写本文时,最新版本是 1.4.31,但将来可能会发生变化,因此要获取最新版本,请访问此 sourceforge 页面。
在 Ubuntu/Debian 发行版上使用apt-get:
apt-get install msmtp
Arch Linux 用户:
sudo pacman -S msmtp
配置 MSMTP
MSMTP 的配置文件存储在每个用户的~/.msmtprc中, /etc/msmtprc是系统范围的配置文件。在您的目录中打开配置文件。
vi ~/.msmtprc
为 Yahoo 帐户添加以下行:
account yahoo tls on tls_starttls off tls_certcheck off auth on host smtp.mail.yahoo.com user user1 from user1@yahoo.com password yourYahooPa5sw0rd
对于 Gmail,请使用以下设置:
account gmail tls on tls_certcheck off auth on host smtp.gmail.com port 587 user user1@gmail.com from user1@gmail.com password yourgmailPassw0rd
此文件也可以有多个帐户,只需确保每个部分的“帐户”值都是唯一的。保存文件并使用chmod使此文件仅由所有者可读,因为它包含密码。此步骤是必需的,因为如果权限超过600,msmtp 将无法运行。
chmod 600 ~/.msmtprc
在用 PHP 实现此功能之前,请从命令行进行检查以确保其正常工作。为此,创建一个包含简单电子邮件的纯文本文件:
echo -e "From: alice@example.com \n\ To: bob@domain.com \n\ Subject: Hello World \n\ \n\ This email was sent using MSMTP via Gmail/Yahoo." >> sample_email.txt
现在发送此电子邮件:
cat sample_email.txt | msmtp --debug -a gmail bob@domain.com
将单词“gmail”替换为“yahoo”或您在“account”选项中输入的任何内容。由于 “--debug”参数,您将看到很多消息。如果事情没有按预期进行,这可以使故障排除变得容易。如果 bob@domain.com 收到此电子邮件,则说明所有设置均正确,因此请将此文件复制到/etc目录:
cp -p ~/.msmtprc /etc/.msmtp_php
将所有权更改为运行 Web 服务器的用户名。根据您 VPS 和 Web 服务器安装的 Linux 发行版,该用户名可以是“ apache ”、“ www-data ”或“ nobody ”:
chown www-data:www-data /etc/.msmtp_php
配置 PHP
打开php.ini文件,其位置根据安装的操作系统和 PHP 类型(PHP CGI、mod_php、PHP-FPM 等)而不同:
vi /etc/php5/php.ini
找到以下行:
sendmail_path =
修改一下,添加msmtp命令的路径:
sendmail_path = "/usr/bin/msmtp -C /etc/.msmtp_php --logfile /var/log/msmtp.log -a gmail -t"
手动创建一个日志文件并将其所有权更改为运行 Web 服务器的用户名:
touch /var/log/msmtp.log chown www-data:www-data /var/log/msmtp.log
重新启动 Web 服务器以应用更改:
service httpd restart
在 Arch Linux 中,这是使用 systemctl 命令完成的:
systemctl restart httpd
根据您的操作系统和 Web 服务器,将“ httpd ”替换为适当的名称。如果 PHP 作为单独的进程运行(如 PHP-FPM),请重新启动它:
service php5-fpm restart
创建一个带有简单 mail() 的 PHP 脚本来测试此设置:
<?php if(mail("receipient@domain.com","A Subject Here","Hi there,\nThis email was sent using PHP's mail function.")) print "Email successfully sent"; else print "An error occured"; ?>
从 Web 浏览器访问此文件。
http://www.example.com/file.php
如果这封电子邮件未发送,您可以检查 msmtp 日志文件中是否存在错误。
tail /var/log/msmtp.log
常见错误
如果使用PHP脚本时邮件没有发送,请按照如下方法排除故障:
- 检查您是否编辑了正确的php.ini文件。可以通过创建phpinfo();文件并检查“已加载的配置文件”部分来确认。
- msmtp 配置文件的路径可能错误,或者 Web 服务器没有权限读取此文件。
- 通过使用命令行 PHP 运行脚本来检查电子邮件是否已发送:
php /var/www/html/file.php