如何在 WordPress 中通过 mail() 发送邮件?借邮件传输代理配置SMTP

如果不在WordPress的functions.php里添加代码 add_action(‘phpmailer_init’, ‘mail_smtp’) 来配置 SMTP 邮件设置,WordPress 会默认使用 PHP 的 mail() 函数来发送邮件。

如果你在多个 WordPress 网站上使用 Gmail 发送邮件,并且对速度有要求,建议使用 邮件传输代理(MTA)结合 mail() 函数,这样可以减少网络连接和身份验证的开销,提高邮件发送的速度。
直接通过 Gmail SMTP 发送邮件虽然简单,但每次都需要重新建立连接和进行身份验证,速度较慢。

理论上 mail() 函数比通过 SMTP 发送邮件更快速,因为它直接使用服务器的邮件传输代理(MTA)发送邮件,不需要通过额外的外部 SMTP 服务器进行中转。

如果你选择使用 mail() 函数而不是通过 phpmailer_init 钩子配置 SMTP,可以直接调用 mail() 函数。你可以在 wp_mail() 函数之前覆盖 sendmail_path,将其指向 mail() 函数的实现。

WordPress 中使用 Gmail SMTP 发送邮件,与 mail() 函数结合邮件传输代理(如 Postfix)配置 Gmail 发邮件,哪个更快?

即使服务器使用邮件传输代理(如 Postfix、Exim 或 Sendmail),然后将邮件通过 SMTP 发送出去,发信速度也比直接在wordpress使用SMTP快。

当你通过 mail() 函数发送邮件时,邮件直接通过本地的邮件传输代理(MTA)发送。MTA(如 Postfix、Sendmail 或 Exim)通常已在本地服务器上配置,并且不会进行网络通信,它通过本地的邮件队列处理邮件的投递。此过程通常是即时的,不会有额外的延迟。

1. 使用 Gmail SMTP(通过 PHP 的 wp_mail())

流程:邮件通过 WordPress 的 wp_mail() 函数发送时,首先需要连接到 Gmail 的 SMTP 服务器(例如 smtp.gmail.com),然后进行身份验证、加密连接等步骤,最后将邮件发送到 Gmail 的邮件队列。

延迟原因:
网络延迟:每次邮件发送都需要通过外部网络连接 Gmail SMTP 服务器。这会涉及到与外部服务器的 TCP/IP 连接、TLS/SSL 加密过程、身份验证等。
外部依赖:邮件依赖于 Gmail 服务器的可用性和响应时间。如果 Gmail 服务器负载较高,或者网络问题,会导致延迟。

额外步骤:发送每封邮件时,SMTP 的身份验证和加密步骤都会消耗一定的时间。

2. 使用 mail() 函数配合邮件传输代理(MTA)配置 Gmail 发信
流程:通过 PHP 的 mail() 函数发送邮件时,如果你配置了一个本地邮件传输代理(例如 Postfix 或 msmtp),该代理会将邮件通过本地 MTA 发送到 Gmail SMTP 服务器。

Postfix/Exim/msmtp 会在本地将邮件交给 Gmail SMTP 服务器进行处理和投递。
使用 msmtp 等邮件代理工具时,它会直接连接到 Gmail 的 SMTP 服务器,但它通常会在 本地服务器内进行邮件投递的连接管理,有时会通过缓存机制等方式提高效率。

延迟原因:

本地 MTA 优势:一旦配置了 MTA,并通过正确的配置(如 msmtp)直接连接 Gmail SMTP,它可以减少某些过程的延迟,比如身份验证的缓存和网络连接复用等。
本地优化:因为邮件通过本地代理进行管理,通常可以更快地启动邮件投递过程,且避免了每次都进行完整的外部身份验证和加密流程。MTA 通常会将发送任务排队并批量发送,减少了每次连接的开销。

速度比较:

通过 Gmail SMTP(wp_mail()):每次发送邮件时,都需要建立新连接与 Gmail 服务器进行身份验证、加密通信,并等待 Gmail 处理邮件。这通常会导致较大的延迟,特别是在邮件发送量大时,性能会受到影响。

通过本地 MTA 配置 Gmail(使用 mail()):在这种情况下,本地邮件代理(例如 msmtp)通常会复用与 Gmail 的连接,避免了每次都重新进行身份验证的过程。邮件将更快地从本地代理转发到 Gmail,因为本地代理通常具有较高的效率和更少的网络开销。

使用 wp_mail() 直接发送 Gmail SMTP 邮件时,因为每次都需要通过网络与 Gmail SMTP 服务器建立连接和验证身份,通常会比使用本地 MTA(通过 mail() 配置 Gmail 发邮件)要慢一些。
使用 mail() 结合邮件传输代理(例如 msmtp)配置 Gmail,由于本地代理复用了与 Gmail 的连接,减少了每次发送邮件的网络延迟和身份验证开销,因此发送邮件的速度通常会更快。

默认的邮件发送机制,PHP 的 mail() 函数

当没有自定义 SMTP 配置时,WordPress 会调用 PHP 内置的 mail() 函数来发送邮件。
mail() 函数会依赖于服务器的邮件传输代理(MTA),例如 Sendmail 或 Postfix。这些邮件传输代理负责将邮件送出服务器。

当 WordPress 使用 PHP 的 mail() 函数发送邮件时,默认情况下,WordPress 不会知道邮件是否发送成功或失败。PHP 的 mail() 函数本身并不会提供详细的反馈信息,尤其是当邮件发送失败时,。

mail() 函数本身不直接支持配置 SMTP 设置

在 PHP 中,mail() 函数本身不直接支持配置 SMTP 设置,它仅仅依赖于服务器上配置的邮件传输代理(MTA)。如果你想要通过 mail() 函数发送邮件并指定 SMTP 配置,那么你需要配置你的服务器使用某个邮件传输代理(如 Postfix、Exim 或 Sendmail),然后将邮件通过 SMTP 发送出去。

但是,如果你希望在 PHP 的 mail() 函数中使用 SMTP 配置,你需要借助一些额外的工具或库。常见的方法是通过 msmtp 或 sendmail 命令来作为邮件传输代理,这样你可以在 mail() 函数中间接配置 SMTP。

方法 1:使用 msmtp 配置 SMTP
msmtp 是一个轻量级的邮件传输代理,它可以用来通过指定的 SMTP 服务器发送邮件。

步骤:
安装 msmtp:

在 Debian 上安装 msmtp:

apt update
apt install msmtp msmtp-mta

配置 msmtp:

创建或编辑配置文件 /etc/msmtprc,为 msmtp 配置 SMTP 设置:

vi /etc/msmtprc

这里是一个例子,配置 Gmail 的 SMTP:

# Example Gmail SMTP configuration
account gmail
host smtp.gmail.com
port 587
from your-email@gmail.com
auth on
user your-email@gmail.com
password your-gmail-app-password
tls on
logfile ~/.msmtp.log

account default : gmail

请注意,password 部分应该是你的 Gmail 应用专用密码,而不是你的 Gmail 登录密码。你可以在 Google 的应用专用密码页面生成一个。

将 mail() 函数指向 msmtp:

在 PHP 中,使用 mail() 函数时,它会调用服务器的 sendmail 命令。你只需要让 sendmail 指向 msmtp,这样 PHP 调用 mail() 时会通过 msmtp 配置的 SMTP 发送邮件。

确保 /usr/sbin/sendmail 是指向 msmtp 的符号链接:

ln -sf /usr/bin/msmtp /usr/sbin/sendmail

测试邮件发送:

配置完成后,你可以通过 PHP 的 mail() 函数发送邮件,它将自动通过 msmtp 使用配置的 SMTP 服务器。

例如,在你的 PHP 代码中使用 mail() 函数发送邮件:

$to = 'recipient@example.com';
$subject = 'Test email';
$message = 'Hello, this is a test email.';
$headers = 'From: your-email@gmail.com';

mail($to, $subject, $message, $headers);

如果配置正确,邮件将通过你在 msmtp 中设置的 SMTP 服务器发送。

方法 2:使用 PHP mail() 配合 sendmail 或 msmtp
如果你不想直接使用 mail() 函数发送邮件,你还可以直接调用 sendmail 或 msmtp 命令。你可以通过 PHP 的 exec() 或 shell_exec() 函数来调用这些工具。

例如,使用 msmtp:

$to = 'recipient@example.com';
$subject = 'Test email';
$message = 'Hello, this is a test email.';
$headers = "From: your-email@gmail.com\r\n";

$cmd = "echo \"$message\" | msmtp --from=your-email@gmail.com --to=$to --subject=\"$subject\"";
exec($cmd);

这种方式需要你安装并正确配置 msmtp,并且直接调用命令行来发送邮件。

多个网站使用不同的 SMTP 设置发送邮件

在一个服务器上有多个网站,并且每个网站需要使用不同的 SMTP 设置来发送邮件时,可以通过配置多个 msmtp 配置文件来为每个网站提供独立的 SMTP 设置。

通过为每个网站创建独立的 msmtp 配置文件,并在 PHP 中使用 msmtp -C 指定配置文件路径,你可以确保每个网站通过其独立的 SMTP 设置发送邮件。你还可以通过符号链接和配置 sendmail_path 来进一步简化邮件发送的流程。这种方法使得每个网站可以使用不同的 SMTP 服务器,同时保持邮件发送过程的灵活性。

具体的做法是:

为每个网站创建独立的配置文件:

你可以为每个网站创建一个专用的 msmtp 配置文件,并在 PHP 代码中使用 -C 参数来指定使用哪个配置文件。

配置 msmtp:

你需要在 /etc/msmtprc 或每个网站独立的目录下配置 msmtp 配置文件,每个网站使用自己的 SMTP 设置。

步骤 1:为每个网站创建独立的 msmtp 配置文件
假设你有多个网站,每个网站需要不同的 SMTP 设置,例如:

网站1 使用 Gmail SMTP
网站2 使用 Outlook SMTP
网站3 使用自定义 SMTP
你可以在每个网站的根目录下创建一个独立的配置文件 msmtprc,或者在统一目录下为每个网站配置不同的文件。

示例 1:为网站1配置 msmtp
在 /home/wwwroot/jiemahao.com/msmtprc 下创建一个 msmtprc 配置文件:

vi  /home/wwwroot/jiemahao.com/msmtprc

配置内容:

# 配置 Gmail SMTP 设置
account gmail
host smtp.gmail.com
port 587
from jiemahao@gmail.com
auth on
user jiemahao@gmail.com
password jiemahao.com
tls on
logfile ~/.msmtp.log

account default : gmail

示例 2:为网站2配置 msmtp
在 /home/wwwroot/site2/ 下创建一个 msmtprc 配置文件:

vi /home/wwwroot/msmtprc

配置内容:

# 配置 Outlook SMTP 设置
account outlook
host smtp-mail.outlook.com
port 587
from your-email@outlook.com
auth on
user your-email@outlook.com
password your-outlook-app-password
tls on
logfile ~/.msmtp.log

account default : outlook

步骤 2:配置 PHP 使用不同的配置文件
要让每个网站使用自己独立的 msmtp 配置文件,你需要在 mail() 函数调用时指定 msmtp 使用相应的配置文件。

例如,在 PHP 代码中,你可以使用 msmtp 命令并通过 -C 参数指定配置文件的位置:

示例:在 PHP 中调用 msmtp 使用指定配置

$to = 'recipient@example.com';
$subject = 'Test email';
$message = 'Hello, this is a test email.';
$headers = "From: your-email@gmail.com\r\n";

// 指定配置文件的路径
$config_file = '/home/wwwroot/msmtprc';  // 网站1的配置文件路径

// 使用 msmtp 发送邮件
$cmd = "echo \"$message\" | msmtp -C $config_file --from=your-email@gmail.com --to=$to --subject=\"$subject\"";
exec($cmd);

这样,网站1使用 //home/wwwroot/jiemahao.com/msmtprc 文件中的 SMTP 配置发送邮件,而其他网站可以根据需要配置各自的文件和路径。

步骤 3:配置 sendmail 使用 msmtp
如果你希望 mail() 函数调用时自动使用 msmtp 来发送邮件并根据配置文件动态选择 SMTP 服务器,你可以让每个网站的 sendmail 命令指向 msmtp。你可以在每个网站的根目录下创建符号链接或脚本来指定 msmtp 使用不同的配置。

为每个网站创建符号链接(如果需要)
在 /home/wwwroot/jiemahao.com/ 下创建 sendmail 符号链接:

ln -s /usr/bin/msmtp /home/wwwroot/jiemahao.com/sendmail

然后修改 PHP 配置,让 mail() 函数通过这个符号链接来使用特定的配置文件:

在 PHP 代码中,你需要配置 sendmail_path 来指定使用 msmtp:

ini_set('sendmail_path', 'home/wwwroot/jiemahao.com/sendmail -C home/wwwroot/jiemahao.com/msmtprc');

这样,mail() 函数就会通过 msmtp 发送邮件,且会使用每个网站的独立配置。

步骤 4:优化管理
为了便于管理,你可以考虑将每个网站的 msmtprc 文件放到一个统一的目录中,例如:

/var/www/config/msmtp/site1.msmtprc
/var/www/config/msmtp/site2.msmtprc

//然后通过 PHP 动态指定相应的配置文件路径。

$site = 'site1';  // 假设通过某种方式获取当前网站名称

// 设置 msmtp 配置文件路径
$config_file = "/var/www/config/msmtp/{$site}.msmtprc";

// 使用 msmtp 发送邮件
$cmd = "echo \"$message\" | msmtp -C $config_file --from=your-email@gmail.com --to=$to --subject=\"$subject\"";
exec($cmd);

总结下多个网站,为每个网站创建一个符号链接,将 /usr/bin/msmtp 指向每个网站目录下的 sendmail,这种方法可以让每个网站使用自己的 msmtp 配置。

具体步骤如下:

1. 创建符号链接(ln -s)
对于每个网站,你可以创建一个符号链接,将 /usr/bin/msmtp 映射到每个站点的 sendmail 路径。

例如,对于站点 site1,site2 和 site3,可以执行以下命令:

# 为 site1 创建符号链接
ln -s /usr/bin/msmtp /var/www/site1/sendmail

# 为 site2 创建符号链接
ln -s /usr/bin/msmtp /var/www/site2/sendmail

# 为 site3 创建符号链接
ln -s /usr/bin/msmtp /var/www/site3/sendmail

这样,当每个站点发送邮件时,msmtp 会被调用,而 msmtp 会根据每个站点的 msmtprc 配置文件来发送邮件。

2. 为每个站点配置 msmtprc
每个站点应该有自己独立的 msmtprc 配置文件,通常放在站点目录中。例如:

/var/www/site1/msmtprc
/var/www/site2/msmtprc
/var/www/site3/msmtprc
每个 msmtprc 文件可以包含与 SMTP 配置相关的参数,例如:

# /var/www/site1/msmtprc
account site1
host smtp.example.com
port 587
from user1@example.com
auth on
user user1@example.com
password yourpassword
tls on

account default : site1

3. 设置 sendmail_path
在 PHP 配置中,你需要指定每个网站的 sendmail_path,通过 ini_set 指令指向相应的 sendmail 链接。例如,在 functions.php 或 wp-config.php 中,针对不同的网站,设置相应的 sendmail_path:

// 对于站点1,设置 sendmail_path 指向 /var/www/site1/sendmail
ini_set('sendmail_path', '/var/www/site1/sendmail -C /var/www/site1/msmtprc');

// 对于站点2,设置 sendmail_path 指向 /var/www/site2/sendmail
ini_set('sendmail_path', '/var/www/site2/sendmail -C /var/www/site2/msmtprc');

// 对于站点3,设置 sendmail_path 指向 /var/www/site3/sendmail
ini_set('sendmail_path', '/var/www/site3/sendmail -C /var/www/site3/msmtprc');

4. 测试配置
确保每个站点的邮件发送功能正常,并且每个站点都使用了自己的 SMTP 配置文件。

总结
通过创建符号链接(ln -s)和为每个站点指定不同的 msmtprc 配置文件,你可以确保每个站点都使用不同的 SMTP 设置来发送邮件,而不需要修改全局 sendmail 配置。

原文链接:https://jiemahao.com/wordpress-mail-smtp/,转载请注明出处。
0

评论0

请先
显示验证码