使用Amazon SES通过PHP发送时,并非收件人都收到所有邮件

时间:2014-05-11 19:38:40

标签: php mysql codeigniter newsletter amazon-ses

我编写了简单的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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

根据亚马逊文档,这可能是个问题。

  

重要信息向多个收件人(收件人)发送电子邮件时   是“To”,“CC”和“BCC”地址)以及对Amazon SES的调用失败,   整个电子邮件被拒绝,没有收件人会收到   预期的电子邮件。因此,我们建议您发送电子邮件至   一次一个收件人。

http://docs.aws.amazon.com/ses/latest/DeveloperGuide/sending-email.html