divert(-1) # # Copyright (c) 2003, 2004 Victor Ustugov # This hack is under BSD License # Redistributions of source code must retain the above copyright notice # # hacks disscussion's maillist - http://www.mta.org.ua/mailman/listinfo/sendmail-conf # # # Check value of EHLO/HELO command # Проверка аргумента команды EHLO/HELO # dnl # dnl # Исключения из проверки HELO: dnl # dnl # исключения сделаны для ${client_addr}, находящихся в $w в виде IP адреса в квадратных скобках, dnl # т. е. если клиент находится на том же хосте, что и сервер dnl # dnl # для исключения из проверки исходящих сообщений надо в sendmail.mc внести: dnl # define(`confCHECK_HELO_SKIP', `OUTGOING')dnl dnl # dnl # в случае использования define(`confCHECK_HELO_SKIP', `OUTGOING') в access_db есть смысл внести: dnl # свои домены dnl # свои IP адреса в квадратных скобках dnl # все имена своего хоста dnl # dnl # подробнее о понятии "исходящим сообщений см. HACK(`is_outgoing') dnl # dnl # для исключения из проверки сообщений аутентифицированных отправителей надо в sendmail.mc внести: dnl # define(`confCHECK_HELO_SKIP', `AUTH')dnl dnl # dnl # для исключения из проверки адресов получателей, указанных в access_db с dnl # квалификатором Spam и значением FRIEND: dnl # define(`confCHECK_HELO_SKIP', `SPAMFRIEND')dnl dnl # dnl # dnl # Варианты проверок HELO: dnl # dnl # для проверки HELO по access_db надо в sendmail.mc внести: dnl # define(`confCHECK_HELO', `ACCESS_DB')dnl dnl # в access_db значения helo вносятся в следующем виде: dnl # Helo:mail.yahoo.com REJECT dnl # Helo:www.mail.ru REJECT dnl # Helo:compuserve.com ERROR Forged helo used dnl # Helo:DFGDFG DISCARD dnl # dnl # для проверки резолвинга A записи хоста, использованного в HELO dnl # надо в sendmail.mc внести: dnl # define(`confCHECK_HELO', `RESOLVE')dnl dnl # dnl # для проверки использования в качестве HELO PTR или A записей локальных интерфейсов dnl # или доменов надо в sendmail.mc внести: dnl # define(`confCHECK_HELO', `OWN')dnl dnl # dnl # для проверки отсутствия точки в HELO надо в sendmail.mc внести: dnl # define(`confCHECK_HELO', `SYNTAX')dnl dnl # dnl # для проверки корректности HELO, указанных в виде IP адреса в квадратных скобках dnl # надо в sendmail.mc внести: dnl # define(`confCHECK_HELO', `IP_SYNTAX')dnl dnl # dnl # для проверки HELO указанных в виде IP адреса без квадратных скобок dnl # надо в sendmail.mc внести: dnl # define(`confCHECK_HELO', `IP')dnl dnl # dnl # для проверки HELO по регулярным выражениям dnl # надо в sendmail.mc внести: dnl # define(`confCHECK_HELO', `DIALUP')dnl dnl # сами регулярные выражения указываются при использовании HACK(`check_helo_dialup_regex') dnl # пример: dnl # HACK(`check_relay_dialup_regex',``^(.+[\.\-])?(adsl|cable|client|dhcp|dial|dial-in|dial-up|dialup|dsl|dyn|dynamic|dyndsl|pool|ppp|user|xdsl)[\.\-_0-9].+'') dnl # HACK(`check_relay_dialup_regex',``^.*[0-9]{1,3}[-\.][0-9]{1,3}[-\.][0-9]{1,3}[-\.][0-9]{1,3}[-\.].+$'',``Access denied. Send mail thru your ISP'') dnl # dnl # dnl # в confCHECK_HELO и confCHECK_HELO_SKIP можно указывать несколько значений, dnl # разделяя их пробелом. dnl # пример: dnl # define(`confCHECK_HELO', `ACCESS_DB OWN SYNTAX IP_SYNTAX IP DIALUP')dnl dnl # define(`confCHECK_HELO_SKIP', `AUTH SPAMFRIEND OUTGOING')dnl dnl # dnl # dnl ###### функциональность, перенесенная из check_fake_helo.m4 dnl # dnl # проверяется соответствие суффикса HELO и доменной зоны PTR записи рилея dnl # dnl # пример: если HELO заканчивается на yahoo.com, то и PTR запись рилея dnl # должна оканчиваться на yahoo.com dnl # dnl # если у отправителя в MUA прописан адрес из домена yahoo.com dnl # и MUA в качестве HELO использует домен из обратного адреса, dnl # то такой отправитель должен отправлять почту через SMTP сервер своего провайдера, dnl # MTA которого уже будет использовать FQDN одного из своих интерфейсов dnl # dnl # confCHECK_HELO_FORGED_RESOLVE - действие при ошибках разрешения dnl # имени хоста рилея, что приведет к невозможности сравнить доменную dnl # зону хоста и суффикс helo. dnl # в confCHECK_HELO_FORGED_RESOLVE через пробел могут быть перечислены dnl # несколько значений, каждое из которых состоит из результата dnl # резолвинга и необходимого действия, разделенных двоеточием. dnl # возможные значения результатов резолвинга: dnl # TEMP - запись в реверсной зоне отсутствует dnl # FAIL - временные проблемы получения записи из реверсной зоны dnl # FORGED - запись в реверсной зоне не соответствует записи в dnl # прямой зоне dnl # возможные действия: dnl # DEFER - возвращать 4xx клиенту dnl # REJECT - возвращать 5xx клиенту dnl # PASS - пропускать проверку forged helo dnl # пример: dnl # define(`confCHECK_HELO_FORGED_RESOLVE', `FAIL:REJECT DEFER:DEFER FORGED:DEFER')dnl dnl # dnl # настройки суффиксов для проверки forged helo (новый вариант): dnl # dnl # такие суффиксы необходимо указывать в access_db с квалификатором HeloSuffix: dnl # HeloSuffix:yahoo.com REJECT go away dnl # HeloSuffix:hotmail.com REJECT dnl # HeloSuffix:aol.com DISCARD dnl # dnl # в качестве значений могут быть указаны: dnl # REJECT dnl # REJECT:сообщение об ошибке dnl # REJECT сообщение об ошибке dnl # DISCARD dnl # TEMP dnl # TEMP:сообщение об ошибке dnl # TEMP сообщение об ошибке dnl # ERROR:X.Y.Z:сообщение об ошибке dnl # ERROR:сообщение об ошибке dnl # ERROR сообщение об ошибке dnl # просто сообщение об ошибке dnl # dnl # для исключений из проверки helo целиком или суффикс указываются в access_db dnl # с квалификатором HeloSuffix и значением OK или SKIP dnl # HeloSuffix:yahoo.com REJECT go away dnl # HeloSuffix:some.host.yahoo.com OK dnl # dnl # настройки суффиксов для проверки forged helo (старый вариант, поддерживается для совместимости): dnl # dnl # суффиксы проверямых helo указываются в виде параметров для HACK(`check_helo'): dnl # dnl # HACK(`check_helo', `hotmail.com')dnl dnl # HACK(`check_helo', `yahoo.com')dnl dnl # HACK(`check_helo', `msn.com')dnl dnl # HACK(`check_helo', `aol.com')dnl dnl # HACK(`check_helo', `compuserve.com')dnl dnl # HACK(`check_helo', `rambler.ru')dnl dnl # HACK(`check_helo', `mail.ru')dnl dnl # HACK(`check_helo', `yandex.ru')dnl dnl # HACK(`check_helo', `chat.ru')dnl dnl # HACK(`check_helo', `gala.net')dnl dnl # ifdef(`_CHECK_HELO_', `dnl', `dnl divert(0) VERSIONID(`$Id: check_helo.m4,v 8.12-0.18 2004/10/22 12:32:42 corvax Exp $')dnl divert(-1) dnl define(`_CHECK_HELO_')dnl dnl dnl default settings dnl значения по умолчанию dnl ifdef(`confCHECK_HELO', `', `define(`confCHECK_HELO', `ACCESS_DB')') ifdef(`confCHECK_HELO_SKIP', `', `define(`confCHECK_HELO_SKIP', `AUTH OUTGOING SPAMFRIEND')') dnl ifdef(`confCHECK_HELO_FORGED_RESOLVE', `', `define(`confCHECK_HELO_FORGED_RESOLVE', `aaa')')dnl ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FAIL:', `', ` define(`confCHECK_HELO_FORGED_RESOLVE', confCHECK_HELO_FORGED_RESOLVE` FAIL:REJECT')') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `TEMP:', `', ` define(`confCHECK_HELO_FORGED_RESOLVE', confCHECK_HELO_FORGED_RESOLVE` TEMP:DEFER')') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FORGED:', `', ` define(`confCHECK_HELO_FORGED_RESOLVE', confCHECK_HELO_FORGED_RESOLVE` FORGED:DEFER')') dnl dnl ifdef(`_ACCESS_TABLE_', `', ` errprint(`*** ERROR: HACK(check_helo) requires FEATURE(access_db) ')') dnl ifelse_strstr(confCHECK_HELO_SKIP, `SPAMFRIEND', ` ifdef(`_DELAY_CHECKS_', `', ` errprint(`*** ERROR: HACK(check_helo) with SPAMFRIEND in confCHECK_HELO_SKIP requires FEATURE(delay_checks, FRIEND) ')')') dnl HACK(`precheck_envelope')dnl HACK(`check_ip')dnl dnl dnl LOCAL_RULESETS dnl dnl ifdef(`_DELAY_CHECKS_',` ifelse_strstr(confCHECK_HELO_SKIP, `SPAMFRIEND', ` SLocal_check_rcpt # R $* $: $>Parse0 $>3 $1 R $+ < @ $+ > $* $: $1 < @ $2 > $3 $| $1@$2 $| R $* $| $+@$+ . $| $: $1 $| $2@$3 $| R $* $| $+@$+ $| $: $1 $| $2@$3 $| $>SearchList $| <> R $* $| $+@$+ $| $: $1 $| $2@$3 dnl R $* $| $* $| $* $: $1 $| $2 $| $>CheckHelo $&s $| $&{client_name} $| $&{client_addr} R $* $| $* $| $#$* $#$3 R $* $| $* $| $* $| $* $| $* $: $1 R $* $| $* $: $1 ', ` SLocal_check_rcpt R $* $: $1 $| $>CheckHelo $&s $| $&{client_name} $| $&{client_addr} R $* $| $#$* $#$2 R $* $| $* $| $* $| $* $: $1 R $* $| $* $: $1 ') ', ` SLocal_check_mail R $* $: $1 $| $>CheckHelo $&s $| $&{client_name} $| $&{client_addr} R $* $| $#$* $#$2 R $* $| $* $| $* $| $* $: $1 R $* $| $* $: $1 ') SCheckHelo R . $| $* $| $* $#error $@ 5.7.1 $: "554 HELO Error" # делаем исключение из проверки, если PTR запись рилея # присутствует в $w (т. е. является адресом интерфеса этого же хоста) R $* $| $=w $| $* $@ SKIP_LOCAL # подставляем IP адрес рилея в квадратных скобках R $* $| $* $| $* $: $1 $| $2 $| [ $3 ] # делаем исключение из проверки, если IP адрес рилея в квадратных скобках # присутствует в $w (т. е. является адресом интерфеса этого же хоста) R $* $| $* $| $=w $@ SKIP_LOCAL # делаем исключение из проверки, если IP адрес рилея в квадратных скобках # является адресом loopback интерфейса R $* $| $* $| [127.0.0.1] $@ SKIP_LOCAL # убираем квардратные скобки R $* $| $* $| [ $+ ] $: $1 $| $2 $| $3 dnl ifelse_strstr(confCHECK_HELO_SKIP, `AUTH', `dnl # skip checks for authentificated senders # делаем исключение из проверки для аутентифицированных отправителей R $* $| $* $| $* $: $&{auth_type} $| $1 $| $2 $| $3 R $+ $| $* $| $* $| $* $@ SKIP_AUTH R $* $| $* $| $* $| $* $: $2 $| $3 $| $4 ') dnl ifelse_strstr(confCHECK_HELO_SKIP, `OUTGOING', `dnl # skip checks for outgoing messages # делаем исключение из проверки для исходящих сообщений R $* $| $* $| $* $: $&{IsOutgoing} $| $1 $| $2 $| $3 R YES $| $* $| $* $| $* $@ SKIP_OUTGOING R $* $| $* $| $* $| $* $: $2 $| $3 $| $4 ') dnl ifelse_strstr(confCHECK_HELO, `OWN', `dnl # check if HELO in $w class # проверяем наличие HELO в классе $w R $=w $| $* $| $* $#error $@ 5.7.1 $: "554 Misconfigured SMTP client detected" ') dnl ifelse_strstr(confCHECK_HELO, `SYNTAX', `dnl # check if HELO have no any dots # проверяем наличие хотя бы одной точки в HELO R $- $| $* $| $* $#error $@ 5.7.1 $: "554 Misconfigured SMTP client (may be MUA) detected" ') dnl ifelse_strstr(confCHECK_HELO, `ACCESS_DB', `dnl # check HELO in access_db # проверяем HELO по access_db R $+ $| $* $| $* $: < ? > $1 $| $2 $| $3 R $+ $| $* $| $* $: < $(access Helo:$1 $: ? $) > $1 $| $2 $| $3 R < REJECT > $* $#error $@ 5.7.1 $: "554 Untrusted HELO rejected" R < REJECT:$* > $* $#error $: $1 R < REJECT $* > $* $#error $: $1 R < DISCARD:$* > $* $#discard $: $1 R < DISCARD $* > $* $#discard $: $1 R < TEMP:$* > $* $#error $@ TEMPFAIL $: $1. " Try again later" R < TEMP $* > $* $#error $@ TEMPFAIL $: $1. " Try again later" R < ERROR:$-.$-.$-:$+ > $* $#error $@ $1.$2.$3 $: $4 R < ERROR:$* > $* $#error $@ UNAVAILABLE $: $1 R < ERROR $* > $* $#error $@ UNAVAILABLE $: $1 dnl R <$*> $+ $| $* $| $* $: $2 $| $3 $| $4 dnl ########## # проверка forged helo # # поиск helo в access_db с квалификатором HeloSuffix R $+ $| $* $| $* $: $1 $| $2 $| $3 $| $>AdvD <$1> <> # временная ошибка поиска, прекращаем проверку R $+ $| $* $| $* $| <> $* $: $1 $| $2 $| $3 # запись не найдена, прекращаем проверку R $+ $| $* $| $* $| $* $: $1 $| $2 $| $3 # запись найдена со значением SKIP, прекращаем проверку R $+ $| $* $| $* $| $* $: $1 $| $2 $| $3 # запись найдена со значением OK, прекращаем проверку R $+ $| $* $| $* $| $* $: $1 $| $2 $| $3 dnl # при положительном результате поиска в access_db и # проверяем рузальтаты ризолвинга $&{client_resolve} R $+ $| $* $| $* $| <$*> <> <$+> $: $1 $| $2 $| $3 $| <$4> <$5> $| $&{client_resolve} ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `TEMP:DEFER', `dnl R $+ $| $| $* $| <$*> <$+> $| TEMP $#error $@ 4.7.1 $: "450 Access temporarily denied. IP name lookup failed for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FAIL:DEFER', `dnl R $+ $| $| $* $| <$*> <$+> $| FAIL $#error $@ 4.7.1 $: "450 Access temporarily denied. Cannot resolve PTR record for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FORGED:DEFER', `dnl R $+ $| [$*] $| $* $| <$*> <$+> $| FORGED $#error $@ 4.7.1 $: "450 Access temporarily denied. IP name possibly forged " $3 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `TEMP:REJECT', `dnl R $+ $| $| $* $| <$*> <$+> $| TEMP $#error $@ 5.7.1 $: "450 Access denied. IP name lookup failed for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FAIL:REJECT', `dnl R $+ $| $| $* $| <$*> <$+> $| FAIL $#error $@ 5.7.1 $: "550 Access denied. Cannot resolve PTR record for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FORGED:REJECT', `dnl R $+ $| [$*] $| $* $| <$*> <$+> $| FORGED $#error $@ 5.7.1 $: "550 Access denied. IP name possibly forged " $3 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `TEMP:PASS', `dnl R $+ $| $| $* $| <$*> <$+> $| TEMP $: $1 $| $| $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FAIL:PASS', `dnl R $+ $| $| $* $| <$*> <$+> $| FAIL $: $1 $| $| $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FORGED:PASS', `dnl R $+ $| [$*] $| $* $| <$*> <$+> $| FORGED $: $1 $| [$2] $| $3 ') R $+ $| $* $| $* $| <$*> <$+> $| $* $: $1 $| $2 $| $3 $| <$4> <$5> dnl # сохраняем в {helo_key} доменную часть helo, найденную в access_db R $+ $| $* $| $* $| <$*> <$+> $: $1 $| $2 $| $3 $| <$4> <$5> $(macro {helo_key} $@ $5 $) # прекращаем проверку, если PTR запись рилея оканчивается на найденную доменную зону {helo_key} R $+ $| $+ . $&{helo_key} $| $* $| <$*> <$*> $: $: $1 $| $2.$&{helo_key} $| $3 dnl # вывод сообщений об ошибках R $+ $| $+ $| $* $| <$*> $#error $@ 5.7.1 $: "554 Forged HELO string " $1 R $+ $| $+ $| $* $| <$*> $#error $@ 5.7.1 $: $4 R $+ $| $+ $| $* $| <$*> $#error $@ 5.7.1 $: $4 R $+ $| $+ $| $* $| <$*> $#discard $: discard R $+ $| $+ $| $* $| <$*> $#discard $: $4 R $+ $| $+ $| $* $| <$*> $#discard $: $4 R $+ $| $+ $| $* $| <$*> $#error $@ TEMPFAIL $: "Try again later" R $+ $| $+ $| $* $| <$*> $#error $@ TEMPFAIL $: $4. "Try again later" R $+ $| $+ $| $* $| <$*> $#error $@ TEMPFAIL $: $4. "Try again later" R $+ $| $+ $| $* $| <$*> $#error $@ $4.$5.$6 $: $7 R $+ $| $+ $| $* $| <$*> $#error $@ UNAVAILABLE $: $4 R $+ $| $+ $| $* $| <$*> $#error $@ UNAVAILABLE $: $4 R $+ $| $+ $| $* $| <$*> <$*> $#error $: $4 # результат поиска неопределенный R $+ $| $* $| $* $| $* $: $1 $| $2 $| $3 ') dnl ifelse_strstr(confCHECK_HELO, `IP_SYNTAX', `dnl # check IP syntax in HELO # проверка синтаксиса IP адреса в HELO R [$-.$-.$-.$-] $| $* $| $* $: [$1.$2.$3.$4] $| $5 $| $6 $| $>CheckIPsyntax $1.$2.$3.$4 R [$-.$-.$-.$-] $| $* $| $* $| FAILED $#error $@ 5.7.1 $: "554 Incorrect IP syntax" R [$-.$-.$-.$-] $| $* $| $* $| $* $: [$1.$2.$3.$4] $| $5 $| $6 ') dnl ifelse_strstr(confCHECK_HELO, `IP', `dnl # check HELO as IP without brackets # проверяем, не является ли HELO IP адресом без квадратных скобок R $-.$-.$-.$- $| $* $| $* $: $1.$2.$3.$4 $| $5 $| $6 $| $(ippat $1.$2.$3.$4 $: IP $) R $-.$-.$-.$- $| $* $| $* $| IP $#error $@ 5.7.1 $: "554 Incorrect FQDN in HELO" R $-.$-.$-.$- $| $* $| $* $| $* $: $1.$2.$3.$4 $| $5 $| $6 ') dnl ifelse_strstr(confCHECK_HELO, `RESOLVE', `dnl # check HELO resolving # проверяем совпадение отрелвленного HELO и A записи рилея R $+ $| $* $| $* $: $1 $| $2 $| $3 $| $(dns_a $1 $) # if temporarily resolve problem occured R $+ $| $* $| $* $| $* $#TEMP $@ 4.7.1 $: "450 Access temporarily denied. Can not resolve A record of $1" # save A record of HELO R $+ $| $* $| $* $| $* $: $1 $| $2 $| $3 $| $4 $(macro {HELO_A} $@ $4 $) # if resolving failed R $&{HELO_A} $| $* $| $* $| $* $#error $@ 5.7.1 $: "550 Name IP lookup failed for " $&{HELO_A} # change last field to client A record with dot R $* $| $* $| $* $| $* $: $1 $| $2 $| $3 $| $3. # check R $* $| $* $| $* $| $&{HELO_A} $: $1 $| $2 $| $3 R $* $| $* $| $* $| $* $#error $@ 5.7.1 $: "550 A record " $&{HELO_A} " of HELO " $1 " and client IP address " $3 " are not equal" R $* $| $* $| $* $| $: $1 $| $2 $| $3 ') dnl ifelse_strstr(confCHECK_HELO, `DIALUP', `dnl # check HELO by dial-up/dsl/cable regexp pattern # проверяем HELO по регулярному выражению на принадлежность diul-up/dsl/cable сетям R $* $| $* $| $* $: $1 $| $2 $| $3 $| $>Local_check_dialup_helo $1 R $* $| $* $| $* $| $#$* $#$4 R $* $| $* $| $* $| $* $: $1 $| $2 $| $3 dnl SLocal_check_dialup_helo dnl define(`_CHECK_HELO_DIALUP_')dnl # check for HELO exclusion in access_db # проверяем, не указано ли HELO в списке исключений в access_db R $+ $: $1 $| $>D <$1> <> R $* $| <$={Accept}> <> $@ $1 R $* $| $* $: $1 dnl # check HELO by regexp # !!! WARNING !!! # regex check with dulpat deprecated # for regex checks use check_helo_dialup_regex # # проверка HELO по регулярному выражению # !!! ВНИМАНИЕ !!! # проверка по dulpat отключена # для проверки HELO по регулярным выражениям необходимо использовать check_helo_dialup_regex #R $* $: $(dulpat $1 $: $1 $) #R @MATCH $#error $@ 5.7.1 $: 550 Access from dsl/dial-up/cable relays denied according to the local policy ') ') dnl ifelse(len(X`'_ARG_), `1', `dnl', `dnl dnl dnl LOCAL_RULESETS dnl dnl SCheckHelo dnl # check for forged HELO # проверка поддельных HELO R $+ $| $* $| $* $: < ? > $1 $| $2 $| $3 $| $&{client_resolve} ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `TEMP:DEFER', `dnl R < ? > $* _ARG_ $| $| $* $| TEMP $#error $@ 4.7.1 $: "450 Access temporarily denied. Cannot resolve PTR record for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FAIL:DEFER', `dnl R < ? > $* _ARG_ $| $| $* $| FAIL $#error $@ 4.7.1 $: "450 Access temporarily denied. IP name lookup failed for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FORGED:DEFER', `dnl R < ? > $* _ARG_ $| [$*] $| $* $| FORGED $#error $@ 4.7.1 $: "450 Access temporarily denied. IP name possibly forged " $3 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `TEMP:REJECT', `dnl R < ? > $* _ARG_ $| $| $* $| TEMP $#error $@ 4.7.1 $: "450 Access temporarily denied. Cannot resolve PTR record for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FAIL:REJECT', `dnl R < ? > $* _ARG_ $| $| $* $| FAIL $#error $@ 5.7.1 $: "550 Access denied. IP name lookup failed for " $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `FORGED:REJECT', `dnl R < ? > $* _ARG_ $| [$*] $| $* $| FORGED $#error $@ 5.7.1 $: "550 Access denied. IP name possibly forged " $3 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `:PASS', `dnl R < ? > $* $| $| $* $| TEMP $: $1 $| $| $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `:PASS', `dnl R < ? > $* $| $| $* $| FAIL $: $1 $| $| $2 ') ifelse_strstr(confCHECK_HELO_FORGED_RESOLVE, `:PASS', `dnl R < ? > $* $| [$*] $| $* $| FORGED $: $1 $| [$2] $| $3 ') R < ? > $+ $| $* $| $* $| $* $: < ? > $1 $| $2 $| $3 dnl R $* _ARG_ $| $+ . _ARG_ $| $* $: $1 _ARG_ $| $2 . _ARG_ $| $3 R $* _ARG_ $| $+ $| $* $#error $@ 5.7.1 $: "554 Forged HELO string " $1 _ARG_ R <$*> $* $| $* $| $* $: $2 $| $3 $| $4 ')