CakePHP发送多封电子邮件而不是一封

时间:2014-04-13 17:49:43

标签: mysql email cakephp-2.0

我有一个奇怪的错误。我有一个脚本,每天为~12K用户发送电子邮件。它工作了大约3个月,然后几天前开始垃圾邮件。它向所有用户发送了大约15份电子邮件,当然,他们开始抱怨。该脚本每天被cron作业激活一次,并且根据服务器的支持,它只被触发一次而没有任何问题。当我尝试将脚本解压缩到只有一个电子邮件地址时,它工作正常,但当我尝试再次发送所有电子邮件时,我遇到了获得多个副本的相同问题。我将其解雇到同一个电子邮件地址,以避免再次向用户发送垃圾邮件。我放了一些日志语句来查看被触发的计数和电子邮件,看到一些奇怪的东西:一旦它到达用户列表的末尾,我看到列表开头的电子邮件被解雇了。类似的东西:

    2014-04-13 04:33:02 Email: 12340 yyy@gmail.com
2014-04-13 04:33:03 Email: 12341 yyy@hotmail.com
2014-04-13 04:33:03 Email: Daily email function got called <- looks like it gets trough new iterations
2014-04-13 04:33:03 Email: 12342 yyy@gmail.com
2014-04-13 04:33:03 Email: 12343 yyy@o2.pl
2014-04-13 04:33:03 Email: 12344 yyy@yahoo.com
2014-04-13 04:33:03 Email: 12345 yyy@aol.com
2014-04-13 04:33:03 Email: 12346 yyy@outlook.com
2014-04-13 04:33:03 Email: 12347 yyy@hotmail.com
2014-04-13 04:33:03 Email: 1 yyy@gmail.com       
2014-04-13 04:33:03 Email: 12348 yyy@comcast.net
2014-04-13 04:33:03 Email: 2 yyy@yahoo.com
2014-04-13 04:33:03 Email: 12349 yyy@yahoo.es
2014-04-13 04:33:03 Email: 3 yyy@hotmail.com
2014-04-13 04:33:03 Email: 12350 yyy@hotmail.com
2014-04-13 04:33:03 Email: 4 yyy@yahoo.com
2014-04-13 04:33:03 Email: 12351 yyy@gmail.com
2014-04-13 04:33:03 Email: 5 yyy@gmail.com.com
2014-04-13 04:33:03 Email: 12352 yyy@hotmail.com

看起来这个脚本第二次被调用,但可能会叫它?

功能:

 function daily_email() {
        CakeLog::write('email', 'Daily email function got called');
        $count = 0;
        ini_set("memory_limit", "2048M");
        set_time_limit("0");
        $from = array('yyy@yyyy.com' => 'yyyyyyyyy');
        $subject = 'bla';
        $template = 'daily';
        $layout = 'daily_layout';
        $users_data = $this->User->find('all', array('conditions' => array('User.unsubscribed ' => '0')));
        foreach ($users_data as $user) {
            $count++;
            $user = $user['User'];
            $to = $user['email_address'];
            $s5 = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 31); //change security string every day
            $offer_link = 'http://bla.bla.com' . $s5;
            $unsubscribe_link = "http://" . $_SERVER['HTTP_HOST'] . "/dailies/user/unsubscribe/" . $user['id'];
            $this->Emailer->send_email($from, $to, $subject, $template, $layout, $offer_link, $unsubscribe_link, $s5);
            $this->User->id = $user['id'];
            $user['is_used'] = 0;
            $user['security_string'] = $s5;
            $this->User->save($user);
        }
        CakeLog::write('email', 'Sent ' . $count . ' emails');
        $this->autoRender = false;
    }

电子邮件组件:

App::uses('Component', 'Controller');
App::uses('CakeEmail', 'Network/Email');

class EmailerComponent extends Component {

    function send_email($from, $to, $subject, $template, $layout, $offer_link, $unsubscribe_link, $s5=null) {
        $email = new CakeEmail();
        $email->template($template, $layout);
        $email->emailFormat('html');         
        $email->to($to);
        $email->from($from);
        $email->subject($subject);
        $email  ->viewVars(array('offer_link' => $offer_link, 'unsubscribe_link' => $unsubscribe_link, 's5' => $s5));
       $email ->send();
    }
}

Cron工作:

0 4 * * * /usr/bin/wget -O /dev/null http://www.myNiceSite.com/dailies/user/daily_email

此外,不确定它是否相关,但ps aux在脚本运行后显示两个进程。

先谢谢你们提供任何帮助

1 个答案:

答案 0 :(得分:0)

看起来我找到了问题的根源。 Wget调用脚本并等待响应,但脚本完成需要很长时间。所以wget再次调用,它可能在无限循环中进入。现在,修复是在脚本运行时在数据库中设置标志,它会阻止脚本第二次运行。