Powershell Send-MailMessage предвосхищает различные значения в CSV - PullRequest
0 голосов
/ 30 сентября 2019

Для всех,

У меня есть CSV, где в каждой строке есть самоконтроль подрядчика, дата истечения срока его счета, имя руководителя подрядчика и соответствующий адрес электронной почты.

У меня есть следующие данные в моем 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, а также для submitter2, получающего данные 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)
}

1 Ответ

2 голосов
/ 30 сентября 2019

Основной причиной проблемы является наличие одного цикла, который устанавливает переменные, необходимые для следующего цикла, на на каждой итерации первого цикла , но следующий цикл никогда не получит их до тех пор, покаПервый цикл завершается. В этом примере лучше всего объединить усилия обоих циклов в один цикл. Вы можете использовать Foreach-Object или foreach.

$from    =  "Your Friends in IT <a@b.c>"
$subject =  "Your contractors's login account will expire soon!"      
$csv = Import-Csv -Path "C:\ps\SAC-Accounts-ExpiringSoon.csv"

ForEach ($user in $csv)
{
    $Name = $user.Name
    $to = $user.SubmitterEmail
    $AccountExpirationDate = $user.AccountExpirationDate -as [datetime]
    $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"

    $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)
}

. PowerShell не будет читать вперед в вашем коде и определять значение переменной. Он должен быть назначен и определен до того, как PowerShell потребуется получить значение. Исходя из того, как был построен ваш код, $body ожидал, что $name и $AccountExpirationDate уже будут назначены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...