如何通过PHPmail()函数使用Gmail或Yahoo

来自菜鸟教程
跳转至:导航、​搜索

红色是什么意思

用户需要输入或自定义的行在本教程中将显示为红色

其余的大部分应该是可复制粘贴的。

关于 PHP 邮件()

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.4.31/msmtp-1.4.31.tar.bz2/download
tar -xvf msmtp-1.4.31.tar.bz2
cd msmtp-1.4.31
./configure
make
make install

撰写本文时最新版本是 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

这个文件也可以有多个账户,只要确保每个部分的 "account" 值是唯一的。 保存文件并使用 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”或您为“帐户”选项输入的任何内容。 由于 "--debug" 参数,您'会看到很多消息。 如果事情没有按预期工作,这是为了使故障排除变得容易。 如果 bob@domain.com 收到此电子邮件,则一切设置正确,因此将此文件复制到 /etc 目录:

cp -p ~/.msmtprc /etc/.msmtp_php

将所有权更改为运行 Web 服务器的用户名。 这可以是“apache”、“www-data”或“nobody”,具体取决于您安装的 VPS 和 Web 服务器上的 Linux 发行版:

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(); 文件并检查“Loaded Configuration File”部分来确认。
  • msmtp 配置文件的路径可能是错误的,或者 Web 服务器没有读取此文件的权限。
  • 通过使用命令行 PHP 运行脚本来检查是否发送了电子邮件:

    php /var/www/html/file.php