如果不在WordPress的functions.php里添加代码 add_action(‘phpmailer_init’, ‘mail_smtp’) 来配置 SMTP 邮件设置,WordPress 会默认使用 PHP 的 mail() 函数来发送邮件。
如果你在多个 WordPress 网站上使用 Gmail 发送邮件,并且对速度有要求,建议使用 邮件传输代理(MTA)结合 mail() 函数,这样可以减少网络连接和身份验证的开销,提高邮件发送的速度。
直接通过 Gmail SMTP 发送邮件虽然简单,但每次都需要重新建立连接和进行身份验证,速度较慢。
理论上 mail() 函数比通过 SMTP 发送邮件更快速,因为它直接使用服务器的邮件传输代理(MTA)发送邮件,不需要通过额外的外部 SMTP 服务器进行中转。
WordPress 中使用 Gmail SMTP 发送邮件,与 mail() 函数结合邮件传输代理(如 Postfix)配置 Gmail 发邮件,哪个更快?
即使服务器使用邮件传输代理(如 Postfix、Exim 或 Sendmail),然后将邮件通过 SMTP 发送出去,发信速度也比直接在wordpress使用SMTP快。
当你通过 mail() 函数发送邮件时,邮件直接通过本地的邮件传输代理(MTA)发送。MTA(如 Postfix、Sendmail 或 Exim)通常已在本地服务器上配置,并且不会进行网络通信,它通过本地的邮件队列处理邮件的投递。此过程通常是即时的,不会有额外的延迟。
使用 Gmail SMTP(通过 PHP 的 wp_mail())流程:邮件通过 WordPress 的 wp_mail() 函数发送时,首先需要连接到 Gmail 的 SMTP 服务器(例如 smtp.gmail.com),然后进行身份验证、加密连接等步骤,最后将邮件发送到 Gmail 的邮件队列。
网络延迟:每次邮件发送都需要通过外部网络连接 Gmail SMTP 服务器。这会涉及到与外部服务器的 TCP/IP 连接、TLS/SSL 加密过程、身份验证等。
通过 PHP 的 mail() 函数发送邮件时,如果你配置了一个本地邮件传输代理(例如 Postfix 或 msmtp),该代理会将邮件通过本地 MTA 发送到 Gmail SMTP 服务器。
Postfix/Exim/msmtp 会在本地将邮件交给 Gmail SMTP 服务器进行处理和投递。使用 msmtp 等邮件代理工具时,它会直接连接到 Gmail 的 SMTP 服务器,但它通常会在 本地服务器内进行邮件投递的连接管理,有时会通过缓存机制等方式提高效率。
一旦配置了 MTA,并通过正确的配置(如 msmtp)直接连接 Gmail SMTP,它可以减少某些过程的延迟,比如身份验证的缓存和网络连接复用等。
默认的邮件发送机制,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。
服务器搭建邮件传输代理MTA配置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
测试邮件发送:
首先可以在服务器命令行测试下
echo -e "Subject: Test Email\nTo: jiemahao.com@qq.com\nFrom: jiemahao.com@gmail.com\n\nTest email body" | msmtp --from=jiemahao.com@gmail.com jiemahao.com@qq.com
然后你还可以通过 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 服务器发送。
因为sendmail_path 是 “/usr/sbin/sendmail -t -i” 且标记为 INI_SYSTEM,说明这是系统级的设置,意味着 PHP 配置文件(php.ini)中的这个值是由系统管理员或者安装过程中的默认设置指定的,而不是你通过 ini_set 函数在脚本中进行修改的。
方法 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,并且直接调用命令行来发送邮件。
最后,为了成功发出邮箱,不进垃圾箱,还要 测试下邮件得分, https://www.mail-tester.com/