События COM (MS Office) в Powershell

Этот вопрос тесно связан с моим предыдущим здесь: Обработка отмены события COM в VBScript

Я хотел бы написать сценарий, который отправляет электронное письмо через SMTP-сервер нашей компании с использованием CDO.

Сначала я попытался написать HTA-приложение для этой цели, но сделать его достаточно удобным, чтобы другие люди могли хорошо с ним работать (из-за правильного разрешения получателя), стало довольно затруднительно.

Итак, теперь я пытаюсь использовать обычную маску Outlook-Mail, чтобы сначала подготовить почту, а затем перехватить событие отправки элемента через Powershell, чтобы передать его содержимое моему сценарию CDO. Я пробовал это через VBScript раньше (см. ссылку выше), но, похоже, это не работает должным образом.

Я новичок в написании сценариев powershell, но в прошлом у меня уже были вещи, которые не работали в VBScript, поэтому я надеюсь, что моя проблема снова будет решена. Прямо сейчас мой скрипт выглядит так:

$WSH = new-Object -ComObject "WScript.Shell"
$Outlook = new-Object -ComObject "Outlook.Application"
$olMailItem = 0

register-objectevent -InputObject $Outlook -EventName "ItemSend"

$MailObject = $Outlook.CreateItem($olMailItem)
$MailObject.Display()

function Outlook_ItemSend([object] $Item, [ref] $Cancel)
{
    $Cancel = $TRUE
    $WSH.PopUp("Event worked")
    return $Null
}

Я еще не зашел так далеко, как надеялся, потому что я вообще не могу понять, как запустить событие. Вы можете найти множество примеров для register-objectevent в Интернете, но каждый раз это кажется очень специфичным для какого-то специального COM-объекта. Я не смог найти ни одного примера для регистрации COM-события MS-Office, для которого требуются параметры...


person GuidoT    schedule 14.01.2019    source источник


Ответы (1)


Вместо использования события вы можете отобразить сообщение модально — вызовите MailItem.Display и передайте true в качестве параметра.

person Dmitry Streblechenko    schedule 14.01.2019
comment
На самом деле это хороший совет, но, к сожалению, не помог... Когда я отображаю почту как модальную, мой скрипт приостанавливается (пока хорошо), но в тот момент, когда я (или другой пользователь) нажимаю «Отправить», почта отправляется выходит регулярно, прежде чем мой код продолжит свое выполнение. Так что уже поздно заниматься почтой. - person GuidoT; 15.01.2019
comment
О, вы пытаетесь изменить сообщение после того, как пользователь нажмет кнопку «Отправить», но до того, как оно будет отправлено? Событие по-прежнему не срабатывает? - person Dmitry Streblechenko; 15.01.2019
comment
Да, я на самом деле хочу отменить ItemSend-Event, потому что я написал другую функцию, использующую CDO для отправки моей электронной почты через наш SMTP-сервер, чтобы она выглядела как какая-то электронная почта, сгенерированная системой. Я хочу создавать электронные письма на основе событий, но дать пользователю возможность редактировать содержимое почты. Поэтому, когда пользователь нажимает кнопку отправки, я хочу, чтобы электронная почта вместо этого скрылась, передала все ее содержимое моему CDO-скрипту (чтобы вместо этого отправить его оттуда), а затем уничтожила почту Outlook без фактической отправки Пользователь. - person GuidoT; 15.01.2019
comment
И да, событие по-прежнему фактически не срабатывает. Он скорее вылетает всякий раз, когда я нажимаю кнопку отправки. Я создал $Action = {Write-Host 'TestEvent'}, чтобы передать его Register-ObjectEvent, но это тоже не помогает. - person GuidoT; 15.01.2019
comment
Я не знаю, почему событие не срабатывает, извините - я не эксперт PS. - person Dmitry Streblechenko; 15.01.2019