Exchange: автоматизация контроля доменов, не поддерживающих ESMTP (EHLO)
Продолжаю тему автоматизации обслуживания microsoft exchange server 2003 с помощью powershell. Раньше уже писал о автоматизации контроля почтовых сервисов с использованием powershell и LogParser. В частности, предложенный в указанном посте сценарий формировал письмо следующего содержания:
To: postmaster Subject: "Обнаружены домены, не поддерживающие ESMTP" При проверке журналов SMTP сервера обнаружены ESMTP сессии, в рамках которых получен отказ на EHLO. Следует включить данные домены в перечень доменов, обслуживаемых исключительно по SMTP - в SMTP connector "SMTP, internet, user messages". Обнаружены домены: test.com (5) test2.com (10) test3.com (2) Выдержка из журнала SMTP сервера: ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ======== Домен test.com (5) : ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| …сессии… С Уважением, postmaster.
Теперь предлагаю по аналогии с автоматическим белым списком отправителей обеспечить автоматическое обновление параметров SMTP коннектора средствами powershell и ADSI.
Местонахождение интересующего нас параметра в AD представлено на рисунке. Итак, обновлять будем атрибут routingList. Содержит многострочное значение, каждая строка вида SMTP:domain.com;10, где домен может быть указан и с маской вида *.domain.com, а группа цифр после ; — “стоимость” коннектора, обеспечивающая возможность конкретизации выбора коннектора при условии, что существует несколько коннекторов, способных доставить сообщение на указанный домен.
Чтобы было более понятно, зачем нам несколько SMTP коннекторов, приведу рисунок из ESM.
-
ESMTP, internet, block system messages – данный коннектор неактивен, посему он “накапливает” NDR и DSN сообщения. Для всех доменов, кроме тех, что прописаны в следующем коннекторе. Причины подобного решения обсудим в следующих постах (кратко – для предотвращения NDR спама, точнее – для предотвращения использования нашей почтовой системы в NDR спам-рассылках).
-
ESMTP, internet, system messages – данный коннектор также, как и предыдущий, обрабатывает только системные сообщения. Но, в отличии от предыдущего, принимает их только для узкого списка доменов (для которых подтверждён факт использования технологии подтверждения отправителя (SPF, Sender-ID, DKIM, BATV). Другими словами, DSN (NDR – как частный случай) мы отправляем только тогда, когда уверены, что письмо получили действительно от почтовой системы домена. Подробности – позднее.
-
ESMTP, internet, user messages – обрабатывает сообщения пользователей, отправляет посредством ESMTP (сессию начинаем с глагола EHLO), сервера – через DNS. Самый “типовой” коннектор, но с самой высокой ценой.
-
SMTP, internet, user messages – отправляет сообщения пользователей узкому кругу доменов, MX которых не поддерживают ESMTP (“не знают” глагола EHLO, в частности). Выбор данного коннектора для указанного круга доменов определяется перечнем доменов в атрибутах данного коннектора и более низкой “ценой” (Cost) по отношению к предыдущему коннектору.
Теперь для того, чтобы передавать сообщения доменам, не поддерживающим ESMTP (а наш сценарий уже умеет обнаруживать такие домены), достаточно добавить его (домен) в атрибут routingList коннектора SMTP, internet, user messages. Приведу отрывок сценария, который обеспечит необходимую функциональность:
# ======================================================================= # подготовим и направим отчёт по отказам на исходящие ESMTP сессии (EHLO) if ($outputMailErrors.facts) { $ESMTPErrors = $outputMailErrors.facts | where { $_.fact | where { ($_.Response -like "500*") ` -or ($_.Response -like "502*") } } if ($ESMTPErrors) { # выделим найденные SMTP домены $newSMTPDomains = $ESMTPErrors | group ToDomain | sort name # прочитаем и разберём список доменов, не поддерживающих ESMTP $exchSMTPConnectorConfig = [ADSI]"LDAP://CN=SMTP\, internet\, user messages,CN=Connections,CN=Основная группа маршрутизации сообщений,CN=Routing Groups,CN=Почтовые серверы Компании ГАРО,CN=Administrative Groups,CN=NovGARO,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=novgaro,DC=ru" $SMTPDomains = $exchSMTPConnectorConfig.routingList ` | ? {$_} | % { if ($_ -match "^SMTP:$($reDomain);(?<cost>\d+)$") { $resObj = new-Object System.Management.Automation.PSObject $resObj | add-member -memberType NoteProperty -name Domain -value $matches["domain"] $resObj | add-member -memberType NoteProperty -name Cost -value $matches["cost"] write-output $resObj } } # проведём проверку вновь найденных доменов на соответствия шаблонам доменов из AD $newSMTPDomains = $newSMTPDomains | % { $newDomain = $_.name $matchedWildcard = ($SMTPDomains | ? { $newDomain -like $_.domain } | select -first 1).domain if ($matchedWildcard) { $_ | add-member -memberType NoteProperty -name matchedWildcard -value $matchedWildcard -force } $_ } # готовим новый список $SMTPDomains += $newSMTPDomains | ? {-not $_.matchedWildcard} | % { $resObj = new-Object System.Management.Automation.PSObject $resObj | add-member -memberType NoteProperty -name Domain -value $_.name $resObj | add-member -memberType NoteProperty -name Cost -value 10 write-output $resObj } # сохраняем изменения в AD $exchSMTPConnectorConfig.routingList = $SMTPDomains | %{ "SMTP:$($_.domain);$($_.cost)" } $exchSMTPConnectorConfig.SetInfo() $SMTPclient.Send( ` $emailFrom, ` $emailTo, ` "[ГАРО-ITG $($myinvocation.mycommand.name)] Обнаружены домены, не поддерживающие ESMTP", ` @" При проверке журналов SMTP сервера обнаружены ESMTP сессии, в рамках которых получен отказ на EHLO. Данные домены должны быть включены в перечень доменов, обслуживаемых исключительно по SMTP - в SMTP connector "SMTP, internet, user messages" (включены сценарием автоматически). $($newSMTPDomains | group matchedWildcard | sort name | % { if ($_.name) { "`nСоответствуют уже введённому шаблону $($_.name) ($($_.count)):" } else { "`nВновь вводимые ($($_.count)):" } $_.group | % { "`n`t$($_.name)" } }) Вновь вводимые записи включены в параметры коннектора. Новое состояние коннектора: $($SMTPDomains | % { "`n`t$($_.domain)" }) Выдержка из журнала SMTP сервера: $($ESMTPErrors | group ToDomain | sort name | %{ @" ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ======== Домен $($_.name) ($($_.count)) : ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| "@ $_.group | % { $_.sessionLogFormatted } }) P.S.> Скрипт: $($myinvocation.mycommand.path) С Уважением, postmaster@novgaro.ru. "@ ` ) } }
Задача выполнена.
RSS комментарии
Обратная ссылка