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

Лучшие бесплатные платформы для создания сайтов без особых навыков

Web

Как определить функцию PHP при нажатии кнопки на форме

Web

Перечисления в PHP

Валидный e-mail: что это, проверка почты на валидность через валидатор
Web

Валидный e-mail: что это, проверка почты на валидность через валидатор

×