如何发送独特的个人电子邮件?

时间:2019-06-10 04:59:27

标签: powershell

我需要向不同的电子邮件地址发送一封唯一的电子邮件 它们来自.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")

上面的代码有效,但是如上所述,它仅向文件中的所有电子邮件地址发送一封电子邮件。我需要为每封电子邮件发送一封邮件。

3 个答案:

答案 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