在电子邮件中嵌入图像并通过 Powershell 发送

新手上路,请多包涵

我正在编辑我的一个旧脚本,以向用户发送一封电子邮件,并将图像嵌入到文本中。我正在尝试使用 Send-MailMessage 函数发送电子邮件,而不是 \(smtp.send(\)msg) 的旧方法。但是,当尝试更新脚本时,图像不再被嵌入。

我知道如何将它们作为实际附件附加到电子邮件中,但我不确定让它们显示为实际嵌入图像是我做错了什么。

注意:为简洁起见,我删除了一些完整的电子邮件,因为它很大,只要我能得到一两张图片,它就可以了。

 # force powershell to run as an x86 process
    Set-ExecutionPolicy -Scope CurrentUser Unrestricted
    if ($env:Processor_Architecture -ne "x86") {
        &"$env:windir\syswow64\windowspowershell\v1.0\powershell.exe" -file $myinvocation.Mycommand.path
        exit
    }

# initialize the script
    if ($startupvariables) { try {Remove-Variable -Name startupvariables  -Scope Global -ErrorAction SilentlyContinue } catch { } }
    New-Variable -force -name startupVariables -value ( Get-Variable | ForEach-Object { $_.Name } )
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null
    $Separator = ".", "@"

# advise what the script does
    Add-Type -AssemblyName PresentationCore,PresentationFramework
    $ButtonType = [System.Windows.MessageBoxButton]::OKCancel
    $MessageIcon = [System.Windows.MessageBoxImage]::Warning
    $MessageTitle = "Shared Drive Access Assistance"
    $MessageBody = "This script asks the user to provide more information regarding a network drive that they would like access to.`n`nTo use it, enter the below information:`n`n`n`tTicket Number`n`n`tUser's Email Address`n`n`tRequestor's Email Address`n`n`nIf this is the script you want to use, click OK.`nIf not, click Cancel."
    $Result = [System.Windows.MessageBox]::Show($MessageBody,$MessageTitle,$ButtonType,$MessageIcon)

    if ($Result -eq "Cancel")
    {
    Exit-PSSession
    }
    else
    {

# get the ticket number
    $Ticket = [Microsoft.VisualBasic.Interaction]::InputBox("Enter the SCTask ticket number" , "Ticket Number")

# get the user id via the email address
    $UserID = [Microsoft.VisualBasic.Interaction]::InputBox("Enter the user's email address" , "User Email Address")
    $User = $UserID.split($Separator)
    $Firstname = $User[0].substring(0,1).toupper()+$User[0].substring(1).tolower()
    $Lastname = $User[1].substring(0,1).toupper()+$User[1].substring(1).tolower()
    $User = $Firstname, $Lastname

# get local username
    $Username = [System.Environment]::UserName

# create email
    $subject = "Ticket $Ticket on Hold for User Response - Shared Drive Access for $User - Awaiting Additional Information"
    $body = @"
    <html>
    <body style="font-family:calibri">
    To $Requestor, $User,<br>
    <br>
    <br>
    In order to proceed with your request for shared drive access, we require the server name and full path to the folder you need access to. If you do not already know this information, you will need to provide these instructions to someone that already has access to the folder that you need access to.<br>
    <br>
    1)  Click the Start menu<br>
    <br>
    <img src="cid:image1.png"><br>
    <img src="cid:image2.png"><br>
    <img src="cid:image3.png"><br>
    <br>
    <br>
    2)  Navigate to "Computer"<br>
    <br>
    <img src="cid:image4.png"><br>
    <br>
    <br>

    <br>
    If you have any questions or need assistance with this process, please contact the Service Desk via one of the methods listed below.
    <br>
    <br>
    Thank You,<br>
    <br>
    IT Service Desk<br>

    </body>
    </html>
"@

    $att1 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive1.png")
    $att2 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive2.png")
    $att3 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive3.png")
    $att4 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive4.png")
    $att1.ContentId = "image1.png"
    $att2.ContentId = "image2.png"
    $att3.ContentId = "image3.png"
    $att4.ContentId = "image4.png"
#    $msg.Attachments.Add($att1)
#    $msg.Attachments.Add($att2)
#    $msg.Attachments.Add($att3)
#    $msg.Attachments.Add($att4)

# create confirmation message
    $ButtonType = [System.Windows.MessageBoxButton]::YesNo
    $MessageIcon = [System.Windows.MessageBoxImage]::Warning
    $MessageTitle = "Shared Drive Access Assistance"
    $MessageBody = "The information you have entered is show below:`n`n`nTicket Number: $Ticket`n`nUser's Email Address: $UserID`n`nRequstor's Email Address: $RequestorID`n`n`nIf you would like to send the email, click Yes.`nOtherwise, click No."
    $Result = [System.Windows.MessageBox]::Show($MessageBody,$MessageTitle,$ButtonType,$MessageIcon)
    if ($Result -eq "No")
    {
    Exit-PSSession
    }
    else

# send email
    {
    Send-MailMessage -To "<$UserID>" -bcc "<$Username@dana.com>" -from "<itservicedesk@x.com>" -Subject $global:subject -SmtpServer "mailrelay.x.com" -BodyAsHtml -body $global:body
    }
    }

Function Clean-Memory {
    Get-Variable |
        Where-Object { $startupVariables -notcontains $_.Name } |
            ForEach-Object {
            try { Remove-Variable -Name "$($_.Name)" -Force -Scope "global" -ErrorAction SilentlyContinue -WarningAction SilentlyContinue}
                catch { }
 }
 }

原文由 sbagnato 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 892
2 个回答

所以真正的问题是如何从附件中将图像嵌入到 HTML 文档中

CID aka Content ID 允许您附加图像,然后在文档中使用该附加图像。避免在 Content ID 名称中使用空格。

 Send-MailMessage -To "Test@Test.com" -from "Test2@Test.com" -SmtpServer SMTP.TEST.NET -Subject "Hello" -BodyAsHtml -Body "<img src='cid:Test.png'>" -Port 25 -Attachments "C:\Users\Test\Test.png"

您正在使用

$att1 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive1.png")
$att2 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive2.png")
$att3 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive3.png")
$att4 = new-object Net.Mail.Attachment ("T:\PS Scripts\Images\shareddrive4.png")
$att1.ContentId = "image1.png"
$att2.ContentId = "image2.png"
$att3.ContentId = "image3.png"
$att4.ContentId = "image4.png"

但是当你发送邮件时你没有附加这些附件

Send-MailMessage -To "<$UserID>" -bcc "<$Username@dana.com>" -from "<itservicedesk@x.com>" -Subject $global:subject -SmtpServer "mailrelay.x.com" -BodyAsHtml -body $global:body

你可以停止使用 Net.Mail.Attachment 而是做类似的事情

$Body = @"
    <html>
        <body style="font-family:calibri">
            <b>This is image 1</b>
            <img src='cid:TEST1.png'>
            <b>This is image 2</b>
            <img src='cid:Test2.png'>
        </body>
    </html>
"@

Send-MailMessage -To "Test@Test.com" `
    -from "Test2@Test.com" `
    -SmtpServer Test.smtp.com `
    -Subject "Hello" `
    -BodyAsHtml -body $body `
    -Attachments "C:\Test\TEST1.png", "C:\Test\TEST2.png"

原文由 ArcSet 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以将图像嵌入到 HTML 中,因此没有额外的文件。它正在取代

{img=file}

带数据网址

{src="data:image/png;base64,[base64 encoded long string representing the image]}

有许多在线转换器可以将您的图像文件转换为所需的代码。

只需谷歌搜索图像到数据 URI 转换器。

原文由 Notanic 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题