Отправка писем с разделами 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".