Статья размещена автором Бетке Сергей Сергеевич

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)

  1. Алекс:

    А под 2013 подобного нет?Всё перерыл…

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка