PHPmailer дает мне ошибку тайм-аута 504 шлюза - PullRequest
0 голосов
/ 17 марта 2019

Я получаю ошибку тайм-аута шлюза 504 с моего сервера при использовании phpmyadmin для отправки индивидуальных писем в список из примерно 1200 пользователей

мне нужно, чтобы письма отправлялись пользователям по одному, поскольку яне хочу показывать какие-либо адреса электронной почты в списке другим пользователям

, кажется, что это хорошо работает, когда я отправляю в небольшой список, но когда я хочу отправить в большой список, я получаюэта ошибка

Каков наилучший способ отправить одно электронное письмо, сбросить запрос и отправить следующее электронное письмо в списке во время прохождения цикла?

Также я хотел бычтобы увидеть сообщение, отправленное [имя] каждый раз, когда электронное письмо выходит

вот мой 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)

1 Ответ

1 голос
/ 18 марта 2019

Я вижу, что вы основали свой код на примере списка рассылки PHPMailer (хотя похоже, что вы, возможно, начали со старой версии, поэтому проверьте, что вы используете последнюю версию), и он выглядит в основном правильно.

Однако отправка такого количества сообщений при загрузке страницы никогда не будет работать надежно. Вам нужно запустить это из cron, чтобы он не подвергался таким тайм-аутам. Там также нет смысла в вызове set_time_limit(60); это не продлит общий тайм-аут, на который вы попали.

Также никогда отключите проверку сертификата SSL, если вы не точно почему вы это делаете - исправьте это правильно. Руководство по устранению неполадок PHPMailer содержит много информации о том, как проверить, что не так.

...