Не всички имейли се получават от получателите, когато се изпращат чрез PHP чрез Amazon SES

Написах прост 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
        }
    }
}

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 това може да е проблемът.

Важно Когато изпратите имейл до множество получатели (получателите са адреси „До“, „CC“ и „BCC“) и обаждането до Amazon SES е неуспешно, целият имейл се отхвърля и никой от получателите няма да получи желания имейл. Затова ви препоръчваме да изпращате имейл до един получател наведнъж.

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

person bumperbox    schedule 12.05.2014
comment
Благодаря, видях това, но го забравих. Ще трябва да пренапиша сценария си. RTFM :) - 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