Написах прост PHP (codeigniter) скрипт за изпращане на бюлетин с Amazon SES. Имам ~8000 имейла в MySQL таблица и скрипт, който изтегля всички редове (имейл адреси), разделя ги на по-малки пакети (поради ограниченията на SES) и изпраща имейл чрез SMTP. Използвам sleep()*
и cronjob, който се изпълнява всяка минута. Знам, че това не е най-доброто решение, но като концепция работи добре.
За да разреша изпращането на имейли с bcc
, трябва да се уверя, че има най-накрая един получател в полето to
или Amazon SES няма да го изпрати. И така, моят адрес ([email protected]
) винаги е в to
, а другите адреси са в bcc
. Всяка итерация поставя 8 различни адреса в bcc
(BTW, има ли по-добро решение за това?). Имам и прост лог файл, който записва всеки адрес, управляван от моето приложение.
Както виждам, някои получатели не получават бюлетина. 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
}
}
}