我的脚本根据每个用户的本地时间发送电子邮件

时间:2012-06-04 19:57:32

标签: php mysql email codeigniter time

我发布了我的php脚本,希望得到您的意见和建议。我的PHP应用程序需要根据用户的本地时间向用户发送个人电子邮件。

每位用户都有一组时间标记,他们选择接收电子邮件。这就是数据库中时间标记字段的样子:12:00:00, 14:15:00, 16:30:00

我将时间标记四舍五入到最近的四分之一小时,每四分钟发送一次cronjobs来检查哪些用户安排了电子邮件并发送相应的电子邮件逐个(担心的样子: - /)在一个循环中。

我的服务器时区设置为America/New_York,因此我无法根据时间发送电子邮件,因为用户位于不同的位置。下面我开发了一个应该处理这个问题的模型。

解决方案:

  1. 收集每个用户的时区
  2. 在每个cronjob上使用他们的时区获取每个用户在php中的本地时间 数据
  3. 创建用户时间标记数组。

    示例:12:00:00, 14:15:00, 16:30:00

    Array ( [0] => 12:00:00 [1] => 14:15:00 [2] => 16:30:00 )

  4. 如果用户的本地时间与他/她的时间标记之一匹配发送电子邮件

  5. 使用发送日期更新数据库
  6. Php脚本:

        //loop through user's entries table that holds content to be emailed    
        foreach ($entries as $entry) { 
    
             //create array of user's time-marks set            
             $timemarks_arr = array_map( "trim", str_getcsv($entry->timemarks));
    
             //get user's localtime
             $timezone = $entry->timezone; //user's time-zone
             $userlocaltime = gmt_to_local($timestamp, $timezone, $daylight_saving); //gets user's localtime
    
             //if a user's time-mark matches his/her localtime      
             if (in_array($userlocaltime, $timemarks_arr))
             {  
                    //send email using Codeigniter's email class
    
                    $this->email->clear(); //reset between cycles
    
                    $this->email->from('myemail@gmail.com', 'Name');
                    $this->email->to($entry->email); 
    
                    $this->email->subject($entry->content);
                    $this->email->message($entry->content); 
    
                    $this->email->send();   
    
                    echo $this->email->print_debugger();                    
    
                    //update date sent
                    $user_id = $entry->user_id;
    
                    $this->db->query("UPDATE `entries` SET date_sent=now() WHERE `user_id` = $user_id AND `entry_id` = $entry->entry_id");
    
             }
    
        }
    

    关注:

    • 模型可靠吗?
    • 性能问题。发送4封电子邮件大约需要5秒钟。(注意:我正在本地Windows服务器的测试环境发送电子邮件 - WAMP)

1 个答案:

答案 0 :(得分:0)

除非您为服务器时间设置服务器脚本,否则您只能获取当地时间。

我要做的是用c ++或其他一些可以更新数据库记录的语言编写一个简单的程序。将程序设置为按小时将服务器时间记录到数据库中,当用户需要调用它时,让他们从数据库中读取该字段。我以前做过这件事并且效果很好。