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




    =============
    Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200