我需要向不同的电子邮件地址发送一封唯一的电子邮件
它们来自.csv
文件。我有一个代码,但它只是将消息发送给所有人
一封电子邮件中的一封电子邮件。
#Import the file that store username and emails
$data = import-csv "C:.csv"
#Declare email content
$email = $data.Email | select -unique
ForEach ($email in $data)
{
$From = "***@gmail.com"
$To = $data.Email
$Subject = "Test"
$Body = "Test"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
}
#Sending email
Send-MailMessage -From $From -to $To -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential (Get-Credential -Message "Please input valid credentials")
上面的代码有效,但是如上所述,它仅向文件中的所有电子邮件地址发送一封电子邮件。我需要为每封电子邮件发送一封邮件。
答案 0 :(得分:2)
我在您的代码中看到的主要问题是,您首先从csv文件的变量$email
中创建了一个唯一的电子邮件地址数组,但随后您在{{ 1}}循环。
在那里,在每次迭代中,foreach
变量将成为CSV文件中的完整行,这显然不是您期望的。
下面的代码略有调整。请注意,我还使用Splatting为$email
cmdlet创建具有所有属性的哈希表,以避免不得不使用容易忽略的反引号。
Send-MailMessage
请注意,#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
,因此您不应引用该参数
根据注释中的要求,如果您想使用CSV文件中的更多字段,则代码将更改。
假设您的CSV如下所示:
Int32
(请注意,用户Dick是重复的)
然后,以下内容将读取csv,在Email属性中将其删除重复数据,然后将电子邮件发送给每个用户:
"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"
希望有帮助
答案 1 :(得分:1)
根据评论,请找到调整后的脚本和推理。
您正在遍历CSV,但只发送了一次电子邮件。看起来原本是将电子邮件发送给一个人,即CSV中的最后一个。
此版本将循环浏览并为CSV中的每一行发送一封电子邮件。
#Import the file that store username and emails
$data = import-csv "C:.csv"
#Declare email content
$email = $data.Email | select -unique
# Declare Credentials
$creds = (Get-Credential -Message "Please input valid credentials")
ForEach ($email in $data) {
$From = "***@gmail.com"
$To = $email.Email
$Subject = "Test"
$Body = "Test"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
#Sending email
Send-MailMessage -From $From -to $To -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential $creds
}
答案 2 :(得分:0)
您犯的最重要的错误是
$To = $data.Email
将所有电子邮件添加到To:
字段中。 https://superuser.com/questions/647216/startup-program-bring-to-foreground几乎是您要遵循的内容,但请注意。您的$To=
分配应使用$email
,它代表数组中的单个对象,而不是整个数组(即$data
)。
$To = $email.Email
编辑:如评论中的Drew's suggestion所述,值得一提的是该行
$email = $data.Email | select -unique
将不起作用,因为稍后在foreach
循环中使用相同的变量名。我建议将唯一的电子邮件地址保存到其他变量
$uniqueEmails = $data.Email | select -unique
然后迭代那个
# Change this
ForEach ($email in $data) {
# To this
ForEach ($email in $uniqueEmails ) {
当然,您已经将Email
属性保存到$uniqueEmails
:
# This line
$To = $email.Email
# Should be changed to
$To = $email