64

我有这个 powershell 脚本来发送带有附件的电子邮件,但是当我添加多个收件人时,只有第一个收件人会收到邮件。我已经阅读了文档,但仍然无法弄清楚。谢谢

$recipients = "Marcel <marcel@turie.eu>, Marcelt <marcel@nbs.sk>"

Get-ChildItem "C:\Decrypted\" | Where {-NOT $_.PSIsContainer} | foreach {$_.fullname} |
send-mailmessage -from "primasfrb@nbs.sk" `
            -to "$recipients" `
            -subject "New files" `
            -body "$teloadmin" `
            -BodyAsHtml `
            -priority  High `
            -dno onSuccess, onFailure `
            -smtpServer  192.168.170.61
4

9 回答 9

97
$recipients = "Marcel <marcel@turie.eu>, Marcelt <marcel@nbs.sk>"

string您需要传递给send-mailmessage类型string[](数组)的类型:

[string[]]$recipients = "Marcel <marcel@turie.eu>", "Marcelt <marcel@nbs.sk>"

我认为不强制转换为 string[] 可以满足 powershell 的强制规则:

$recipients = "Marcel <marcel@turie.eu>", "Marcelt <marcel@nbs.sk>"

object[]类型,但可以做同样的工作。

于 2012-04-20T07:22:01.620 回答
39

只需创建一个 Powershell 数组就可以了

$recipients = @("Marcel <marcel@turie.eu>", "Marcelt <marcel@nbs.sk>")

相同的方法可用于附件

$attachments = @("$PSScriptRoot\image003.png", "$PSScriptRoot\image004.jpg")
于 2015-05-12T14:23:06.910 回答
7

您必须首先将字符串转换为字符串数组,如下所示:

$recipients = "Marcel <marcel@turie.eu>,Marcelt <marcel@nbs.sk>"
[string[]]$To = $recipients.Split(',')

然后Send-MailMessage像这样使用:

Send-MailMessage -From "primasfrb@nbs.sk" -To $To -subject "New files" -body "$teloadmin" -BodyAsHtml -priority High -dno onSuccess, onFailure -smtpServer 192.168.170.61
于 2015-05-05T12:12:11.020 回答
6

要定义一个字符串数组,使用 $var = @('User1', 'User2') 会更舒服。

$servername = hostname
$smtpserver = 'localhost'
$emailTo = @('username1 <user1@dom.com>', 'username2<user2@dom.com>')
$emailFrom = 'SomeServer <user3@dom.com>'
Send-MailMessage -To $emailTo -Subject 'Low available memory' -Body 'Warning' -SmtpServer $smtpserver -From $emailFrom
于 2016-10-05T16:06:40.223 回答
6

这是一个完整的(Gmail)和简单的解决方案......只需使用普通的;分隔符.. 最适合作为参数传入。

$to = "user1@domain.org;user2@domain.org"
$user = "italerts@domain.org"    
$pass = "password"

$pass = ConvertTo-SecureString -String $pass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential $user, $pass
$mailParam = @{
    To = $to.Split(';')
    From = "IT Alerts <italerts@domain.org>"
    Subject = "test"
    Body = "test"
    SmtpServer = "smtp.gmail.com"
    Port = 587 #465
    Credential = $cred
    UseSsl = $true
}

# Send Email
Send-MailMessage @mailParam

谷歌邮件注意事项

  • 如果启用了“不太安全的应用程序”选项,这适用于 Gmail,但我们应该避免启用它。
  • 而不是“不太安全的应用程序”,启用两步验证并使用“应用程序密码”
  • 如果 587 不起作用,请使用端口 465。
于 2019-04-30T21:13:55.127 回答
2

没错,每个地址都需要引用。如果您在命令行上列出了多个地址,则 Send-MailMessage 喜欢它,如果您同时指定人性化和电子邮件地址部分。

于 2012-09-10T21:59:16.433 回答
0

发送 .NET / C# powershell 电子邮件使用这样的结构:

为了获得最佳行为,使用这样的方法创建一个类

 using (PowerShell PowerShellInstance = PowerShell.Create())
            {
                PowerShellInstance.AddCommand("Send-MailMessage")
                                  .AddParameter("SMTPServer", "smtp.xxx.com")
                                  .AddParameter("From", "xxx@xxx.com")
                                  .AddParameter("Subject", "xxx Notification")
                                  .AddParameter("Body", body_msg)
                                  .AddParameter("BodyAsHtml")
                                  .AddParameter("To", recipients);

                // invoke execution on the pipeline (ignore output) --> nothing will be displayed
                PowerShellInstance.Invoke();
            }              

因此,这些实例在如下函数中被调用:

        public void sendEMailPowerShell(string body_msg, string[] recipients)

永远不要忘记为接收者使用字符串数组,如下所示:

string[] reportRecipient = { 
                        "xxx <xxx.Fercher@xxx.com>",
                        "xxx <xxx@xxx.com>"
                        };

body_msg

此消息可以作为方法本身的参数,启用 HTML 编码!

收件人

千万不要忘记在有多个收件人的情况下使用字符串数组,否则只会使用字符串中的最后一个地址!!!

调用函数可能如下所示:

        mail reportMail = new mail(); //instantiate from class
        reportMail.sendEMailPowerShell(reportMessage, reportRecipient); //msg + email addresses

大拇指

于 2017-04-18T12:05:35.620 回答
0

不需要所有复杂的铸件或拆分成一个数组。我只是通过改变语法来解决这个问题:

$recipients = "user1@foo.com, user2@foo.com"

对此:

$recipients = "user1@foo.com", "user2@foo.com"
于 2021-11-03T18:38:03.617 回答
0

我在Azure VM上使用PowershellSendGrid向更多收件人发送邮件的完整解决方案:


# Set your API Key here
$sendGridApiKey = '......your Sendgrid API key'
# (only API permission to send mail is sufficient and safe')

$SendGridEmail = @{

    # Use your verified sender address.
    From = 'my@email.com'

    # Specify the email recipients in an array.
    To =  @('person01@domainA.com','person02@domainB.com')

    Subject = 'This is a test message via SendGrid'

    Body = 'This is a test message from Azure send by Powershell script on VM using SendGrid in Azure'
    
    # DO NO CHANGE ANYTHING BELOW THIS LINE
    SmtpServer = 'smtp.sendgrid.net'
    Port = 587
    UseSSL = $true
    Credential = New-Object PSCredential 'apikey', (ConvertTo-SecureString $sendGridApiKey -AsPlainText -Force) 
}

# Send the email
Send-MailMessage @SendGridEmail

在我在 Azure 中的一台 VM 上使用 Powershell 5.1 进行了测试。

于 2021-11-05T03:47:23.753 回答