Ответов: 47 Просмотров: 0
|
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, моя реализация разбивает рассылку не по заданному количеству писем, а динамически, упираясь на время выполнения скрипта. |