Скрипт массовой рассылки э-маилов

Статус
В этой теме нельзя размещать новые ответы.

webnet

Создатель
Регистрация
1 Дек 2006
Сообщения
19
Реакции
5
Привет всем.
Есть скрипт , он выдергивает маилы пользователей из базы данных и потом функцией делает отправку . Беда заключается в том , что в базе 15к пользователей и когда начинаеться отправка миалов , сервер мягко говоря виснет . Может кто дописать скрипт , что бы отправлял по 10-15 писем за раз , отдыхал секунд 30 и опять отправлял ?
PHP:
<?
require_once ("include/bittorrent.php");
dbconn ();
if (get_user_class() < UC_SYSOP) die('Access denied, u\'re not sysop'); 

global $SITENAME, $SITEEMAIL;
$res = mysql_query ( "SELECT email FROM users" ) or sqlerr ( __FILE__, __LINE__ );
$counter = mysql_affected_rows ();
while ( $a = mysql_fetch_assoc ( $res ) ) {
	
	$subject = $_POST ['subject'];
	if (! $subject)
		stderr ( $lang ['error'], "Пожалуста, введите тему!" );
	
	$msg = $_POST ['msg'];
	if (! $msg)
		stderr ( $lang ['error'], "Введите текст сообщения!" );
	
	$message = <<<EOD
$msg
EOD;
	sent_mail ( $a ["email"], $SITENAME, $SITEEMAIL, $subject, $message, false );
}
stdhead ( "Спамилка" );
stdmsg ( "Успешно..", "Рассылка завершена. Отправлено <b>$counter</b> сообщений" );
stdfoot ();
?>

Буду очень благодарен . :bc:
 
Так зачем 30 секунд после 15ти, если можно 2 секунды после каждого? :)


Вставь sleep(2); сразу после sent_mail() и вуаля.
 
А также добавьте на всякий случай строки
ini_set('output_buffering', 0);
set_time_limit(0);
ob_implicit_flush();
часть из них будет сразу выводит на экран то, что вам надо, а set_time_limit(0) не прервёт скрипт на пол-пути.
 
Дописывать я не буду, но могу подсказать что если письма отправляютя через phpmail, то есть смысл делать отправку через pop или smtp почтовые порты, а программную часть разделить на нити для эмуляции многопоточности.
 
PHP:
<? 
// работа скрипта не будет прервана
set_time_limit(0);
require_once ("include/bittorrent.php"); 
dbconn (); 
if (get_user_class() < UC_SYSOP) die('Access denied, u\'re not sysop');  

global $SITENAME, $SITEEMAIL; 
$res = mysql_query ( "SELECT email FROM users" ) or sqlerr ( __FILE__, __LINE__ ); 
$counter = mysql_affected_rows (); 
$i=0;
while ( $a = mysql_fetch_assoc ( $res ) ) { 
     $i++;
    $subject = $_POST ['subject']; 
    if (! $subject) 
        stderr ( $lang ['error'], "Пожалуста, введите тему!" ); 
     
    $msg = $_POST ['msg']; 
    if (! $msg) 
        stderr ( $lang ['error'], "Введите текст сообщения!" ); 
     
    $message = <<<EOD 
$msg 
EOD; 
    sent_mail ( $a ["email"], $SITENAME, $SITEEMAIL, $subject, $message, false ); 

// спим 30 сек
    if ($i%15==0)  { 
       // сбрасываем на экран накопленный буфер перед сном
        flush();
        sleep(30);
    }
} 
stdhead ( "Спамилка" ); 
stdmsg ( "Успешно..", "Рассылка завершена. Отправлено <b>$counter</b> сообщений" ); 
stdfoot (); 
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху