Тематические термины: Exchange, Powershell, SMTP.
В случае проблем отправки электронной почты, часто необходимо просматривать очередь сообщений. В MS Exchange для этого есть, по меньшей мере, 2 инструмента — графическая консоль и Powershell.
Графическая консоль удобна для быстрого периодического осмотра очереди или поиска сообщения.
Запускаем Консоль управления Exchange – переходим в раздел Инструменты – кликаем по Средство просмотра очереди:
Откроется список почтовых доменов, на которые недавно были попытки отправить сообщения. В первую очередь, нас интересует колонки «Количество сообщений» и «Последняя ошибка» — для решения проблем смотрим их:
Для поиска писем по критериям, возможно создать фильтр:
Кликнув правой кнопкой мыши по списку очереди, мы получаем список возможных действий:
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
Подробная информация о письмах в очереди от определенного отправителя:
Get-Message -Filter { FromAddress -like “[email protected]” } | 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”}
Помещение письма в очередь при отправке — обычный процесс в работе любого почтового сервера. Сообщения, которые успешно отправляются, сразу пропадают из очереди, но при возникновении проблем, система пытается совершить повторные попытки отправки, а письма могут долго висеть в этой очереди, пока не отправятся или не истечет установленный администратором срок.
Причин, почему может не уходить почта довольно много. Проблема может быть на нашей стороне, стороне получателя, сбоев программного обеспечения, ошибок администрирования, агрессивного действия систем безопасности и много другое. Вот небольшой список часто возникающих проблем:
Посмотреть:
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 = “admins24\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.admins24.local/powershell -Credential $credImport-PSSession $session
function Send-Alert () { $it = “Дмитрий <[email protected]>” $from = “Служба проверки очереди сообщений <[email protected]>” $subject = “Необходимо проверить транспорт почты” $bodyMessage = “Есть очереди, превышающие допустимое количество писем” $enc = New-Object System.Text.utf8encoding Send-MailMessage -to $it -from $from -Subject $subject-bodyAsHTML $bodyMessage -smtpServer mx.admins24.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 }}
Что происходит:
* важно отметить, что в случае проблем с почтой, письмо администратору может и не прийти. Именно для этого мы также выводим статус 2. Его можно проверять системой мониторинга, например Zabbix.
Существуют следую очереди:
Очереди хранятся в базе данных ESE, которая находится в папке “%ExchangeInstallPath%TransportRoles\data\Queue”:
* 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
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies