修复 PHPMailer Cron 作业电子邮件问题

PHP

了解 PHPMailer 和 Cron 作业电子邮件传送

当直接在浏览器中运行 PHPMailer 脚本时,它们可以正常运行,按预期发送电子邮件。这种即时反馈可以给人留下脚本已完全运行的印象。然而,当通过 cron 作业执行相同的脚本时,就会出现复杂性。通常,这会导致电子邮件无法发送,表明脚本的执行环境存在差异。

为了解决这些差异,必须了解脚本运行的不同环境:Web 服务器环境和命令行环境。每个都有其自己的配置和限制,这些配置和限制会影响 PHPMailer 等外部脚本的运行方式。无论执行方法如何,识别这些差异是使 PHPMailer 一致工作的关键。

命令 描述
require_once 包含并评估指定文件;这里它用于包含'init.php',它设置环境并自动加载 PHPMailer 类。
$mail->$mail->isSMTP(); 配置 PHPMailer 使用 SMTP(简单邮件传输协议)发送电子邮件,这是通过外部服务器发送所必需的。
$mail->$mail->SMTPAuth = true; 启用 SMTP 身份验证,如果 SMTP 服务器在发送电子邮件之前需要用户名和密码,则需要启用此身份验证。
$mail->$mail->setFrom(); 设置发件人电子邮件地址和发件人姓名。
$mail->$mail->addAddress(); 将收件人添加到电子邮件,您可以在其中传递电子邮件地址和收件人姓名(可选)。
$mail->$mail->addBCC(); 在电子邮件中添加 BCC(密件抄送)电子邮件地址,以便在其他收件人不知情的情况下收到邮件的副本。
$mail->$mail->isHTML(true); 告诉 PHPMailer 使用 HTML 作为电子邮件正文,从而允许在电子邮件内容中使用富文本格式和样式。

PHPMailer 与 Cron 的脚本功能和命令使用

提供的脚本旨在解决通过 cron 作业(而不是基于浏览器的环境)执行 PHPMailer 脚本时面临的常见问题。初始脚本通过包含“init.php”确保 PHP 环境设置正确,这对于建立会话管理和自动加载必要的类至关重要。此设置对于跨不同执行上下文的一致脚本行为至关重要。然后它使用 SMTP 设置配置 PHPMailer 以发送电子邮件。这些设置包括指定 SMTP 服务器、身份验证凭据、安全协议 (TLS) 和服务器端口,确保电子邮件发送过程符合服务器的要求。

在脚本中使用 PHPMailer 对象的方法(如“isSMTP()”、“addAddress()”和“send()”)是控制电子邮件传输过程的基础。 “isSMTP()”方法激活基于 SMTP 的发送,“addAddress()”将收件人添加到电子邮件,“send()”尝试将电子邮件分派到指定地址。如果发送方法失败,它会提供一个空响应,这对于调试很有用。这些方法对于利用 PHPMailer 的功能来可靠地处理电子邮件发送操作(无论是从浏览器还是 cron 作业触发)而言是不可或缺的,从而确保无论脚本的调用方法如何,都能按预期发送电子邮件。

在 Cron 作业中使用 PHPMailer 解决电子邮件传送问题

PHP 服务器端脚本

//php
require_once 'init.php';
// Ensure global variables are configured
require $_SERVER['DOCUMENT_ROOT'] . '/path/to/site_settings.php';
$msg_id = "custom_id" . time();
$mb_html = '<html>Your email content here</html>';
$mb_text = 'Your email content in plain text';
$mail = new Email();
$success_mail_sent = $mail->sendEmailWithPHPMailer(false, 5, $msg_id, $configs['my_email'], ucfirst(DOMAIN_NAME), null, null, 'test', $mb_html, $mb_text, false, 'cron_job');
if ($success_mail_sent === null) {
    echo 'Failed to send email.';
} else {
    echo 'Email successfully sent. Message ID: ' . $success_mail_sent;
}
//

增强计划任务中的电子邮件功能

Cron 的 PHP 脚本调整

//php
class Email {
    public static function sendEmailWithPHPMailer($smtp, $priority, $msg_id, $to_email, $to_name, $add_cc_email = null, $subject_emoji = null, $subject_text, $mail_body_html, $mail_body_text, $getAcopy, $origin) {
        $mail = new PHPMailer\PHPMailer\PHPMailer();
        if ($smtp) {
            $mail->isSMTP();
            $mail->Host = 'mail.domain.com';
            $mail->SMTPAuth = true;
            $mail->Username = 'username@domain.com';
            $mail->Password = 'password';
            $mail->SMTPSecure = 'tls';
            $mail->Port = 587;
            $mail->ContentType = "text/html; charset=utf-8\r\n";
        }
        $mail->Priority = $priority;
        $mail->setFrom($to_email, $to_name);
        $mail->addAddress($to_email, $to_name);
        if ($getAcopy) {
            $mail->addBCC($to_email, $to_name);
        }
        $mail->Subject = $subject_emoji . $subject_text;
        $mail->Body = $mail_body_html;
        $mail->AltBody = $mail_body_text;
        if (!$mail->send()) {
            return null;
        } else {
            return $mail->getLastMessageID();
        }
    }
}
//

使用 Cron 作业对 PHPMailer 进行高级故障排除

作为 cron 作业运行时,可能影响 PHPMailer 的一个关键方面是环境配置与从 Web 服务器运行时的差异。 Cron 作业通常有一组最小的环境变量,其中可能不包括 PHP 正确发送电子邮件所需的配置。这种差异可能会导致 PHPMailer 无法找到 SMTP 服务器或正确进行身份验证等问题。确保从 cron 运行的 PHP 脚本可以访问所有必要的环境变量,或者在脚本本身中显式设置这些变量,这一点至关重要。

为了使故障排除更加复杂,cron 作业中的错误处理不会将错误输出到浏览器,而是需要在日志文件中捕获或发送到电子邮件。因此,在 PHPMailer 实现中设置全面的日志记录可以极大地帮助识别和解决问题。实施强大的错误处理和日志记录机制可确保快速识别和纠正电子邮件发送的任何问题,从而在通过 cron 安排时保持应用程序电子邮件功能的可靠性。

  1. 为什么 PHPMailer 在浏览器中工作但不能通过 cron 工作?
  2. 发生这种情况通常是因为 Web 服务器和 cron 环境之间的环境设置不同,特别是路径和 SMTP 配置。
  3. 如何确保我的 PHPMailer cron 作业具有正确的 SMTP 设置?
  4. 直接在脚本中定义所有必需的 SMTP 参数,或确保 cron 环境可以访问包含这些设置的 PHP 配置。
  5. 当 PHPMailer 在 cron 作业中失败时,调试 PHPMailer 的最佳方法是什么?
  6. 在脚本中实施日志记录以捕获错误并查看这些日志以诊断问题。
  7. 环境变量会影响 PHPMailer 在 cron 作业中的功能吗?
  8. 是的,缺少或错误配置的环境变量可能会阻止 PHPMailer 在 cron 作业中正常运行。
  9. 如何模拟 cron 作业环境进行测试?
  10. 使用“php”命令从命令行运行 PHP 脚本,以模拟脚本在 cron 中的执行方式,包括使用 cron 作业使用的相同用户。

成功地将 PHPMailer 与 cron 作业集成需要了解 Web 服务器执行和 cron 执行之间的环境差异。通过直接在脚本中配置 SMTP 设置、确保正确设置所有环境变量并实施详细日志记录,开发人员可以最大程度地减少 PHPMailer 在 cron 作业中无法按预期运行的常见问题。这些步骤将显着提高在不同操作环境中自动发送电子邮件的可靠性。