RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

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

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

Сообщение в очереди exim состоит из двух файлов, чьи имена представляют собой идентификатор сообщения, сопровождаемый -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.

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

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

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

  • -acl number length: Этот элемент является устаревшим и не генерируется начиная с релиза exim 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, а не процессом автооттаивания.
  • -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, сопровождаемые адресом. Адрес задает значение для узла дерева, а буквы индицируют, имеет ли узел присоединенннёю левую и/или правую ветвь, соответственно. Если ветви существуют, они следуют немедленно. Вот пример дерева с тремя узлами:
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. Первые два поля: отправитель конверта, который ассоционирован с этим адресом и его длиной. Если длина 0, специальный отправитель конверта отстутствует (тогда в строке два символа пробела). Не пустое поле может являться результатом роутера 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.

Поиск

 

Найди своих коллег!