有一段日子没有更新这个系列了,主要是大家都忙于过年,也没有什么心情来写东西。
今天要和大家讨论一下如何用powershell发email,主要原因是刚刚有一个客户跟我说,他想每周都能得到一份单位内用户的exchange mailbox大小的报告,最好是email的方式。
呵呵,要解决这个问题,我们要分两部分来做,首先是如何用powershell来查看邮箱的大小,然后是如何发用powershell送email给客户。
下面象大家汇报我是如何做的,第一步......
嘿嘿,第一步不是打开powershell,而是打开IE,敲入www.google.com :^),然后搜索"powershell exchange 2003 mailbox size"
然后我得到好多的结果,随便打开一个连接得到下面的一段代码
# Get date for file name
$day = Get-Date -UFormat "%Y%m%d"
# Gets data through WMI from specified Exchange mailbox servers
$computers = "server001","server002"
foreach ($computer in $computers) {
Get-Wmiobject -namespace root\MicrosoftExchangeV2 -class Exchange_Mailbox -computer $computer | sort-object -desc MailboxDisplayName | select-object MailboxDisplayName,StorageGroupName,StoreName,Size,DateDiscoveredAbsentInDS | Export-Csv -Path $computer-$day.csv
}
从上面的代码看出,他有两台email 服务器,我只有一台。另外他是把结果保存在当前目录下面的以当前日期和服务器名字作为文件名的.csv文件中的。我呢,玩个票,把结果保存成html文件,呵呵。
好了开始写我的代码
$day = Get-Date -UFormat "%Y%m%d"
这句话是为了生成文件名中的日期
$computer="myexchangeserver"
写入你的email服务器名
$filename="c:\mailboxlog\$computer-$day.html"
我在c:下面专门建立一个目录用来存放报告
$mailboxes=Get-Wmiobject -namespace root\MicrosoftExchangeV2 -class Exchange_Mailbox -computer $computer | sort-object -desc size | select-object MailboxDisplayName, @{Name="Size(MB)"; Expression = {[int]($_.size/1kb)}}
上面这句话改动的比较厉害。首先,原句是根据邮箱名来排序的,我改成了根据大小来排序,最大的排在前面 sort-object -desc size
select-object MailboxDisplayName, @{Name="Size(MB)"; Expression = {[int]($_.size/1kb)}} 这一段稍微有点儿复杂,首先我只需要得到两个信息,邮箱名和大小。但是通过get-wmi#object 语句得到的size是kbyte的,我希望是基于MB的所以改成了上面的样子。这样,所有的邮箱大小名字信息就都存在了$mailboxes这个对象里面了。
然后,我们把$mailboxes输出为html格式,很简单
$mailboxes | ConvertTo-Html | Set-Content $filename
这样报告就生成了,下面进入正题,发送email 报告。
发送email都需要什么信息呢?
首先email服务器 $computer这个在前面已经定义了
然后发件人
$from="mwpq@hahaha.com"
然后收件人
$to="manager@wahaha.com"
然后邮件主题
$title="Weekly Exchange Mailbox Size Report"
然后内容
$body="This email generated by mwpq's powershell to collect mailbox info from exchange server, see attachment for details please."
好了照抄下面,不要问我为什么,因为我也是从www.google.com上面抄来的。顺便说下,在vbscript下我一般用cdo来发送email,powershell就不用那么麻烦了,用.net下面的email client 就可以了,很方便。
$smtp = new-Object System.Net.Mail.SmtpClient($computer)
$emailMsg = new-Object System.Net.Mail.MailMessage($from,$to, $title, $body)
$attachment = new-Object System.Net.Mail.Attachment($filename)
$emailMsg.Attachments.Add($attachment)
$smtp.Send($emailMsg)
最后全部代码在这里
- $day = Get-Date -UFormat "%Y%m%d"
- $computer="myexchangeserver"
- $filename="c:\mailboxlog\$computer-$day.html"
- $mailboxes=Get-Wmiobject -namespace root\MicrosoftExchangeV2 -class Exchange_Mailbox -computer $computer | sort-object -desc size | select-object MailboxDisplayName, @{Name="Size(MB)"; Expression = {[int]($_.size/1kb)}}
- $mailboxes | ConvertTo-Html | Set-Content $filename
- $from="mwpq@hahaha.com"
- $to="manager@wahaha.com"
- $title="Weekly Exchange Mailbox Size Report"
- $body="This email generated by mwpq's powershell to collect mailbox info from exchange server, see attachment for details please."
- $smtp = new-Object System.Net.Mail.SmtpClient($computer)
- $emailMsg = new-Object System.Net.Mail.MailMessage($from,$to, $title, $body)
- $attachment = new-Object System.Net.Mail.Attachment($filename)
- $emailMsg.Attachments.Add($attachment)
- $smtp.Send($emailMsg)
复制代码
http://bbs.winos.cn/thread-28252-1-1.html |