将图像嵌入电子邮件并通过Powershell发送 [英] Embed images in email and send via Powershell

查看:161
本文介绍了将图像嵌入电子邮件并通过Powershell发送的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am editing one of my old scripts to send an email to a user with images embedded into the text. I am trying to use the Send-MailMessage function to send the email as opposed to the older method of $smtp.send($msg). However, when trying to update the script, the images are no longer being embedded.

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

I know how to attach them to the email as actual attachments, but I am not sure what I am doing wrong to have them show as actual embedded images.

注意:为简便起见,我删除了一些完整的电子邮件,因为它很大,只要我能获得一两个图像,它都将起作用.

NOTE: for brevity, I removed some of the full email since it is large and as long as I can get an image or two working, it will all work.

# 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文档中

So the real question is how to embed a image into the HTML document from a attachment

CID(又称Content ID)将使您可以附加图像,然后在文档中使用该附加图像.避免在Content ID名称中使用空格.

CID aka Content ID will allow you to attach a image and then use that attached image in the document. Avoid using spaces in the Content ID name.

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"

但是当您发送邮件时,您不会附加这些附件

but when you send the mail you are not attaching those attachments

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,而执行类似的操作

You could stop using the Net.Mail.Attachment and instead do something like

$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"

这篇关于将图像嵌入电子邮件并通过Powershell发送的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆