使用PowerShell从草稿模板发送带有图像的Outlook电子邮件

时间:2019-07-06 17:39:47

标签: html powershell outlook

作为入职流程的一部分,我们将用户凭据发送给招聘经理。我有一个保存在Outlook中的DRAFT模板,并运行一个使用Outlook模板的PS脚本,并用凭据信息(用户名,密码等)替换关键字。多年来效果一直很好,现在,MARCOM希望对其加以完善,并希望我们将内嵌图像添加到新的雇用电子邮件中。因此,我将图像添加到了模板中,但是现在运行PS脚本时,这些图像不在新创建的电子邮件中。只是有一个红色的“ X” 并且Outlook报告该图像无法显示。

我的一些关键要求是:

  • 据我所知,我无法使用SMTP发送电子邮件(必须使用Outlook),因为必须延迟(通过 DeferredDeliveryTime 强>)。如果可以使用SMTP发送,则可能可以使用 之类的东西,但不能使用SMTP。我尝试将图像附加到Outlook中的DRAFT电子邮件中,并使用 cid: 方法调用附加的文件名,但是我无法正常工作。
  • 我们包括了密码的拼写(每封电子邮件都是唯一的),因此邮件合并也不起作用
  • 所有图像都有超链接(指向各种站点/服务)

我尝试了许多方法来解决此问题,包括将DRAFT电子邮件另存为HTML,并使用 Get-Content -Raw 读取HTML代码等等,但这没用

我尝试使用Mozilla Thunderbird(如此处引用的powershell email with html picture showing red 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导入的,模板中的图像是标准的嵌入式图像(链接除外)。语音密码是一个单独的功能。他们希望在此模板中像一打内联图像,并且它们在DRAFT电子邮件中,但是在发送的最终电子邮件中都没有显示(但是超链接仍然适用于图像)。

考虑到我必须使用Outlook客户端而不是使用 Send-MailMessage 之类的要求,PS可以发送内嵌图像,这些图像是现有DRAFT电子邮件的一部分在Outlook(2013或2016)中是否成功(并且已修改DRAFT模板以在发送之前替换特定变量),其中包括签名示例/模板?如果是这样,我的PS代码中缺少什么使内嵌图像正确显示的内容?

提前谢谢!

UCG

1 个答案:

答案 0 :(得分:0)

我已经开发出了适合我的解决方案。首先,这是导致我的问题的POSH代码行(从上面):

$NewOutlookEmail.HTMLBody = $oTemplateToUse.HTMLBody

此行复制“ 模板”电子邮件的内容,但不复制该电子邮件中的图像。为了完成这项工作,我采用了另一种方法,并创建了原始“ template ”电子邮件的完整副本,并将其存储在另一个文件夹中。复制后,我可以编辑/发送复制的电子邮件,并且图像/链接保持不变,因为我不是复制邮件内容,而是整个电子邮件本身。

为此,我首先创建了一个名为 Temp 的文件夹(在 DRAFTS 下)。

接下来,我替换了这一行脚本代码(来自上面的问题):

$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

DRAFTS 下创建 Temp 文件夹后,这将复制“ 模板”电子邮件发送到 Temp 文件夹中的新邮件,该文件夹随后将被称为Items(1),然后进行编辑然后发送。下一封电子邮件将重复此过程(因此,只要它是 Temp 文件夹中的唯一一封电子邮件,便始终以索引1进行引用)。

希望这对以后的人有帮助!