首页 > 解决方案 > PHPmailer 给我一个 504 网关超时错误

问题描述

使用 phpmyadmin 向大约 1200 个用户的列表发送个人电子邮件时,我的服务器收到 504 网关超时错误

我需要将电子邮件一一发送给用户,因为我不想将列表中的任何电子邮件地址暴露给任何其他用户

当我发送到一个小列表时,它似乎工作得很好,但是当我想发送到一个大列表时,我收到了这个错误

发送一封电子邮件,重置请求并发送列表中的下一封电子邮件,因为它通过循环的最佳方式是什么?

此外,我希望在每次电子邮件发出时看到发送到 [name] 的消息

这是我的php

require('connection.inc.php');
include ("PHPMailer/class.phpmailer.php");
include ("PHPMailer/class.smtp.php");
require 'PHPMailer/PHPMailerAutoload.php';

$mail = new PHPMailer();
if (isset($_POST['submit'])) {
    error_reporting(E_STRICT | E_ALL);
    date_default_timezone_set('Etc/UTC');
    $message = $_POST['message'];
    $UeMail = uniqid();
    $UDomain = uniqid();
    $domain = '@zzz.org';
    $mail = new PHPMailer;
    $mail->isSMTP();
    $mail->SMTPDebug = 0;
    $mail->Host = 'zzz.zzz.com';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;
    $mail->SMTPAuth = true;
    $mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead
    $mail->Username = 'zzz@zzz.com';
    $mail->Password = 'zzz';
    $mail->setFrom('zzz' . $UeMail . $domain);
    $mail->addReplyTo('zzz@zzz.com');
    $mail->WordWrap = 9999; // set word wrap
    // I ADDED THIS TO BYPASS SSL ERRORS
    $mail->SMTPOptions = array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    );
    // SET ENVOIRMENT #1 (DONT FORGET TO SET #2)
    // LIVE ENVIORMENT EMAIL TO SMS
    $result = mysqli_query($con, "SELECT name, mob_email FROM `user` WHERE mob_email<>''");
    // TEST ENVIORMENT
    // $result = mysqli_query($con, "SELECT email, name FROM user_test WHERE email<>''");
    foreach($result as $row) {
        set_time_limit(60);
        $mail->Body = $message; //HTML Body
        $mail->AltBody = $message; //Text Body
        // SET ENVOIRMENT #2
        // LIVE ENVIORMENT EMAIL TO SMS
        $mail->addAddress($row['mob_email'], $row['name']);
        // TEST ENVIORMENT
        // $mail->addAddress($row['email'], $row['name']);
        if (!$mail->send()) {
            echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo . '<br />';
            break; //Abandon sending
        }
        else {
            echo "Message sent to :" . $row['name'] . ' (' . str_replace("@", "&#64;", $row['email']) . ')<br />';
            // Mark it as sent in the DB (NOT USING THIS RIGHT NOW)
            /*
            mysqli_query(
            $mysql,
            "UPDATE mailinglist SET sent = TRUE WHERE email = '" .
            mysqli_real_escape_string($mysql, $row['email']) . "'"
            );
            */
        }
        // Clear all addresses and attachments for next loop
        $mail->clearAddresses();
        $mail->clearAttachments();
    }
}

这是我的html

<!DOCTYPE html>
<html>
    <head>
        <title>Form submission</title>
    </head>
    <body>
        <form action="" method="post">
        Message:<br><textarea rows="5" name="message" cols="30" maxlength="110"></textarea><br>
        <input type="submit" name="submit" value="Submit">
        </form>
    </body>
</html>

所有代码都在一个文件中(sendEmail.php)

标签: phphtmlphpmailer

解决方案


我可以看到您的代码基于 PHPMailer 邮件列表示例(尽管看起来您可能是从旧版本开始的,所以请检查您使用的是最新版本),并且看起来基本正确。

但是,在页面加载时发送这么多消息永远不会可靠地工作。您需要从 cron 运行它,以免它受到此类超时的影响。set_time_limit(60)调用;也没有任何意义。这不会延长您达到的整体超时时间。

除非您确切地这样做,否则永远不要禁用 SSL 证书验证- 正确修复它。PHPMailer 故障排除指南提供了大量有关如何检查问题的信息。


推荐阅读