Я написал простой PHP-скрипт (codeigniter) для отправки новостной рассылки с помощью Amazon SES. У меня есть ~ 8000 электронных писем в таблице MySQL и сценарии, которые извлекают все строки (адреса электронной почты), разбивают их на более мелкие пакеты (из-за ограничений SES) и отправляют электронную почту через SMTP. Я использую sleep()*
и cronjob, который запускается каждую минуту. Я знаю, что это не лучшее решение, но как концепция оно прекрасно работает.
Чтобы разрешить отправку писем с bcc
, я должен убедиться, что в поле to
есть хотя бы один получатель, иначе Amazon SES не отправит его. Итак, мой адрес ([email protected]
) всегда находится в to
, а остальные адреса — в bcc
. Каждая итерация помещает 8 разных адресов в bcc
(кстати, есть ли лучшее решение для этого?). У меня также есть простой файл журнала, в который записываются все адреса, используемые моим приложением.
Как я вижу, некоторые получатели не получают рассылку. Amazon SES возвращает возвращенные электронные письма, и это работает нормально, но некоторые адреса вообще не получают его, и Amazon SES не получает никакой обратной связи. Эти адреса есть в моем логе, значит они обрабатываются PHP-скриптом. Затем я просто удаляю этот адрес и снова вставляю в таблицу MySQL, и все работает! Часть писем парсится из файла CSV, часть вставляется вручную. Я действительно не знаю и не могу проверить всех получателей, получили ли они информационный бюллетень. У вас есть идеи, что могло вызвать это странное поведение?
Я не могу понять, в чем проблема.
Я использую CodeIgniter и PHPMailer.
public function cronSendMail(){
$newsletter = $this->baumodel->getNewsletter();
if(is_array($newsletter)){
echo "No job for me!";
return;
}elseif(is_object($newsletter)){ //means there is a newsletter ready for sending
$limit = 104;
$newsOfset = $newsletter->news_slanje_ofset;
$noviOfset = $newsOfset+$limit;
$adrese = $this->baumodel->getAdresar($limit, $newsOfset);
$brojAdresa = count($this->baumodel->getSveAdrese()); //number of recipients in whole MySQL table
if($brojAdresa < $newsOfset){
echo "Adrese: ".$brojAdresa;
echo " Ofset: " .$newsOfset;
die('Job is finished! ');
}
$this->baumodel->setNewsletterOfset($newsletter->news_id, $noviOfset);
$emailArray = array();
foreach($adrese as $adr){
array_push($emailArray, trim($adr['adr_email']));
}
$newsletterContent = $newsletter->news_sadrzaj;
$this->load->library('email');
$this->email->clear();
$maliNiz = array();
for($i=0; $i<13; $i++){
//13 times with 2 seconds sleep is ~30-35 seconds of execution time.
//CronJob runs every minute
$j=0;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$maliNiz[$j] = array_pop($emailArray);
$j++;
$this->email->to('[email protected]');
$this->email->bcc($maliNiz); //This is my BCC array of 8 addresses
$this->email->from('[email protected]', 'Baulink Portal');
$this->email->subject('Gradjevinski portal Baulink - Novo na portalu');
$this->email->message($newsletterContent);
$this->email->send();
//echo $this->email->print_debugger();
sleep(2);
//log file start
$filepath = APPPATH . 'logs/mail-log-' . date('Y-m-d') . '.php';
$handle = fopen($filepath, "a+");
$currentDateTime = date('d.M.Y H:i:s');
foreach($maliNiz as $emailAdresa){
$infoLog = $emailAdresa . " // ".$currentDateTime . " \n";
fwrite($handle, $infoLog);
}
fclose($handle);
//log file end
}
}
}