我编写了简单的PHP(codeigniter)脚本来发送与Amazon SES的简报。我在MySQL表格和脚本中有大约8000封电子邮件,它们会提取所有行(电子邮件地址),将其拆分为较小的包(因为SES限制)并通过SMTP发送电子邮件。我使用sleep()*
和每分钟运行的cronjob。我知道这不是最好的解决方案,但作为一个概念,它工作正常。
要允许发送bcc
的邮件,我必须确保to
字段中最后有一个收件人,否则Amazon SES将不会发送邮件。因此,我的地址(news@baulink.rs
)始终位于to
,其他地址位于bcc
。每次迭代都会在bcc
中放置8个不同的地址(顺便说一下,有没有更好的解决方案?)。我还有一个简单的日志文件,它写入我的应用程序操作的每个地址。
正如我所见,有些收件人没有收到时事通讯。亚马逊SES返回退回的电子邮件,并且工作正常,但有些地址根本没有得到它,并且亚马逊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('news@baulink.rs');
$this->email->bcc($maliNiz); //This is my BCC array of 8 addresses
$this->email->from('office@baulink.rs', '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
}
}
}
答案 0 :(得分:0)
根据亚马逊文档,这可能是个问题。
重要信息向多个收件人(收件人)发送电子邮件时 是“To”,“CC”和“BCC”地址)以及对Amazon SES的调用失败, 整个电子邮件被拒绝,没有收件人会收到 预期的电子邮件。因此,我们建议您发送电子邮件至 一次一个收件人。
http://docs.aws.amazon.com/ses/latest/DeveloperGuide/sending-email.html