Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

своя рассылка на php

333
14 апреля 2007 года
GHopper
200 / / 28.12.2004
Здравствуйте!
На сайте имею ~1500 подписчиков. Сделал простую рассылку:

 
Код:
$mlist = array(); //массив с подписчиками
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 писем в секунду, может у кого есть готовые скрипты для рассылки писем? Какие ограничения могут выдвигаться хостером?
12
14 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Скорее всего скрипт выходит за timeout. Т.е. к примеру для полной отработки логики скрипту требуется 2 минут, а на хосте величина таймаута установлена на 1 мин по прошествии которой сервер работу скрипта прекращает. См. директиву max_execution_time.
12
14 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: GHopper
Переделал скрипт, после чего он, при отправки 100 писем, переходит сам на себя


А можно поподробнее каким образом это реализованно?

333
15 апреля 2007 года
GHopper
200 / / 28.12.2004
Код:
$k = 100; //отправляем по 100 писем за раз, потом перегружаем страницу
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]
15
15 апреля 2007 года
shaelf
2.7K / / 04.05.2005
1. Устанавливаешь несколько проходов по крону на него (допустим каждые 5 минут)
2. Отправляешь 100 писем, записываешь метку в файл.
3. При отправке читаешь из файла метку и начинаешь отправку с того места, откуда указывает метка.
12
15 апреля 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: GHopper
Потом перегружаю страницу и повторяю действие.


Т.е. под "переходит сам на себя" ты и понимаешь обновление страницы в браузере?

Цитата: GHopper

Ограничение по времени должно убираться set_time_limit(0);


Не каждый хостер позволить изменять данную директиву. Я бы даже сказал больше: это не позволить сделать вообще ни один хостер (если у нас конечно не имеется DS :D , но это уже отдельный разговор).

29K
13 июля 2007 года
sergei-nko
11 / / 13.07.2007
Цитата: GHopper
Как правильно делать рассылку, как сделать отправку не больше 4 писем в секунду, может у кого есть готовые скрипты для рассылки писем? Какие ограничения могут выдвигаться хостером?



Если ваша задача - ускорить отправку писем, чтобы уложиться в лимиты времени, то я бы не рекомендовал пользоваться встроенной функцией mail. Вы же не знаете как она работает. Скорее всего она начинает smtp-сессию с почтовым сервером при каждом вызове - а начальный коннект может растягиваться на неопределенное время. Потом еще дисконнект, он тоже может затянуться.

Я бы на вашем месте написал функцию, которая один раз устанавливает SMTP-сессию с почтовым сервером, а потом отправляет все письма за одну сессию. Это будет гораздо, гораздо быстрее.

Скорее всего есть готовые коды, вот хоть бы этот взять за основу: http://www.wellho.net/forum/Writing-PHP/PHP-SMTP-Mail-Problem.html
или еще погуглить.

Но вы, возможно, уже сами решили проблему. Расскажите как ?

92
30 июля 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата: sergei-nko
Если ваша задача - ускорить отправку писем, чтобы уложиться в лимиты времени, то я бы не рекомендовал пользоваться встроенной функцией mail. Вы же не знаете как она работает. Скорее всего она начинает smtp-сессию с почтовым сервером при каждом вызове - а начальный коннект может растягиваться на неопределенное время. Потом еще дисконнект, он тоже может затянуться.

Я бы на вашем месте написал функцию, которая один раз устанавливает SMTP-сессию с почтовым сервером, а потом отправляет все письма за одну сессию. Это будет гораздо, гораздо быстрее.

Скорее всего есть готовые коды, вот хоть бы этот взять за основу: http://www.wellho.net/forum/Writing-PHP/PHP-SMTP-Mail-Problem.html
или еще погуглить.

Но вы, возможно, уже сами решили проблему. Расскажите как ?





вы не бот? =) а то я где-то сообщение 1 в 1 видел уже =)))

человек просит помочь именно с его реализацией)))

ЗЫ:
shaelf
, +1.
автор, крон - выход )

15
30 июля 2007 года
shaelf
2.7K / / 04.05.2005
Хотя у меня ещё проще)) Все письма в БД, при отправке каждого письма сохраняется метка в БД, что отправлен.))
92
30 июля 2007 года
Тень Пса
2.2K / / 19.10.2006
выход - RSS :D и ничего рассылать не надо.

если пользователь подписался на новости сайта, то я думаю ему не составит труда подписаться на RSS этого сайта... тем более что эта весчь пользуется всё чаще и все больше :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог