Не все письма, полученные получателями при отправке через PHP с использованием Amazon SES

Я написал простой 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
        }
    }
}

person Dusan    schedule 11.05.2014    source источник
comment
Возможно, письмо помечено как СПАМ. Таким образом, проблема может заключаться в том, что домен, с которого осуществляется отправка, занесен в черный список или что-то еще вызывает оценку в списке спама.   -  person Giacomo1968    schedule 12.05.2014
comment
Нет, дело даже не в СПАМе. Например, есть некоторые учетные записи Gmail, которые отлично работают, и сообщения доставляются в папку «Входящие», но в некоторых других случаях это не работает вообще. Аналогично с @hotmail и доменными (служебными) адресами электронной почты. Очень странно...   -  person Dusan    schedule 12.05.2014
comment
Ладно, достаточно честно. Но неясно, Amazon SES это или процесс рассылки на вашей стороне. Очень своеобразно. Если подумать, ваши журналы могут быть просто ложными срабатываниями.   -  person Giacomo1968    schedule 12.05.2014
comment
Я попытаюсь записать ответы от SMTP, это даст мне больше данных для анализа. Наверное, это что-то на моей стороне.   -  person Dusan    schedule 12.05.2014
comment
Точно. Вам по-прежнему необходимо установить SMTP-соединение, чтобы передать материал в Amazon SES, так что это еще один аспект, на который следует обратить внимание.   -  person Giacomo1968    schedule 12.05.2014


Ответы (1)


Согласно документам Amazon, это может быть проблемой.

Важно! Если вы отправляете электронное письмо нескольким получателям (получателями являются адреса «Кому», «Копия» и «Скрытая копия»), а вызов Amazon SES завершается неудачно, все электронное письмо отклоняется, и ни один из получателей не получит предполагаемое электронное письмо. Поэтому мы рекомендуем отправлять электронные письма одному получателю за раз.

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

person bumperbox    schedule 12.05.2014
comment
Спасибо, видел, но забыл. Мне придется переписать свой сценарий. РТФМ :) - person Dusan; 12.05.2014
comment
Если вы используете Amazon PHP SDK, вы можете подключиться к API напрямую, а не через smtp, что позволит вам отправлять пакеты электронных писем. Единственным недостатком является то, что если вы хотите сменить почтового провайдера, вам придется переписать. - person bumperbox; 12.05.2014
comment
Будет ли это быстрее, если я использую Amazon PHP SDK? Теперь на каждый запрос уходит около 3 секунд, и если я отправляю только одному получателю на запрос, это очень медленно. - person Dusan; 13.05.2014
comment
И я думаю, что SES также отклонит всю электронную почту, если вызов сервера завершится неудачно, не имеет значения, вызван ли он SMTP или обычным API. - person Dusan; 13.05.2014
comment
При дальнейшем чтении похоже, что та же проблема возникнет с API. Я просматривал документы SES, когда они только вышли, но с тех пор не просматривал. В итоге я использовал мандрил. - person bumperbox; 13.05.2014
comment
Это неправда. Мой BCC получает, но мой To нет. - person ; 15.06.2016