Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

GNU Mailman

Глава 10 из книги "Архитектура приложений с открытым исходным кодом", том 2.

Оригинал: GNU Mailman
Автор: Barry Warsaw
Перевод: А.Панин

10.7. VERP

Аббревиатура VERP расшифровывается как Variable Envelope Return Path и используется для обозначения широко известной техники, используемой списками рассылок для однозначного определения реального адреса принимающей стороны. Когда адрес в списке рассылки перестает быть активным, почтовый сервер принимающей стороны отправит уведомление об этом отправителю сообщения. В случае списки рассылки вам потребуется сделать так, чтобы это уведомление было отправлено в список рассылки, а не автору оригинального сообщения; автор не сможет сделать ничего с уведомлением и хуже того, отправка сообщения назад автору может раскрыть информацию о том, кто подписан на список рассылки. Когда список рассылки получает уведомление, однако, он может выполнить какое-либо полезное действие, такое, как отключение адреса из уведомления или удаление подписки на список рассылки, использующей этот адрес.

При этом существуют две основные проблемы. Во-первых, даже с учетом того, что существует стандартный формат описанных выше уведомлений (называемый delivery status notifications), многие используемые серверы электронной почты не соблюдают его. Вместо этого основная часть их уведомлений может содержать любой объем сложно разбираемого программно текста, что затрудняет их автоматическую обработку. Фактически система Mailman использует библиотеку, содержащую множество данных для эвристического анализа уведомлений, сформированную из данных реально принятых уведомлений за период 15 лет существования Mailman.

Во-вторых, представим ситуацию, при которой участник списка рассылки использует несколько перенаправлений сообщений. Участница может быть подписана на список рассылки с использованием ее адреса anne@example.com, но сообщения с него могут перенаправляться на адрес person@example.org, с которого сообщения также могут перенаправляться на адрес me@example.net. Когда последний сервер example.net получает сообщение, он обычно просто отправляет сообщение, указывающее на то, что адрес me@example.net более не действителен. Но сервер Mailman, отправивший сообщение, знает только об адресе участника anne@example.com, поэтому уведомление о недействительном адресе me@example.net не будет содержать адреса подписчика и Mailman проигнорирует его.

В данном случае используется техника VERP, которая эксплуатирует фундаментальное требование к протоколу SMTP о предоставлении возможности однозначного определения адреса назначения путем возвращения таких уведомлений отправителю сообщения (envelope sender). Эта операция осуществляется не с использованием поля From: сообщения, а фактически с использованием значения MAIL FROM, устанавливаемого во время диалога SMTP. Эта информация сохраняется в ходе доставки сообщения и конечный почтовый сервер должен, в соответствии со стандартами, отправлять уведомления на полученный адрес. Система Mailman использует этот факт для кодирования оригинального адреса назначения в качестве значения MAIL FROM.

Если сервер Mailman использует адрес mylist@example.org, то закодированный адрес отправителя сообщения для размещения в списке рассылки с помощью технологии VERP, отправляемый на адрес anne@example.com, будет следующим:
mylist-bounce+anne=example.com@example.org

В данном случае символ + используется для отделения локального адреса, причем это форматирование поддерживается большинством современных почтовых серверов. Таким образом, когда сообщение возвратится, оно на самом деле будет доставлено на адрес mylist-bounce@example.com, но в заголовке To: будет находиться закодированный с использованием техники VERP адрес получателя. После этого система Mailman может произвести разбор этого заголовка To: для декодирования оригинального адреса назначения в виде anne@example.com.

Хотя техника VERP и является очень мощным инструментом для фильтрации некорректных адресов и недопущения их попадания в список рассылки, она имеет один потенциально важный недостаток. Использование техники VERP требует от системы Mailman отправки только одной копии сообщения для каждой принимающей стороны. Без техники VERP система Mailman могла отсылать наборы идентичных копий исходящих сообщений множеству принимающих сторон, экономя тем самым общую пропускную способность канала и время обработки сообщений. Но техника VERP требует использования уникального значения MAIL FROM для каждой принимающей стороны, а единственным способом удовлетворения этого требования является отправка уникальных копий сообщения. В общем случае это приемлемый компромисс и, фактически, вместе с отправкой этих индивидуальных сообщений для задействования техники VERP, система Mailman также сможет сделать множество полезных вещей в любом случае. Например, она может встраивать строку URL в заключительную часть сообщения, сформированную для каждого из подписчиков и позволяющую использовать прямую ссылку для закрытия подписки. Вы можете представить множество различных типов операций обработки сообщений с целью модификации текста сообщения для каждого индивидуального подписчика.


Далее: Модель передачи состояния представления REST