【问题标题】:Powershell send-mailmessage - email to multiple recipientsPowershell send-mailmessage - 向多个收件人发送电子邮件
【发布时间】:2012-05-01 18:41:09
【问题描述】:

我有这个 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

【问题讨论】:

    标签: powershell


    【解决方案1】:
    $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[] 类型,但可以做同样的工作。

    【讨论】:

    • 其实你不需要“人类友好”的名字。请确保在调用时取消引用 $recipients。所以不要使用"$recipients",而是使用$recipients,使用如下格式填写:$recipients = "&lt;User1@domain.com&gt;", "&lt;User2@domain.com&gt;"
    • 知道了:Send-MailMessage -To @('email@gmail.com','email2@gmail.com')
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你必须先将字符串转换成字符串数组,像这样:

      $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
      

      【讨论】:

      • 从字符串数组开始怎么样,像这样$recipients = @("Marcel &lt;marcel@turie.eu&gt;", "Marcelt &lt;marcel@nbs.sk&gt;")
      • 如果输入是纯文本,这种方法很有用。可以在同一行进行拆分:$recipients = "Marcel &lt;marcel@turie.eu&gt;,Marcelt &lt;marcel@nbs.sk&gt;".Split(',')
      【解决方案4】:

      只需创建一个 Powershell 数组即可解决问题

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

      同样的方法可以用于附件

      $attachments = @("$PSScriptRoot\image003.png", "$PSScriptRoot\image004.jpg")
      

      【讨论】:

      • 我最喜欢你的解决方案。努伊斯·鲁巴诺夫
      【解决方案5】:

      要定义一个字符串数组,使用起来更舒服 $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
      

      【讨论】:

        【解决方案6】:

        发送一个 .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
        

        点赞

        【讨论】:

          【解决方案7】:

          这是一个完整的(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
          

          Google 邮件备注

          • 如果启用了“不太安全的应用”选项,这适用于 Gmail,但我们应该避免启用它。
          • 不要使用“不太安全的应用”,而是启用两步验证并使用“应用密码”
          • 如果 587 不起作用,请使用端口 465。

          【讨论】:

          • 这是最好的解决方案,尤其是对于将值存储在 JSON 配置文件中的应用程序。
          【解决方案8】:

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

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

          到这里:

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

          【讨论】:

            【解决方案9】:

            我在 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 进行了测试。

            【讨论】:

              猜你喜欢
              • 2014-06-22
              • 2012-05-18
              • 2017-12-05
              • 2015-08-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多