Основная проблема, которую я вижу в вашем коде, заключается в том, что вы сначала создаете массив уникальных адресов электронной почты из файла csv в переменной $email
, но позже вы перезаписываете это же значение, используя его в цикле foreach
.
Там, на каждой итерации, переменная $email
станет полной строкой из файла CSV, что явно не то, что вы ожидаете.
Ниже слегка скорректированная версия вашего кода. Обратите внимание, что я также использовал Splatting , чтобы создать хеш-таблицу со всеми свойствами для командлета Send-MailMessage
, чтобы избежать необходимости использовать backtick, который легко игнорировать.
#Import the file that store username and emails
$data = import-csv "D:\mail.csv"
# Get a unique array of email addresses
$addresses = $data.Email | Select-Object -Unique
# Declare Credentials
$creds = (Get-Credential -Message "Please input valid credentials")
# loop through the email addresses array and send a mail to each of them
foreach ($email in $addresses) {
$splat = @{
From = "***@gmail.com"
To = $email
Subject = "Test"
Body = "Test"
SmtpServer = "smtp.gmail.com"
Port = 587
Credential = $creds
UseSsl = $true
}
#Sending email
Send-MailMessage @splat
}
Обратите внимание, что параметр -Port
имеет тип Int32
, поэтому не следует заключать его в кавычки
Обновление
В соответствии с вашим комментарием, если вы хотите использовать больше полей из CSV-файла, код изменится.
Давайте предположим, что ваш CSV выглядит примерно так:
"User","Email","ManagerEmail"
"Tom","t.somebody@yourcompany.com","el.jeffe@yourcompany.com"
"Dick","d.somebody@yourcompany.com","el.jeffe@yourcompany.com"
"Harry","h.somebody@yourcompany.com","di.rector@yourcompany.com"
"Dick","d.somebody@yourcompany.com","el.jeffe@yourcompany.com"
(обратите внимание, пользователь Дик дублируется)
Затем следующий код будет читать csv, дедуплицировать его в свойстве Email и отправлять электронные письма каждому пользователю:
# Import the file that store username and emails
# and uniquify the objectson property Email
$data = Import-Csv "D:\mail.csv" | Sort-Object -Property Email -Unique
# Declare Credentials
$creds = (Get-Credential -Message "Please input valid credentials")
# loop through the csv objects array and send a mail to each of them
foreach ($item in $data) {
# every item is an object with properties .User, .Email and .ManagerEmail
$splat = @{
From = "***@gmail.com"
To = $item.Email
Cc = $item.ManagerEmail
Subject = "Hi there {0}" -f $item.User
Body = "Test"
SmtpServer = "smtp.gmail.com"
Port = 587
Credential = $creds
UseSsl = $true
}
#Sending email
Send-MailMessage @splat
}
Надеюсь, это поможет