【问题标题】:Send-MailMessage Attachment from memory从内存中发送-MailMessage 附件
【发布时间】:2018-10-30 02:29:01
【问题描述】:

我正在尝试使用我在this thread 中找到的答案(指向this URL)在 Send-MailMessage 中发送附件而不先保存到磁盘。

它说要使用:

$attachment = [System.Net.Mail.Attachment]::CreateAttachmentFromString($attachmenttext,"test.txt") 

但是当我尝试使用 Send-MailMessage 而不是它显示的复杂方式时,我得到了这个错误:

Send-MailMessage -From "email@email.com" -To "email@email.com" -Subject "Subject" -Body $body -SmtpServer "smtp.server.local" -Port 25 -BodyAsHtml -Attachments $attachment

Send-MailMessage : Could not find file 'C:\Windows\system32\System.Net.Mail.Attachment'.
At line:3 char:1
+ Send-MailMessage -From "email@email.com" -To "email@e ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Send-MailMessage], FileNotFoundException
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.PowerShell.Commands.SendMailMessage

是否可以继续使用此方法使用 Send-MailMessage?或者有什么不同的方法可以让我在不先保存到磁盘的情况下附加文件,同时仍然使用 send-mailmessage?

【问题讨论】:

  • 内存中的项目类型。是字符串还是字节数组>
  • 不,您必须使用System.Net.Mail(MailMessage、SmtpClient、Attachment 等)中提供的工具手动构建和发送邮件
  • @ArcSet 一个字符串

标签: powershell scripting attachment


【解决方案1】:

让我先看看有什么问题。 [System.Net.Mail.Attachment]::CreateAttachmentFromString 输出类型 System.Net.Mail.Attachment 而 send-mailmessage -attachments 正在寻找字符串数组 string[]。这就是示例失败的原因。

我编写了一个简单的函数,因此您可以使用您在示例中发布的附件,该附件创建一个MailMessage 并查找[System.Net.Mail.Attachment] 类型的附件。

Function Try-SendMail([string[]]$To, [string]$From, [string]$SmtpServer, [int]$Port = 25, [pscredential]$SmtpCredential, [string]$Subject, [string]$Body, [System.Net.Mail.Attachment[]]$attachment, [switch]$IsBodyHTML){
    [System.Net.Mail.MailMessage]$Mail = new-object System.Net.Mail.MailMessage
    $To | %{$Mail.To.Add($_)}
    $Mail.From = $From
    $Mail.IsBodyHtml = $IsBodyHTML
    $Mail.Body = $Body
    $Mail.Subject = $Subject
    $Attachment | %{$mail.Attachments.Add($_)}
    [System.Net.Mail.SmtpClient]$SMTP = new-object System.Net.Mail.SmtpClient
    $SMTP.Host = $SmtpServer
    $SMTP.Port = $Port
    If($SmtpCredential){
        $NetCredential = New-Object System.Net.NetworkCredential
        $NetCredential.UserName = $SmtpCredential.GetNetworkCredential().UserName
        $NetCredential.Password = $SmtpCredential.GetNetworkCredential().Password
        $SMTP.Credentials = $NetCredential
    }
    try{
        $SMTP.Send($Mail)
    }catch{
        $_ | select *
    }
}

你可以像这样使用它

$To = @("Person1@Test.com","Person2@Test.com")
$From = "MainGuy@PErson.com"
$Server = "SMTPSERVER.NET"
$Port = 587
$Attachments = @(
    $([System.Net.Mail.Attachment]::CreateAttachmentFromString("HELLO", "Test.txt")),
    $([System.Net.Mail.Attachment]::CreateAttachmentFromString("HELLO2", "Test2.txt"))
)
$SmtpCredential = Get-Credential

Try-SendMail -to $To -From $From -Subject "Hello" -Body "World" -Attachment $Attachments -SmtpServer $Server -port $Port -SmtpCredential $SmtpCredential

*编辑忘记在函数参数中将[System.Net.Mail.Attachment]改为[System.Net.Mail.Attachment[]]

【讨论】:

  • 谢谢 - 我希望有一个我能记住的单行字,但我可以忍受。我可以像往常一样复制和粘贴该功能并使用其余功能。遗憾的是,这不是内置在发送邮件消息中!
  • 好吧,它的官方 - 我使用了这种方法。我在你的方法或this 之间纠结。我喜欢另一种方法,因为它更具自定义性且易于记忆,但它在 Outlook 2016 中不起作用。如果我可以给你多个赞成票,我会 :) 感谢您的宝贵时间!
  • @alexander7567 大多数电子邮件客户端不允许您链接的方法
猜你喜欢
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多