В случае проблем отправки электронной почты, часто необходимо просматривать очередь сообщений. В MS Exchange для этого есть, по меньшей мере, 2 инструмента — графическая консоль и Powershell.
Консоль управления Exchange (GUI)
Графическая консоль удобна для быстрого периодического осмотра очереди или поиска сообщения.
Просмотр
Запускаем Консоль управления Exchange — переходим в раздел Инструменты — кликаем по Средство просмотра очереди:
Откроется список почтовых доменов, на которые недавно были попытки отправить сообщения. В первую очередь, нас интересует колонки «Количество сообщений» и «Последняя ошибка» — для решения проблем смотрим их:
Описание колонок
- Тип доставки — определяет способ отправки писем и следующее действие (или очередь), которое будет выполнено с пересылаемым письмом. Может быть:
- DNSConnectorDelivery. Доставка с помощью SMTP-соединителя, созданного на локальном сервере. Разрешение маршрутизации с помощью DNS.
- NonSmtpGatewayDelivery. Используется очередь для доставки с помощью локального коннектора. SMTP не используется.
- SmartHostConnectorDelivery. Доставка внешнему получателю с помощью SMTP-соединителя. Разрешение маршрутизации с использованием промежуточного узла.
- SmtpRelayWithinAdSitetoEdge. Отправка письма внешнему получателю с помощью соединителя SMTP, который находиться на пограничном транспортном сервере.
- MapiDelivery. Доставка локальным получателям.
- SmtpRelayWithinAdSite. Сообщения помещаются в очередь для доставки на транспортный сервер-концентратор, находящийся на том же узле Active Directory, что и локальный сервер.
- SmtpRelaytoRemoteAdSite. Сообщения помещаются в очередь для доставки на сервер, находящийся на удаленном узле Active Directory.
- SmtpRelaytoTiRg. Сообщения помещаются в очередь для доставки группе маршрутизации Exchange Server 2003.
- Undefined. Сообщения помещаются в очередь отправки, а следующий пункт назначения прыжка еще не определен.
- Unreachable. Эти сообщения помещаются в очередь «Недостижимо», и задать маршрут к получателю невозможно.
- Состояние — состояние очереди для конкретного домена.
- Активно или Установка связи. Передача выполняется в данный момент.
- Приостановлено. Передача не выполняется, и не будет выполняться автоматически.
- Готово. Передача закончена, сообщений нет в очереди.
- Повторить. Передача не выполняется, повторные попытки будут предприняты в ближайшее время.
- Количество сообщений — отображает количество писем в очереди на отправку. Если 0, писем в очереди нет и в ближайшее время список должен пропасть. При наличии писем в очереди со статусами «Повторить» или «Приостановлено» говорит о том, что в результате отправки всех или некоторых писем до данного адресата, возникли ошибки.
- Время следующей попытки — дата и время, когда сервер отправит письмо. Как правило, можно увидеть со статусом «Повторить».
- Последняя ошибка — отображает код и текст последнее ошибки, которая возникла во время отправки сообщения.
Для поиска писем по критериям, возможно создать фильтр:
Возможные действия
Кликнув правой кнопкой мыши по списку очереди, мы получаем список возможных действий:
- Посмотреть сообщения — отобразит список писем, которые входят в очередь для данного адресата.
- Приостановить — не выполнять попыток отправлять письма.
- Удалить сообщения (с отправкой отчета о недоставке) — очередь чиститься, отправителю отправляется уведомление.
- Удалить сообщения (без отправки отчетов о недоставке) — очередь чиститься, отправителю ничего не отправляется.
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»}
Почему письма висят в очереди
Помещение письма в очередь при отправке — обычный процесс в работе любого почтового сервера. Сообщения, которые успешно отправляются, сразу пропадают из очереди, но при возникновении проблем, система пытается совершить повторные попытки отправки, а письма могут долго висеть в этой очереди, пока не отправятся или не истечет установленный администратором срок.
Часто встречаемые проблемы, из-за которых письма висят в очереди
Причин, почему может не уходить почта довольно много. Проблема может быть на нашей стороне, стороне получателя, сбоев программного обеспечения, ошибок администрирования, агрессивного действия систем безопасности и много другое. Вот небольшой список часто возникающих проблем:
- 451 4.4.0 primary target ip address responded with… Ваш сервер не смог отправить сообщение на mx получателя (причина поясняется после with).
- 451 4.4.0 DNS query failed. Неудачная попытка при разрешении MX-записи в DNS. Выполните вручную nslookup с почтового сервера, чтобы убедиться в работоспособности запросов DNS.
- 450 4.7.1 Helo command rejected: Host not found. Получатель отказался принять от нашего сервера команду приветствия из-за того, что не может найти имя нашего сервера в DNS. Необходимо убедиться в правильности настройки последнего для соответствующей зоны (записи A и PTR).
- 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
}
}
Что происходит:
- Подключаемся к серверу Exchange с логином admin и паролем, хэш которого хранится в файле C:\Scripts\password.txt (заранее создан командой read-host -assecurestring | convertfrom-securestring | out-file C:\Scripts\password.txt).
- Форсируем запуск повторной отправки сообщений для всех очередей со статусом «Повторить».
- Ждем 5 минут (300 секунд).
- Проходим по транспортным серверам и ищем очереди с длинной более 100 сообщений. Если находим, отправляем письмо администратору и выводим на экран 2.
* важно отметить, что в случае проблем с почтой, письмо администратору может и не прийти. Именно для этого мы также выводим статус 2. Его можно проверять системой мониторинга, например Zabbix.
Дополнительная информация
Типы очередей
Существуют следую очереди:
- Очереди доставки. Обычная очередь, содержащая письма для пересылки внешним и внутренним пользователям.
- Очередь передачи. Не обработанные службой транспорта сообщения, но полученные ею.
- Теневые очереди. Содержат копии отправляемых писем до момента подтверждения получения от mx-партнеров.
- Очередь подозрительных сообщений. Изолированные сообщения, которые Exchange посчитал, потенциально, опасными. Это могут быть письма, содержащие зловредный код, а может быть и ложное срабатывание из-за ошибки программного обеспечения.
- Сообщения с недостижимым местом назначения. Сообщения, которые не удалось доставить.
Где хранятся очереди Exchange
Очереди хранятся в базе данных ESE, которая находится в папке «%ExchangeInstallPath%TransportRoles\data\Queue»:
* mail.que — основной файл с базой очередей; tmp.edb — временный файл для проверки схемы самой базы; trn.chk — контрольные точки для отслеживания записи в логах.
Со временем, файл mail.que может разрастись и занимать много места. Для полной чистки базы ее можно просто создать заново. Для этого открываем службы Windows — останавливаем Microsoft Exchange Transport (перестанет работать почта) — переименовываем папку Queue, в которой находятся файлы базы и снова запускаем службу транспорта. Папка и база очереди создастся снова.
Источник: https://www.dmosk.ru/miniinstruktions.php?mini=exchange-queue