Работа с очередями в MS Exchange Server

Обновлено Обновлено: Опубликовано Опубликовано:

Тематические термины: Exchange, Powershell, SMTP.

В случае проблем отправки электронной почты, часто необходимо просматривать очередь сообщений. В MS Exchange для этого есть, по меньшей мере, 2 инструмента — графическая консоль и Powershell.

Консоль управления Exchange (GUI)

Графическая консоль удобна для быстрого периодического осмотра очереди или поиска сообщения.

Просмотр

Запускаем Консоль управления Exchange - переходим в раздел Инструменты - кликаем по Средство просмотра очереди:

Открываем средство просмотра очереди

Откроется список почтовых доменов, на которые недавно были попытки отправить сообщения. В первую очередь, нас интересует колонки «Количество сообщений» и «Последняя ошибка» — для решения проблем смотрим их:

Список очередей Exchange

Описание колонок

  1. Тип доставки — определяет способ отправки писем и следующее действие (или очередь), которое будет выполнено с пересылаемым письмом. Может быть:
    • DNSConnectorDelivery. Доставка с помощью SMTP-соединителя, созданного на локальном сервере. Разрешение маршрутизации с помощью DNS.
    • NonSmtpGatewayDelivery. Используется  очередь для доставки с помощью локального коннектора. SMTP не используется.
    • SmartHostConnectorDelivery. Доставка внешнему получателю с помощью SMTP-соединителя. Разрешение маршрутизации с использованием промежуточного узла.
    • SmtpRelayWithinAdSitetoEdge. Отправка письма внешнему получателю с помощью соединителя SMTP, который находиться на пограничном транспортном сервере.
    • MapiDelivery. Доставка локальным получателям.
    • SmtpRelayWithinAdSite. Сообщения помещаются в очередь для доставки на транспортный сервер-концентратор, находящийся на том же узле Active Directory, что и локальный сервер.
    • SmtpRelaytoRemoteAdSite. Сообщения помещаются в очередь для доставки на сервер, находящийся на удаленном узле Active Directory.
    • SmtpRelaytoTiRg. Сообщения помещаются в очередь для доставки группе маршрутизации Exchange Server 2003.
    • Undefined. Сообщения помещаются в очередь отправки, а следующий пункт назначения прыжка еще не определен.
    • Unreachable. Эти сообщения помещаются в очередь «Недостижимо», и задать маршрут к получателю невозможно.
  2. Состояние — состояние очереди для конкретного домена.
    • Активно или Установка связи. Передача выполняется в данный момент.
    • Приостановлено. Передача не выполняется, и не будет выполняться автоматически.
    • Готово. Передача закончена, сообщений нет в очереди.
    • Повторить. Передача не выполняется, повторные попытки будут предприняты в ближайшее время.
  3. Количество сообщений — отображает количество писем в очереди на отправку. Если 0, писем в очереди нет и в ближайшее время список должен пропасть. При наличии писем в очереди со статусами «Повторить» или «Приостановлено» говорит о том, что в результате отправки всех или некоторых писем до данного адресата, возникли ошибки.
  4. Время следующей попытки — дата и время, когда сервер отправит письмо. Как правило, можно увидеть со статусом «Повторить».
  5. Последняя ошибка — отображает код и текст последнее ошибки, которая возникла во время отправки сообщения.

Для поиска писем по критериям, возможно создать фильтр:

Создание фильтра при поиске очереди Exchange

Варианты фильтра при поиске сообщений в очереди Exchange

Возможные действия

Кликнув правой кнопкой мыши по списку очереди, мы получаем список возможных действий:

Возможные действия с очередью Exchange

  • Посмотреть сообщения — отобразит список писем, которые входят в очередь для данного адресата.
  • Приостановить — не выполнять попыток отправлять письма.
  • Удалить сообщения (с отправкой отчета о недоставке) — очередь чиститься, отправителю отправляется уведомление.
  • Удалить сообщения (без отправки отчетов о недоставке) — очередь чиститься, отправителю ничего не отправляется.

Powershell

Powershell позволит автоматизировать некоторые задачи по работе с очередями.

Просмотр

Синтаксис:

Get-Queue [-Filter Фильтр] [-Server Сервер] <Параметры запроса>

Пример:

Get-Queue | fl

Примеры использования

Отобразить очереди, в которых более 50-и писем.

Get-Queue -Filter { MessageCount -gt 50 }

Посмотреть сообщения для конкретной очереди:

Get-Queue -Identity mx\615820 | Get-Message

* где mx\615820 — идентификатор очереди, который мы смотрим командой Get-Queue.

Посмотреть все очереди на всех транспортных серверах:

Get-TransportServer | ForEach { Get-Queue -Server $_.Name }

Подробная информация об очереди:

Get-Queue -Identity mx\615820 | Format-List

* где mx\615820 — идентификатор очереди, который мы смотрим командой Get-Queue.

Подробная информация о письмах в очереди от определенного отправителя:

Get-Message -Filter { FromAddress -like "user@dmosk.local" } | Format-List

Список отправителей для определенной очереди:

Get-Queue mx\726931 | Get-Message -ResultSize Unlimited | Select FromAddress

Список получателей:

Get-Queue mx\726931 | Get-Message -ResultSize Unlimited -IncludeRecipientInfo | Select Recipients

Очистить очередь

Удалить сообщения в очереди:

Get-Queue -Identity mx\Poison | Get-Message -ResultSize unlimited | Remove-Message -WithNDR $False

* где mx\Poison — название очереди.

Удалить все сообщения:

Get-Queue | Get-Message -ResultSize unlimited | Remove-Message -WithNDR $False

Удалить сообщение по фильтру:

Get-Queue | Get-Message -ResultSize unlimited | Where {$_.Subject -eq "Тема письма"} | Remove-Message -WithNDR $False

Повторная отправка очереди

Выполняется с помощью командлета Retry-Queue:

Retry-Queue -Filter {Status -eq "Retry"}

* данная команда принудительно повторит отправку всех сообщений, у которых активен статус «Повторить».

Для повторной отправки из очереди подозрительных сообщений, сначала смотрим письма:

Get-Message -Queue Poison

И повторяем попытку отправки с использованием идентификатора письма:

Resume-Message mx\Poison\162514

* где mx\Poison\162514 — полный идентификатор сообщения (mx — сервер, Poison — очередь, 162514 — id письма).

Приостановка очереди

Выполняется командлетом Suspend-Queue:

Suspend-Queue mx\173625

Остановить отправку сообщений, которые находятся в очереди с более чем 500 писем:

Suspend-Queue -Filter {MessageCount -ge 500 -and Status -eq "Retry"}

Возобновить приостановленную очередь

Resume-Queue -Filter {Status -eq "Suspended"}

Почему письма висят в очереди

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

Часто встречаемые проблемы, из-за которых письма висят в очереди

Причин, почему может не уходить почта довольно много. Проблема может быть на нашей стороне, стороне получателя, сбоев программного обеспечения, ошибок администрирования, агрессивного действия систем безопасности и много другое. Вот небольшой список часто возникающих проблем:

  1. 451 4.4.0 primary target ip address responded with... Ваш сервер не смог отправить сообщение на mx получателя (причина поясняется после with).
  2. 451 4.4.0 DNS query failed. Неудачная попытка при разрешении MX-записи в DNS. Выполните вручную nslookup с почтового сервера, чтобы убедиться в работоспособности запросов DNS.
  3. 450 4.7.1 Helo command rejected: Host not found. Получатель отказался принять от нашего сервера команду приветствия из-за того, что не может найти имя нашего сервера в DNS. Необходимо убедиться в правильности настройки последнего для соответствующей зоны (записи A и PTR).
  4. 451 4.7.0 Temporary server error. Please try again later. Как правило, ошибка связана с невозможностью разрешать записи в DNS. Ошибка может носить временный характер, а может возникнуть из-за неправильных настроек сети.

Время жизни сообщения в очереди

Посмотреть:

Get-transportserver MX | Select MessageExpirationTimeout

* где MX — имя транспортного сервера. По умолчанию, равен 2.00:00:00 (2 дня).

Поменять:

Set-TransportServer MX -MessageExpirationTimeout 3.00:00:00

* где MX — имя транспортного сервера.

Скрипт мониторинга очередей

Пример рабочего скрипта на Powershell:

Set-PSDebug -Off
 

$username = "dmosk\admin"
$password = cat C:\Scripts\password.txt | convertto-securestring
$threshold_count = 100
 

$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://mx.dmosk.local/powershell -Credential $cred
Import-PSSession $session
 

function Send-Alert () {
    $it = "Дмитрий <master@dmosk.ru>"
    $from = "Служба проверки очереди сообщений <queue_check@dmosk.local>"
    $subject = "Необходимо проверить транспорт почты"
    $bodyMessage = "Есть очереди, превышающие допустимое количество писем"
    $enc  = New-Object System.Text.utf8encoding
    Send-MailMessage -to $it -from $from -Subject $subject-bodyAsHTML $bodyMessage -smtpServer mx.dmosk.local -Encoding $enc
}
 

Get-TransportServer | ForEach {
    Retry-Queue -Filter {Status -eq "Retry"}
}
 

Start-Sleep -s 300
 

Get-TransportServer | ForEach {
    Get-Queue -Server $_.Name -Filter { MessageCount -gt $threshold_count } | ForEach {
        Send-Alert
        echo 2
        break
    }
}

Что происходит:

  1. Подключаемся к серверу Exchange с логином admin и паролем, хэш которого хранится в файле C:\Scripts\password.txt (заранее создан командой read-host -assecurestring | convertfrom-securestring | out-file C:\Scripts\password.txt).
  2. Форсируем запуск повторной отправки сообщений для всех очередей со статусом «Повторить».
  3. Ждем 5 минут (300 секунд).
  4. Проходим по транспортным серверам и ищем очереди с длинной более 100 сообщений. Если находим, отправляем письмо администратору и выводим на экран 2.

* важно отметить, что в случае проблем с почтой, письмо администратору может и не прийти. Именно для этого мы также выводим статус 2. Его можно проверять системой мониторинга, например Zabbix.

Дополнительная информация

Типы очередей

Существуют следую очереди:

  • Очереди доставки. Обычная очередь, содержащая письма для пересылки внешним и внутренним пользователям.
  • Очередь передачи. Не обработанные службой транспорта сообщения, но полученные ею.
  • Теневые очереди. Содержат копии отправляемых писем до момента подтверждения получения от mx-партнеров.
  • Очередь подозрительных сообщений. Изолированные сообщения, которые Exchange посчитал, потенциально, опасными. Это могут быть письма, содержащие зловредный код, а может быть и ложное срабатывание из-за ошибки программного обеспечения.
  • Сообщения с недостижимым местом назначения. Сообщения, которые не удалось доставить.

Где хранятся очереди Exchange

Очереди хранятся в базе данных ESE, которая находится в папке "%ExchangeInstallPath%TransportRoles\data\Queue":

Список файлов в папке с очередями Exchange

* mail.que — основной файл с базой очередей; tmp.edb — временный файл для проверки схемы самой базы; trn.chk — контрольные точки для отслеживания записи в логах.

Со временем, файл mail.que может разрастись и занимать много места. Для полной чистки базы ее можно просто создать заново. Для этого открываем службы Windows - останавливаем Microsoft Exchange Transport (перестанет работать почта) - переименовываем папку Queue, в которой находятся файлы базы и снова запускаем службу транспорта. Папка и база очереди создастся снова.

Смена пути хранения очереди

Открываем на редактирование файл %ExchangeInstallPath%\Bin\EdgeTransport.exe.config (C:\Program Files\Microsoft\Exchange Server\V14\Bin\EdgeTransport.exe.config) и меняем значения ключей QueueDatabasePath и QueueDatabaseLoggingPath, например:

    <add key="QueueDatabasePath" value="D:\Queue" />
    <add key="QueueDatabaseLoggingPath" value="D:\Queue" />

* где QueueDatabasePath — папка хранения файлов очереди; QueueDatabaseLoggingPath — папка хранения файлов журналов очереди.

Читайте также

Получение статистики сообщений в MS Exchange

Работа с очередью в Postfix

# Серверы # Почта # Powershell # Exchange
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет