Вход Регистрация
Файл: qa-include/qa-app-mailing.php
Строк: 197
<?php
    
/*
    Question2Answer (c) Gideon Greenspan

    http://www.question2answer.org/

    
    File: qa-include/qa-app-mailing.php
    Version: See define()s at top of qa-include/qa-base.php
    Description: Functions for sending a mailing to all users


    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    More about this license: http://www.question2answer.org/license.php
*/

    
if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
        
header('Location: ../');
        exit;
    }


    function 
qa_mailing_start()
/*
    Start a mailing to all users, unless one has already been started
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-db-admin.php';
        
        if (
strlen(qa_opt('mailing_last_userid'))==0) {
            
qa_opt('mailing_last_timestamp'time());
            
qa_opt('mailing_last_userid''0');
            
qa_opt('mailing_total_users'qa_db_count_users());
            
qa_opt('mailing_done_users'0);
        }
    }

    
    function 
qa_mailing_stop()
/*
    Stop a mailing to all users
*/
    
{
        
qa_opt('mailing_last_timestamp''');
        
qa_opt('mailing_last_userid''');
        
qa_opt('mailing_done_users''');
        
qa_opt('mailing_total_users''');
    }

    
    function 
qa_mailing_perform_step()
/*
    Allow the mailing to proceed forwards, for the appropriate amount of time and users, based on the options
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-db-users.php';

        
$lastuserid=qa_opt('mailing_last_userid');
        
        if (
strlen($lastuserid)) {
            
$thistime=time();
            
$lasttime=qa_opt('mailing_last_timestamp');
            
$perminute=qa_opt('mailing_per_minute');
            
            if ((
$lasttime-$thistime)>60// if it's been a while, we assume there hasn't been continuous mailing...
                
$lasttime=$thistime-1// ... so only do 1 second's worth
            
else // otherwise...
                
$lasttime=max($lasttime$thistime-6); // ... don't do more than 6 seconds' worth
            
            
$count=min(floor(($thistime-$lasttime)*$perminute/60), 100); // don't do more than 100 messages at a time
            
            
if ($count>0) {
                
qa_opt('mailing_last_timestamp'$thistime+30);
                    
// prevents a parallel call to qa_mailing_perform_step() from sending messages, unless we're very unlucky with timing (poor man's mutex)
                
                
$sentusers=0;
                
$users=qa_db_users_get_mailing_next($lastuserid$count);
                
                if (
count($users)) {
                    foreach (
$users as $user)
                        
$lastuserid=max($lastuserid$user['userid']);
                    
                    
qa_opt('mailing_last_userid'$lastuserid);
                    
qa_opt('mailing_done_users'qa_opt('mailing_done_users')+count($users));
                    
                    foreach (
$users as $user)
                        if (!(
$user['flags'] & QA_USER_FLAGS_NO_MAILINGS)) {
                            
qa_mailing_send_one($user['userid'], $user['handle'], $user['email'], $user['emailcode']);
                            
$sentusers++;
                        }
                
                    
qa_opt('mailing_last_timestamp'$lasttime+$sentusers*60/$perminute); // can be floating point result, based on number of mails actually sent

                
} else
                    
qa_mailing_stop();
            }
        }
    }

    
    function 
qa_mailing_send_one($userid$handle$email$emailcode)
/*
    Send a single message from the mailing, to $userid with $handle and $email.
    Pass the user's existing $emailcode if there is one, otherwise a new one will be set up
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-app-emails.php';
        require_once 
QA_INCLUDE_DIR.'qa-db-users.php';
        
        if (!
strlen(trim($emailcode))) {
            
$emailcode=qa_db_user_rand_emailcode();
            
qa_db_user_set($userid'emailcode'$emailcode);
        }
        
        
$unsubscribeurl=qa_path('unsubscribe', array('c' => $emailcode'u' => $handle), qa_opt('site_url'));
        
        return 
qa_send_email(array(
            
'fromemail' => qa_opt('mailing_from_email'),
            
'fromname' => qa_opt('mailing_from_name'),
            
'toemail' => $email,
            
'toname' => $handle,
            
'subject' => qa_opt('mailing_subject'),
            
'body' => trim(qa_opt('mailing_body'))."nnn".qa_lang('users/unsubscribe').' '.$unsubscribeurl,
            
'html' => false,
        ));
    }


    function 
qa_mailing_progress_message()
/*
    Return a message describing current progress in the mailing
*/
    
{
        if (
strlen(qa_opt('mailing_last_userid')))
            return 
strtr(qa_lang('admin/mailing_progress'), array(
                
'^1' => number_format(qa_opt('mailing_done_users')),
                
'^2' => number_format(qa_opt('mailing_total_users')),
            ));
        else
            return 
null;
    }

    
/*
    Omit PHP closing tag to help avoid accidental output
*/
Онлайн: 0
Реклама