Отправка писем с разделами phpmailer

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

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

У меня есть Cron, который выполняет PHP-файл в определенное время

Например, каждый понедельник в 8:00

* 8 ** 1 php-f / $ filepath ()

Этот php-файл отправляет тысячи писем, но вместо того, чтобы отправлять все непрерывно с 8 утра, я хочу отправлять 30 писем в минуту с 8:00, например

То есть:

08:00 -> 0-30 писем

08:01 -> 30-60 писем

08:02 -> 60-90 писем... и т. Д.

Поскольку запуск cron запускается один раз в 8 утра, я подумал об использовании функции php sleep для приостановки между минутами, но не соблюдая команду, система не работает и блокируется. В моем опыте с C функция сна всегда работает правильно.

Я установил доставку для отправки 30 писем, когда и выход из цикла со счетчиком

 ***** php-f /$filepath ()

и так заставляйте систему запускать файл каждую минуту.

Мой код

    $res = $admin->array_mixed(); //Array with all mails address

    $send_per_min=30;
    $send = 0;

    foreach ($res as $r){
    $mails->AddAddress("$r['invitacion_email']");
    .
    .
    .
    $mails = new PHPMailer(true);
$mails->Mailer = "smtp";
    .
    .
    .
    if($mails->Send()){                                      
    $send++;
    $log_OK .= $mail." Send!!! \n";
    }else{                              
    $log_KO .= $mail." Failed!!! \n";
    }


    if ($send == $send_per_min){//With this line I checked that after making 30 shipments out of the loop until the next minute the cron rerun
    //I want to replace it with a sleep that once sent 30 mails, wait until the next minute. In this way, you could set the cron at a specific time
    break;
    }

    }//End for

Надеюсь, вы были более понятны, чем в предыдущем посте ( https://stackru.com/questions/15393432/sending-emails-with-phpmailer-partitioned).

Приветствую сообщество.

Pd-извините за мой плохой английский

1 ответ

Вы можете звонить php каждые 30 минут в cron, не используя sleep. При желании можете передать как параметр PHP количество отправляемых писем. PHP выполняется и отправляет все письма (только 30 или количество, настроенное в базе данных). После того, как из cron выполняется новый вызов, вы отправляете больше писем (только 30 или количество, настроенное в базе данных) и повторяете это снова, пока у вас есть почта для отправки. Для этого вы можете записать в базу данных или в файл последнее отправленное электронное письмо (используя идентификатор или другой элемент управления). Для продолжения отправки электронной почты, но не повторной отправки электронной почты повторяется. Настройки отправленных и логов можно записать в SQLite, XML, текстовом, MySQL или другом.

у вас есть только $res с 30 письмами, не отправленными.

Единственный пример:

SELECT 
    * 
FROM 
    `my_mail` m
WHERE 
    m.`isSent` = 'notsend'
LIMIT 30;

$res получает возврат SQL или вы можете отформатировать его ранее, и каждое отправленное письмо без ошибок

$log_OK .= $mail." Send!!! \n";

Запишите в базу данных информацию, отправленную с успехом.

Единственный пример:

UPDATE
    `my_mail`
SET
    `isSent` = 'send'
WHERE 
    id = '$id';

Другое решение ниже:

Я создаю класс с одним возможным решением вашей проблемы: метод getMail - это ваша функция getMail, замените эту функцию, метод sentMail - ваша функция для отправки почты PHPMailer, метод sentScheduleMail - это движок из отправлять каждую минуту, но если отправка почты медленнее 60 секунд, функция будет отправлять почту только в следующую первую минуту.

<?php

class SentMailByPart {

    /**
     * SQL to recovery the quantity of mails specified
     * @param int $quantity
     */
    private function getMail($quantity) {
        return array(array("test1"), array("test2"));
    }

    /**
     * Function main to send mail
     */
    public function sentScheduleMail() {
        /**
         * While system is running
         */
        while (1) {
            /**
             * Time in unixtime
             */
            $res = $this->getMail(30);
            foreach ($res as $r) {
                // $this->sentMail($r);
                $this->sentMail($r);
            }
            unset($res, $r);
            $time = mktime();
            sleep($time % 60);
        }
    }

    /**
     * Settings of mail, subject and message (Your function to sent e-mail)
     * @param stdClass $settings
     */
    private function sentMail($r) {
        /**
         * New instance of PHP
         */
        $mails = new PHPMailer(true);
        /**
         * Mail address
         */
        $address = $r['invitacion_email'];
        /**
         * Sent by smtp
         */
        $mails->Mailer = "smtp";
        /**
         * Mail of destination
         */
        $mails->AddAddress($address);

        /**
         * Check mail is sent
         */
        if ($mails->Send()) {
            return true;
        } else {
            /**
             * Write error in error log
             */
            error_log(fprintf("Mail (%s) is not send. Erro: %s"
                            , $address
                            , $mails->ErrorInfo), 0);
            return false;
        }
    }

}

$sent = new SentMailByPart();
$sent->sentScheduleMail();

/**
 * if wish stop the send of mail alter $isRunning = 0, is run
 */
?>

Извините, если мой английский очень плохой, мои идиомы "pt-br".

Другие вопросы по тегам