Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

52. Формат файлов спула

Сообщение в очереди exim состоит из двух файлов, чьи имена представляют собой идентификатор сообщения, сопровождаемый -D и -H, соответственно. Часть данных сообщения сохранется отдельно в файле -D. Конверт сообщения, статус и заголовки сохраняются в файле -H, чей формат описан в этой части. Каждый из этих двух файлов содержит финальный компонент его собственного имени, как первую строку. Это страховка от дисковых ошибок, когда каталог потерян, но сами файлы восстановимы.

Некоторые люди соблазняются редактированием файлов -D с целью модифицировать сообщения. Вы должны быть черезвычайно осторожными, если делаете это: такое не рекомендуется, и Вы делаете это на свой страх и риск. Вот некоторые из ловушек:

Файлы, чьи имена заканчиваются на -J, также могут быть замечены в каталоге input (или в его субкаталогах, когда установлена split_spool_directory). Это файлы журналов, используемые для записи адресов, на которые сообщение было доставлено во время работы доставки. В конце доставки файл -H обновляется, а файл -J удаляется.

52.1. Формат файла -H

Вторая строка файла -H содержит логин для uid процесса, который вызвал exim для чтения сообщения, сопровождаемое цифровым uid и gid. Для локально сгенерированных сообщений обычно это пользователь, пославший сообщение. Для сообщения, полученного через TCP/IP, это пользователь exim.

Третья строка файла содержит адрес отправителя сообщения как передано в конверте, содержащийся в угловых скобках. Для рикошетов адрес отправителя пустой. Для входящей SMTP-почты отправитель даётся в команде MAIL. Для локально сгенерированных сообщений адрес отправителя создаётся exim из логина текущего пользователя и сконфигурированного qualify_domain. Однако, это может быть перезадано путём опции -f или начальной строки From, если вызывающий доверенный, предоставленный адрес <> или адрес совпадает с untrusted_set_senders.

Четвёртая строка содержит два числа. Первое время, когда сообщение было получено, в обычном формате UNIX: число секунд от начала эпохи. Второе число счётчик посланных отправителю предупреждений о задержанной доставке получателю.

Далее следует множество строк, начинающихся с дефиса. Они могут появляться в любом порядке и пропущены, если неуместны:

После опций присутствует список тех адресов, на которые сообщение не было доставлено. Этот набор адресов инициализируется из командной строки, когда используется опция -t и установлена extract_addresses_remove_arguments, иначе она выпускается пустой. Каждый раз, когда произведена успешная доставка, адрес добавляется к этому набору. Адреса сохраняются внутренне, как балансированное бинарное дерево, а это представление того дерева, которое пишется в файл спула. Если адрес раскрывается через файл алиасов или форвардов, оригинальный адрес добавляется к дереву, когда завершается доставка всех дочерних адресов.

Если дерево пусто, присутствует единственная строка в файле спула, содержащая лишь текст XX. Иначе, каждая строка содержит две буквы, являющиеся Y или N, сопровождаемые адресом. Адрес задает значение для узла дерева, и буквы индицируют, имеет ли узел присоединенннёю левую и/или правую ветвь, соответственно. Если ветви существуют, они следуют немедленно. Вот пример дерева с тремя узлами:
YY darcy@austen.fict.example
NN alice@wonderland.fict.example
NN editor@thesaurus.ref.example

После дерева неполучателей есть список получателей сообщения. Это простой список с предществующим счётчиком. Он включает оригинальных получателей сообщения, включая тех, кому сообщение уже доставлено. В простом случае список содержит один адрес на строку. Например:
4
editor@thesaurus.ref.example
darcy@austen.fict.example
rdo@foundation
alice@wonderland.fict.example

Однако, когда дочерний адрес добавляется к списку вышестоящих адресов как результат использования опции one_time в роутере redirect, каждая строка имеет следующую форму:
<top-level address> <errors_to address> <length>,<parent number>#<flag bits>

Флаг 01 указывает присутствие трёх других полей, которые сопровождают адрес высшего уровня. Иные биты могут использоваться в будущем для поддержки дополнительных полей. Смещение <parent number> в списке получателей оригинального родителя адресов one_time. Первые два поля: отправитель конверта, который ассоциирован с этим адресом и его длиной. Если длина ноль, специальный отправитель конверта отстутствует (тогда в строке два символа пробела). Не пустое поле может являться результатом роутера redirect: в котором установлена errors_to.

Пустая строка отделяет конверт и статутсную информацию от следующих заголовков. Заголовок может занять несколько строк файла и с целью экономии усилий при его чтении каждому заголовку предшествует число и идентификационный символ. Число определяет количество символов в заголовке, включая любые встроенные новые строки и завершающую новую строку. Символ один из следующих:
символ
значение
<blank> заголовок, который не интересует exim
B заголовок Bcc:
C заголовок Cc:
F заголовок From:
I заголовок Message-id:
P заголовок Received: (P означает почтовый штемпель)
R заголовок Reply-To:
S заголовок Sender:
T заголовок To:
* заменённый или удалённый заголовок

Удалённые или заменённые (перезаписанные) заголовки остаются в файле спула для отладки. Они не передаются при доставке сообщения. Вот типичный набор заголовков:
111P Received: by hobbit.fict.example with local (Exim 4.00)
id 14y9EI-00026G-00; Fri, 11 May 2001 10:28:59 +0100
049  Message-Id: <E14y9EI-00026G-00@hobbit.fict.example>
038* X-rewrote-sender: bb@hobbit.fict.example
042* From: Bilbo Baggins <bb@hobbit.fict.example>
049F From: Bilbo Baggins <B.Baggins@hobbit.fict.example>
099* To: alice@wonderland.fict.example, rdo@foundation,
darcy@austen.fict.example, editor@thesaurus.ref.example
104T To: alice@wonderland.fict.example, rdo@foundation.example,
darcy@austen.fict.example, editor@thesaurus.ref.example
038  Date: Fri, 11 May 2001 10:28:59 +0100

Заголовки, помеченные звёздочкой, индицируют, что отправитель конверта, заголовок From: и заголовок To: были перезаписаны, последний потому, что роутинг привёл к неквалифицированному домену foundation.