Перейти к основному содержимому

Email-рассылка со своего сервера: подводные камни

· 4 мин. чтения

Недавно мы по ряду причин решили отказаться от стороннего сервиса для email-рассылок и осуществлять рассылки со своего сервера. Я бы хотел указать на ряд трудностей, с которыми мы столкнулись в процессе, и пути их решения.

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

Автоответчик

Будьте готовы к тому, что люди не понимают, зачем нужен автоответчик. На вас посыпятся сотни очень важных автоответов: "Спасибо!", "Я получил ваше письмо, отвечу, как только смогу" (вот зачем мне это?), или даже просто "адылопрыда". Их что, насильно заставляют заполнять поле автоответа?! Причем у большинства автоответофилов ящик на mail.ru (с трудом воздерживаюсь от комментариев по этому поводу).

Учитывая, что у нас из ответов на письма по рассылке формируются тикеты в хелпдеске, заваливать поддержку сотнями бесполезных тикетов после каждой рассылки не хочется.

Как с ними бороться? Казалось бы, открываем RFC, читаем, что нам нужно парсить заголовок Auto-Submitted: на предмет его наличия и неравенства значения слову no и получаем профит. Так? Неа. Ключевое слово там SHOULD. И если, например, gmail, yandex и yahoo восприняли это как руководство к действию, то вот mail.ru (опять ты?) слишком горд, чтобы слушать чьи-то советы. Спасибо хоть за заголовок X-AutoReply. Туда же идет и rambler со своим X-Autogenerated. Страшно представить, что на этот счет придумали еще более невменяемые серверы типа i.ua (о них еще пойдет речь), но от них пока автоответов не приходило. Может, у них просто вообще такой функции нет?

Server name

Помните, что в параметре myhostname postfix'а должен быть указан FQDN. И если у вас там будет стоять не example.com, а просто example, то могут возникнуть проблемы с доставкой письма. Опять же, Gmail, Yandex и даже MailRu на это забивают, но вот тот самый злополучный i.ua (а также ukr.net) просто отпинывает письма, никак это не комментируя.

Greylisting

Еще одна подлянка от ukr.net. На эту тему у них есть только вот такой придурковатый FAQ. Суть в том, что если ваш сервер не известен укрнету, то письма он доставлять сразу не будет. Чтобы попасть в его белый список, надо послать то же самое письмо через определенный промежуток времени. К счастью, postfix по умолчанию поддерживает эту опцию, так что надо просто подождать несколько часов после первого письма.

Quarantine

Нас вновь радует i.ua. По какой-то, известной только ему, причине он решил поместить часть наших писем в карантин. Чтобы вытащить их из этого карантина, нужно ввести код, отправленный в письме, или перейти по ссылке в этом же письме. Тут я уже сдался - писать отдельный парсер служебных писем для удовлетворения прихоти параноидально настроенных админов в мои планы не входило.

Верстка

По поводу самой верстки писем на хабре уже была куча статей, вряд ли я добавлю к ним что-то новое. Я выступлю немного с другой позиции: что делать, когда уже есть сверстанная страница на сайте, а ее надо отправить письмом. У нас, например, есть рассылка, которая частично состоит из материалов на сайте. Не переверстывать же ее специально под письмо? А если таких страниц почти 200? И периодически в них вносятся правки?

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

В планах вот еще есть встроить ее в сайтовый workflow, чтобы она автоматически создавала email-версию при изменении контента.

Отписаться от рассылки

Про заголовок List-Unsubscribe на том же хабре писали еще в 2010 году. Тут главное помнить, что в том же Gmail, чтобы в письме появилась кнопка "Отписаться", надо, чтобы гугл считал вас добросовестным отправителем. На практике надо правильно настроить DKIM, в том числе учесть следующий пункт. Также, как минимум, гугл не требует, чтобы в заголовке List-Unsubscribe была именно mailto: ссылка, достаточно ссылки на сайт со страницей отписки.

DKIM: Body hash did not verify

Столкнулся с такой фразой в заголовках письма, когда заметил, что в части отправленных писем GMail не помещает кнопку "Отписаться". По сути, здесь всё просто - тело письма было изменено уже после подписывания, поэтому хэши не совпадают.

Выяснить причину этого было уже не так просто. Но покопавшись, я выяснил, что согласно RFC2822 длина строки тела сообщения не должна превышать 998 символов. По какой-то причине postfix (насколько я понял) расставляет переносы уже после подписывания письма, поэтому лучше подавать постфиксу на вход письмо с уже правильно расставленными переносами.

Вот пока и всё.