【发布时间】:2020-01-30 01:11:02
【问题描述】:
致各位
我有一个 csv,其中每一行都有一个承包商 samaccount、其帐户到期日期、承包商的主管姓名和各自的电子邮件地址。
我的 csv 中有以下数据:
Name,AccountExpirationDate,Submitter,SubmitterEmail
Username1,9/21/2019,Submitter1,Submitter1@b.com
Username2,9/22/2019,Submitter2,Submitter2@b.com
Username3,9/23/2019,Submitter3,Submitter3@b.com
当我执行下面的代码时,它确实会为每一行发送一封电子邮件,但该消息仅说明每封电子邮件中的 username3 数据。如何更正此问题,以便 submitter1@b.com 接收 username1 数据,提交者 2 接收 username2 数据等?
$from = "Your Friends in IT <a@b.c>"
$subject = "Your contractors's login account will expire soon!"
$body = "Hello <br>"
$body += "Your contractor's login account for <b>$Name</b></font> is set to expire on<b> $AccountExpirationDate</b>.<br>"
$body += "Kind Regards,<br><br>"
$body += "Your friends in IT"
$csv = Import-Csv -Path "C:\ps\SAC-Accounts-ExpiringSoon.csv"
$csv | foreach {
$Name = $_.name
$to = $_.SACSubmitterEmail
$_.AccountExpirationDate = $_.AccountExpirationDate -as [datetime]
$_
}
ForEach ($user in $csv)
{
$mail = New-Object System.Net.Mail.Mailmessage $from, $to, $subject, $body
$mail.IsBodyHTML=$true
$server = "mail.b.com"
# $port = 25
$Smtp = New-Object System.Net.Mail.SMTPClient $server,$port
$Smtp.Credentials = [system.Net.CredentialCache]::DefaultNetworkCredentials
$smtp.send($mail)
}
【问题讨论】:
-
$csv | foreach {}如果您之后已经有一个迭代相同数据的 foreach 循环,则不需要。将您的努力组合成一个循环可能会解决大多数问题。由于除了设置变量之外您没有对foreach-object执行任何操作,因此当您到达下一个循环时,您只有前一个foreach-object设置的最后一个值。您的意图似乎是同时循环两次,但它没有那种效果。 -
此外,变量名称存在一些问题:脚本或 CSV 列中未提及
$_.SACSubmitterEmail。您可以通过更改以下行来解决所述问题:$mail = New-Object System.Net.Mail.Mailmessage $from, $to, $subject, $body到$mail = New-Object System.Net.Mail.Mailmessage $from, $user.SubmitterEmail, $subject, $body
标签: powershell csv foreach