【问题标题】:enumerate and email with powershell使用 powershell 枚举和发送电子邮件
【发布时间】:2014-03-13 14:24:46
【问题描述】:

好的,伙计们,我一直在阅读、研究、学习和测试有关 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}}

我将其存储在名为 accountizes.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

提前感谢您的有用建议。

【问题讨论】:

    标签: email powershell exchange-server-2010


    【解决方案1】:

    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 }
    

    【讨论】:

    • 我只想补充一点,ForEach 是上下文相关的,与 ForEach-Object 并不完全不同; ForEach 可以用作 ForEach-Object 的别名。此外值得注意的是,ForEach-Object 写入管道,而 ForEach 不写入(除非用作 ForEach-Object 的别名!)。
    • 好的,在查看了我的原始行和您修改后的行的输出之后,除了我的代码行也返回了邮箱大小之外,输出看起来是一样的。看起来他们都遍历列表,Foreach/Foreach 对象是否必要?我如何将其写入变量并作为电子邮件发送给每个用户和我自己?
    【解决方案2】:

    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)
    

    这将使每个人都收到一封电子邮件和密件抄送。然后你可以给自己发另一封电子邮件,说明向谁发送了警告。

    【讨论】:

    • 我投票给 Paolo 的答案是因为它有效。我将尝试您的第一个解决方案,因为我不想向所有用户发送通用消息。我希望它说明他们的邮箱大小和差异 - 2gigs
    • 您可能想要查看Switch 循环。这样,您可以将其邮箱大小与几个不同的选项相匹配,并相应地分配主题和正文。
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 2015-05-15
    • 2018-03-12
    • 2016-07-21
    • 2010-09-25
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    相关资源
    最近更新 更多