Ответ на почту Outlook с помощью PowerShell

Я пытаюсь автоматизировать некоторые ответы на электронные письма, которые я получаю в своем прогнозе. Я попытался отправить почту из своего внешнего вида (обычная почта) с помощью powershell, и это сработало успешно. Теперь я пытаюсь ответить на почту, используя powershell. Это мой текущий код на данный момент:

$o = New-Object -com Outlook.Application
$all_mail = $o.Session.Folders.Item($myEmailId).Folders.Item("Inbox").Items
foreach ($mail in $all_mail) {      
    if ($mail.subject -match "Re: Testing") {
        $reply = $mail.reply()
        $reply.body = $reply.body + "Adding this extra info in mail."
        $reply.send()
    }
}
#myEmailId is my emailId, if trying this script, replace it with yours.

Когда я запускаю это, я получаю следующую ошибку

Operation aborted (Exception from HRESULT: 0x80004004 (E_ABORT))
At line:7 char:13
+             $reply.send()
+             ~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

Я распечатал промежуточные журналы во время отладки и обнаружил, что он успешно получает все электронные письма в моем Outlook. Условие if, при котором оно соответствует теме письма, также работает нормально. Я пробовал просматривать различные ресурсы в Интернете, но не смог найти никакого решения для этого. Любая помощь или направление будет действительно полезным.


person visleck    schedule 19.02.2021    source источник
comment
Рад видеть, что вы обнаружили вариант, однако я действительно не совсем понимаю ваш вариант использования здесь. Для вашего варианта использования вам уже нужно открыть Outlook, чтобы узнать/получить имя субъекта, на которое нужно ответить, закрыть Outlook и запустить автоматизацию. Вы находитесь в Outlook, просто используйте VBA, чтобы запустить макрос, чтобы ответить на потоки электронной почты. Нет открытия/закрытия Outlook, запуска PowerShell для чего-то, что вы можете делать, пока он открыт. Итак, назовите меня любопытным. Не то, чтобы этот комментарий действительно требовал ответа, поскольку у вас есть свой собственный ответ, но, ну, вы знаете. ;-}, кстати, вы можете запустить сценарий PS из Outlook VBA.   -  person postanote    schedule 20.02.2021


Ответы (1)


Помогаю себе с блогом Microsoft Dev:

Add-Type -assembly "Microsoft.Office.Interop.Outlook"
Add-type -assembly "System.Runtime.Interopservices"

try
{
$outlook = [Runtime.Interopservices.Marshal]::GetActiveObject('Outlook.Application')
    $outlookWasAlreadyRunning = $true
}
catch
{
    try
    {
        $Outlook = New-Object -comobject Outlook.Application
        $outlookWasAlreadyRunning = $false
    }
    catch
    {
        write-host "You must exit Outlook first."
        exit
        
    }
}

$namespace = $Outlook.GetNameSpace("MAPI")

$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)

$mails = $inbox.Items | Where-Object {$_.Subject -like "ABC TEST*"}

foreach($mail in $mails) {
    $reply = $mail.reply()
    $reply.body = "TEST BODY"
    $reply.send()
    while(($namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderOutbox)).Items.Count -ne 0) {
        Start-Sleep 1
    }
}

# Kill Process Outlook (close COM)
Get-Process "*outlook*" | Stop-Process –force

Цикл while для Items.Count используется для проверки того, пуст ли OutBox. Если вы закроете процесс Outlook до его завершения, ваша почта не будет отправлена.

person PowerCat    schedule 19.02.2021