своя рассылка на php
На сайте имею ~1500 подписчиков. Сделал простую рассылку:
for($i=0;$i<count($mlist);$i++) {
print("Сообщение для ".$mlist[$i]['name']);
if (mail(string to, string subject, string message))
print(" отправлено успешно");
else
print(" не может быть отпралено");
}
После запуска скрипт зависал примероно на 200ом письме. Добавлял sleep(2) - не помогает. Переделал скрипт, после чего он, при отправки 100 писем, переходит сам на себя и отправляет следующие 100 писем, пока не отправит все. И по прежнему скрипт зависает на неопределенном месте (всегда по разному).
Как правильно делать рассылку, как сделать отправку не больше 4 писем в секунду, может у кого есть готовые скрипты для рассылки писем? Какие ограничения могут выдвигаться хостером?
А можно поподробнее каким образом это реализованно?
set_time_limit(0);
error_reporting(E_ALL);
include ("include/MailList.class.php"); //класс для $ml - множества пользователей
include ("include/MailList_for_one.class.php"); //класс для $mr - одного из множества пользователей, определение текстовых данных происходит вручную, наследованием от $ml, здесь
include ("include/htmlMimeMail/htmlMimeMail.php");
$mlist = array();
$fp = fopen("mmailers.dat", "r");
while (!feof($fp)) {
$mlist[] = fgets($fp, 4096);
}
fclose($fp);
$mlcount = count($mlist);
if ($mlcount < $k)
$k = $mlcount;
$fp = fopen("mailers.dat", "w");
for($i=0;$i<$k;$i++) {
fputs($fp, $mlist[$i]);
}
fclose($fp);
$fp = fopen("mmailers.dat", "w");
for($i=$k;$i<$mlcount;$i++) {
fputs($fp, $mlist[$i]);
}
fclose($fp);
//$title = $_POST["titl"];
//$title = str_replace(" ", "_", $titl);
$title = "Специальная акция!";
// MailList("file"|"db")
$ml = new MailList("file"); //$ml содержит список всех пользователей
//$ml->ShowMailers();
$fp = fopen("done", "a");
for ($mailers_i = 0; $mailers_i<count($ml->mailers); $mailers_i++) { //пробегаемся по всему списку пользователей
//unset($mr);
$mr = new MailList_for_one();
$mr->mailers[0] = $ml->mailers[$mailers_i]; //и присваем каждого пользователя в отдельный массив
$mr->AddFile("html/pijama.htm", "html");
$mr->SendMail($title." $mailers_i");
fputs($fp, $ml->mailers[$mailers_i]['email']."\n");
//sleep(1);
}
fclose($fp);
if ($k!=$mlcount)
header("Location: http://".$_SERVER["SERVER_NAME"].$_SERVER["PHP_SELF"]);
вот так вот сделано. mmailers.dat - все адреса, mailers.dat - те, кому нужно отправить за этот заход. сначало из mmailers.dat перекидываю $k-email`ов в mailers.dat и запускаю рассылку из mailers.dat. Потом перегружаю страницу и повторяю действие.
Ограничение по времени должно убираться set_time_limit(0);
[COLOR=darkred]======================[/COLOR]
[COLOR=darkred]Блин, ребята, форматируйте свой код сами! Вы тут ср...тте, а мне за вами убирать :D[/COLOR]
2. Отправляешь 100 писем, записываешь метку в файл.
3. При отправке читаешь из файла метку и начинаешь отправку с того места, откуда указывает метка.
Т.е. под "переходит сам на себя" ты и понимаешь обновление страницы в браузере?
Ограничение по времени должно убираться set_time_limit(0);
Не каждый хостер позволить изменять данную директиву. Я бы даже сказал больше: это не позволить сделать вообще ни один хостер (если у нас конечно не имеется DS :D , но это уже отдельный разговор).
Если ваша задача - ускорить отправку писем, чтобы уложиться в лимиты времени, то я бы не рекомендовал пользоваться встроенной функцией mail. Вы же не знаете как она работает. Скорее всего она начинает smtp-сессию с почтовым сервером при каждом вызове - а начальный коннект может растягиваться на неопределенное время. Потом еще дисконнект, он тоже может затянуться.
Я бы на вашем месте написал функцию, которая один раз устанавливает SMTP-сессию с почтовым сервером, а потом отправляет все письма за одну сессию. Это будет гораздо, гораздо быстрее.
Скорее всего есть готовые коды, вот хоть бы этот взять за основу: http://www.wellho.net/forum/Writing-PHP/PHP-SMTP-Mail-Problem.html
или еще погуглить.
Но вы, возможно, уже сами решили проблему. Расскажите как ?
Я бы на вашем месте написал функцию, которая один раз устанавливает SMTP-сессию с почтовым сервером, а потом отправляет все письма за одну сессию. Это будет гораздо, гораздо быстрее.
Скорее всего есть готовые коды, вот хоть бы этот взять за основу: http://www.wellho.net/forum/Writing-PHP/PHP-SMTP-Mail-Problem.html
или еще погуглить.
Но вы, возможно, уже сами решили проблему. Расскажите как ?
вы не бот? =) а то я где-то сообщение 1 в 1 видел уже =)))
человек просит помочь именно с его реализацией)))
ЗЫ:
shaelf, +1.
автор, крон - выход )
если пользователь подписался на новости сайта, то я думаю ему не составит труда подписаться на RSS этого сайта... тем более что эта весчь пользуется всё чаще и все больше :)