Статья размещена автором Бетке Сергей Сергеевич

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.

Exchange: автоматизация контроля доменов, не поддерживающих ESMTP (EHLO) Теперь предлагаю по аналогии с автоматическим белым списком отправителей обеспечить автоматическое обновление параметров SMTP коннектора средствами powershell и ADSI.

Местонахождение интересующего нас параметра в AD представлено на рисунке. Итак, обновлять будем атрибут routingList. Содержит многострочное значение, каждая строка вида SMTP:domain.com;10, где домен может быть указан и с маской вида *.domain.com, а группа цифр после ; — “стоимость” коннектора, обеспечивающая возможность конкретизации выбора коннектора при условии, что существует несколько коннекторов, способных доставить сообщение на указанный домен.

Exchange: автоматизация контроля доменов, не поддерживающих ESMTP (EHLO)Чтобы было более понятно, зачем нам несколько 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.
"@ `
)
}
}

Задача выполнена.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка