我有一个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发送电子邮件,但这些脚本不需要解析特定电子邮件地址的数据,因为-to
中的Send-MailMessage
始终是静态的。另一个脚本的示例:
$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 "<","<" -replace """,'"' -replace ">",">"
$body = $notice + $html
Send-MailMessage -from $FromAddress -to $ToAddress -subject $Subject -bodyashtml ($body | Out-String) -priority High -smtpServer $SMTPserver
}
else {exit;}
作为PowerShell新手(充其量)我想知道我的选择是什么。我假设我将循环通过csv相当多,并可能构建数组。我只想确保,就我自己的教育而言,任务是以最简单的形式完成的,PowerShell分配给我们。
感谢。
答案 0 :(得分: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 "<","<" -replace """,'"' -replace ">",">"
$body = $notice + $html
Send-MailMessage -from $FromAddress -to $ToAddress -subject $Subject -bodyashtml ($body | Out-String) -priority High -smtpServer $SMTPserver
}
}
else {exit;}
以上是我们如何实现这一目标的片段示例。我省略了一些html格式变量,因为它们并不重要。我还没有测试发送不是静态电子邮件地址,而是发送到-Property Email
的电子邮件地址我假设用$ToAddress
取代$i
应该做什么,或者关闭。