作为入职流程的一部分,我们将用户凭据发送给招聘经理。我有一个保存在Outlook中的DRAFT模板,并运行一个使用Outlook模板的PS脚本,并用凭据信息(用户名,密码等)替换关键字。多年来效果一直很好,现在,MARCOM希望对其加以完善,并希望我们将内嵌图像添加到新的雇用电子邮件中。因此,我将图像添加到了模板中,但是现在运行PS脚本时,这些图像不在新创建的电子邮件中。只是有一个红色的“ X” 并且Outlook报告该图像无法显示。
我的一些关键要求是:
我尝试了许多方法来解决此问题,包括将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
答案 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进行引用)。
希望这对以后的人有帮助!