【问题标题】:Using multiple attachments through comObject Outlook.Application通过 comObject Outlook.Application 使用多个附件
【发布时间】:2015-06-11 10:08:30
【问题描述】:

我有一个进入 SCSM 的脚本,从 IR 获取相关文件并将它们正确下载到用户的计算机上。 接下来,我需要脚本从客户的 Outlook 应用程序创建一封电子邮件,并在发送电子邮件之前将其显示在他们的屏幕上..

这是执行此操作的脚本部分:

$GetFiles = Get-ChildItem "$ArchiveRootPath\$IRID\" 

$ol = New-Object -comObject Outlook.Application #| New-Object Net.Mail.MailMessage

$mail = $ol.CreateItem(0)
$mail.To = "johndoe@contoso.com"
$mail.Subject = "This is a test [$IRID]"

Foreach($GetFile in $GetFiles)
{
Write-Host “Attaching File :- ” $GetFile
 $attachment = New-Object System.Net.Mail.Attachment –ArgumentList C:\Temp\SCSM_Archive\$IRID\$GetFile
 $mail.Attachments.Add($attachment)
 }

$inspector = $mail.GetInspector
$inspector.Display()

但是,当我运行脚本时,我得到了这个错误:

Attaching File :-  email.eml
Exception calling "Add" with "1" argument(s): "Value does not fall within the expected range."
At C:\Temp\SSWireless Script.ps1:99 char:2
+  $mail.Attachments.Add($attachment)
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

从下载文件的脚本的前一部分检查所有变量。 PS 可以看到文件,但不能将它们附加到电子邮件中。 我不想使用发送消息功能,因为我们将转移到跨域电子邮件帐户,并且宁愿使用 Outlook 来创建电子邮件本身。

【问题讨论】:

  • 不确定您使用的是什么版本,但我发现的 Attachments.Add() 似乎需要四个参数。我也不知道为什么 COM 对象一定会知道 .Net 对象是什么(System.Net.Mail.Attachment)。
  • 我在企业环境中使用 PS2.0,这将是 SCSM 任务中使用的主脚本的一部分。至于在调用 com 对象时调用 .net,我不确定。我尝试了很多不同的变体...注释掉 $attachment 行...但是在这种情况下,我没有收到错误并且出现了电子邮件,但是文件中缺少附件(尽管它们是PS正在使用中)。
  • 有趣,虽然可能不是您正在寻找的确切答案,但您是否尝试过压缩目录的内容并只是简单地附加 zip?不完全确定您计划通过电子邮件发送的内容有多大,但认为值得一提。
  • @bundyfx Zip 不是一个选项。它将被我们的内部邮件服务器、网关服务器或收件人服务器(收件人在我们组织的外部)标记和阻止。如果我指定一个文件名,那么它就可以工作,并且可以毫无问题地附加,即: $Getfiles = "File path\filename" $mail.Attachments.add($Getfiles)
  • 抱歉格式错误。我正在尝试掌握它,但显然失败了。

标签: email powershell


【解决方案1】:

这是Microsoft.Office.Interop.Outlook Attachments.Add method 的参考。这确认了第一个参数(也是您案例中唯一的参数)需要是文件的完整路径。

没有必要将 [System.Net.Mail.Attachment] .NET 对象传递给 COM 接口。

您的代码应如下所示:

$GetFiles = Get-ChildItem "$ArchiveRootPath\$IRID\" 

$ol = New-Object -comObject Outlook.Application
$mail = $ol.CreateItem(0)
$mail.To = "johndoe@contoso.com"
$mail.Subject = "This is a test [$IRID]"

Foreach($GetFile in $GetFiles)
{
    Write-Host “Attaching File :- $GetFile.Name"
    $mail.Attachments.Add($GetFile.FullName)
}

【讨论】:

  • 非常感谢!在这一点上,即使我知道在 com 对象中传递 .net 是没有意义的,但我不知道还能尝试什么。我明天在办公室试试!
猜你喜欢
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多