【问题标题】:Embed images in email and send via Powershell在电子邮件中嵌入图像并通过 Powershell 发送
【发布时间】:2021-05-19 16:29:16
【问题描述】:

我正在编辑我的一个旧脚本以向用户发送一封电子邮件,其中嵌入了文本中的图像。我正在尝试使用 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 { }
 }
 }

【问题讨论】:

标签: html powershell


【解决方案1】:

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

CID 又名 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"

【讨论】:

  • 多么简单而优雅的解决方案!谢谢你:-)
  • 是否可以在不附加任何内容的情况下将图像添加到“body”部分。就像复制图像并将其粘贴到电子邮件客户端的正文部分一样......?
  • 否 Image ether 需要附加或客户端可以访问。就像在网络上可访问的图像的参考一样。
  • 这对我不起作用,我没有收到图像...它们已附加但未显示在电子邮件中...s3.gifyu.com/images/imagesdontshow.png
  • @RicardoBohner 您没有提供足够的信息来帮助您。我需要查看脚本以确定您做错了什么
【解决方案2】:

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

{img=file}

带有数据网址

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

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

只需 google 即可获得图像到数据 URI 转换器。

【讨论】:

猜你喜欢
  • 2017-07-28
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多