【问题标题】:PowerShell Send-MailMessage to multiple recipients with differing information in the bodyPowerShell 向正文中具有不同信息的多个收件人发送 MailMessage
【发布时间】:2017-10-16 00:31:59
【问题描述】:

我有一个 sql 脚本,可以根据特定条件将记录提取到 csv 中。 csv 通常看起来像这个例子:

Ticket,Last Updated,Priority,Assigned To,Email
2329,1-12-2017,Medium,Assignee1,assignee1@domain.tld
2417,5-23-2016,Low,Assignee1,assignee1@domain.tld
2416,4-20-2017,Medium,Assignee2,assignee2@domain.tld
2463,8-9-2016,Medium,Assignee2,assignee2@domain.tld
2481,3-4-2017,Low,Assignee3,assignee3@domain.tld
2499,2-22-2017,Medium,Assignee4,assignee4@domain.tld
2500,12-20-2016,High,Assignee5,assignee5@domain.tld
2498,11-30-2016,Medium,Assignee5,assignee5@domain.tld

注意,电子邮件字段可以在多行中使用相同的电子邮件地址。

我无法理解如何在 PowerShell 中解析这些数据,以便将行数据发送到该行的 Email 列中的地址。

但是,当此脚本运行时,我不想向同一个人发送多封电子邮件。因此,如果 Email 列在 csv 中具有相同的值,我想在电子邮件正文中发送一封包含多行信息的电子邮件,然后再转到下一封电子邮件,直到 EOF。

在上面的示例 csv 中,只有一封电子邮件会发送到 assignee1@domain.tld 以获取 Ticket 2329 & 2417 数据,依此类推,直到 EOF。我在 sql 查询中执行Order By Email,如果这有助于组织流程,则会转储到 csv。

我以前使用 PowerShell 发送电子邮件,但这些脚本不需要解析特定电子邮件地址的数据,因为 Send-MailMessage 中的 -to 一直是静态的。来自另一个脚本的示例:

$FromAddress    = "noreply@domain.tld"
$ToAddress      = "something@domain.tld"
$Subject        = "Mail message Subject line"
$SMTPserver     = "smtp server address"


if ((Get-Item "data.csv").length -gt 0kb)
{
    $html = import-csv -Path .\data.csv | Foreach {$_.web_link= '<a href="{0}">{1}</a>' -f $_.web_link,$_.author;$_} | Foreach {$_.web_link= '<a href="{0}">{1}</a>' -f $_.web_link,$_.title;$_}| 
    Select @{Name="Link"; Expression={$_.web_link}}, @{Name="Author"; Expression={$_.web_link}} | ConvertTo-Html -Head $htmlformat -Body $bodyformat
    $html = $html -replace "&lt;","<" -replace "&quot;",'"' -replace "&gt;",">"
    $body = $notice + $html
    Send-MailMessage -from $FromAddress -to $ToAddress -subject $Subject -bodyashtml ($body | Out-String) -priority High -smtpServer $SMTPserver 
}
else {exit;}

作为 PowerShell 新手(充其量),我想知道我的选择是什么。我假设我将在 csv 中循环很多次,并可能构建数组。为了我自己的教育,我只想确保以 PowerShell 分配给我们的最简单的形式完成任务。

谢谢。

【问题讨论】:

  • 你可以使用Group-Object来分组Email
  • 感谢您的评论。对我来说似乎是一件愚蠢的事情,但同样,PowerShell 不是我的强项。我使用您的建议添加了工作代码作为答案。

标签: sql powershell csv email


【解决方案1】:
if ((Get-Item "import.csv").length -gt 0kb)
{
$import = Import-Csv -Path .\import.csv|
Group-Object -Property Email -AsHashTable
    foreach ($i in $import.GetEnumerator()){
        $html = $($i.Value) | ConvertTo-Html -Head $htmlformat -Body $bodyformat
        $html = $html -replace "&lt;","<" -replace "&quot;",'"' -replace "&gt;",">"
        $body = $notice + $html
        Send-MailMessage -from $FromAddress -to $ToAddress -subject $Subject -bodyashtml ($body | Out-String) -priority High -smtpServer $SMTPserver
    }

}
else {exit;}

以上是我们如何使其工作的 sn-p 示例。我省略了一些 html 格式变量,因为它们并不重要。我还没有测试发送到不是静态电子邮件地址而是发送到来自-Property Email 的电子邮件地址我假设用$i 替换$ToAddress 应该可以,或者类似的方法。

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多