6

我正在使用一个 powershell 脚本,它将创建磁盘空间的 HTML 报告并将其作为电子邮件发送。不幸的是,我无法将脚本发送给多个电子邮件收件人。我正在使用的脚本可以在这里找到:

http://gallery.technet.microsoft.com/scriptcenter/6e935887-6b30-4654-b977-6f5d289f3a63

以下是脚本的相关部分...

$freeSpaceFileName = "FreeSpace.htm" 
$serverlist = "C:\sl.txt" 
$warning = 90 
$critical = 75 
New-Item -ItemType file $freeSpaceFileName -Force 

Function sendEmail 
{ param($from,$to,$subject,$smtphost,$htmlFileName) 
$body = Get-Content $htmlFileName 
$smtp= New-Object System.Net.Mail.SmtpClient $smtphost 
$msg = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body 
$msg.isBodyhtml = $true 
$smtp.send($msg) 
} 

$date = ( get-date ).ToString('yyyy/MM/dd') 
$recipients = "to1@email.com", "to2@email.com"
sendEmail from@email.mail $recipients "Disk Space Report - $Date" smtp.server $freeSpaceFileName

我收到以下错误

New-Object : Exception calling ".ctor" with "4" argument(s): "The specified string is not in the form required for an e
-mail address."
At E:\DiskSpaceReport.ps1:129 char:18
+ $msg = New-Object <<<<  System.Net.Mail.MailMessage $from, $to, $subject, $body
+ CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
4

6 回答 6

8

您使用的 MailMessage 构造函数只需要一个电子邮件地址。请参阅 MSDN 文档 http://msdn.microsoft.com/en-us/library/5k0ddab0.aspx

您应该尝试使用Send-MailMessage,因为它的-To参数接受地址数组

Send-MailMessage -from from@email.mail -To $recipients -Subject "Disk Space Report - $Date" -smptServer smtp.server -Attachments $freeSpaceFileName

注意:Send-MailMessage 是在 PowerShell v2.0 中引入的,这就是为什么仍然有使用其他命令的示例的原因。如果您需要使用 v1.0,那么我将更新我的答案。

于 2013-03-06T20:55:50.890 回答
7

使用 PowerShell 发送电子邮件有两种方法:

  1. 对于Send-MailMessage方法(在 PowerShell 版本 2 中引入):

    $to = "to1@email.com", "to2@email.com"

  2. 对于System.Net.Mail方法(来自 PowerShell 版本 1 的作品):

    $msg.To.Add("to1@email.com")

    $msg.To.Add("to2@email.com")

于 2016-05-23T18:57:07.850 回答
3

您也可以在System.Net.Mail一行中完成此操作。只需确保在单个字符串中添加括号和以逗号分隔的所有收件人:

$msg = New-Object System.Net.Mail.MailMessage("from@email.com","to@email1.com,to@email2.com","Any subject,"Any message body")

这也适用于 RFC-822 格式的电子邮件地址:

System.Net.Mail.MailMessage("Sender <from@email.com>","Rcpt1 <to@email1.com>,Rcpt2 <to@email2.com>","Any subject,"Any message body")
于 2019-06-05T10:31:18.393 回答
2

根据https://docs.microsoft.com/en-us/dotnet/api/system.net.mail,看起来 MailMessage 构造函数已被 Microsoft 修复,因为它接受多个收件人,用逗号字符 (",") 分隔。 mailmessage.-ctor?redirectedfrom=MSDN&view=net-5.0#System_Net_Mail_MailMessage__ctor_System_String_System_String_System_String_System_String _

to String - 包含电子邮件收件人地址的字符串。多个电子邮件地址必须用逗号字符 (",") 分隔。

于 2021-08-18T13:07:25.083 回答
1

试试这个:

Function sendEmail 
{ param($from,[string[]]$to,$subject,$smtphost,$htmlFileName) 
$body = Get-Content $htmlFileName 
$smtp= New-Object System.Net.Mail.SmtpClient $smtphost 
$msg = New-Object System.Net.Mail.MailMessage 
$msg.from =$from

foreach($a in $to)
{
   $msg.to.Add($a)
}

$msg.Subject= $subject
$msg.Body = $body 
$msg.isBodyhtml = $true 
$smtp.send($msg) 
} 

sendemail  -from from@email.mail -to $recipients -smtphost smtp.server -subject "Disk Space Report - $Date" -htmlFileName  $freeSpaceFileName
于 2013-03-06T20:08:04.437 回答
0

我建议在 powershell 中使用 send-mailmessage 而不是定义自己的函数。我的猜测是你的一个参数类型不匹配。

于 2013-03-06T20:15:50.670 回答