Send-MailMessage 基于条件
Send-MailMessage based on Conditions
我正在尝试根据以下条件向提交的用户发送电子邮件:
- UserCountry = "Yes" 和 UserTeamInTheList = "No" → 发送 MailMessage1
- UserCountry = "No" 和 UserTeamInTheList = "No" → 发送 MailMessage2
注意: 另外,我的电子邮件正文是中文的,不会在电子邮件中反映出来。请帮忙。我只有?????在电子邮件中而不是原始消息中。
下面是我使用的查询的输出:
$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'
}
}
您的代码存在一些问题,但最重要的是您在顶部填充 $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 根据您的条件过滤结果,然后 return 只需 SubmittedBy
属性。然后,因为 Send-MailMessage
接受 -To
参数的数组输入,您可以将此列表提供给 属性。如果您不希望每个收件人看到其他收件人,您可以使用 -BCC
代替,或者执行 ForEach
来单独执行它们(但请注意,在尝试发送大量个人时可能会达到限制电子邮件)。
此外,我还使用了 Splatting 和哈希表,这些设置对于两个 Send-MailMessage
命令都是相同的,因此我们可以重复使用它们而无需重复。
我正在尝试根据以下条件向提交的用户发送电子邮件:
- UserCountry = "Yes" 和 UserTeamInTheList = "No" → 发送 MailMessage1
- UserCountry = "No" 和 UserTeamInTheList = "No" → 发送 MailMessage2
注意: 另外,我的电子邮件正文是中文的,不会在电子邮件中反映出来。请帮忙。我只有?????在电子邮件中而不是原始消息中。
下面是我使用的查询的输出:
$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'
}
}
您的代码存在一些问题,但最重要的是您在顶部填充 $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 根据您的条件过滤结果,然后 return 只需 SubmittedBy
属性。然后,因为 Send-MailMessage
接受 -To
参数的数组输入,您可以将此列表提供给 属性。如果您不希望每个收件人看到其他收件人,您可以使用 -BCC
代替,或者执行 ForEach
来单独执行它们(但请注意,在尝试发送大量个人时可能会达到限制电子邮件)。
此外,我还使用了 Splatting 和哈希表,这些设置对于两个 Send-MailMessage
命令都是相同的,因此我们可以重复使用它们而无需重复。