send-mailmessage将不同的附件发送给不同的收件人

时间:2014-07-27 12:41:14

标签: powershell

我要求向成千上万的不同收件人发送电子邮件,并为每个收件人提供不同的附件。 我有一个文本文件中的收件人列表和另一个文本文件中的附件路径列表。 对于文本文件中的第一个收件人,应使用第一个附件路径。 对于文本文件中的第二个收件人,应使用第二个附件路径。

以下代码将所有附件分别发送给所有收件人。 但我希望这可以像我上面所描述的那样工作。每个收件人只能使用相应的附件发送一封电子邮件。

如果可以实现,请告诉我。如果可以使用Excel,我还可以在Excel电子表格的两个不同列中复制收件人和附件路径。

我可以通过使用Excel构建千种不同的send-mailmessage行来实现这一目标,但这看起来像是一种丑陋的做法。这就是为什么我想知道是否有更好的方法来做到这一点。

$attachments = get-content C:\attach.txt
$recipients = get-content C:\recip.txt

foreach ($attachment in $attachments)
{
  foreach ($recipient in $recipients)
  {
    Send-MailMessage -From "recipient@target.com" -To $recipient -subject "Test" -smtpServer smtp.server.com -attachments $attachment
  }
}

2 个答案:

答案 0 :(得分:1)

一种可能性:

$MailParams = 
@{
  From = "recipient@target.com" 
  Subject =  "Test" 
  SmtpServer = 'smtp.server.com'
  }

$recipients = get-content C:\recip.txt

get-content C:\attach.txt |
 foreach { $i=0 } { $_ | Send-MailMessage @MailParams -To $recipients[$i++] } 

答案 1 :(得分:0)

使用 for 循环来串联迭代两个文件:

for ($i = 0; $i -lt $recipients.Count; $i++) {
  Send-MailMessage -From "recipient@target.com" -To $recipients[$i] -Subject "Test" -SmtpServer smtp.server.com -Attachments $attachments[$i]
}

大概两个文件中的行数应该相同,因此$recipients.Count recip.txt attach.txt 中的行数;您也可以在 for 循环中使用$attach.Count

<小时/> 您也可以使用Excel路线,然后将文件另存为CSV以简化操作。使用CSV文件,您可以使用此代码,其中收件人附件是列名:

Import-Csv <path_to_csvfile> | %{Send-MailMessage -From "recipient@target.com" -To $_.Recipient -Subject "Test" -SmtpServer smtp.server.com -Attachments $_.Attachment}

这可能是一个更好的主意,因为如果他们在同一个文件中,则不太可能将附件与正确的收件人匹配。对于单独的列表,一个错误可能导致该点之后的所有收件人收到错误的附件。