使用 PHPMailer 实现 PHP 邮件群发功能详解

青禾
青禾
发布时间:2026-10-14 | 6人浏览过
原创

本文将详细解析如何使用 PHP 结合 PHPMailer 库实现高效的邮件群发功能。内容涵盖 SMTP 服务器配置、HTML 邮件模板构建、通过读取外部文件获取收件人列表,以及利用 URL 参数实现分批发送以规避服务器超时限制的具体代码与逻辑。

环境准备与类库引入

实现邮件群发的基础是依赖成熟的邮件发送类库。PHP 原生函数在处理 SMTP 认证时较为繁琐,因此推荐使用 PHPMailer。使用前需确保本地环境已下载该类库文件(通常包含 class.phpmailer.php 及其相关依赖)。

<?php
// 引入 PHPMailer 类文件
require_once("class.phpmailer.php");
?>

SMTP 服务器配置策略

配置 SMTP 是实现邮件投递的关键。以下配置以 163 邮箱为例,展示了如何建立安全连接并进行身份验证。

$mail = new PHPMailer();
$mail->IsSMTP();                                      // 启用 SMTP
$mail->Host = "smtp.163.com";                        // 指定 SMTP 服务器
$mail->SMTPAuth = true;                              // 开启身份验证
$mail->Username = "your_username";                      // SMTP 登录账号
$mail->Password = "your_password";                      // SMTP 登录密码(注意:部分服务商需使用授权码而非登录密码)

此外,还需设置发件人显示名称及字符集,以确保邮件在客户端正常渲染:

$mail->From = "sender@example.com";                    // 发件人邮箱地址
$mail->FromName = "网站管理员";                        // 发件人昵称
$mail->CharSet = "UTF-8";                              // 推荐 UTF-8 编码
$mail->Encoding = "base64";

构建邮件内容与接收者列表

现代邮件通常支持 HTML 格式。可以通过字符串变量定义邮件正文,并使用 AddAddress 方法动态添加收件人。

第1步:定义 HTML 邮件模板

创建包含样式和内容的 HTML 字符串,确保兼容主流邮件客户端。

$mail->IsHTML(true);                                // 设置为 HTML 格式
$mail->Subject = '周刊第十二期';
$mail->Body = <<<EOT
<html>
<head>
<style type="text/css">
body { font-family: Arial, sans-serif; color: #333; }
.header { background-color: #f0f0f0; padding: 10px; }
</style>
</head>
<body>
<div class="header">欢迎来到我们的周刊</div>
<p>这是本期的重要内容更新...</p>
</body>
</html>

第2步:读取收件人数据源

对于小规模测试,可读取文本文件;生产环境中建议对接数据库。此处演示读取纯文本邮箱列表的方法。

$filename = "email_list.txt";
$fp = fopen($filename, "r");
$contents = fread($fp, filesize($filename));

注意:文本文件中每行应仅包含一个有效的邮箱地址。若需从 QQ 号码生成邮箱,可在读取后追加 @qq.com 后缀。

分批发送逻辑与防超时机制

直接循环发送大量邮件容易导致 PHP 执行超时或触发防火墙限制。通过 URL 参数控制当前发送索引,可实现断点续传式的分批发送。

第3步:初始化发送状态

通过 $_GET['action'] 获取上次发送的索引位置,若未传入则默认为 0。

// 获取当前发送索引,默认从第一封开始
$current_index = isset($_GET['action']) ? intval($_GET['action']) : 0;

第4步:执行单封邮件发送

检查索引是否超出总数量,若未超出,则提取邮箱地址,调用发送函数,并将结果写入日志。

if ($current_index < $count_total) {
  $target_email = trim($list_emails[$current_index]);
  if (empty($target_email)) {
    echo "跳过空行";
    redirect_page($url = "?action=" . $current_index);
    exit;
  }

  $mail->ClearAddresses(); // 清除之前的收件人
  $mail->AddAddress($target_email, "User");
  
  if ($mail->Send()) {
    log_result("success", $target_email, "发送成功");
    echo "正在发送第 {$current_index} 封至 {$target_email}";
  } else {
    log_result("fail", $target_email, $mail->ErrorInfo);
    echo "发送失败: {$mail->ErrorInfo}";
  }

   // 跳转至下一封
   redirect_page("?action=" . ($current_index + 1));
} else {
   echo "所有邮件已发送完毕!";
}

第5步:自动重定向脚本

为避免页面长时间加载,使用 JavaScript 进行定时跳转,模拟后台异步执行的效果。

function redirect_page($url) {
  echo "<script>
    setTimeout(function() { window.location.replace('$url'); }, 1000);
</script>";
  exit; // 终止当前脚本输出,防止重复处理
}

第6步:日志记录辅助函数

将发送结果追加写入文本文件,便于后续审计。

function log_result($type, $email, $message) {
  $log_entry = date('Y-m-d H:i:s') . " [$type] $email: $message\r\n";
  file_put_contents('send_log.txt', $log_entry, FILE_APPEND);
}

运行方式与注意事项

将上述逻辑整合到一个 PHP 文件中,部署到 Web 服务器。通过浏览器访问该文件,如 http://example.com/send_mail.php,即可开始第一批发送。每次刷新或等待脚本跳转,都会处理下一封邮件。

风险提示:

  1. 凭证安全:代码示例中的用户名和密码仅为占位符,实际使用时请勿硬编码,建议使用环境变量或配置文件管理,并避免上传至公共仓库。
  2. 速率限制:频繁向同一 SMTP 服务器发送邮件可能触发反垃圾邮件机制。建议在发送间隔中加入 sleep() 函数,或使用队列系统处理大规模发送。
  3. 字符编码:务必统一 HTML 头部声明、PHP 文件编码及数据库编码均为 UTF-8,以防中文乱码。

简要总结

通过集成 PHPMailer 并结合简单的索引跳转逻辑,我们可以构建一个稳定且易于理解的邮件群发工具。这种方法虽然简单,但在小流量场景下非常有效,同时也为理解异步处理和日志记录提供了基础范式。以上就是基于 PHPMailer 实现邮件群发的详细内容,更多关于 PHP 开发实践的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表