Нашел интересненькую выкладку https://www.dmosk.ru/miniinstruktions.php?mini=exchange-queue
get-queue
Get-Queue -Identity Submission
Get-Message -ResultSize unlimited
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 "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript." } | 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 = "Дмитрий <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.>"
$from = "Служба проверки очереди сообщений <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.>"
$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, в которой находятся файлы базы и снова запускаем службу транспорта. Папка и база очереди создастся снова.
Смена пути хранения очереди
Открываем на редактирование файл %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 — папка хранения файлов журналов очереди.