| 
 
  Super Member
 
  
 Покинул форум
 Сообщений всего: 723
 Дата рег-ции: Февр. 2009
 Репутация: 42
 
 
 
 
  
 | vipraskrutka, я сделал фикс для FM RC 1, в файле fm.class.php (найти и заменить функцию):
 
 CODE:		/*_SendMail функция отправки e-mail через sendmail сервера
 */
 function _SendMail($list, $user_id_offset=0) {//sys_improve (Добавил аргумент)
 $headers = 'From: '.$list[0].' <'.$list[1].">\n";
 $headers .= 'Reply-To: '.$list[1]."\n";
 $headers .= 'Return-Path: '.$list[1]."\n";
 $headers .= "MIME-Version: 1.0\nContent-type: text/plain; charset=windows-1251\nContent-Transfer-Encoding: 8bit\nDate: " . gmdate('D, d M Y H:i:s', time()) . " UT\nX-Priority: 3\nX-MSMail-Priority: Normal\nX-Mailer: PHP\n";
 
 $skip_mails = (file_exists(FM_SKIP_MAILS)) ? file(FM_SKIP_MAILS):array();
 if (count($skip_mails) !== 0) {
 unset($skip_mails[0]);
 $skip_mails	= preg_replace("#(\r\n|\|$)#","",trim(implode("|",$skip_mails)));
 } else {
 $skip_mails	= "@";
 }
 
 $users = $this->_Read(FM_USERS);
 if (is_array($list[2])) {
 
 @set_time_limit(360);
 
 $before_time = time();
 
 foreach ($list[2] as $user_id => $flag) {
 $user_id = $user_id_offset + $user_id;
 if (isset($users[$user_id]) && !preg_match("#(".$skip_mails.")$#is",$users[$user_id]['m'])) {
 mail($users[$user_id]['m'], $list[3], $list[4], $headers);
 
 //Если разница максимального времени выполнения скрипта и времени между началом цикл
 //и временем текущей итерации цикла <= 2, то завершаем цикл и сохраняем смещение :-)
 if ((360 - (time() - $before_time)) <= 2)
 {
 $this->_Read2Write($fp, 'data/massmail_tmpdb.php');
 $this->_Write($fp, array($list, $uid_offset));
 $fm->_Message($fm->LANG['AdminMassMail'],$fm->LANG['MassMailNSended'],'setmembers.php?action=massmail_offset',1);
 }
 }
 }
 } else {
 if (!preg_match("#(".$skip_mails.")$#is",$list[2])) {
 mail($list[2], $list[3], $list[4], $headers);
 }
 }
 }
 
 function _SendMail_with_offset()
 {
 $tmp_db = $this->_Read('data/massmail_tmpdb.php');
 $this->_SendMail($tmp_db[0], $tmp_db[1]);
 }
 
 В файле setmembers.php, после:
 
 CODE:} elseif ($fm->input['action'] == 'massmail') {if ($fm->_Intval('dosend') === 1) {
 if ($fm->input['subject'] == '' || $fm->input['message'] == '') {
 $fm->_Message($fm->LANG['AdminMassMail'],$fm->LANG['EmailNotEmpty'],'',1);
 }
 $allusers = $fm->_Read(FM_USERS,FALSE);
 SkipMails();
 array_filter($allusers,'MAP_MAIL');
 unset($allusers);
 
 $total_mails = sizeof($usersmails);
 if ($total_mails > 0) {
 $message = sprintf ($fm->LANG['MassMailText'],
 $fm->exbb['boardname'],
 $fm->exbb['boardurl'],
 $fm->input['message']);
 $fm->_Mail($fm->exbb['boardname'],$fm->exbb['adminemail'],$usersmails,$fm->input['subject'],$message);
 $fm->_WriteLog($fm->LANG['LogMassMail'],1);
 $fm->_Message($fm->LANG['AdminMassMail'],sprintf($fm->LANG['MassMailSended'],$total_mails),'setmembers.php?action=massmail',1);
 } else {
 $fm->_Message($fm->LANG['AdminMassMail'],$fm->LANG['EmailAdminError'],'',1);
 }
 } else {
 include('./admin/all_header.tpl');
 include('./admin/nav_bar.tpl');
 include('./admin/mass_mail.tpl');
 include('./admin/footer.tpl');
 }
 добавить:
 
 CODE:} elseif ($fm->input['action'] == 'massmail_offset') {$fm->_SendMail_with_offset();
 
 lang_admin_setmembers.php
 
 CODE:$this->LANG['MassMailNSended']	= 'Сообщение разослано на ряд адресов, но рассылка еще не окончена, сейчас произойдет переадресация и рассылка продолжится.';
 Я не тестировал (поскольку столь крупной базы у меня нет), если кто-то может -- буду рад если вы протестируете на локалке с Денвером скрипт рассылки.
 
 В отличие от скрипта WR, моя реализация разбивает рассылку не по заданному количеству писем, а динамически, упираясь на время выполнения скрипта.
 |