phpmailer l oop дублированные адреса электронной почты (и возможное сообщение) в цикле - PullRequest
0 голосов
/ 06 января 2020

У меня есть следующий код для отправки подтверждения доставки по электронной почте моим клиентам:

while ($i < count($tracked) ) {
try {
        //Server settings
        //$mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
        $mail->isSMTP();                                            // Send using SMTP
        $mail->Host       = 'smtp.office365.com';                    // Set the SMTP server to send through
        $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
        $mail->Username   = 'support@mycompany.com';                     // SMTP username
        $mail->Password   = 'password';                               // SMTP password
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
        $mail->Port       = 587;                                    // TCP port to connect to

        //Recipients
        $mail->setFrom('support@mycompany.com', 'mycompany');
        $mail->addAddress($tracked[$i]['customers_email_address'], $tracked[$i]['customers_name']);     // Add a recipient
        $mail->addReplyTo('support@mycompany.com', 'mycompany');


        // Content
        $mail->isHTML(true);                                  // Set email format to HTML
        $mail->Subject = EMAIL_TEXT_SUBJECT;
        $mail->Body    = $html;
$mail->AltBody = 'Your order with mycompany.com has shipped';
        $mail->send();
        echo 'order confirmation sent to order#:'.$tracked[$i]['orders_id'].'<br/>';
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    }
    $i++;
}

Похоже, что он отправляет несколько писем. Я считаю, что происходит то, что в то время как l oop адрес каждого нового клиента добавляется в список без его очистки. Что, кажется, не происходит, хотя, кажется, сообщение не дублируется? Разве это не дублируется при каждом проходе в l oop?

В любом случае я думаю, что перед попыткой лучше всего сделать следующее:

$mail = new PHPMailer(true);

, чтобы с каждым проходом while l oop объект $ mail будет снова создаваться. Это правильно? Я знаю, что функция clearAllRecipients () существует, но я также хочу убедиться, что тело также очищено.

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Это потому, что addAddress() делает именно то, что предполагает его название; добавляет адрес, на который будет отправлено сообщение. Он не устанавливает адреса, на которые будет отправлено сообщение.

Неудивительно, что есть метод, который позволяет очистить список адресов, называемый clearAddresses(), поэтому просто вызовите в конце отправки l oop после send() и ваша проблема будет решена.

Я также рекомендовал бы основывать свой код на примере списка рассылки, предоставляемом с PHPMailer так как это будет намного быстрее, чем код у вас здесь. Также ознакомьтесь с документами по отправке в списки https://github.com/PHPMailer/PHPMailer/wiki/Sending-to-lists) для получения дальнейших рекомендаций.

0 голосов
/ 06 января 2020

похоже, что вы перебираете массив $ tracked. Почему бы не использовать foreach l oop? Тогда вам не нужно использовать счетчик.

    foreach ($tracked as $track ) {
try {
        //Server settings
        //$mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
        $mail->isSMTP();                                            // Send using SMTP
        $mail->Host       = 'smtp.office365.com';                    // Set the SMTP server to send through
        $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
        $mail->Username   = 'support@mycompany.com';                     // SMTP username
        $mail->Password   = 'password';                               // SMTP password
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
        $mail->Port       = 587;                                    // TCP port to connect to

        //Recipients
        $mail->setFrom('support@mycompany.com', 'mycompany');
        $mail->addAddress($track['customers_email_address'], $track['customers_name']);     // Add a recipient
        $mail->addReplyTo('support@mycompany.com', 'mycompany');


        // Content
        $mail->isHTML(true);                                  // Set email format to HTML
        $mail->Subject = EMAIL_TEXT_SUBJECT;
        $mail->Body    = $html;
$mail->AltBody = 'Your order with mycompany.com has shipped';
        $mail->send();
        echo 'order confirmation sent to order#:'.$track['orders_id'].'<br/>';
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    }
}
...