[Карта]                [Начало]                [Sendmail-ссылки]                [Синтаксис]                [Типовые задачки]                  [Задачки по маршрутизации]                  [Задачки по маcкарадингу]                  [SendmailACL]                  [Spamooborona]                  [VadeRetro]                  [Regex]                  [Тонкости]                  [Недок.особен.]                  [Несущ.юзеры]                  [Прячемся!]                  [RFC1893.Цитаты]                  [ТП.Эмоции]                  [Антиспам&Разум]                  [Экзерсисы]                 


Задачки по маршрутизации.


  • 1. Использование LOCAL_RULE_0: теория и особенности решений.
  • 2.Задачки.
  • 2.2. Перенаправляем в локальный ящик почту, пришедшую с адресов релеев, которые попали в dnsbl-базы.
  • 2.3. Перенаправляем в локальный ящик почту, пришедшую с адресов релеев, которые попали в dnsbl-базы и по результатам попадания набравшую определенный вес.
  • (Назначаем каждому срабатыванию по базам dnsbl определенный вес, суммируем все значения, по результатам пропускаем или складываем в отдельный ящик.)
  • 2.4. Перенаправление почты в зависимости от адреса получателя и ip-адреса релея, с которого пришло письмо.
  • 2.5. Перенаправление почты в случае, когда отправитель и получатель совпадают.
  • 2.6 Перенаправление почты в зависимости от ключевых слов в имени и домене получателя.
  • 2.7. Перенаправление почты несуществующим юзерам на другой почтовик этим же юзерам.
  • 2.8. Подмена получателя: genericuser+somevariablestring@mydomain.com -> genericuser@mydomain.com.
  • 2.9. Как видоизменить адрес получателя (добавляем 3 цифры перед адресом).
  • 2.10. Как обрабатывать почту, поступающую с отдельных IP, отдельным mailer'ом?
  • 2.11. Smarthost & индивидуальный маршрут для отдельного адреса.
  • 2.12. Как перенаправлять почту в зависимости от размера сообщения.
  • 2.12.


  • 1. Использование LOCAL_RULE_0: теория и особенности решений.

    Частная маршрутизация в sendmail.cf возможна посредством рулсета LOCAL_RULE_0.
    Sendmail book by Bryan Costales with Eric Allman: "...
    In rule 0, after local delivery agent has been selected and before the uucp, smtp and the like have been selected, you can insert custom delivery agents of your own. To do this, use the LOCAL_RULE_O macro:

    LOCAL_RULE_0
    #We service lady via an mx record.
    R$+< lady.Berkley.EDU. >             $#uucp $@ lady $: $1
    Here, we introduce a new rule to select a delivery agent. The host lady is a UUCP host for which we accept mail via an MX record.
    ..."
    Про общую маршрутизацию можно почитать здесь.

    1.1 Особенности решений по перемаршрутизации почты в LOCAL_RULE_0.

    1.1.1 Четырехкратное и более исполнение правил из LOCAL_RULE_O.

    06.10.2008.Nota Bene!
    Все решения по перемаршрутизации почты, решаемые в рулсете LOCAL_RULE_0 (о нем читайте дальше в п. Теория), имеют важную особенность. Оказывается, этот рулсет исполняется от 4 и более раз, в зависимости от того, сколько получателей письма, есть ли алиасы среди получателей, заказана ли перемаршрутизация по данному письма в virtusertable & mailertable. То есть в самом-самом-самом простом случае количество проходов этого рулсета будет равно 4 (!!!): два прохода сначала (отдельно для отправителя и получателя) и два в конце.
    Вот на борьбу с "лишними" проходами у меня ушла уйма времени. Кстати, они видны только при выводе в лог, а вот если использовать тестовый режим sendmail'a, то вы увидите только два прохода (отправитель, получатель). Вот почему я редко использую sendmail -bt.

    Обращаю ваше внимание, что здесь речь идет именно о многократных проходах, но не о многократном принятии решения. То есть в итоге маршрут будет выбран только в последнем проходе, когда DeliveryMode=interacrive & addr_type=< e s > ( когда разбирается конвертный получатель). Это означает, что невозможно изменить маршрут письма на этапе разбора адреса конвертого отправителя (DeliveryMode=interacrive & addr_type=< e r >). Ведь бывают задачки, когда для определения маршрута письма достаточно знать только адрес отправителя, и казалось бы, можно оптимизировать исполнение LOCAL_RULE_0, указав другой маршрут письма сразу после обработки адреса отправителя. Но не тут-то было. Все равно LOCAL_RULE_0 исполнится и для адреса отправителя, и для адреса получателя, и на этом последнем этапе и произойдет "настоящий" выбор маршрута.

    В первой задачке мне удалось избавиться от двух проходов, когда разбирается отправитель. Это сделано за счет привлечения дополнительного макроса $&f. В первый раз он пустой. Но получатель анализируется все еще дважды, это видно по логу. Минус этого способа в том, что когда приходит письмо от MAILER-DAEMON (т.е. в этом случае макрос <$&f> будет выглядеть как <>), этот набор правил и вовсе не исполняется ни разу, что не есть хорошо, но от этого никак не избавиться в этом способе. Я не стала ее переписывать по образу и подобию второй и остальных задачек, нет времени, но сделать это будет нетрудно.
    Во второй задачке (и остальных) мне удалось добиться единственной проверки на одно письмо с помощью макросов <$&{addr_type}> (рекомендация Анджея для обхода набора правил, когда разбирается отправитель, это позволяет исполняться правилам только для получателя) и <$&{deliveryMode}>(для обхода первого прохода, когда значение <$&{deliveryMode}> равно <b>; мой же набор исполняется во время второго прохода, когда значение <$&{deliveryMode}> равно < i > ), но мое решение (в части использования <$&{deliveryMode}>) не одобрил гуру sendmail'a Andrzej Adam Filip.
    Про <$&{addr_type}> - этот макрос сравнительно новый. RELEASE_NOTES:"...
    8.12.0/8.12.0 2001/09/08
    New macro {addr_type} which contains whether the current address is an envelope sender or recipient address. Suggested by Neil Rickert of Northern Illinois University..."
    Досье на <$&{deliveryMode}> и объяснение тому, почему я использовала <$&{deliveryMode}> для оптимизации решений задачек по маршрутизации, здесь.
    Несмотря на неодобрение гуру, я выкладываю все решения по маршрутизации, потому что считаю эти задачки интересными, но вот мне данный функционал пока не нужен, а, значит, я не могу долго тестировать эти решения, а прийти к правильному и грамотному решению очень хочется. Поэтому было бы интересно услышать мнения по поводу других возможных решений этих задачек.

    14.10.2008. Кстати, только теперь мне стало понятно, что имел в виду уважаемый Z0termaNN, когда в треде про копирование почты сказал "...только этот способ намного более дорогой, чем addrcpt в milter, т.к. каждое сообщение обрабатывается 2 раза, а кроме того на каждое копирование производится запуск sendmail. такими приемами пользовались когда milterа не было, да и то не всегда."
    Так как рулсет, в котором располагается известное решение O. Koreshkov по копированию почты, - ни что иное, как LOCAL_RULE_0, то это решение обладает всеми побочными эффектами, о которых было сказано выше.
    Конечно, хотелось бы переписать это решение, оптимизировав его, но мне данный функционал не нужен. Если у кого-либо есть время и желание протестировать новое решение - пишите, попробуем.


    1.1.2 Обязательное возвращение поданного на вход значения на выходе, если не сработало ни одно из наших правил перемаршрутизации.

    Однажды я совершила грубейшую ошибку. В знак того, что при соблюдении некоего условия в LHS мой локальный набор LOCAL_RULE_0 окончен, а следовательно окончена и та часть senmdail.cf, которая принимает решение о маршруте письма, я написала следующее правило:
    R$* условие $*                   $@ OK
    Эта техника применяется и имеет на то полное право в локальных рулсетах Local_check_(relay|mail|rcpt)& Check(Received|From|To|Subject|etc).
    Так как вызов Local_check_(relay|mail|rcpt) предваряется копированием исходного значения, поданного на вход в check_(relay|mail|rcpt) с последующим возвращением этого значения для дальнейшей работы или завершением рулсета, если в локальном наборе случился $#(error|discard), то использование аналогичного правила в Local_check_(relay|mail|rcpt)
    R$* условие $*                   $@ OK
    приведет к благополучному завершению локального рулсета и продолжению работы глобального рулсета check_(relay|mail|rcpt) .
    В случае с Check(Received|From|To|Subject|etc) вообще не имеет значения, каким значением окончится работа любого из этих рулсетов в случае благополучного прохождения всех проверок.

    Но не тут-то было с LOCAL_RULE_0. Этот локальный набор завершает набор правил, определяющий маршрут письма. Поэтому возвращаемое значение целиком и полностью влияет на маршрут.

    Догадайтесь, что я потом делала весь день ???
    Правильно, вычищала ящик OK: в него исправно складывалась вся почта, проходившая через мой почтовик в течение всего времени, пока я не заподозрила неладное. А это было около 400 писем. Ну никогда я так не радовалась спаму, как в тот день: больше половины писем было помечено спам-меткой VadeRetro и потому сразу прибито. Ну а остальную почту я уже рассылала руками. Дааа, нелегкая, я вам скажу, работа у Почтальона...

    Кстати, одно время в детстве я мечтала быть Почтальоном. Каждое лето я проводила у бабушек в деревне. Почтальоном тогда работала одна добрая улыбчивая женщина с очень грустными глазами. Мне очень-очень нравился ее огромный коричневый кожаный сильно потертый портфель Почтальона, который она никогда не снимала с плеча и который казался каким-то таинственным кладом людских горестей и радостей, поздравительных открыток, писем, телеграм и (самое вкусное) посылок. И всегда было радостно, когда она заходила в наш зеленый двор, ведь это означало, что пришло письмо от мамы или пенсии :) бабушкам. А тогда в магазине продавали ну очень вкусные леденцы-петушки на настоящей деревянной(!!!) палочке по 5 копеек за штуку ...
    Так вот, кто-то сказал "мечтайте осторожно, мечты иногда сбываются". В тот день я вспомнила свою детскую мечту ... Ой, как она мне аукнулась! Врагу не пожелаю. Ладно хоть не ногами ходить-разносить почту пришлось, а всего лишь ручками раскидать ...

    Обратите внимание, я выделила красным цветом все правила, где я возвращаю исходное значение.


    1.1.3. Полная и краткая форма возвращаемого из LOCAL_RULE_0 значения.

    Это моя догадка. Вообще-то, я всегда использовала полную форму. Но стала замечать, что в примерах на sendmail-конфе часто обходятся простой формой, если речь идет о mailer'ах по умолчанию.
    Если $+ - адрес локального юзера user@mail.anrb.ru и определен MAILER(local), то запись
    R$+               $#local $: $1
    равносильна
    R$+               $: $1
    Если $+ - адрес не локального юзера user@apache.anrb.ru, и определен MAILER(smtp), то запись
    R$+                   $#esmtp $@apache.anrb.ru $: $1
    также равносильна
    R$+               $: $1
    То есть при упрощенной форме записи sendmail сам разберется, локальный это адрес или нет, и выберет для этого получателя мэйлер и маршрут по умолчанию.
    А вот если нужно изменить или мэйлер, или маршрут, или получателя, тогда следует использовать полную форму:
    R$+<@apache.anrb.ru.>                   $#esmtp $@liguria.anrb.ru $: $1<@liguria.anrb.ru.>


    1.1.4. $#error вызывает error bounce message.

    Отказ от приема письма в любом из рулсетов check_* & Check_* (за исключением check_compat) на нашем сервере означает отказ от письма на этапе smtp-диалога. Получив отказ, удаленный сервер сам генерирует сообщение об ошибке и доставляет отправителю. То есть работа по извещению отправителя ложится на плечи сервера-отправителя. В случае с LOCAL_RULE_0 мы будем иметь дело с гораздо более затратным error bounce message. Отказ от приема письма в рулсете LOCAL_RULE_0 на нашем сервере приведет к формированию сообщения об ошибке на нашем сервере и последующую доставку error bounce message на удаленный сервер-отправитель. А такого отправителя может и не быть. Это означает, что "двойной отказ" свалится в почтовый ящик Постмастера либо другой персоны, указанной в опции confDOUBLE_BOUNCE_ADDRESS.

    1.1.5. LOCAL_RULE_0 & (virtusertable|mailertable)

    Вопрос о совместном использовании LOCAL_RULE_0 и virtusertable, mailertable (если они уже имеются или в них возникнет необходимость потом) пока оставляю открытым.
    Будут ли они друг дружке мешать? Что исполнится первым, вторым, третьим. Не перепишут ли они решения друг друга?


    1.2 Теория.
    1.2.1. Про синтаксис $# (настоящие и ненастоящие мэйлеры).

    Долгое время я пребывала в уверенности в том, что почту, отфильтрованную sendmail'ом, нельзя пересылать другому пользователю. А можно лишь отказаться от нее на этапе SMTP-диалога.
    Эта убежденность была основана на том, что Subject, внутренние To & From, MessageID, $&{currHeader}, etc мы можем проверить только в тех рулсетах, в которых НЕВОЗМОЖЕН вызов настоящего mailer'a.

    Настоящий mailer - это только мое определение, и оно означает следующие mailer'ы:
    -local
    -smtp
    -esmtp
    -uucp
    -etc
    Ненастоящие mailer'ы:
    -error
    -discard
    Ненастоящие $#error & $#discard хоть и называются почтовыми программами со специальными именами, на самом деле используются для блокировки поступления письма получателю: error сгенерирует сообщение об ошибке, но при этом письмо не примет (за исключением рулсета check_compat), и доставкой извещения об ошибке отправителю будет заниматься почтовик-отправитель.
    Discard же сначала получит письмо, а затем его уничтожит, не известив об этом ни получателя, ни отправителя.

    Считаю, что /../sendmail/doc/op/op.me по поводу $# высказывается непрозрачно:
    "... The $# syntax should only be used in ruleset zero, a subroutine of ruleset zero,
    or rulesets that return decisions (e.g., check_rcpt).

    It causes evaluation of the ruleset to terminate immediately,
    and signals to sendmail that the address has completely resolved.
    The complete syntax for ruleset 0 is:
    #mailer $@host $:user
    This specifies the {mailer, host, user} 3-tuple necessary to direct the mailer..."
    То есть в переводе на русский вызов mailer'a возможен лишь в наборах правил 0, его подпрограммах, а также в рулсетах, принимающих решение (например, check_rcpt). А где 5-ый рулсет?
    Вот опять-таки обтекаемая формулировка: рулсеты, принимающие решения. Конечно, по примеру можно сказать, что это будут рулсеты check_(relay|mail|rcpt|eoh) плюс рулсеты, проверяющие подзаголовки письма (Check(From|Subject|To|Received|Header|MessageId|etc...)) А как быть с остальными рулсетами? По мне, так каждый рулсет принимает решение.
    В этой цитате нет четкого разделения, когда все-таки можно вызывать "настоящий" mailer, когда - "ненастоящий" #error, а когда "ненастоящий" #discard.
    Кстати, в переводе Плотникова эта часть ("or rulesets that return decisions (e.g., check_rcpt)") опущена. Не в первый раз убеждаюсь, что все-таки лучше читать оригинал.

    Если внимательно просмотреть sendmail.cf, то можно убедиться, что "настоящий" mailer вызывается в рулсете 0 и в рулсетах, которые он (S0) вызывает, а также в 5 рулсете (localaddr). И все.

    Теперь открываем второе издание книги "Sendmail" Bryan Costales и находим упоминание про пятый рулсет. Раздел 8.3 гласит:
    "S0 - Purpose: Resolve mail delivery agent"
    9.3: "Rule set 0 is different from the other rule sets
    [skip]
    Rule set 0 is one of the few rule sets that may user $# to return the symbolic name of a delivery agent (Rule set 5 can also return a $#")..."
    А какие же это именно "few rule sets" не сказано.

    По поводу же ненастоящих мэйлеров op.me гласит
    The mailer with the special name error can be used to generate a user error.
    The (optional) host field is an exit status to be returned,
    and the user field is a message to be printed.
    The exit status may be numeric or one of the values
    USAGE, NOUSER, NOHOST, UNAVAILABLE, SOFTWARE, TEMPFAIL, PROTOCOL, or CONFIG
    to return the corresponding EX_ exit code,
    or an enhanced error code as described in RFC 1893,
    Enhanced Mail System Status Codes.
    For example, the entry:
    $#error $@ NOHOST $: Host unknown in this domain
    on the RHS of a rule will cause the specified error to be generated
    and the "Host unknown" exit status to be returned if the LHS matches.
    This mailer is only functional in rulesets 0, 5, or one of the check_* rulesets.
    The host field can also contain the special token quarantine
    which instructs sendmail to quarantine the current message.
    The mailer with the special name discard causes any mail sent to it to be discarded
    but otherwise treated as though it were successfully delivered.
    This mailer cannot be used in ruleset 0, only in the various address checking rulesets.
    "various address checking rulesets" - это что? это где?
    И опять-таки последняя фраза противоречит уже процитированному
    "The $# syntax should only be used in ruleset zero, a subroutine of ruleset zero, or rulesets that return decisions (e.g., check_rcpt)."

    Насколько я понимаю из сопоставления всех этих цитат и анализа sendmail.cf, все-таки:
    1."Настоящий мэйлер", f.e., smtp может быть вызван только в рулсетах 0 (вместе с поднаборами) и 5.
    2. "Ненастоящий мэйлер" error м.б. вызван в рулсетах 0,5, и всех check_* & Check_*
    3. "Ненастоящий мэйлер" discard м.б. вызван только в check_* & Check_*
    4. Еще один вариант использования синтаксиса $# . Это не вызов мэйлера, это просто фишка для выхода из поднабора правил и возвращения в основной набор.

    Итак, все неясности-неточности описаны, но я не могу ждать, когда что-то прояснится, поэтому беру на вооружение README и дальше работаю с локальным рулсетом LOCAL_RULE_0.

    README гласит:
    "Similarly, LOCAL_RULE_0 can be used to introduce new parsing rules."
    Слово LOCAL в названии рулсета означает, что все правила из этого набора будут добавлены в рулсет 0, а следовательно, в нем можно производить анализ некоторых значений и изменять маршрут письма в зависимости от результата.
    Этими некоторыми значениями будут все данные, известные на момент вступления в действие рулсета 0, а именно:
    - ip & name релея;
    - HELO
    - имена отправителя и получателя
    А также все данные, которые можно получить исходя из перечисленных выше:
    - наличие релея в dnsbl-базе;
    - mx, A и любая другая запись из ДНС, соответствущая домену отправителя.
    Как видите, подзаголовки Subject, From, To, MessageID, etc на этот момент не известны, поэтому маршрут письма не может быть изменен в зависимости от их значения.
    Зато тогда, когда эти значения станут нам доступными, мы уже не будем иметь право вызывать любой мэйлер кроме #error & #discard.
    Правда, нашлось вот такое черновое решение:
    "Use storage -map to store result of Check_Subject -ruleset to macro and use that macro on ruleset 0 (or ruleset called from ruleset 0).
    Surely this doesn't work unless you use DeliveryMode=queue (and $={persistentMacros}) - S0 is processed and the routing decision(s) taken before the headers are seen. "
    но ожидаемого результата оно не дало.
    Еще цитата из ответа на вопрос, почему при проверке темы сообщения не вызывается mailer: "As you discovered, that only works for ruleset 0 and its extensions. You cannot usefully do that from a check ruleset. " (Neil W Rickert)
    Правда, здесь не упоминается ruleset 5 :(
    Очень, конечно, хотелось найти точную формулировку, когда и где можно вызывать "настоящие mailer'ы", но пока, увы !

    Кстати, ранее на вопрос о сохранении отвергнутой почты, чаще всего давался ответ: procmail.
    Claus Assmann: You have to decide what you want: reject the e-mail or accept it? If you want to accept it, but redirect it, then you need to use either some home-made rules (e.g., setting a header based on the dnsbl lookups which is interpreted by problem or redirecting e-mail based on that) or use procmail and let it perform the dnsbl lookups.
    Про откладывании почты с "плохими" темами: Not within sendmail.It can be easily done with procmail or milter...


    Отдельно про синтаксис "$#error $@ quarantine $: Reason for quarantine"

    5.1.4. Ruleset hooks

    A few extra rulesets are defined as "hooks" that can be defined to get special features. They are all named rulesets. The "check_*" forms all give accept/reject status; falling off the end or returning normally is an accept, and resolving to $#error is a reject or quarantine. Quarantining is chosen by specifying quarantine in the second part of the mailer triplet:

    $#error $@ quarantine $: Reason for quarantine

    Many of these can also resolve to the special mailer name $#discard; this accepts the message as though it were successful but then discards it without delivery. Note, this mailer cannot be cho- sen as a mailer in ruleset 0. Note also that all "check_*" rulesets have to deal with temporary failures, especially for map lookups, themselves, i.e., they should return a temporary error code or at least they should make a proper decision in those cases.

    2.3. The Mail Queues

    Mail messages may either be delivered immediately or be held for later delivery. Held messages are placed into a holding directory called a mail queue.

    A mail message may be queued for these reasons:
    + ...
    + ...
    + The mail message has been marked as quarantined via a mail filter or rulesets.

    2.3.6. Quarantined Queue Items

    It is possible to "quarantine" mail messages,
    otherwise known as envelopes. Envelopes (queue
    files) are stored but not considered for delivery
    or display unless the "quarantine" state of the
    envelope is undone or delivery or display of quar-
    antined items is requested. Quarantined messages
    are tagged by using a different name for the queue
    file, 'hf' instead of 'qf', and by adding the quar-
    antine reason to the queue file.

    Delivery or display of quarantined items can
    be requested using the -qQ flag to sendmail or
    mailq. Additionally, messages already in the queue
    can be quarantined or unquarantined using the new
    -Q flag to sendmail. For example,

    sendmail -Qreason -q[!][I|R|S][matchstring]

    Quarantines the normal queue items matching the
    criteria specified by the -q[!][I|R|S][matchstring]
    using the reason given on the -Q flag. Likewise,

    sendmail -qQ -Q[reason] -q[!][I|R|S|Q][matchstring]

    Change the quarantine reason for the quarantined
    items matching the criteria specified by the
    -q[!][I|R|S|Q][matchstring] using the reason given
    on the -Q flag. If there is no reason,
    unquarantine the matching items and make them nor-
    mal queue items. Note that the -qQ flag tells
    sendmail to operate on quarantined items instead of
    normal items.

    The following macros are defined and/or used internally by sendmail for interpolation into argv's for mailers or for other contexts:
    ...
    ${quarantine} The quarantine reason for the envelope, if it is quarantined.

    All queue files have the name ttYMDhmsNNppppp where YMDhmsNNppppp is the id for this message and the tt is a type:
    ...
    hf The same as a queue control file, but for a quarantined queue job.

    2. Задачки.

    2.1. Перенаправляем в локальный ящик почту, пришедшую с адресов релеев, которые соответствуют определенным шаблонам.

    1 Решение.
    11.09.2008.
    LOCAL_CONFIG
    #For full log to maillog
    Ksyslog syslog
    Kstorage macro
    Kcomp arith
    Knondsl1 regex -a@MATCH (^|[0-9.-])(mail|mailrelay|mta|mx|relay|smtp)[0-9.-]
    Knondsl2 regex -a@MATCH \.(hotmail\.com|rax\.ru|7cont\.ru|mail\.ru|yandex\.ru|rambler\.ru)$
    Kdsl1 regex -a@MATCH (^|[0-9.-])([axv]dsl|as|bgp|broadband|cable|customer|[ck]lient|dhcp|dial|dialin|dialup|dialer|dip|dsl|dslam|dup|dyn|dynamic|geo\d+|host|ip|isdn|modem|nas|node|pool|ppp|pppo[ae]|sirius.*ukrtel.*|user|users)[0-9.-]
    Kdsl2 regex -a@MATCH [0-9a-f]{8,}
    Kdsl3 regex -a@MATCH \.(ipt\.aol\.com|internetdsl\.tpnet\.pl|rr\.com|pppool\.de|adelphia\.net|osnanet\.de|dedicado\.com\.uy|tpnet\.pl|tstt\.net\.tt|star\.usn\.ru|volia\.net|\.com\.br|static\.\w+\.tnp\.pl|amm\.unipg\.it|kks\.tyumen\.ru|mpe\.lv|x5.ru|in-addr\.arpa|m\-auto\.kz|factorial\.ru|csloxinfo\.net|elencom\.net\.ua|fktom\.net\.tomline\.ru|pcheers\.static\.otenet\.gr|kadan\.scnet\.cz|\.megalan\.ru|epm\.net\.co|net\.upc\.cz|gw\.net2u\.cz|velocom\.net\.ar|sti\.net\.pl|istanbulbilisim\.com\.tr|pro100r\.net|infonet\.lv|ttnet\.net\.tr|ipcom\.comunitel\.net|speedy\.net\.pe|airtelbroadband\.in|ttnet\.net\.tr|csloxinfo\.net|kirovnet\.ru|zebra\.lt|dev\.euron\.pl|netvision\.net\.il|mail\.solutions\-intg\.com|cyprus\.intersv\.com|vie\.surfer\.at|maksinets\.lv)$
    F{Recip}/etc/mail/Recip
    D{Parse1_count}0

    LOCAL_RULE_0
    R$*                           $: $(syslog syslog:01: $1 $) $1

    #R$*                           $: <$(arith + $@ $&{Parse1_count} $@ 1 $)> $1
    #R$*                           $: $(syslog syslog:02: $1 $) $1
    #R<2>$+                           $: <$&f> $1
    #R<1>$+                           $: $1

    R$+                           $: <$&f> $1
    R<>$+                           $: $1
    R<$+>$+                           $: $2 $| $>Parse11
    R$*                           $: $(syslog syslog:02: $1 $) $1
    R$+ $| OK                  $: $1
    R$+ $| local $+                  $# local $: $2

    SParse11

    R$*                  $: <$&{client_name}>
    R$*                  $: $(syslog syslog:20: $1 $) $1
    R<>                  $@ OK
    R<[$-.$-.$-.$-]>                  $@ OK
    R<$+>                  $: $1

    R$+                  $: $(nondsl1 $1 $)
    R$*                  $: $(syslog syslog:20: $1 $) $1
    R@MATCH                  $@ OK

    R$+                  $: $(nondsl2 $1 $)
    R$*                  $: $(syslog syslog:21: $1 $) $1
    R@MATCH                  $@ OK

    R$+                  $: $(dsl1 $1 $)
    R$*                  $: $(syslog syslog:22: $1 $) $1
    R@MATCH                  $@ local report

    R$+                  $: $(dsl2 $1 $)
    R$*                  $: $(syslog syslog:23: $1 $) $1
    R@MATCH                  $@ local report2

    R$+                  $: $(dsl3 $1 $)
    R$*                  $: $(syslog syslog:24: $1 $) $1
    R@MATCH                  $@ local report3

    # А следующие 3 строчки просто для примера того, как "ловить" "неудобные/некошерные/кяфрные" домены, не прибегая к спец. преобразованию Kmap regex:
    R$+.anrb.$+                  $: $(syslog syslog:30: $&{client_name} $) $1.anrb.$2
    R$+.anrb.$+                  $@ local report4
    # Для контроля (по идее эта строка никогда исполнится не должна)
    R$+.anrb.$+                  $: $(syslog syslog:31: $&{client_name} $) $1.anrb.$2

    R$*                  $: $(syslog syslog:4: $1 $) $1
    R$*                  $: OK
    ------

    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:01:frode.christiansen<@ka-group.com.>
    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:02:frode.christiansen<@ka-group.com.>
    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:01:consiglio<@anrb.ru.>
    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:20:<ip70-82-211-87.adsl2.static.versatel.nl>
    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:20:ip70-82-211-87.adsl2.static.versatel.nl
    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:21:ip70-82-211-87.adsl2.static.versatel.nl
    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:22:@MATCH
    Sep 10 16:24:02 apache sendmail[15455]: m8AANvKS015455: syslog:02:consiglio<@anrb.ru.>\233local.report
    Sep 10 16:24:10 apache sendmail[15455]: m8AANvKS015455: from=<frode.christiansen@ka-group.com>, size=1490, class=0, nrcpts=1, msgid=<000501c91330$022c8ae1$4b546f8c@yeudeyl>, proto=ESMTP, daemon=MTA, relay=ip70-82-211-87.adsl2.static.versatel.nl [87.211.82.70]
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:01:frode.christiansen<@ka-group.com.>
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:02:frode.christiansen<@ka-group.com.>
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:01:consiglio<@anrb.ru.>
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:20:<ip70-82-211-87.adsl2.static.versatel.nl>
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:20:ip70-82-211-87.adsl2.static.versatel.nl
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:21:ip70-82-211-87.adsl2.static.versatel.nl
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:22:@MATCH
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: syslog:02:consiglio<@anrb.ru.>\233local.report
    Sep 10 16:24:10 apache sendmail[15489]: m8AANvKS015455: to=<consiglio@anrb.ru>, delay=00:00:08, xdelay=00:00:00, mailer=local, pri=31723, dsn=2.0.0, stat=Sent

    NB! Несмотря на то, что в логе записан адрес получателя to=<consiglio@anrb.ru>, на самом деле письмо действительно доставляется локально в файл /var/spool/mail/report. Т.е. при перемаршрутизации адрес получателя не переписывается!
    ------

    mail -f /var/spool/mail/report
    N 24 frode.christiansen Wed Sep 10 16:24 55/1828 Заказ
    ------

    cat /var/spool/mail/report
    From frode.christiansen@ka-group.com Wed Sep 10 16:24:10 2008
    Return-Path: <frode.christiansen@ka-group.com>
    Received: from ip70-82-211-87.adsl2.static.versatel.nl (ip70-82-211-87.adsl2.static.versatel.nl [87.211.82.70])
             by apache.anrb.ru (8.13.8/8.13.8) with ESMTP id m8AANvKS015455
             for <consiglio@anrb.ru>; Wed, 10 Sep 2008 16:24:02 +0600
    Message-ID: <000501c91330$022c8ae1$4b546f8c@yeudeyl>
    From: "derwin balty" <frode.christiansen@ka-group.com>
    To: <consiglio@anrb.ru>
    Subject: =?koi8-r?B?+sHLwdo=?=
    ------

    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:01:leskedne1985<@441-4444.com.>
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:02:leskedne1985<@441-4444.com.>
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:01:terrapin<@anrb.ru.>
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:20:<CPE-65-30-29-42.kc.res.rr.com>
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:20:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:21:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:22:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:23:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:24:@MATCH
    Sep 10 16:28:39 apache sendmail[20833]: m8AASWYP020833: syslog:02:terrapin<@anrb.ru.>\233local.report2
    Sep 10 16:28:41 apache sendmail[20833]: m8AASWYP020833: from=<leskedne1985@441-4444.com>, size=1710, class=0, nrcpts=1, msgid=<200809101028.m8AASWYP020833@apache.anrb.ru>, proto=ESMTP, daemon=MTA, relay=CPE-65-30-29-42.kc.res.rr.com [65.30.29.42]
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:01:leskedne1985<@441-4444.com.>
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:02:leskedne1985<@441-4444.com.>
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:01:terrapin<@anrb.ru.>
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:20:<CPE-65-30-29-42.kc.res.rr.com>
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:20:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:21:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:22:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:23:CPE-65-30-29-42.kc.res.rr.com
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:24:@MATCH
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: syslog:02:terrapin<@anrb.ru.>\233local.report2
    Sep 10 16:28:41 apache sendmail[20854]: m8AASWYP020833: to=<terrapin@anrb.ru>, delay=00:00:02, xdelay=00:00:00, mailer=local, pri=31968, dsn=2.0.0, stat=Sent
    -------

    mail -f /var/spool/report2
    >N 1 leskedne1985@441-4 Wed Sep 10 16:28 56/2057 Just 2 pills to add 2 inc
    ------

    cat /var/spool/report2
    From leskedne1985@441-4444.com Wed Sep 10 16:28:41 2008
    Return-Path: <leskedne1985@441-4444.com>
    Received: from [65.30.29.42] (CPE-65-30-29-42.kc.res.rr.com [65.30.29.42])
             by apache.anrb.ru (8.13.8/8.13.8) with ESMTP id m8AASWYP020833
             for <terrapin@anrb.ru>; Wed, 10 Sep 2008 16:28:39 +0600
    Message-Id: <200809101028.m8AASWYP020833@apache.anrb.ru>
    Date: Wed, 10 Sep 2008 05:38:49 -0500
    From: garald <leskedne1985@441-4444.com>
    User-Agent: Thunderbird 2.0.0.16 (Windows/20080708)
    MIME-Version: 1.0
    To: terrapin@anrb.ru
    ------

    date|mail -sTest terrapin
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:01:postmaster<@anrb.ru.>
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:02:postmaster<@anrb.ru.>
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:01:terrapin<@apache.anrb.ru.>
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:20:<dovestai.anrb.ru>
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:20:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:21:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:22:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:23:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:24:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:30:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: syslog:02:terrapin<@apache.anrb.ru.>\233local.report4
    Sep 10 16:25:58 apache sendmail[15836]: m8AAPwD8015836: from=<postmaster@anrb.ru>, size=447, class=0, nrcpts=1, msgid=<1354572671.20080910163614@anrb.ru>, proto=ESMTP, daemon=MTA, relay=dovestai.anrb.ru [1.2.3.4]
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:01:postmaster<@anrb.ru.>
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:02:postmaster<@anrb.ru.>
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:01:terrapin<@apache.anrb.ru.>
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:20:<dovestai.anrb.ru>
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:20:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:21:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:22:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:23:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:24:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:30:dovestai.anrb.ru
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: syslog:02:terrapin<@apache.anrb.ru.>\233local.report4
    Sep 10 16:25:58 apache sendmail[15837]: m8AAPwD8015836: to=<terrapin@apache.anrb.ru>, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30636, dsn=2.0.0, stat=Sent
    -------

    mail -fH /var/spool/mail/report4
    >U 1 postmaster@anrb.ru Wed Sep 10 16:25 20/725


    2 Решение.

    Ну а теперь то же самое, но только через "помучаться". Именно с этого я начала решать эту задачку, пока не обнаружила чисто случайно упоминание про LOCALE_RULE_0. Берем вот эти прваила и добавляем их сразу после слова SParse1 прямо в /../sendmail/cf/m4/proto.m4, предварительно сохранив оригинал этого файла.

    R$*                           $: $(syslog syslog:01: $1 $) $1

    #R$*                           $: <$(arith + $@ $&{Parse1_count} $@ 1 $)> $1
    #R$*                           $: $(syslog syslog:02: $1 $) $1
    #R<2>$+                           $: <$&f> $1
    #R<1>$+                           $: $1

    R$+                           $: <$&f> $1
    R<>$+                           $: $1
    R<$+>$+                           $: $2 $| $>Parse11
    R$*                           $: $(syslog syslog:02: $1 $) $1
    R$+ $| OK                  $: $1
    R$+ $| local $+                  $# local $: $2

    В sendmail.mc добавляем
    LOCAL_CONFIG
    #For full log to maillog
    Ksyslog syslog
    Kstorage macro
    Kcomp arith
    Knondsl1 regex -a@MATCH (^|[0-9.-])(mail|mailrelay|mta|mx|relay|smtp)[0-9.-]
    Knondsl2 regex -a@MATCH \.(hotmail\.com|rax\.ru|7cont\.ru|mail\.ru|yandex\.ru|rambler\.ru)$
    Kdsl1 regex -a@MATCH (^|[0-9.-])([axv]dsl|as|bgp|broadband|cable|customer|[ck]lient|dhcp|dial|dialin|dialup|dialer|dip|dsl|dslam|dup|dyn|dynamic|geo\d+|host|ip|isdn|modem|nas|node|pool|ppp|pppo[ae]|sirius.*ukrtel.*|user|users)[0-9.-]
    Kdsl2 regex -a@MATCH [0-9a-f]{8,}
    Kdsl3 regex -a@MATCH \.(ipt\.aol\.com|internetdsl\.tpnet\.pl|rr\.com|pppool\.de|adelphia\.net|osnanet\.de|dedicado\.com\.uy|tpnet\.pl|tstt\.net\.tt|star\.usn\.ru|volia\.net|\.com\.br|static\.\w+\.tnp\.pl|amm\.unipg\.it|kks\.tyumen\.ru|mpe\.lv|x5.ru|in-addr\.arpa|m\-auto\.kz|factorial\.ru|csloxinfo\.net|elencom\.net\.ua|fktom\.net\.tomline\.ru|pcheers\.static\.otenet\.gr|kadan\.scnet\.cz|\.megalan\.ru|epm\.net\.co|net\.upc\.cz|gw\.net2u\.cz|velocom\.net\.ar|sti\.net\.pl|istanbulbilisim\.com\.tr|pro100r\.net|infonet\.lv|ttnet\.net\.tr|ipcom\.comunitel\.net|speedy\.net\.pe|airtelbroadband\.in|ttnet\.net\.tr|csloxinfo\.net|kirovnet\.ru|zebra\.lt|dev\.euron\.pl|netvision\.net\.il|mail\.solutions\-intg\.com|cyprus\.intersv\.com|vie\.surfer\.at|maksinets\.lv)$
    F{Recip}/etc/mail/Recip
    D{Parse1_count}0

    LOCAL_RULESETS
    SParse11
    R$*                  $: <$&{client_name}>
    R$*                  $: $(syslog syslog:20: $1 $) $1
    R<>                  $@ OK
    R<[$-.$-.$-.$-]>                  $@ OK
    R<$+>                  $: $1

    R$+                  $: $(nondsl1 $1 $)
    R$*                  $: $(syslog syslog:20: $1 $) $1
    R@MATCH                  $@ OK

    R$+                  $: $(nondsl2 $1 $)
    R$*                  $: $(syslog syslog:21: $1 $) $1
    R@MATCH                  $@ OK

    R$+                  $: $(dsl1 $1 $)
    R$*                  $: $(syslog syslog:22: $1 $) $1
    R@MATCH                  $@ local report

    R$+                  $: $(dsl2 $1 $)
    R$*                  $: $(syslog syslog:23: $1 $) $1
    R@MATCH                  $@ local report2

    R$+                  $: $(dsl3 $1 $)
    R$*                  $: $(syslog syslog:24: $1 $) $1
    R@MATCH                  $@ local report3

    R$*                  $: OK
    Пересобираем конфиг.
    На самом деле первоначально я вообще добавляла новые правила прямо в sendmail.cf, но вот это я уже приводить не буду, так делать так, конечно, некрасиво и неграмотно, хотя результат тот же.
    Как уже неоднократно говорила, я не sendmail-гуру, я просто наглая, поэтому порой правлю sendmail.cf напрямую, хотя "отцы" sendmail'а в первых строках этого файла просят так не делать.

    2.2. Перенаправляем в локальный ящик почту, пришедшую с адресов релеев, которые попали в dnsbl-базы.

    Claus Assmann по этому поводу говорит:
    "Two possibilities:
    1. disable the check in sendmail, use procmail to do this.
    2. use sendmail 8.10: its new features allow you to do this.
    Check the RBL: if it matches: set a macro.
    During delivery (LOCAL_RULESET_0): check the macro:
    if it is set: change the recipient.
    Easy, isn't it? 8.10 makes it possible... "
    Мы пойдем вторым путем, самым легким.

    02.10.2008.
    LOCAL_CONFIG
    D{Spamcop_lookup}0
    D{Dsbl_lookup}0
    # map for DNS based blacklist lookups
    Kdnsbl dns -R A -T<TMP>

    LOCAL_RULE_0

    R$*                  $: $1 $| <$&{addr_type}> $| <$&{deliveryMode}>
    R$*                  $: $(syslog syslog:01: $1-$&{deliveryMode}-$&{opMode} $) $1

    # Dnsbl_Check is called only for envelope recipient and interactive DeliveryMode
    # The first passage is doing for "deliver in background" mode. Skip it.
    # The second passage is doing for "deliver in interactively" mode.
    R$* $| <e r> $| <i>         $: $1 $| $>Dnsbl_Check
    # Other users (envelope sender, header sender or recipient) are skipped
    R$* $| <$*> $| <$*>         $: $1
    R$*                           $: $(syslog syslog:02: $1 $) $1
    # What does return from Dnsbl_Check?
    # If OK or CONTINUE - skip this mail
    # The mail from local ips & nets or from CONNECT:ips & nets
    R$+ $| OK                  $: $1
    # The mail from other ips. These ips are not known by any dnsbl.
    R$+ $| CONTINUE                  $: $1
    R$*                           $: $(syslog syslog:03: $1 $) $1
    # If local (ip is in the some dnsbl) -
    # call local mailer and send this mail to local mailbox $2
    R$+ $| local $+                  $#local $: $2
    R$*                           $: $(syslog syslog:04: $1 $) $1

    SDnsbl_Check
    # Checking for exclusions for source ip.
    R$*                  $: <$&{client_addr}>
    # For some cases
    R<>                   $@ OK
    # Strip angle brackets
    R<$+>                   $: $1

    # Local originated mail
    R127.0.0.1                  $@ OK
    # Is this user send the mail from local net ($=R or RELAY in access or from CONNECT:nets)?
    # Checking for local net
    R$=R                            $@ OK
    R$-.$-.$-.$-                   $: $(access $1.$2.$3.$4 $:$1.$2.$3 $)
    RRELAY                           $@ OK
    R$-.$-.$-                  $: $(access $1.$2.$3 $:$1.$2 $)
    RRELAY                           $@ OK
    R$-.$-                           $: $(access $1.$2 $)
    RRELAY                           $@ OK

    # Ip-adddress will be modified after previous access-check so
    # let us return original ip with CONNECT: tag in the work space:
    R$*                                    $: CONNECT:$&{client_addr}
    # Checking for tag CONNECT:
    RCONNECT:$-.$-.$-.$-                   $: $(access CONNECT:$1.$2.$3.$4 $:CONNECT:$1.$2.$3 $)
    ROK                                    $@ OK
    RCONNECT:$-.$-.$-                   $: $(access CONNECT:$1.$2.$3 $:CONNECT:$1.$2 $)
    ROK                                    $@ OK
    RCONNECT:$-.$-                           $: $(access CONNECT:$1.$2 $)
    ROK                                    $@ OK

    R$*                           $: CONTINUE
    R$*                           $: $(syslog syslog:17: $1 $) $1

    # Ip-adddress will be modified after previous access-check so
    # let us return original ip in the work space:
    R$*                           $: $&{Spamcop_lookup}
    R$*                           $: $(syslog syslog:20: $1 $) $1
    R0                            $: 0 $| $&{client_addr}

    # DNS based IP address spam list bl.spamcop.net
    R0 $| $-.$-.$-.$-         $: 0 $| <$(dnsbl $4.$3.$2.$1.bl.spamcop.net. $: OK $)>
    R0 $| $*                  $: $(storage {Spamcop_lookup} $@ $1 $) $1
    R$*                           $: $(syslog syslog:21:spamcop: $&{Spamcop_lookup}-$1 $) $1
    R<OK>                           $: CONTINUE
    R<$+<TMP>>                  $: CONTINUE
    R<$+>                            $@ local report                           
    #R$+                            $#local $: report
    R$*                           $: $(syslog syslog:22: $1 $) $1

    # Ip-adddress will be modified after previous access-check so
    # let us return original ip in the work space:
    R$*                           $: $&{Dsbl_lookup}
    R$*                           $: $(syslog syslog:30: $1 $) $1
    R0                            $: 0 $| $&{client_addr}

    # DNS based IP address spam list list.dsbl.org
    R0 $| $-.$-.$-.$-         $: 0 $| <$(dnsbl $4.$3.$2.$1.list.dsbl.org. $: OK $)>
    R0 $| $*                  $: $(storage {Dsbl_lookup} $@ $1 $) $1
    R$*                           $: $(syslog syslog:31:dsbl: $&{Dsbl_lookup}-$1 $) $1
    R<OK>                           $: CONTINUE
    R<$+<TMP>>                  $: CONTINUE
    R<$+>                            $@ local report2                           
    #R$+                            $#local $: report2

    R$*                           $: $(syslog syslog:41: $1 $) $1

    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:01:jjkhhandyandy<@halifax.com.hk.>\233<e.s>\233<b>-.b.-.d
    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:02:jjkhhandyandy<@halifax.com.hk.>
    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:03:jjkhhandyandy<@halifax.com.hk.>
    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:04:jjkhhandyandy<@halifax.com.hk.>
    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:01:paradise<@anrb.ru.>\233<e.r>\233<b>-.b.-.d
    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:02:paradise<@anrb.ru.>
    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:03:paradise<@anrb.ru.>
    Sep 27 18:43:46 apache sendmail[23513]: m8RChhGE023513: syslog:04:paradise<@anrb.ru.>
    Sep 27 18:43:47 apache sendmail[23513]: m8RChhGE023513: from=<jjkhhandyandy@halifax.com.hk>, size=650, class=0, nrcpts=1, msgid=<000401c920a0$0703c717$78d91499@cubfskjp>, proto=ESMTP, daemon=MTA, relay=pool-72-87-102-181.prvdri.east.verizon.net [72.87.102.181]
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:01:jjkhhandyandy<@halifax.com.hk.>\233<e.s>\233<i>-.i.-.d
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:02:jjkhhandyandy<@halifax.com.hk.>
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:03:jjkhhandyandy<@halifax.com.hk.>
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:04:jjkhhandyandy<@halifax.com.hk.>
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:01:paradise<@anrb.ru.>\233<e.r>\233<i>-.i.-.d
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:17:CONTINUE
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:20:0
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:21:spamcop:<127.0.0.2>-<127.0.0.2>
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:02:paradise<@anrb.ru.>\233local.report
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: syslog:03:paradise<@anrb.ru.>\233local.report
    Sep 27 18:43:47 apache sendmail[23536]: m8RChhGE023513: to=<paradise@anrb.ru>, delay=00:00:01, xdelay=00:00:00, mailer=local, pri=120650, dsn=2.0.0, stat=Sent

    mail -fH report
    N1133 jjkhhandyandy@hali Sat Sep 27 18:43 26/991 Fwd: Любые, даже самые грязные

    cat report
    From jjkhhandyandy@halifax.com.hk Sat Sep 27 18:43:47 2008
    Return-Path: <jjkhhandyandy@halifax.com.hk>
    Received: from pool-72-87-102-181.prvdri.east.verizon.net (pool-72-87-102-181.prvdri.east.verizon.net [72.87.102.181])
             by apache.anrb.ru (8.13.8/8.13.8) with ESMTP id m8RChhGE023513
             for <paradise@anrb.ru>; Sat, 27 Sep 2008 18:43:46 +0600
    Message-ID: <000401c920a0$0703c717$78d91499@cubfskjp>
    From: "derk seho" <jjkhhandyandy@halifax.com.hk>
    To: <paradise@anrb.ru>
    Subject: =?koi8-r?B?RndkOiDswMLZxSwgxMHWxSDTwc3ZxSDH0tHaztnFINPFy9PVwczYzg==?=
             =?koi8-r?B?2cUgxsHO1MHaycksIM/WydfBwNQg2sTExdPY?=

    11.09.2008.
    Я чуть усложню задачу и сделаю эту перемаршрутизацию только для определенных получателей, перечисленных в файле /etc/mail/Recip.
    Формат файла прост:
    user1
    user2
    user3
    NB! После изменения этого файла следует рестартовать sendmail. Ес-но, вы должны изменить имя домена anrb.ru в 2-х строках на свой домен.
    Маршрутизация применяется только после того, как были вызваны и отправитель, и получатель, то есть после второго прохода.
    LOCAL_CONFIG
    F{Recip}/etc/mail/Recip

    LOCAL_RULE_0
    Переписывается.


    2.3. Перенаправляем в локальный ящик почту, пришедшую с адресов релеев, которые попали в dnsbl-базы и по результатам попадания набравшую определенный вес. (Назначаем каждому срабатыванию по базам dnsbl определенный вес, суммируем все значения, по результатам пропускаем или складываем в отдельный ящик.)

    Решается на основе этого и вышеупомянутого решений.


    2.4. Перенаправление почты в зависимости от адреса получателя и ip-адреса релея, с которого пришло письмо.

    11.09.2008.
    Это новое решение старой задачки, когда я еще не знала про LOCAL_RULE_0, спец-но предназначенный для таких задач.
    Здесь речь идет о перемаршрутизации почты в зависимости не только от домена получателя, но и от IP хоста, с которого идет почта.
    В терминологии автора, в простом случае эта задачка решается с помощью mailertable:
    domain.tld [TAB] esmtp:[zz.zz.zz.zz]
    sub.domain.tld [TAB] esmtp[yy.yy.yy.yy]
    Ему же нужно, чтобы mailertable позволял указать IP адрес хоста (правда, здесь он опустил имя домена, а оно также имеет значение)
    domain.tld [TAB] esmtp:[zz.zz.zz.zz]
    Connect:xx.xx.xx.xx [TAB] esmtp[yy.yy.yy.yy]

    В новом свете решение должно выглядеть так (не проверялось):
    LOCAL_CONFIG
    LOCAL_RULE_0
    # Если на вход подан адрес домена domain.tld, то добавляем два важных макроса:
    R$+<@domain.tld.>                  $: $1<@domain.tld.> $| <$&{addr_type}> $| <$&{deliveryMode}>
    # Если эти макросы - <e r> & <i>, то отправляем письмо по новому маршруту. Здесь вместо $+<@domain.tld.> можно указать просто $+, потому что предыдущей строкой мы уже отсеяли всех других отправителей-получателей:
    R$+<@domain.tld.>$| <e r> $| <i>         $#esmtp $@ [zz.zz.zz.zz] $: $1<@domain.tld.>
    # Избавляемся от макросов <e r> & <i> в тех случаях, когда их значения равны < e s > и < d >, это сработает только для $+<@domain.tld.>, поэтому я слентяйничаю и укажу первой лексемой просто $+ :
    R$+ $| $+ $| $+           $: $1
    # Строго говоря, предыдщую проверку в отношении домена domain.tld можно было не делать, а просто воспользоваться mailertable:
    domain.tld [TAB] esmtp:[zz.zz.zz.zz]
    # Так как перед доменом domain.tld нет точки, то это перенаправление сработает только для домена domain.tld.

    # А вот теперь разберемся с "хитрой" перемаршрутизицией. Если мы имеем дело с доменом sub.domain.tld, то добавляем два важных макроса:
    R$+<@sub.domain.tld.>                  $: $1<@sub.domain.tld.> $| <$&{addr_type}> $| <$&{deliveryMode}>
    # Если эти макросы - <e r> & <i>, то добавляем IP отправителя, попутно избавившись от предыдущих добавленных макросов:
    R$+ $| <e r> $| <i>         $: $1 $| <$&{client_addr}>
    # Если же эти макросы отличны от <e r> & <i>, то избавляемся от них, оставляя в рабочем поле только эл.адрес и продолжаем работу:
    R$+ $| $+ $| $+           $: $1
    # Если IP равен xx.xx.xx.xx, меняем маршрут письма (обратите внимания, я опять лентяйничаю и пишу $+ вместо $+<@sub.domain.tld.>, но мы изначально заявили, что будем работать только с этим поддоменом, так что все ОК) :
    R$+ $| < xx.xx.xx.xx >         $#esmtp $@ [yy.yy.yy.yy] $: $1
    # Автор вопроса не указал, что делать с почтой, которая придет с другого IP. Поэтому вот вариант для блокировки:
    R$+ $| <$+>         $#error $@ 5.7.1 $: "550 Access for IP " $1 " denied: " $2
    # А вот вариант отправки письма по второму маршруту
    R$+ $| <$+>         $#esmtp $@ [vv.vv.vv.vv] $: $1
    # Ну а это для редких случаев, когда IP пустой:
    R$+ $| <>         $: $1

    2.5. Перенаправление почты в случае, когда отправитель и получатель совпадают.

    20.01.2009. Спрашивали здесь. Проверено.
    LOCAL_CONFIG
    LOCAL_RULE_0
    Kstorage macro
    # Для начала добавим два макроса, чтобы "отделить мух от котлет":
    R$*                                    $: $1 $| <$&{addr_type}> $| <$&{deliveryMode}>
    # Если на вход был подан адрес отправителя на этапе Interactive delivery mode, то сохраняем его в макросе Sender:
    R$* $| <e s> $| <i>                  $: $(storage {Sender} $@ $1 $) $1

    # Если на вход был подан адрес получателя (об этом говорит $&{addr_type}=<e r>) и при этом он совпал со значением макроса Sender, то меняем маршрут письма, письмо уходит на удаленную систему:
    R$&{Sender} $| <e r> $| <i>         $#esmtp $@apache.anrb.ru $: terrapin <@apache.anrb.ru.>
    # Или, если так нужно, остается на локальном сервере, но оказывается в другом почтовом ящике.
    # Нижеследующие 3 правила одинаковы по действию. Выбираем mailer=local & почтовый ящик consiglio:
    R$&{Sender} $| <e r> $| <i>         $#local $: consiglio
    # Выбираем почтовый ящик consiglio, по умолчанию он локальный, $: говорит продолжать набор правил, но значения < e s > & < i > уже сами по себе говорят о последнем исполнении LOCAL_CONFIG_0:
    R$&{Sender} $| <e r> $| <i>         $: consiglio
    # Выбираем почтовый ящик consiglio, по умолчанию он локальный, $@ говорит закончить на этом набор правил:
    R$&{Sender} $| <e r> $| <i>         $@ consiglio
    # Для остальных значений <$&{addr_type}> & <$&{deliveryMode}> оставляем в рабочей области только эл.адрес:
    R$* $| $* $| $*                           $:$1

    Замечания.
    1. Здесь не используется макрос $&f в качестве адреса отправителя, потому что в LOCAL_RULE_0 приходят уже канонизированные адреса, а в макросе $&f хранится не канонизированный адрес отправителя. Лишний раз вызывать канонизацию считаю лишним, тем более что адрес отправителя и так подается канонизированным, именно его я и сохраняю для дальнейшего сравнения.

    2. Здесь не учтен вариант, когда юзер отправляет себе письмо с неполным адресом получателя или с доменом-синонимом:
    paradise@anrb.ru -> paradise
    paradise@anrb.ru -> paradise@mail.anrb.ru
    Но с этим разобраться будет нетрудно.

    3. Возможны неожиданности при работе с алиасами. Надо проверить, что будет, если письмо отправлено на адрес, который явяляется алиасом, с этого же адреса.

    4. Команда newaliases, которую советовал учесть Andrzej Adam Filip, ($&OpMode=i & $&DeliveryMode=i) здесь роли не сыграет, так как при этом $&{addr_type}=< > :
    LOCAL_RULE_0
    R$*                                    $: $1 $| <$&{deliveryMode}><$&{opMode}>
    R$* $| <i><i>                           $: $(syslog syslog:LC00: <$&{addr_type}><i><i> $) $1
    R$* $| <i><i>                           $: $1
    R$*                                     $: $(syslog syslog:LC1: $1 $) $1

    Запускаем команду newaliases и смотрим лог:
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC00:<><i><i>
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC1:postmaster
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC00:<><i><i>
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC1:adm
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC00:<><i><i>
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC1:webmaster
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC00:<><i><i>
    Jan 20 16:59:26 mail sendmail[6069]: NOQUEUE: syslog:LC1:abuse


    2.6. Перенаправление почты в зависимости от ключевых слов в имени и домене получателя.

    Задачка:
    " ... Далее почта приходящая на виртуальные домены обрабатывается следующим образом
    test@testuser1.my.mail.com -> user1
    логин.test@testuser1.my.mail.com -> user1
    любой_другой_логин.test@testuser1.my.mail.com -> user1
    логин@testuser1.my.mail.com -> /dev/null
    еще_один_логин.test@testuser2.my.mail.com -> user2
    то есть все что идет на виртуальные домены без ключевого слова - дропается, все что проходит по вайлдкартам - доставляется нужным локальным пользователям..."

    Интерес для меня здесь в том, чтобы не делать обновление таблицы virtusertable скриптом, а написать правила так, чтобы они охватывали все возможные варианты 3-4-5 правилами без участия файла virtusertable. То есть представьте, что таких вирт. доменов будет 20. Это как же файл "забьется", его будет трудно читать. А я хочу, чтобы все делали правила, не заглядывая в virtusertable и не требуя от админа работы по заполнению этой таблицы.
    Кое-какое начало положено, получается очень интересно, хочется доделать ...
    28.02.2009. И все-таки virtusertable здесь имхо не пройдет: нужно суметь выцепить test в имени получателя, а как это сделать без привлечения regex?
    Пока что я дошла до такого спец. преобразования, позволяющего из адреса somewho@testuser1.my.mail.com выцепить пользователя user1 по принципу: test - это разделитель, поэтому оставляем в лексеме, в которой он содержится, оставшуюся часть - user1.
    Далее нужно будет напустить regex и на правую часть адреса с тем, чтобы отделить случаи, когда почта должна сохраняться и перекладываться юзеру, определенному первым regex'ом, от случаев, когда почта должна быть уничтожена.
    Ну а дальше проблем быть не должно. LOCAL_RULE_0 в руки. Пока наработочки такие:
    regex.mc:
    KSubject_Test regex -dtest -s2 (.+)@test(.+).mydom.ru
    op.me:
    -s substring match
    -d set the delimiter used for -s
    The -s flag can include an optional parameter which can be used to select the substrings in the result of the lookup.
    For example, -s1,3,4

    cat input34:
    /map Subject_Test somewho@testuser1.mydom.ru
    /map Subject_Test somewho@testuser2.mydom.ru
    /map Subject_Test somewho@testIvan.mydom.ru
    /map Subject_Test somewho@testuser2.test.ru
    /map Subject_Test somewho@testIvantest.mydom.ru
    /map Subject_Test Sidorov.test@testIvantest.mydom.ru

    server:/etc/mail/regex#/usr/sbin/sendmail -bt -C../regex.cf <input34 >output34

    cat output34:
    ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
    Enter <ruleset> <address>
    > > map_lookup: Subject_Test (somewho@testuser1.mydom.ru) returns user1 (0)
    > map_lookup: Subject_Test (somewho@testuser2.mydom.ru) returns user2 (0)
    > map_lookup: Subject_Test (somewho@testIvan.mydom.ru) returns Ivan (0)
    > > map_lookup: Subject_Test (somewho@testuser2.test.ru) no match (0)
    > map_lookup: Subject_Test (somewho@testIvantest.mydom.ru) returns Ivantest (0)
    > map_lookup: Subject_Test (Sidorov.test@testIvantest.mydom.ru) returns Ivantest (0)


    2.7. Перенаправление почты несуществующим юзерам на другой почтовик этим же юзерам..

    28.02.2009. Это классическая задачка по маршрутизации, и она достаточно подробно описана на странице Virtual Hosting with Sendmail.
    Встроенное решение. Virtusertable работает исключительно с локальными юзерами, поэтому прописываете всех юзеров, которые существуют на первом сервере в этой таблице, затем указываете
    @yourdomain.com      [TAB]      %1@othercompany.com
    и почта для несуществ. юзеров будет уходить на другой сервер этому же юзеру.
    Mailertable, который наоборот работает только с транзитными юзерами, в обычном режиме здесь не подойдет. В необычном надо было бы исключить домен из числа локальных, в этой таблице перечислить всех несущ. юзеров и завернуть их на второй сервер, а существующих на данном (уже не локальном) домене - разложить локальным мэйлером по соответствующим ящикам. В зависимости от того, каких юзеров и насколько больше, можно выбрать или virtusertable, или mailertable.
    Что меня не устраивает в этих решениях? Да все то же: если юзеров много, то заполнять (mailer|virtuser)table - дело хлопотное. Да, скрипт в руки, скажете вы, но ведь его и еще читать иногда приходится. А представьте там штук 100-200-300 юзеров. Ну да, egrep никто не отменял, но если можно сделать это же без привлечения дополнительных таблиц, отчего ж не попробовать?
    Итак, юзеры системные. Следовательно, нужно проверить /etc/passwd & /etc/mail/aliases.
    Не проверялось, написано по образу и подобию задачки 1 и задачки 2.
    LOCAL_CONFIG
    Kpasswd user -m -a@LOCALUSER
    Kalias implicit -m -a@LOCALUSER /etc/mail/aliases
    Klocal sequence alias passwd
    LOCAL_RULE_0
    Kstorage macro
    # Для начала выберем только локальную почту ($=w) и добавим два макроса , чтобы "отделить мух от котлет":
    R$+<@$=w.>                                    $: $1 $| <$&{addr_type}> $| <$&{deliveryMode}>
    # Если на вход был подан адрес локального получателя (я не буду указывать <@$=w.>, обойдусь простым <@$+>, потому что из-за предыд. правила, добавившего 2 доп. макроса только для лок. юзеров, следующее правило будет исполнено только для локальщиков)на этапе Interactive delivery mode, то отправляем имя юзера на проверку в файлы /etc/passwd & /etc/mail/aliases. Да, еще промаркируем этот адрес с.п. < CHECK > для того, чтобы отделить обработанную нами почту от той, что мы не трогали (не лок. юзеры), ведь у них будут разные дороги:
    R$+<@$+> $| <e r> $| <i>                  $:$(local $1 $) < CHECK >
    # Если юзер упомянут в /etc/passwd & /etc/mail/aliases (спец. преобразование local вернуло @LOCALUSER), то возвращаем значение - имя пользователя без домена, я полагаю, что здесь сработает по умолчанию локальный мэйлер.
    R$+@LOCALUSER< CHECK >                   $@ $1
    # Если локальный юзер оказался помечен маркером < CHECK >, значит он прошел через препредыдущее правило, и не подпал под предыдущее, то есть он локальной системе не известен и должен пойти на другой почтовый сервер к другому юзеру с тем же именем.
    R$+< CHECK >                   $#esmtp $@apache.anrb.ru $: $1 <@apache.anrb.ru.>
    # Все остальные адреса (не локальные домены + адреса отправителей + DeliveryMode!=i) должны быть обработаны по умолчанию
    R$+                   $@ $1


    2.8. Подмена получателя: genericuser+somevariablestring@mydomain.com -> genericuser@mydomain.com.

    Задачка недавно появилась на sendmail-конфе и перекликается с задачкой 2.6. Как часто бывает, стоит задуматься над какой-то задачкой как НЕЧТО/НЕКТО начинает подсказывать. И хотя в этом решении ничего нового по сравнению с моим нет, но все же для меня это подтверждение того, что я на верном пути.
    Итак, здесь почта для адреса вида genericuser+somevariablestring@mydomain.com уходит на genericuser@mydomain.com
    Источник.
    Andrzej Adam Filip: Rewrite '-' separator to '+' separator and allow sendmail handle deliveries to 'user+detail' as usual (with 'user' as the final try).
    LOCAL_CONFIG
    Kplus regex -s1,2 -d+ ^(genericsuser)-([0-9a-z]{1,32})$
    LOCAL_RULE_0
    R$+ <@$=w.> $*              $: $(plus $1 $: $1 $) <@$2.> $3


    9. Как видоизменить адрес получателя (добавляем 3 цифры перед адресом).

    Необходимо преобразовать адрес получателя из
    1234567.pa...@host1.edu
    в
    9191234567@host2.com
    Правила от Andrzej Adam Filip . Первоисточник здесь.

    LOCAL_CONFIG
    Kd7 regex ^[0-9]{7}$$
    LOCAL_RULE_0
    # Canonify (in case of DNS resolution problems)
    R$+ <@host1.edu>            $: $1 <@host1.edu.>
    # do the regex lookup
    R$-.pager <@host1.edu.>             $: <$(d7 $1 $: NOMATCH $)> $1.pager <@host1.edu.>
    # rewrite as it was in case of no match
    R<$+> $-.pager <@host1.edu.>            $: $2.pager<@host1.edu.>
    # rewrite matching addresses
    R<> $-.pager <@host1.edu.>            $: $(dequote 919 "" $1 $) <@host2.com.>

    For testing use the commands below (simple check, detailed check):
    echo '3,0 1234567.pa...@host1.edu' | sendmail -bt
    echo '3,0 1234567.pa...@host1.edu' | sendmail -bt -d21.12 -d60.1

    Здесь для меня интересно еще и обсуждение других решений, потому что оно перекликается с моим ощущением: задачки, которые легко решаются локальными правилами, не стоит решать с.п. тяжелой артиллерии - Mimedefung&etc.
    Автор: I had originally planned to write a perl script and pipe some aliases to that but I think it might be simpler to try and solve this with some regex local rules in sendmail, if possible.
    Andrzej Adam Filip: IF you want to investigate "perl option" further THEN take a look at
    * socket map protocol, sample scripts are provided in contrib directory of sendmail distribution [will require also a few custom *.mc lines]
    *OR*
    * MIMEDefang (perl based) milter, it can rewrite envelope recipients
    It may be an overkill in your case unless you want to introduce much more sophisticated checks than you seem to suggest later (e.g. checks against full list of valid pager numbers).
    Автор: I'm actually already using MIMEDefang for something else on this server but I didn't want to have to deal with the extra overhead, since MIMEDefang is already doing other processing, if I didn't have to. Thanks for the tip about using it, though. It gives me some ideas for some other things I need to get done.


    10. Как обрабатывать почту, поступающую с отдельных IP, отдельным mailer'ом?

    22.05.2009. Для чего это нужно.
    Пишу начерно "по образу и подобию" задачи №2.4.
    LOCAL_CONFIG
    LOCAL_RULE_0
    # Оптимизируем - ограничиваем сферу деятельности:
    R$*                  $: $1<@domain.tld.> $| <$&{addr_type}> $| <$&{deliveryMode}>
    # Если добавленные макросы - <e r> & <i>, то еще добавляем IP-адрес отправителя, попутно избавляясь от уже добавленных макросов:
    R$* $| <e r> $| <i>        $: $1 $| <$&{client_addr}>
    # Если же эти макросы отличны от < e r > & < i >, то избавляемся от них, оставляя в рабочем поле только эл.адрес и завершаем работу:
    R$+ $| $+ $| $+        $@ $1
    Если письмо из локальной сети 1.2.3 - отправляем письмо на обработку новому mailer'у:
    R$* $| <1.2.3.$+>         $#newmailer $@ mail.youdomain.ru $: $1
    В противном случае избавляемся от IP адреса в рабочей области и завершаем работу
    R$* $| <$-.$-.$-.$+>         $@ $1
    # Ну а это для редких случаев, когда IP пустой:
    R$+ $| <>         $@ $1
    Думаю, 2 последние строки можно объединить след. образом:
    R$+ $| $*         $@ $1

    11. Smarthost & индивидуальный маршрут для отдельного адреса.

    25.06.09. Источник.
    Вся исходящая почта уходит на smarthost.ru. Необходимо, чтобы письма для user22@mydomain.ru уходили на user22@host1.mydomain.ru (это получается, что почта от локальных юзеров для локального же юзера user22 должна уходить на host1?).
    define(`SMART_HOST',`smarthost.ru')
    LOCAL_NET_CONFIG
    Ruser222 < @mydomain.ru.>                $#smtp $@ host1.mydomain.ru $: user22

    12. Как перенаправлять почту в зависимости от размера сообщения.

    24.07.2009. Источник здесь.
    У меня нет готового решения, но попробую перевести то, что посоветовал гуру.
    Итак, создаем дополнительный mailer. Например, так, как здесь.
    В определение mailer'a в поле F= добавляем флаг "e", получится, например, следующее: F=mDFMuXae
    Флаг e описан в локах след. образом:
    "... e This mailer is expensive to connect to, so try to avoid connecting normally; any necessary connec- tion will occur during a queue run. See also option HoldExpensive..."

    "... HoldExpensive [c] If an outgoing mailer is marked as being expensive, don't connect immediately..."

    "...confCON_EXPENSIVE HoldExpensive [False] Avoid connecting immediately to mailers marked expensive..."

    То есть вся почта, которая будет обрабатываться новым mailer'ом,будет сначала поставлена в очередь. Для чего это нужно? А для того, чтобы мы могли воспользоваться макросом $&{msg_size}, истинное значение которого можно проверить только после принятия письма целиком, например, в рулсете check_compat. Пример проверки размера сообщения есть здесь.
    То есть, насколько я понимаю, нужно будет сначала определить для всех новый mailer (или просто добавить текущему mailer'у флаг "e" через опцию
    SMTP_MAILER_FLAGS [undefined] Flags added to SMTP mailer. Default flags are `mDFMuX' for all SMTP-based mailers; the "esmtp" mailer adds `a'; "smtp8" adds `8'; and "dsmtp" adds `%'.),
    затем проверить размер сообщения в check_compat и по результату присвоить какому-нить макросу статус YES|NO, а затем в LOCAL_RULE_0 по этому макросу принять решение - куда пойдет данное письмо.

    Обратная связь
    Страница создана 28 августа 2007г. Последнее обновление - 24 ноября 2009г.