Send-MailMessage基于条件

时间:2017-09-09 06:05:58

标签: sql sql-server powershell tsql powershell-v4.0

我正在尝试根据以下条件向用户提交电子邮件:

  1. UserCountry =“Yes”和UserTeamInTheList =“No”→发送MailMessage1
  2. UserCountry =“No”和UserTeamInTheList =“No”→发送MailMessage2
  3. 注意:此外,我的电子邮件是中文,不反映在电子邮件中。请帮忙。我只得到??????在电子邮件而不是原始邮件。

    以下是我正在使用的查询的输出:

    $Q  = "Select * from Query"
    $cr = Invoke-Sqlcmd -ServerInstance Server1 -Database DB1 -Query $Q |
          select FileId,SubmittedBy,UserCountry,UserTeamIsInTheList |
          ft -AutoSize
    $cr
    

    现在根据上面的输出和上面的条件,我使用下面的代码(我正在尝试它,当然它是错误的代码):

    $Q  = "Select * from Query"
    $cr = Invoke-Sqlcmd -ServerInstance Server1 -Database DB1 -Query $Q |
          select FileId,SubmittedBy,UserCountry,UserTeamIsInTheList |
          ft -AutoSize
    $cr
    
    foreach ($i in $cr) {
        if (UserCountry -eq "Yes" -and UserTeamIsInTheList -eq "No") {
            Send-MailMessage -To ("SubmittedBy" (*User In the Output above who submitted this file*) -CC “abc@xyz.com” -From “xyz@abc.com" -SMTPServer acb.newbie.co  -Subject “Testing” -Body “MailMessage1”
        } elseif {
            if (UserCountry -eq "No" -and UserTeamIsInTheList -eq "No") {
                Send-MailMessage -To ("SubmittedBy" (*User In the Output above who submitted this file*) -CC “abc@xyz.com” -From “xyz@abc.com" -SMTPServer acb.newbie.co  -Subject “Testing” -Body “MailMessage2”
            } else {
                'Exit'
            }
        }
    

1 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,但最重要的是您在顶部填充$CR变量。您已将| FT放在此末尾,这会将对象类型更改为无法在脚本中进一步重用的内容。您仍然可以使用Format-Table输出此变量,您只需要单独执行此操作。

总的来说,我建议你做这样的事情:

$Q = "Select * from Query"
$CR = Invoke-Sqlcmd -ServerInstance Server1 -Database DB1 -Query $Q | Select FileId,SubmittedBy,UserCountry,UserTeamIsInTheList
$CR | FT -AutoSize

$MailSettings = @{
    CC = 'abc@xyz.com'
    From = 'xyz@abc.com'
    SMTPServer = 'acb.newbie.co'
    Subject = 'Testing'
}

$Group1 = $CR | Where ($_.UserCountry -eq 'Yes' -and $_.UserTeamIsInTheList -eq 'No') | Select -ExpandProperty SubmittedBy
Send-MailMessage @MailSettings -To $Group1 -Body 'MailMessage1'

$Group2 = $CR | Where ($_.UserCountry -eq 'No' -and $_.UserTeamIsInTheList -eq 'No') | Select -ExpandProperty SubmittedBy
Send-MailMessage @MailSettings -To $Group2 -Body 'MailMessage2'

您不应该需要ForEach循环,因为您可以使用Where-Object cmdlet根据您的条件过滤结果,然后只返回SubmittedBy属性。然后,因为Send-MailMessage接受-To参数的数组输入,您只需将此列表提供给该属性即可。如果您不希望每个收件人看到其他收件人,您可以改为使用-BCC,或者ForEach单独执行这些收件人(但请注意,在尝试发送大量个人时,您可以达到限制电子邮件)。

此外,我使用了Splatting和两个Send-MailMessage命令相同设置的哈希表,因此我们可以重复使用它们而不必复制。