【问题标题】:Using PowerShell to send Outlook emails from Draft template with images使用 PowerShell 从草稿模板发送带有图像的 Outlook 电子邮件
【发布时间】:2019-07-06 17:39:47
【问题描述】:

作为入职流程的一部分,我们会将用户信用发送给招聘经理。我有一个保存在 Outlook 中的 DRAFT 模板并运行一个 PS 脚本,该脚本使用 Outlook 模板并将关键字替换为凭据信息(用户名、密码等)。它多年来一直运行良好,现在,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

【问题讨论】:

    标签: html powershell outlook


    【解决方案1】:

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

    $NewOutlookEmail.HTMLBody = $oTemplateToUse.HTMLBody
    

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

    为此,我首先创建了一个名为 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文件夹后,这将复制“模板 em>”通过电子邮件发送到 Temp 文件夹中的新邮件消息,然后将其作为 Items(1) 引用,然后进行编辑然后发送。下一封电子邮件将重复该过程(因此,只要它是 Temp 文件夹中唯一的电子邮件,它将始终以索引 1 进行引用)。

    希望这对未来的人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-30
      • 2021-08-19
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      相关资源
      最近更新 更多