Рассылка писем

bobo

Новичок
Привет, помогите ламеру решить проблему :)

Нужно организовать рассылку писем на email'ы, суть такая: выбираю из БД ящики пользователей и на каждый из них нужно отправить письмо с текстом. Просто перебирать ящики циклом и при каждой итерации отправлять письмо не вариант, т.к. ящиков больше сотни.

Как это сделать, что б не сидеть после отправки формы и не ждать по 2 минуты ?
Заранее благодарю.
 

bobo

Новичок
Самый простой вариант, какой пришел в голову - это сделать задание cron, запускать его каждые секунд 5, а при отправке новости формировать текстовый файл со списком ящиков. Скрипт cron при каждом вызове будет брать первый ящик из списка, отправлять письмо и удалять ящик из списка и так, пока список не кончится.
Что скажете ?:)
 

Redjik

Джедай-мастер
вообще можно нескольким адресатам отправлять... только если нет %username% в теле письма
c другой стороны, для такой ничтожной рассылки можно пользоватся халявным тарифом на mailchimp
 

Фанат

oncle terrible
Команда форума
что это за МТА такой, который жалкую сотню писем ставит в очередь аж две минуты?

но допустим, ладно, такой тормозной.
Но почему при этом сам крон не может отправить все письма разом - для меня загадка. возле него тоже кто-то сидит и ждёт?
 

Redjik

Джедай-мастер
Фанат
он может через удаленный smtp отправлять ... там реально будешь сидеть и ждать, даже с кроном =)
 

bobo

Новичок
Нескольким адресатам сразу не хотелось бы, что б ящики то не палить :)
Отправка через smtp, да, пользуюсь классом libmail, может кто знает такой http://webi.ru/webi_files/php_libmail.html Если посоветуете что-нибудь посвежее - был бы благодарен.

Фанат, а как именно "отправить все письма разом" то ? В любом же случае нужно перебирать массив или текстовый файл, выдергивать по одному адресу и отправлять по письму при каждой итерации, разве нет ?
 

Фанат

oncle terrible
Команда форума
надо. а в чем проблема-то?
или у тебя массив перебирается по 1 элементу в секунду? Сервер на РС ХТ что ли?
 

bobo

Новичок
Дык трудно сказать, в чем проблема. Видимо много времени уходит на соединение с почтовым сервером, формирование\отправку письма, закрытие соединение (что там еще делается ?), т.к. проверял отправку на 5 пользователях - ждал ну секунд 10 точно.

Т.е. оно так выглядит:

PHP:
$query = query("SELECT `mail`
		        FROM `".DB_PREFIX."users`
		        WHERE `sendnews` = '1'
			      AND `mail` IS NOT NULL;");
								
    if ($query) { 
												
        foreach($query as $key => $value) {
											
	        @sendMail($value['mail'],FROM_EMAIL,$MAIL_TITLE['spamnews'],$body);
											
        }
									
    }
								
redirect(0,"editnews");
exit();
после отправки формы и до момента redirect(0,"editnews"); и проходит ~10 сек. (в БД 5 адресатов).
 

Фанат

oncle terrible
Команда форума
а зачем собака стоит перед sendMail? Это просто вопрос, без связи с твоей проблемой.

а внутре у ней, небось, таймауты конские - потому долго и отправляет
 

bobo

Новичок
Да бывает иногда почтовый сервер недоступен и что б сообщение об ошибке не вылазило поставил собаку. Это что б не видели в случае чего, куда идет соединение. Параноик я походу :)
 

bobo

Новичок
$smtp_conn = fsockopen($this->smtp_serv, $this->smtp_port, $errno, $errstr, $this->smtp_timeout); вот по последнему параметру понять не могу (читаю мануалы сейчас): если его убрать, то таймаута вообще не будет ?
Можно задать его равным например 0.2 сек или только целые числа допускаются ?
 

Фанат

oncle terrible
Команда форума
а зачем ты показываешь ошибки всем, кто будет пользоваться, кроме тебя?
 

Фанат

oncle terrible
Команда форума
таймаут соединения не играет роли. он включается только если сервер долго не отвечает. но если сервер ответил быстро, то до таймаута дело вовсе не доходит
 

bobo

Новичок
а зачем ты показываешь ошибки всем, кто будет пользоваться, кроме тебя?
Да почему, в htaccess прописана директива php_flag display_errors off, но все равно хочется как-то подстраховаться.

таймаут соединения не играет роли. он включается только если сервер долго не отвечает. но если сервер ответил быстро, то до таймаута дело вовсе не доходит
Блин, так и думал :( Т.е. получается дело в smtp сервере, он так долго соединения обрабатывает ?
В самом классе, кроме fsockopen (то, что выше давал), нечего, влияющего на соединение, больше нет..
 

С.

Продвинутый новичок
Не знаю, что там за sendMail() такой, но обычный mail() шлет письма асинхронно без всяких таймаутов.
 

bobo

Новичок
Ага, спасибо, чото упустил это из внимания.
Вариант, описанный мной во втором посте темы, жизнеспособен вообще ?
Понятно, что работать оно будет, но со стороны спецов (т.е. с вашей) это вообще сильно страшно выглядит ?:)

обычный mail() шлет письма асинхронно без всяких таймаутов.
Да это понятно, но именно через smtp хотелось бы это делать.
 

Фанат

oncle terrible
Команда форума
все равно хочется как-то подстраховаться.
"бережёного бог бережёт" - говорила монашка, надевая на свечку презерватив.

и вот из-за этих воображаемых страхов ты и лишаешь сам себя жизненно важной информации.
 
Сверху