Использование PowerShell для отправки писем Outlook из черновика с изображениями - PullRequest
1 голос
/ 06 июля 2019

В рамках нашего процесса регистрации мы отправляем кредиты пользователям менеджерам по найму. У меня есть шаблон DRAFT, сохраненный в Outlook, и я запускаю сценарий PS, который использует шаблон Outlook и заменяет ключевые слова информацией о полномочиях (имя пользователя, пароль и т. Д.). Уже много лет он отлично работает, MARCOM хочет улучшить его и хочет, чтобы мы добавили встроенные изображения в новые письма о найме. Итак, я добавил изображения в шаблон, но когда я сейчас запускаю свой скрипт PS, изображения не появляются во вновь созданных электронных письмах. Существует просто красный «X» , и Outlook сообщает, что изображение не может быть отображено.

Некоторые из моих ключевых требований:

  • Из того, что я могу сказать, я не могу отправить электронное письмо с использованием SMTP (я должен использовать Outlook), потому что доставка вновь созданных электронных писем должна быть отложена (через DeferredDeliveryTime ). Если бы я мог отправлять с SMTP, я мог бы использовать что-то вроде , но я не могу использовать SMTP. Я попытался прикрепить изображения к черновику электронной почты в Outlook и использовать метод cid: для вызова имен вложенных файлов, но не смог заставить его работать.
  • Мы включили фонетическое написание паролей (уникальное для каждого письма), поэтому слияние не будет работать либо
  • Все изображения имеют гиперссылки (на различные сайты / услуги)

Я пробовал множество подходов, пытаясь решить эту проблему, в том числе сохранение черновика электронной почты в виде HTML и использование Get-Content -Raw для чтения в коде HTML и т. Д. и это не сработало

Я пытался использовать Mozilla Thunderbird (как указано здесь, электронное письмо powershell с html-изображением, отображаемым красным x ), чтобы получить Base64 изображения, но это тоже не сработало.

Общие основы моего кода PS (в части взаимодействия с Outlook):

If ($arrNewHireCSVobjects.Count -ge 1)
    {
    [string]$strTemplateSubjectToUse = 'Account Information - xyz'
    $oDraftsFolderIndex = 16
    $objOutlook = New-Object -comObject Outlook.Application
    $oNameSpace = $objOutlook.GetNameSpace("MAPI")
    $oDraftsFolder = $oNameSpace.GetDefaultFolder($oDraftsFolderIndex)
    $oTemplateToUse = $oDraftsFolder.Items | Where-Object {$_.Subject -eq $strTemplateSubjectToUse}
        $arrNewHireCSVobjects | ForEach-Object {
        $strTemp = $_."Manager ID"
        $ManagerUPN = ($arrManagerInfo | Where-Object {$_.employeeID -eq $strTemp}).userPrincipalName
        $NewOutlookEmail = $objOutlook.CreateItem(0)
        $NewOutlookEmail.SentonBehalfofName = "IT.Service.Desk@domain.com"
        $NewOutlookEmail.Recipients.Add($_."Current email address") | Out-Null
##
        [string]$strPhoneticPassword = ""
        For ($i = 0; $i -le $_."Temp password".Length; $i++) {
        [string]$decimal = [byte][char]($_."Temp password"[$i])
        If ($i -eq 0)
            {
            $strPhoneticPassword = $PhoneticTable[$decimal]
            }
        ElseIf ($i -eq $_."Temp password".Length)
            {
            $strPhoneticPassword = $strPhoneticPassword
            }
        Else
            {
            $strPhoneticPassword = $strPhoneticPassword + " / " + $PhoneticTable[$decimal]
            }
        }
        $strPhoneticPassword = ($strPhoneticPassword.Trim()).Replace('  ',' ')
##
        $NewOutlookEmail.Subject = $strTemplateSubjectToUse -replace 'xyz', ($_."First".Trim() + " " + $_."Last".Trim())
        $NewOutlookEmail.HTMLBody = $NewOutlookEmail.HTMLBody -replace "TEMPnewhirename", ($_."First".Trim() + " " + $_."Last".Trim())
        $NewOutlookEmail.HTMLBody = $NewOutlookEmail.HTMLBody -replace "TEMPusername", $_.Username
        $NewOutlookEmail.HTMLBody = $NewOutlookEmail.HTMLBody -replace "TEMPemailaddress", $_."Email Address"
        $NewOutlookEmail.HTMLBody = $NewOutlookEmail.HTMLBody -replace "TEMPtemppassword", $_."Temp password"
        $NewOutlookEmail.HTMLBody = $NewOutlookEmail.HTMLBody -replace "TEMPphoneticpassword", $strPhoneticPassword
        $NewOutlookEmail.DeferredDeliveryTime = (Date).AddHours(4)
        $NewOutlookEmail.Send()
        }
    }

Информация о сотруднике импортируется из CSV, изображения в шаблоне являются стандартными, встроенными изображениями (кроме ссылок). Фонетический пароль - это отдельная функция. Они хотят, чтобы дюжина встроенных изображений в этом шаблоне находилась в черновом сообщении электронной почты, но ни одно из них не отображается в конечном отправленном электронном письме (но гиперссылки по-прежнему работают с изображениями).

Учитывая мои требования использования клиента Outlook по сравнению с использованием чего-то вроде Send-MailMessage , может ли PS работать для отправки встроенных изображений, которые являются частью существующего ЧЕРНОВОГО письма в Outlook (2013 или 2016) успешно (и перед отправкой изменили шаблон DRAFT для замены определенных переменных), который включает пример / шаблон подписи? Если да, что мне не хватает в моем PS-коде, который позволит правильно отображать встроенные изображения?

Заранее спасибо !!

* * UCG тысяча сорок-девять

1 Ответ

0 голосов
/ 07 июля 2019

Я разработал решение, которое работает для меня.Во-первых, это строка кода POSH (сверху), которая вызывает мою проблему:

$NewOutlookEmail.HTMLBody = $oTemplateToUse.HTMLBody

Эта строка копирует содержимое письма " template ", но не изображения вэто письмоЧтобы сделать эту работу, я выбрал другой подход и создал полную копию исходного письма " template " и сохранил его в другой папке.После копирования я могу редактировать / отправлять скопированное электронное письмо, а изображения / ссылки остаются нетронутыми, поскольку я копирую не содержимое сообщения, а само письмо.

Для этого сначала я создал папку (в разделе ПРОЕКТЫ ) с именем Temp .

Далее я заменил эту строку кода скрипта (из моего вопроса выше):

$NewOutlookEmail = $objOutlook.CreateItem(0)

Со следующим:

$oSubFolder = $oDraftsFolder.Folders | ? {$_.FolderPath.EndsWith('Temp')}
$oDraftsFolder.Items | ForEach-Object {If ($_.Subject -Like $strTemplateSubjectToUse){$_.Copy().Move($oSubFolder)}} | Out-Null
$NewOutlookEmail = $oSubFolder.Items(1)

И я удалил следующую строку:

$NewOutlookEmail.HTMLBody = $oTemplateToUse.HTMLBody

После создания Temp * 1031Папка * в папке DRAFTS , при этом электронная почта « template » будет скопирована в новое сообщение в Temp * 1041Папка *, которая затем будет называться Items (1), затем отредактирована и затем отправлена.В следующем письме процесс будет повторяться (поэтому на него всегда будет ссылаться индекс 1, если это единственное письмо в папке Temp ).

Надеюсь, это поможет кому-то в будущем !!

...