Мне нужно отправлять ежемесячно много писем с 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