Если Вы ведете БД пользователей, которым интересен ваш сайт, вы наверняка сталкиваетесь с необходимостью делать массовые рассылки, новостей, событий и т.п.
Когда БД насчитывает 2000-3000 пользователей, то особенностей практически нет, кроме как победить бдительные почтовые системы, которые по началу наверняка отправят вашу новость в СПАМ. Как их победить я напишу в след. посте (нам потребуется DKIM, SPF и настойчивость 🙂 )
Но если ваша БД насчитывает 100.000 и более пользователей, которую вы собирали продолжительное время, то наверняка в каждой из рассылок ваш почтовый сервер делает двойную и бесполезную работу при отправке 20% писем, т.к. email данных пользователей уже не существуют:
1. Отправляет письмо пользователю email которого уже удален.
2. Получает ошибку от почтового сервера и перенаправляет её отправителю (если он не локальный)
Конечно, пункт 2 можно пресечь (в данном посте мы говорим исключительно о sendmail), установив директиву ErrorMode в q. Но правильнее будет все-таки отслеживать подобные email и предпринимать относительно них какие либо действия в зависимости от тематики вашего сайта: удалять, просить пользователя ввести новый email, исключать email из рассылки.
Чтобы отследить данные email, как один из вариантов можно, в качестве получателя ошибок установить спец. адрес, пришедшие письма на который разбирать на статус ошибки.
Установить получателя ошибок можно используя ключ -f “<email для ошибок>” при отправке письма, или через заголовок Errors-To (который переопределяет email, указанный в -f).
Пусть email Для ошибок будет “mail-errors@your-domain.com”. Если использовать модуль MIME::Lite, то код будет примерно таким:
1 2 3 4 5 6 7 8 9 10 |
$mail = new MIME::Lite( From => "sender@your-domain.com", To => "receiver@reciever-domain.ru", Subject => "This is subject", Type => "text/html; charset=utf-8", Data => "This is body" ); $mail->add('Errors-To' => 'mail-errors@your-domain.com'); $mail->send('sendmail'); # или $mail->send('sendmail', "/usr/lib/sendmail -f \"mail-errors@your-domain.com\""); |
Чтобы обработать все письма, которые буду приходить на mail-errors@your-domain.com, нужно добавить программу обработчик. Прописываем в /etc/aliases
1 |
mail-errors: "|/path_to_program/mail.errors.pl" |
Не забываем, запустить newaliases и перезапустить sendmail
Вероятнее всего при первом тестировании у вас появится ошибка типа
1 2 3 4 5 6 7 8 |
----- The following addresses had permanent fatal errors ----- "|/path_to_program/mail.errors.pl" (reason: Service unavailable) (expanded from: <mail-errors@your-domain.com>) ----- Transcript of session follows ----- smrsh: "mail.errors.pl" not available for sendmail programs (stat failed) 554 5.0.0 Service unavailable |
Правильно, нужно было почитать мануал. Делаем линк запускаемой программы в папку /etc/smrsh, т.е. в нашем случае:
1 |
# ln -s /path_to_program/mail.errors.pl /etc/smrsh/mail.errors.pl |
Код простейшего скрипта-обработчика:
1 2 3 4 5 6 7 8 |
#!/usr/bin/perl -w use strict; while (<>) { # что-то делаем с полученным письмом ... } print ""; |