Web

Как использовать PHPMailer для массовой рассылки писем

Мне нужно отправлять ежемесячно много писем с QR-кодом png во вложении. Из-за этого я планирую изменить свой скрипт с помощью «встроенной» функции mail(), чтобы использовать класс PHPMailer.

Проблема в том, что при использовании класса PHPMailer только первый запрос к базе данных получает электронное письмо.

Если это может быть полезно, я прилагаю свой скрипт:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1" />

<title>Envio de chaves PIX por email em massa</title>

<link rel="shortcut icon" href="<?=SITE_IMAGES_PATH?>favicon.ico" />

<link rel="stylesheet" href="../styles.css">

<script type="text/javascript" src="main.js"></script>

<script type="text/javascript" src="ckeditor/ckeditor.js"></script>

<a name='topo'></a>

</head>

<body>

<?php

// Страница настройки

ob_start();

session_start();

 

require('../constants.php');

require('../functions.php');

require('../db.php');

 

use PHPMailer\PHPMailer\PHPMailer;

use PHPMailer\PHPMailer\Exception;

 

require('../mailer/src/Exception.php');

require('../mailer/src/PHPMailer.php');

require('../mailer/src/SMTP.php');

 

// Кодирование

header('Content-Type: text/html; charset=UTF-8');

@ini_set('default_charset','UTF-8');

 

// Получение разрешений

try{

    $sql = "SELECT * FROM " . CONFIG;

    $configdata = $link->prepare($sql);

    $configdata->execute();

    $data = $configdata->fetch(PDO::FETCH_ASSOC);

} catch(PDOException $error){

    die($error->getMessage());

}

if(!empty($_COOKIE['user']) && empty($_SESSION['id'])){

    $logindata = unserialize($_COOKIE['user']);

    try{

        $sql1 = "SELECT * FROM " . USERS . " WHERE user = :user AND pass = :pass";

        $sessionmngt = $link->prepare($sql1);

        $sessionmngt->bindValue(':user',$logindata['user']);

        $sessionmngt->bindValue(':pass',$logindata['pass']);

        $sessionmngt->execute();

        $userdata = $sessionmngt->fetch(PDO::FETCH_ASSOC);

    } catch(PDOException $error){

        die($error->getMessage());

    }

    $_SESSION['id']     = $userdata['id'];

    $_SESSION['user']   = $userdata['user'];

    $_SESSION['pass']   = $userdata['pass'];

    $_SESSION['level']  = $userdata['level'];

    $_SESSION['status'] = $userdata['status'];

}

$config = array(0=>'Visitante',1=>'Usuário',2=>'Moderador',3=>'Administrador',4=>'FUCKING GOD',5=>'Ninguém');

$status = array(0=>'Desativado',1=>'Ativo');

(!isset($_SESSION['level'])) ? $_SESSION['level'] = 0 : NULL;

if(isset($_SESSION['level']) ? $_SESSION['level']>=ROOT : NULL) {

    $sql = "SELECT * FROM " . EMPRESAS;

    $empresas = $link->prepare($sql);

    $empresas->execute();

    if(isset($_GET['lista']) ? $_GET['lista'] == 'enviar' : NULL) {

        while($empresa = $empresas->fetch(PDO::FETCH_ASSOC)) {

            var_dump($empresa);

            try {

                $sql = "SELECT id,valor,nome_modalidade FROM " . MODALIDADES . " 

                        INNER JOIN " . EMP_MODALIDADES . " ON " . MODALIDADES . ".mid = " . EMP_MODALIDADES . ".mid

                        WHERE eid=:eid";

                $consulta_modalidades = $link->prepare($sql);

                $consulta_modalidades->bindValue(':eid',$empresa['id']);

                $consulta_modalidades->execute();

            } catch(PDOException $error) {

                die($error->getMessage());

            }

            $chave_pix          ="04729502000109";

            $beneficiario_pix   ="FUNDEPI";

            $cidade_pix         ="PRES PRUDENTE";

            $identificador      ="***";

            $descricao          ="";

            $gerar_qrcode=true;

            while($modalidade = $consulta_modalidades->fetch(PDO::FETCH_ASSOC)) {

                $chave_pix="04729502000109";

                $beneficiario_pix="FUNDEPI";

                $cidade_pix="PRES PRUDENTE";

                $identificador="***";

                $descricao="";

                $gerar_qrcode=true;

                $valor_pix=preg_replace("/[^0-9.]/","",$modalidade['valor']);

                if ($gerar_qrcode) {

                    include "phpqrcode/qrlib.php"; 

                    include "funcoes_pix.php";

                    $px[00]="01"; 

                    $px[26][00]="BR.GOV.BCB.PIX";

                    $px[26][01]=$chave_pix;

                    if (!empty($descricao)) {

                        $tam_max_descr=99-(4+4+4+14+strlen($chave_pix));

                        if (strlen($descricao) > $tam_max_descr) {

                            $descricao=substr($descricao,0,$tam_max_descr);

                        }

                        $px[26][02]=$descricao;

                    }

                    $px[52]="0000";

                    $px[53]="986";

                    $px[54]=$valor_pix;

                    $px[58]="BR";

                    $px[59]=$beneficiario_pix;

                    $px[60]=$cidade_pix;

                    $px[62][05]=$identificador;

                    $px[62][50][00]="BR.GOV.BCB.BRCODE";

                    $px[62][50][01]="1.0.0";

                    $pix=montaPix($px);

                    $pix.="6304";

                    $pix.=crcChecksum($pix);

                    $linhas=round(strlen($pix)/40)+1;

?>

Modalidade: <?=$modalidade['nome_modalidade']?><br />

Valor: R$ <?=$valor_pix?>,00<p>

<img src="logo_pix.png"><br>

<?php

     ob_start();

     QRCode::png($pix, null,'M',5);

     $imageString = base64_encode(ob_get_contents());

     ob_end_clean();

}

    $valor_pix      = preg_replace("/[^0-9.]/","",$modalidade['valor']);

    $uid            = md5(uniqid(time()));

    $remetente      = "financeiro@inovaprudente.com.br";

    $nome_remetente = "Финансовый отдел - Фонд Инова Пруденте";

    $headers        = "From: " . $nome_remetente . " <" . $remetente . ">\r\n";

    $headers        .= "Reply-To: " . $remetente . "\r\n";

    $headers        .= "MIME-Version: 1.0\r\n";

    $headers        .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";

    $destinatario   = "financeiro@inovaprudente.com.br"; //$empresa['email'];

    $assunto        = "Ключ PIX для " . $empresa['nome'];

    $corpo          = "<!DOCTYPE html>

    <html>

    <meta charset=\"utf-8\" />

    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">

    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />" .

      "Приветствую вас, " . $empresa['nome'] . "!<br /><br />

Вот данные PIX для расчета ежемесячной платы.<br /><br />

Соответствующий QRC-код прилагается к этому письму, но вы также можете использовать сканируемую строку для оплаты, если у вас нет с собой мобильного телефона ;)<br /><br /><b>Модальность:</b> " . $modalidade['nome_modalidade'] . "

<br /><b>Ценность:</b> R$ " . $modalidade['valor'] . ",00<br />

<b>Вводимая строка:</b> <font face='Courier New'>" . $pix . "</font>

<br /><br />Мы проводим тесты с биллинговой системой PIX. Мы отправляем это сообщение, содержащее QR-код (и соответствующий ему ключ), чтобы мы могли подтвердить его получение. НЕ ОПЛАЧИВАТЬ! Мы будем признательны, если вместо этого вы оставите отзыв, сообщив нам, что: 1) попало ли письмо в ваш ящик СПАМа и 2) смогло ли приложение вашего банка отсканировать QR-код.<br /><br />Спасибо за внимание.<br /><br /> Ваш,<br />Фернандо</html>";

                $email = new PHPMailer();

                $email->Encoding = 'base64';

                $email->CharSet = 'UTF-8';

                $email->SetFrom($remetente, $nome_remetente);

                $email->Subject = $assunto;

                $email->isHTML(true);

                $email->Body    = $corpo;

                $email->AddAddress($destinatario);

                $file_to_attach = '../mailer/tmp/';

                $filename = 'Chave PIX.png';

                $email->addStringAttachment(base64_decode($imageString), $filename);

                return $email->Send();

                if(!$mail->Send()) {

                    echo "Erro no envio do email: " . $mail->ErrorInfo;

                } else {

                    echo "Deu bom!";

                }

                $email->ClearAllRecipients();            }

        }

    }

?>

    <div class='divtab' id='whitebody'>

        <table id='yellowborder' align="center">

            <tr>

                <td class='title'>Nome</td>

                <td class='title'>Chaves PIX</td>

                <td class='title'>Email</td>

                <td class='title'>Celular</td>

            </tr>

            <?php

            while($empresa = $empresas->fetch(PDO::FETCH_ASSOC)) {

                $sql = "SELECT * FROM " . EMP_MODALIDADES . " WHERE eid=:eid";

                $modalidades = $link->prepare($sql);

                $modalidades->bindParam(':eid',$empresa['id']);

                $modalidades-> execute();

           ?>

                <tr class='trhover'>

                    <td class='cell'><b><a href="<?="../empresas.php?modo=visualizar&id=" . $empresa['id']?>" title='Clique para ver detalhes'><?=$empresa['nome']?></a></b></td>

                    <td align='center'>

                        <?php

                            while($modalidade = $modalidades>fetch(PDO::FETCH_ASSOC)) {

?>

<a target='_blank' onclick="window.open('./qrcode_empresas.php?id=<?=$empresa['id']?>&mid=<?=$modalidade['mid']?>', '_blank','menubar=no,resizable=no, scrollbars=no, status=no, titlebar=no, toolbar=no, width=600, height=600')"><img class='imgbutton' src='.<?=SITE_IMAGES_PATH?>qrcode.png' alt='Будет сгенерирован временный ключ на сумму ежемесячной платы ' title='Временный ключ будет сгенерирован на сумму ежемесячной платы ' style='margin-left: 7px; width:25px; '></a><?php

}?>

</td>

                    <td class='cell'><?=$empresa['email']?></td>

                    <td class='cell'><?=$empresa['celular']?></td>

                </tr>

            <?php } ?>

        </table>

    </div>

    <?php } else { die(FORBIDDEN_ERROR); } ?>

<br />

</html>

</body>

 

Ответ 1

Взгляните на пример списка рассылки, предоставленный с PHPMailer - вы, вероятно, могли бы повысить эффективность того, что делали до сих пор. Я также рекомендовал бы сделать ваш сценарий менее монолитным. Выполнить декомпозицию кода - разбить его на небольшие части, и вам станет легче работать.

Я думаю, ваша непосредственная проблема заключается в следующем:

return $email->Send();

Здесь будет отправлено первое электронное письмо, а затем скрипт будет завершен! Просто удалите return (и, возможно, добавьте обработку ошибок в соответствии с примером).

Схожие статьи

Web

Несоответствие токена csrf laravel для запроса POST ajax

Контейнеры Flex: центрирование по вертикали и растягивание размеров
Web

Контейнеры Flex: центрирование по вертикали и растягивание размеров

Web

Как сделать так, чтобы все значения PHP echo попадали в таблицу HTML

Web

Как делать асинхронные HTTP-запросы в PHP

×