52. Формат файлов спула
Сообщение в очереди exim`a состоит из двух файлов, чьи имена - идентификатор сообщения, сопровождаемый
“-D
” и
“-H
”, соответственно. Часть данных сообщения сохранется отдельно в файле
“-D
”. Конверт сообщения, статус и заголовки сохраняются в файле
“-H
”, чей формат описан в этой части. Каждый из этих двух файлов содержит финальный компонент его собственного имени, как его первая строка. Это страховка от дисковых ошибок, когда директория потеряна, но сами файлы - восстановимы.
“
Некоторые люди соблазняются редактированием файлов -D
” с целью модифицировать сообщения. Вы должны быть черезвычайно осторожными, если делаете это; это не рекомендуется, и вы делаете это на свой страх и риск. Вот, некоторые из ловушек:
Вы должны гарантировать, что exim не попытается доставить сообщение в тот момент когда вы играетесь с ним. Самый безопасный способ - заблокировать
“-D
” файл, также как это делает exim - используя
“
fcntl()
”. Если вы обновите файл на месте, блокировка останется. Если вы запишете новый файл и переименуете его, блокировка будет потеряна в момент переименования.
Если вы измените число строк в файле, значение
“
$body_linecount
”, которое сохранено в файле
“-H
”, будет некорректным. В настоящее время, это значение не используется exim`ом, но нет никаких гарантий, что так будет и дальше.
Если сообщение в формате MIME, вы должны позаботиться, чтобы не повредить его.
Если сообщение криптографически подписано, любое изменение делает подпись недействительной.
Файлы, чьи имена заканчиваются на
“-J
”, также могут быть замечены в директории
“
input
” (или в её субдиректориях, когда установлена
“
split_spool_directory
”). Это файлы журналов, используемые для записи адресов на которые сообщение было доставлено во времяработы доставки. В конце доставки, файл
“-H
” обновляется, и файл
“-J
” - удаляется.
52.1 Формат файла
“-H
”
Вторая строка файла
“-H
” содержит имя логина для uid процесса который вызвал exim для чтения сообщения, сопровождаемое цифровым uid и gid. Для локально сгенерённых сообщений, обычно это - пользователь пославший сообщение. Для сообщения полученного через TCP/IP - обычно, это пользователь exim`a.
“
Третья строка файла содержит адрес отправителя сообщения как передано в конверте, содержащийся в угловых скобках. Для рикошетов - адрес отправителя пустой. Для входящей SMTP почты, отправитель даётся в команде MAIL. Для локально сгенерированных сообщений, адрес отправителя создаётся exim`ом из имени логина текущего пользователя и сконфигурированного
qualify_domain
”. Однако, это может быть перезадано путём опции
“
-f
” или начальной строки
“From
”, если вызывающий - доверенный, или если предоставленный адрес -
“<>
”, или адрес совпадает с
“
untrusted_set_senders
”.
Четвёртая строка содержит два числа. Первое - время когда сообщение было получено, в обычном формате UNIX - число секунд от начала эпохи. Второе число - счётчик посланных отправителю предупреждений о задержанной доставке получателю.
Далее следует множество строк, начинающихся с дефиса. Они могут появляться в любом порядке, и пропущены, если неуместны:
“
-acl <number> <length>
” - Этот элемент является устаревшим, и не генерится начиная с релиза exim`a 4.61; вместо него используются
“
-aclc
” и
“
-aclm
”. Однако,
“
-acl
” всё ещё распознаётся, для обеспечения обратной совместимости. В старом формате, строки этой формы пристутствуют для каждой переменной ACL которая непуста. Число идентифицирует переменную; переменные
“
acl_cx
” нумеруются 0-9 и переменные
“
acl_mx
” нумеруются от 10 до 19. Длинна - длинна строки данных для переменной. Сама строка начинается со следующей строки, и сопровождается символом новой строки. Она может содержать внутренние новые строки.
“
-aclc <number> <length>
” - Строка этой формы представлена для каждой переменной ACL соединения, которая не пуста. Число идентифицирует перемнную. Длинна - длинна строки данных для переменной. Сама строка начинается со следующей строки, и сопровождается символом новой строки. Она может содержать внутренние новые строки.
“
-aclm <number> <length>
” - Строка этой формы представлена для каждой переменной ACL сообщения, которая не пуста. Число идентифицирует перемнную. Длинна - длинна строки данных для переменной. Сама строка начинается со следующей строки, и сопровождается символом новой строки. Она может содержать внутренние новые строки.
“
-active_hostname <hostname>
” - Она присутствует, если сообщение было передано через SMTP, и значение
“
$smtp_active_hostname
” отличается от значения
“
$primary_hostname
”.
“
-allow_unqualified_recipient
” - Она представлена если в строках заголовков разрешён неквалифицированный адрес получателя (для предотвращения таких адресов от квалификации, если перезапись происходит в транспортное время). Локальные сообщения, которые были введены используя
“
-bnq
” и удалённые сообщеняи от хостов, которые совпадают с
“
recipient_unqualified_hosts
” устанавливают этот флаг.
“
-allow_unqualified_sender
” - Она представлена если в строках заголовков разрешён неквалифицированный адрес отправителя (для предотвращения таких адресов от квалификации, если перезапись происходит в транспортное время). Локальные сообщения, которые были введены используя
“
-bnq
” и удалённые сообщеняи от хостов, которые совпадают с
“
sender_unqualified_hosts
” устанавливают этот флаг.
“
-auth_id <text>
” - Идентификационная информация для сообщения, полученного в аутентифицированной сессии - значение переменной
“
$authenticated_id
”.
“
-auth_sender <address>
” - Адрес аутентифицированного отправителя - значение переменной
“
$authenticated_sender
”.
“
-body_linecount <number>
” - Тут записано число строк сообщения, и присутстсвует всегда.
“
-body_zerocount <number>
” - Тут зписано число бинарных нулей в теле сообщения, и она представлена если число больше нуля.
“
-deliver_firsttime
” - Она записывается когда новое сообщение первый раз добавляется в спул. Когда файл спула обновлятся после задержки, она опускается.
“
-frozen <time>
” - Сообщение заморожено, и заморозка произошла в
“
<time>
”.
“
-helo_name <text>
” - Она записывает имя хоста заданное удалённым хостом в команде HELO или EHLO.
“
-host_address <address>.<port>
” - Она записывает IP-адрес хоста с которого передано сообщение и номер использованного удалённого порта. Она опускается для локально сгенерённых сообщений.
“
-host_auth <text>
” - Если сообщение передано через аутентифицированное SMTP соединение, она записывает имя аутентификатора - значение переменной
“
$sender_host_authenticated
”.
“
-host_lookup_failed
” - Она представлена если попытка поиска имени хоста отправителя по его IP-адресу была неудачной. Она соответствует переменной
“
$host_lookup_failed
”.
“
-host_name <text>
” - Она записывает имя удалённого хоста с которого было передано сообщение, если имя хоста найдено из IP-адреса, когда сообщение было получено. Она отстутствует, если обратный поиск не был завершён.
“
-ident <text>
” - Для локально переданных сообщений, эта запись - логин исходного пользователя, кроме случая когда пользователь доверенный и для задания значения ident использовалась опция
“
-oMt
”. Для сообщений переданных через TCP/IP, эта запись - строка ident, предоставленная удалённым хостом, если она была.
“
-interface_address <address>.<port>
” - Это - запись IP-адреса локального интерфейса и имя порта через который сообщение было принято с удалённого хоста. Она опущена для локально сгенерированных сообщений.
“
-local
” - Сообщение от локального отправителя.
“
-localerror
” - Сообщение - локально сгенерированный рикошет.
“
-local_scan <string>
” - Она записывает строку данных которую вернула функция
“
local_scan()
”, когда сообщение было получено - значение переменной
“
$local_scan_data
”. Она опущена, если данных возвращено не было.
“
-manual_thaw
” - Сообщение было заморожено, но было оттаяно вручную, т.е. явной командой exim`a, а не процессом автооттаивания.
“
-N
” - Процесс тестирования был начат используя опцию
“
-N
” для подавления любых актуальных доставок, но доставка задержана. Для любых последующих попыток доставки,
“
-N
” - присутствует.
“
-received_protocol
” - Она записывает значение переменной
“
$received_protocol
”, которая содержит имя протокола, по которому было получено сообщение.
“
-sender_set_untrusted
” - Отправитель конверта этого сообщения был установлен недоверенным локальным вызовом (используется для гарантии, что вызывающий показан в списках очереди).
“
-spam_score_int <number>
” - Если сообщение было просканировано SpamAssassin, она присутствует Она записывает значение
“
$spam_score_int
”.
“
-tls_certificate_verified
” - TLS сертификат был получен от клиента, который послал это сообщение, и сертификат был проверен сервером.
“
-tls_cipher <cipher name>
” - Когад сообщение получено через шифрованное соединение, она записывает имя использовавшегося алгоритма шифрования.
“
-tls_peerdn <peer DN>
” - Когда сообщение было получено по шифрованному соединению, и сертификат был передан с клиента, она записывает Distinguished Name (DN) этого сертификата.
После опций присутствует список тех адресов на которые сообщение не было доставлено. Этот набор адресов инициализируется из командной строки когда используется опция
“
-t
” и установлена
“
extract_addresses_remove_arguments
”; иначе она выпускается пустой. Каждый раз, когда произведена успешная доставка, адрес добавляется к этому набору. Адреса сохраняются внутренне, как балансированное бинарное дерево, и это - представление того деревакоторое пишется в файл спула. Если адрес раскрывается через файл альясов или форвардов, оригинальный адрес добавляется к дереву, когда завершается доставка всех дочерних адресов.
Если дерево пусто, присутствует единственная строка в файле спула, содержащая лишь текст
“XX
”. Иначе, каждая строка содержит две буквы, являющиеся
“Y
” или
“N
”, сопровождаемые адресом. Адрес - значение для узла дерева, и буквы индицируют, имеет ли узел присоединенннёю левую ветвь и/или правую ветвь, соответственно. Если ветви существуют, они следуют немедленно. Вот пример дерева с тремя узлами:
|
После дерева неполучателей,есть список получателей сообщения. Это простой список, с предществующим счётчиком. Он включает оригинальных получателей сообщения, включая те, кому сообщение уже доставлено. В простом случае, список содержит один адрес на строку. Например:
|
Однако, когда дочерний адрес добавляется к списку вышестоящих адресов как результат использования опции
“
one_time
” в роутере
“
redirect
”, каждая строка имеет следующую форму:
|
Флаг 01 указывает присутствие трёх других полей, которые сопровождают адрес высшего уровня. Иные биты могут использоваться в будущем, для поддержки дополнительных полей. Смещение
“
<parent number>
” в списке получателей оригинального родителя адресов
“one time
” (нифига не понzл чё написал - прим. lissyara). Первые два поля - отправитель конверта, который ассоциирован с этим адресом и его длиной. если длинна - ноль, специальный отправитель конверта отстутствует (тогда в строке два символа пробела). Непустое поле может являться результатом роутера
“
redirect
” у котором установлена
“
errors_to
”.
Пустая строка отделяет конверт и статутсную информацию от следующих заголовков. Заголовок может занять несколько строк файла, и с целью экономии усилий при его чтении, каждому заголовку предшествует число и идентификационный символ. Число - чисто символов в заголовке, включая любые встроенные новые строки и завершающую новую строку. Символ - один из следующиж:
|
Удалённые или заменённые (перезаписанные) заголовки остаются в файле спула для отладки. Они не передаются при доставке сообщения. Вот - типичный набор заголовков:
|
Заголовки помеченные звёздочкой индицируют, что отправитель конверта, заголовок
“
From:
”, и заголовок
“
To:
” были перезаписаны, последний потому что роутинг привёл к неквалифицированному домену
“
foundation
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200