WordPress邮件通知发送的SMTP发信代码,无需插件

开启WordPress的SMTP发送通知邮件的功能,可以是插件,也可以使用代码,本着少用插件,提高网站性能,这里使用代码。

最简单的在你可以在 functions.php里末尾添加代码如下代码增加SMTP功能:

// 使用 SMTP 发送邮件的配置
add_action('phpmailer_init', 'mail_smtp');
function mail_smtp($phpmailer) {
    // 配置 SMTP 邮件发送的相关设置
    $phpmailer->FromName = 'jiemaho'; // 发件人显示名称
    $phpmailer->Host = 'smtp.gmail.com'; // 设置 SMTP 服务器
    $phpmailer->Port = 587; // 设置端口
    $phpmailer->Username = 'jiemahao@gmail.com'; // SMTP 用户名
    $phpmailer->Password = 'jiemahao.com'; // SMTP 密码(授权码)
    $phpmailer->From = 'jiemahao@gmail.com'; // 发件人邮箱
    $phpmailer->SMTPAuth = true; // 开启 SMTP 验证
    $phpmailer->SMTPSecure = 'tls'; // 加密协议(tls 或 ssl)
    $phpmailer->IsSMTP(); // 设置使用 SMTP
}

在 WooCommerce 中,当客户完成订单并触发 payment_complete 时,确实会自动通过 phpmailer_init 发邮件。这段代码配置了 SMTP 服务器,以确保通过指定的邮箱账户发送邮件。通常这种邮件发送不会显著影响 WordPress 运行速度,但仍有几个因素需要考虑:

1. SMTP 邮件发送可能引入的延迟

影响:SMTP 服务器(特别是外部的,如 smtp.mail.ru)的响应时间可能会影响邮件的发送速度。如果邮件服务器的响应慢或发生延迟,可能会导致 WooCommerce 在客户支付完成后稍微延迟确认订单处理。

优化:

使用异步邮件发送:你可以考虑使用异步处理邮件发送,以避免邮件发送过程阻塞主线程。可以通过将邮件发送代码放到后台任务中处理,而不是直接同步发送。

2. 邮件发送的服务器配置

影响:如果邮件服务器配置不正确,或者存在与邮件服务器的连接问题,可能会导致邮件发送失败,或者 WooCommerce 在尝试发送邮件时出现延迟。

优化:
确保你配置的 SMTP 服务器稳定且响应快速。
可以使用邮件服务提供商(如 Mailgun, SendGrid, Amazon SES 等)来替代传统的 SMTP 服务器,这些服务通常提供更高的发送可靠性和更好的性能。
如果你选择 smtp.mail.ru,可以测试该服务的发送速度,并且考虑切换到更适合高频邮件发送的服务。

3. WooCommerce 和 PHP 邮件发送的瓶颈

影响:在订单处理过程中,WooCommerce 会使用 wp_mail 函数发送邮件。虽然默认的 wp_mail 是异步执行的,但邮件发送仍然会消耗服务器资源,尤其是当订单量很大时,可能会影响网站的响应时间。

优化:
使用邮件队列插件:可以安装邮件队列插件,如 WP Mail Queue,它将邮件发送任务放入队列中,并逐步发送,从而减轻服务器负担。
优化邮件内容:确保邮件内容简单明了,不包含复杂的附件或大量图片,以减少邮件发送的负担。

4. 邮件发送的安全性和稳定性

影响:如果 SMTP 配置中的账户信息泄露(例如邮箱密码),可能会导致安全问题或邮件发送失败。确保使用的是专门的 SMTP 授权码,而不是普通的登录密码。

优化:
使用邮件服务提供商的 API 进行邮件发送(例如 SendGrid, Mailgun 等),这些服务提供更好的安全性和更高的可靠性。
如果仍然使用传统 SMTP,确保密码和配置是加密的,并且不要在源代码中硬编码敏感信息。

5. 邮件发送和缓存机制

影响:如果你使用缓存插件(如 W3 Total Cache 或 WP Super Cache),可能会缓存某些页面,导致 WooCommerce 处理订单时的响应延迟,影响客户的体验。

优化:
确保订单相关的页面(如结账、订单确认)不被缓存。你可以在缓存插件中设置规则,确保这些页面不被缓存。

快速响应改进代码

如果希望用户触发邮件时,立即返回响应,并且邮件立刻发送,只是不会等待邮件发送的完成。

为了实现这一点,我们可以使用 WordPress 的异步 wp_mail() 发送邮件,而不使用计划任务。具体来说,可以将邮件发送操作放入一个 wp_remote_post 请求或后台的 wp_mail 触发的回调中,立即返回响应,不等待邮件发送完成。

// 使用 SMTP 发送邮件的配置
add_action('phpmailer_init', 'mail_smtp');
function mail_smtp($phpmailer) {
    // 配置 SMTP 邮件发送的相关设置
    $phpmailer->FromName = 'jiemaho'; // 发件人显示名称
    $phpmailer->Host = 'smtp.gmail.com'; // 设置 SMTP 服务器
    $phpmailer->Port = 587; // 设置端口
    $phpmailer->Username = 'jiemahao@gmail.com'; // SMTP 用户名
    $phpmailer->Password = 'jiemahao.com'; // SMTP 密码(授权码)
    $phpmailer->From = 'jiemahao@gmail.com'; // 发件人邮箱
    $phpmailer->SMTPAuth = true; // 开启 SMTP 验证
    $phpmailer->SMTPSecure = 'tls'; // 加密协议(tls 或 ssl)
    $phpmailer->IsSMTP(); // 设置使用 SMTP
}

// 延迟邮件发送,不阻塞
add_action('phpmailer_init', function ($phpmailer) {
    // 获取当前邮件的相关信息
    $to = $phpmailer->getToAddresses();   // 收件人
    $subject = $phpmailer->Subject;       // 主题
    $message = $phpmailer->Body;          // 邮件内容
    $headers = $phpmailer->getCustomHeaders(); // 邮件头部信息

    // 立即返回响应给用户,解除阻塞
    remove_action('phpmailer_init', 'mail_smtp'); // 避免重复触发

    // 使用 wp_remote_post 异步发送邮件
    wp_remote_post(admin_url('admin-ajax.php'), array(
        'method'    => 'POST',
        'body'      => array(
            'action'    => 'send_immediate_email',
            'to'        => $to,
            'subject'   => $subject,
            'message'   => $message,
            'headers'   => $headers,
        ),
        'blocking'  => false, // 非阻塞模式,立即返回响应
    ));
});

// 后台异步邮件发送
add_action('wp_ajax_send_immediate_email', function () {
    // 获取传递的数据
    $to = $_POST['to'];
    $subject = $_POST['subject'];
    $message = $_POST['message'];
    $headers = $_POST['headers'];

    // 发送邮件
    wp_mail($to, $subject, $message, $headers);

    // 结束
    wp_die(); 
});

说明:
phpmailer_init 配置邮件:仍然使用 phpmailer_init 钩子配置邮件的 SMTP 设置。

立即返回响应:邮件会通过 wp_remote_post 异步请求发送。使用 blocking => false 参数确保请求不会阻塞用户的响应,而是立即返回。

后台异步发送邮件:通过 wp_remote_post 将邮件内容传递到 admin-ajax.php,然后通过 wp_mail 在后台异步发送邮件。这样,用户可以立刻收到响应,而邮件会在后台发送。

流程:

  1. 用户触发邮件时,邮件配置完成,但不会立即发送。
  2. 立即返回响应:wp_remote_post 会异步触发邮件发送,WordPress 页面不会等待邮件发送完成,
  3. 用户会立刻收到响应。
  4. 后台异步发送邮件:通过 wp_ajax_send_immediate_email 处理后台邮件发送。

优势:

  1. 立即响应:邮件发送不会阻塞前端响应,用户能在触发邮件后迅速得到反馈。
  2. 邮件立即发送:虽然是异步执行,但邮件在后台会立刻发送。
  3. 无额外延时:邮件发送与用户的操作分离,前端用户体验更流畅。
  4. 这样,你就可以实现用户触发邮件时,立即返回响应,而邮件会在后台继续发送的功能。
原文链接:https://jiemahao.com/wordpress-smtp-code/,转载请注明出处。
0

评论0

请先
显示验证码