Почтовый сервис PHP отправляет почту всем в цикле.Как этого избежать? - PullRequest
0 голосов
/ 24 апреля 2019

Для моей веб-страницы у меня есть почтовый сервис php, который позволяет мне отправлять письма через

EmailService::getService()->sendEmail($email, $first_name, $subject, $body);

Это работает нормально, если я не помещаю эту строку в цикл, например, чтобы уведомить всех перечисленных администраторов:

$sql = "SELECT * FROM admin_notifications";
$result = mysqli_query($con, $sql);
while($row = mysqli_fetch_assoc($result)){      
    EmailService::getService()->sendEmail($row['email'], $row['first_name'], $subject, $body);
}

Прямо сейчас каждый админ получает каждое письмо.Например, если есть 3 администратора, каждый администратор получает 3 разных письма.Похоже, что служба отправляет 3 письма каждому получателю.

Поскольку я не внедрял сам почтовый сервис и потому, что не до конца понимаю, я не знаю, с чего начать.ошибка.

Может быть, у кого-нибудь есть предложения?

Вот код для почтовой службы:

<?php

    /*Verschickt Emails*/
    use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles;

    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;

    class EmailService{
        /**
        * instance
        *
        * Statische Variable, um die aktuelle (einzige!) Instanz dieser Klasse zu halten
        *
        * @var Singleton
        */
       protected static $_instance = null;
       protected $mail;

       /**
        * get service
        *
        * Falls die einzige Service-Instanz noch nicht existiert, erstelle sie
        * Gebe die einzige Service-Instanz dann zurück
        *
        * @return   Singleton
        */
       public static function getService()
       {
           if (null === self::$_instance)
           {
               self::$_instance = new self;
           }
           return self::$_instance;
       }

       /**
        * clone
        *
        * Kopieren der Service-Instanz von aussen ebenfalls verbieten
        */
       protected function __clone() {}

       /**
        * constructor
        *
        * externe Instanzierung verbieten
        */
       protected function __construct() {
           //new PHPMailerAutoload();
           $this->mail = new PHPMailer();

           $configs = ConfigService::getService()->getConfigs();
           $this->mail->SMTPDebug = 3;          //Gibt starke Debugging Ausgaben aus - für Realease Deaktivieren (später auf 2)
           $this->mail->setLanguage('de');
           $this->mail->IsSendmail();
           $this->mail->Host = $configs['email_host'];
           $this->mail->Port = $configs['email_port'];
           $this->mail->SMTPSecure = "ssl";
           $this->mail->SMTPAuth = true;
           $this->mail->Username = $configs['email_username'];
           $this->mail->Password = $configs['email_password'];
           $this->mail->From       = $configs['email_username'];
           $this->mail->FromName   = "Studienführer - VWI-ESTIEM-Karlsruhe e.V.";
           $this->mail->CharSet =  'UTF-8';
           $this->mail->isHTML(true);
       }


       /**
        * sendet Email
        *
        * Sendet eine Email an den Nutzer. Gibt ein gewisses Format vor
        */
       public function sendEmail($toEmail, $userName, $subject, $body){
           $this->mail->AddAddress($toEmail, $userName);
           $this->mail->Subject = $subject;

             $this->mail->AddEmbeddedImage(__DIR__ . '/../../pictures/logo_studi.png', 'studilogo.png', 'studilogo.png');
             $this->mail->AddEmbeddedImage(__DIR__ . '/../../pictures/email/facebook.png', 'facebook.png', 'facebook.png');
             $this->mail->AddEmbeddedImage(__DIR__ . '/../../pictures/email/instagram.png', 'instagram.png', 'instagram.png');

           $htmlWithoutCSS = '
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            <html>
                <head>
                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                    <title>My Mail</title>
                    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
                </head>
                '.'
                <body>
                    <p>Hallo $userName,</p>
                    $body
                </body>
            </html>
            ';
           $cssToInlineStyles = new CssToInlineStyles();
           $this->mail->Body = $cssToInlineStyles->convert(
                $htmlWithoutCSS,
                file_get_contents(__DIR__ . '/../../res/css/emails.css')
            );
           if(!$this->mail->Send()){
               return false;
           }else{
               return true;
           }
       }
    }

?>

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Причина вашей проблемы в том, что эта строка

$this->mail->AddAddress($toEmail, $userName);

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

public function sendEmail($toEmail, $userName, $subject, $body){, по-видимому, не предназначен для многократного вызова за один экземпляр, но простое изменение решит проблему

Добавьте $mail->ClearAllRecipients(); к такому методу.

public function sendEmail($toEmail, $userName, $subject, $body){

    // remove previous recipients if being called multiple times in a loop
    $this->mail->ClearAllRecipients();  

    $this->mail->AddAddress($toEmail, $userName);
    $this->mail->Subject = $subject;

    . . .
1 голос
/ 24 апреля 2019

Вы используете один и тот же экземпляр каждый раз в цикле, и каждый раз, когда вы вызываете sendEmail(), он добавляет адреса к экземпляру.

Вы можете каждый раз создавать новый экземпляр вместо вызова getService(), и он начнется заново.

while($row = mysqli_fetch_assoc($result)){    
    $mailer = new EmailService;  
    $mailer->sendEmail($row['email'], $row['first_name'], $subject, $body);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...