Самый быстрый способ отправки письма

Fragaria

В качестве тестового задания в одной фирме нужно придумать архитектуру сервиса, который разошлет пользователям одной онлайн-системы письма-уведомления с содержанием, отличающимся только обращением в начале (типа Уважаемый %username%! Бла бла бла). Обязательное условие - сервис должен за ограниченное время справиться с рассылкой на большое количество адресов (до миллиона при этом он должен быть написан на PHP (!) :)
Все вроде понятно, за исключением собственно процедуры отправки. От mail я отказался сразу. Один из вариантов - PEAR:MAIL, который умеет отправлять через SMTP или sendmail.
Что быстрее? :)

tokuchu

Возможно в очередь локального MTA будет быстрее положить, чем на 25-й порт заливать куда-нибудь. Но в любом случае это будет правильнее, т.к. в таком случае тебе не надо отлавливать сетевые ошибки.
А ещё можно написать скрипт на чём-нибудь, который генерит письма и ложит их в очередь, а из PHP-скрипта запустить его в бекграунде. :)

Fragaria

В случае с локальным МТА не получится отправить письмо повторно в случае временной ошибки :(

dgaf

Неважно как скоро ты эти письма засунешь в очередь почтового демона, сам демон будет их дольше пытаться разослать.

Fragaria

Значит все же SMTP?

tata2410

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

tokuchu

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

tokuchu

Значит все же SMTP?
Он имел в виду, что не важно с какой скоростью у тебя скрипт закончит работать, т.к. время доставки будет всё равно много больше.

Fragaria

В смысле скрипт не повторит отправку. Сам МТА конечно может повторить. Но если окажется, что на данный адрес отправка вообще не возможна, скрипт об этом не узнает.

Fragaria

Это уже не важно. Главное, чтобы я за обозримое время отправил все письма, а когда они дойду - это уже пофиг.

tokuchu

В смысле скрипт не повторит отправку.
В том-то и дело, что это уже задача не скрипта, а MTA.
Сам МТА конечно может повторить. Но если окажется, что на данный адрес отправка вообще не возможна, скрипт об этом не узнает.
Он и так об этом может не узнать. Лучше эту ситуацию обрабатывать как-нибудь по-другому. Ловить отбойники на определённый адрес и их уже анализировать чем-нибудь.

Bayur19

Может свой модуль отправки писем из PHP стоит написать?
Типа получить входные данные (e-mail, заголовок открыть сетевое соединение, пульнуть туда данные. Какие данные посылать? - можно отсниферить траффик при отправке письма.
Или гугл взботни на тему SMTP connection from PHP
Первая ссылка выдала код:
   <?php  
$smtp_server = "smtpserver.com";
$port = 25;
$mydomain = "mydomain.com";
$username = "username";
$password = "password";
$sender = "sender email";

if (ISSet($_REQUEST["recipient"]
{
$recipient = $_REQUEST["recipient"];
}
else
{
Die("Recipient is a required field...");
}

if (ISSet($_REQUEST["subject"]
{
$subject = $_REQUEST["subject"];
}
else
{
$subject = "";
}

if (ISSet($_REQUEST["content"]
{
$content = $_REQUEST["content"];
}
else
{
Die("Content is a required field...");
}

// SMTP connection

$handle = fsockopen($smtp_server, $port);
fputs($handle, "EHLO " . $mydomain . "\r\n");

// SMTP authorization
fputs($handle, "AUTH LOGIN\r\n");
fputs($handle, base64_encode($username)."\r\n");
fputs($handle, base64_encode($password)."\r\n");

// Send out the e-mail
fputs($handle, "MAIL FROM:<" . $sender . ">\r\n");
fputs($handle, "RCPT TO:<" . $recipient . ">\r\n");
fputs($handle, "DATA\r\n");
fputs($handle, "To: " . $recipient . "\n");
fputs($handle, "Subject: " . $subject . "\n\n");
fputs($handle, $content . "\r\n");
fputs($handle, ".\r\n");

// Close connection to SMTP server
fputs($handle, "QUIT\r\n");
?>

tokuchu

Типа получить входные данные (e-mail, заголовок открыть сетевое соединение, пульнуть туда данные. Какие данные посылать? - можно отсниферить траффик при отправке письма.
Не ходите, дети, в Африку гулять, блядь!

margadon

к спамерам подался? :(

Fragaria

Нет, это просто тестовое задание. Фирма геймдевом занимается.

AlexV769

Тебе нужен MTA, который умеет за одно TCP-соединение отправить все письма, которые можно доставить через данный MX-сервер. Тогда 90% писем будут доставлены максимально быстро, поскольку расположены на всяких там gmail.com и mail.ru.
Сам по себе MTA можно настроить, чтобы временные ошибки превращались в постоянные через короткое время. Скажем, через полчаса. Зажимать этот параметр слишком сильно нельзя из-за грейлистинга, как тут уже обозначили. Ну и почти любой MTA предоставляет средства для просмотрра очередей отправки, так что ты в любой момент времени сможешь получить статистику по отправке сообщений.

Fragaria

Окей, спасибо, буду смотреть, какие MTA можно использовать. PEAR:Mail умеет только с sendmail работать, посмотрю, что умеет он, а дальше exim4 и тд.

spensnp

sendmail
сейчас sendmail de-facto суть один из интерфейсов к MTA, i.e. практически любой почтовый сервер включает sendmail.

Barbie29

быстрее чем скорость канала не отправишь... можно написать прогу, которая передющему серваку жахнет 10мегабайтами за секунду, но он это не успеет разобрать

Fimida

Да, но
Mail Transfer Agent'a какие есть спецификации?
Оставить комментарий
Имя или ник:
Комментарий: