Sender whitelist (белый список) отправителей для Exchange 2003 – дубль 2
Ранее уже писал о возможности организации белого списка отправителей для Exchange 2003. Однако, выявились подводные камни с решением на базе NTFS junctions. После ряда обновлений — симптомы следующие: файлы из папки filter (pickup) успешно "улетают", но в exchange tracking log они вообще не попадают. И письма не доходят.
Решение есть. Разработаем службу (на базе сценария powershell), в которой реализуем подписку на новые файлы в папке Filter нашего SMTP сервера, копирование в архив и в папку Pickup того же SMTP сервера. Ниже – сценарий службы (о том, как зарегистрировать его в качестве службы – читайте в предыдущей статье):
trap { $evt=new-object System.Diagnostics.EventLog("Application") $evt.Source= 'itgSenderWhitelist' #$myinvocation.mycommand.name $evt.WriteEntry(` $_.Exception.Message, ` [System.Diagnostics.EventLogEntryType]::Error ` ) exit } $DebugPreference = "Continue" $SMTPFilterDir = "D:\Mailroot\vsi 1\Filter" $SMTPFilterBackupDir = "D:\Mailroot\vsi 1\FilterBackup" $SMTPPickupDir = "D:\Mailroot\vsi 1\Pickup" $watcher = New-Object System.IO.FileSystemWatcher $SMTPFilterDir $watcher.EnableRaisingEvents = $true Register-ObjectEvent ` $watcher ` -eventName "Created" ` -sourceIdentifier "SenderWhitelist.MsgFile.Created" ` -action { $ErrorActionPreference = "Continue" trap {continue} if ($true) { trap { $evt=new-object System.Diagnostics.EventLog("Application") $evt.Source= 'itgSenderWhitelist' #$myinvocation.mycommand.name $evt.WriteEntry(` $_.Exception.Message + "`n`nОшибка при копировании нового файла сообщения $($newMsgFile) в $($newMsgBackupFile).", ` [System.Diagnostics.EventLogEntryType]::Error ` ) break } $newMsgFile = $args[1].FullPath; $newMsgBackupFile = [System.IO.Path]::Combine( ` $SMTPFilterBackupDir, ` [System.IO.Path]::GetFileName($newMsgFile) ` ) $newPickupMsgFile = [System.IO.Path]::Combine( ` $SMTPPickupDir, ` [System.IO.Path]::GetFileName($newMsgFile) ` ) [System.IO.File]::Copy($newMsgFile, $newMsgBackupFile) [System.IO.File]::Move($newMsgFile, $newPickupMsgFile) } } #Get-EventSubscriber "SenderWhitelist.MsgFile.Created" | Unregister-Event #Get-EventSubscriber "SenderWhitelist.MsgFile.Created"
Опять-таки, следует изучить возможности WMI в части событий файловой системы, но для данной задачи обёртка System.IO.FileSystemWatcher показалась мне более удобной.
Сразу оговорюсь: приведённая служба имеет недостатки. Если файл занят, она регистрирует ошибку, но не более. Необходима доработка сценария с тем, чтобы он дожидался освобождения файла. Сделаю это чуть позднее.
Начинать изучение возможностей PowerShell в обработке событий рекомендую с этой статьи, что же касается событий файловой системы – рекомендую почитать здесь.
Отзывы » (1)
RSS комментарии
Обратная ссылка
А под 2013 подобного нет?Всё перерыл…