用powershell枚举并发送电子邮件

时间:2014-03-13 14:24:46

标签: email powershell exchange-server-2010

好的伙计们,我一直在阅读,研究,学习和测试PowerShell。在过去的20天里,这是我能够提出的。

get-mailbox -identity $_.name | select name,userprincipalname,@{label="Size";expression={$size = Get-Mailboxstatistics $_.identity;$size.TotalItemSize.Value.ToMB()}},@{label="Items";expression={$items = Get-Mailboxstatistics $_.name;$item.ItemCount}}

我将其存储在名为accountsizes.ps1的脚本中。它通过输出所有具有大小的电子邮件帐户完全按照我的预期工作,但为了让我只获得超过2048MB的邮箱,我必须这样称呼它:

PS C:\accountsizes.ps1 | where size -gt "2048" | select userprincipalname,size

这可以通过以MB为单位返回电子邮件地址和邮箱大小。但现在我的困境是;如何枚举结果并提取每个电子邮件地址并向该用户和我发送电子邮件,警告他们他们的邮箱太大而且需要存档。从我读过和学习的内容来看,我将不得不使用ForEach循环和send-mailmessage cmdlet。我无法弄清楚如何使用ForEach并将其与脚本合并:这是我用ForEach去掉了大脑:

PS C:\accountsizes.ps1 | where size -gt "2048" | select userprincipalname,size | ForEach($user in userprincipalname){$_.userprincipalname}

我不知道这样做的正确方法(所以,不要问我为什么这样做:)),我以前没有关于脚本和编码的知识。

这是我的电子邮件部分:

$smtpserver = "domain.com"
$smtpFrom = "me@domain.com"
$smtpTo = "you@domain.com"
$messageSubject = "Warning Email Mailbox Too Large"
$body = "blah blah blah blah"

send-mailmessage -from $smtpFrom -to $smtpTo -subject $messageSubject -body $body

提前感谢您的有用建议。

2 个答案:

答案 0 :(得分:2)

foreach关键字和ForEach-Object cmdlet是两回事。

如果使用foreach关键字,则为迭代变量指定名称,然后迭代集合。例如:

$collection = @("one", "two")
foreach ($item in $collection) {
    Write-Host $item
}

相反,如果管道命令输出,则必须将ForEach-Object cmdlet与脚本块一起使用。在脚本块中,您可以使用特殊变量$_来引用迭代变量。例如:

$collection = @("one", "two")
$collection | ForEach-Object {
    Write-Host $_
}

您可以使用ForEach-Object缩短%

$collection | % {
    Write-Host $_
}

所以,在你的情况下你应该这样做:

C:\accountsizes.ps1 | where size -gt "2048" | select userprincipalname,size | % { $_.userprincipalname }

答案 1 :(得分:1)

Paolo提供了极好的信息,如果没有别的话,值得赞成。至于你如何枚举和发送电子邮件的问题,你可能需要这样的东西:

C:\accountsizes.ps1 | where size -gt "2048" | %{
    $smtpServer = "smtp.domain.com"

    #Creating SMTP server object
    $SMTP = new-object Net.Mail.SmtpClient($smtpServer)

    #Creating a Mail object
    $EMail = new-object Net.Mail.MailMessage

    #Construct Email 
    $EMail.From = "me@domain.com"
    $EMail.ReplyTo = "me@domain.com"
    $EMail.To.Add($_.userprincipalname)
    $EMail.subject = "Warning Email Mailbox Too Large"
    $EMail.body = "blah blah blah blah"

    $SMTP.Send($EMail)
}

你可以获得更多的想象力,按照大小来发送不同的电子邮件,具体取决于邮箱的大小,或者根据大小从主题和正文的文件中获取内容,但这只会让事情变得复杂。你也可以使用Send-MailMessage,这样就可以了,我只是喜欢这种方式,因为在我看来,这比使用大量交换机的线路更容易。如果消息和主题是通用的,您可能想要做更多类似的事情:     $ smtpServer =“smtp.domain.com”

#Creating SMTP server object
$SMTP = new-object Net.Mail.SmtpClient($smtpServer)

#Creating a Mail object
$EMail = new-object Net.Mail.MailMessage

#Construct Email 
$EMail.From = "me@domain.com"
$EMail.ReplyTo = "me@domain.com"
C:\accountsizes.ps1 | where size -gt "2048" | %{$EMail.BCC.Add($_.userprincipalname)}
$EMail.subject = "Warning Email Mailbox Too Large"
$EMail.body = "blah blah blah blah"

$SMTP.Send($EMail)

这会使一个电子邮件和BCC的每个人都在上面。然后你可以给自己做另一封电子邮件,说明谁发送了警告。