【发布时间】:2020-07-17 13:40:17
【问题描述】:
我有这个 powershell 脚本来获取一些电子邮件计数,如果我在 csv 文件中只有一个用户,它可以正常工作,但是当我放置两个或更多用户时,它会将其全部读取为一行,然后我得到一个无效的 SMTP 地址错误。我一生都无法弄清楚如何让它单独阅读每一行。有人可以看看这个 powershell 脚本并帮助我吗?
############ Start Import the Exchange 2010 modules if available, otherwise import 2007.
if (Get-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -Registered -ErrorAction SilentlyContinue) {
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
} else {
Add-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.Admin
}
############ Start Variables
[Int] $intSent = $intRec = 0
$emails = Get-Content "C:\Test.csv"
$dt = (get-date).adddays(-1)
$tab2 = @()
$tabInfo = @()
############ End variables
############ Start HTML Style
$head = @'
<style>
body { background-color:#FFFFFF;
font-family:Tahoma;
font-size:11pt; }
td, th { border:1px solid black;
border-collapse:collapse;
text-align:center;
background+color:#e0e0e0;
width:300px;}
th { color:#ffffff;
background-color:#20a000;
text-align:center;}
table, tr, td, th { padding: 1px; margin: 0px }
table { margin-left:15px; }
</style>
'@
############ End HTML Style
############ Start retrieve email address + NB sent/received mails
foreach ($i in $emails) {
$intRec = 0 #Number of received mails
$intSent = 0 #Number of sent mails
$intTotalSentInt = 0 #Number of sent internal mails
$intTotalSentExt = 0 #Number of sent external mails
$intTotalRecInt = 0 #Number of received internal mails
$intTotalRecExt = 0 #Number of received external mails
$address = $emails #Email address
$object = new-object Psobject #Create the object
$objectInfo = new-object Psobject #Create the object info
############ Sent mails
Get-TransportService | Get-MessageTrackingLog -ResultSize Unlimited -Start $dt -Sender $emails -EventID RECEIVE | ? {$_.Source -eq "STOREDRIVER"} | ForEach {
If ($_.Recipients -match "domain.com") {
$intTotalSentInt++
}
If ($_.Recipients -notmatch "domain.com") {
$intTotalSentExt++
}
}
############ Received mails
Get-TransportService | Get-MessageTrackingLog -ResultSize Unlimited -Start $dt -Recipients $emails -EventID DELIVER | ForEach {
If ($_.Sender -match "domain.com") {
$intTotalRecInt += [Int] $_.RecipientCount
} Else {
# From an external sender
$intTotalRecExt += [Int] $_.RecipientCount
}
}
############ Insert address + number of sent/received mails
$object | Add-member -Name "User" -Membertype "Noteproperty" -Value $emails
$object | Add-member -Name "Internal Emails Sent" -Membertype "Noteproperty" -Value $IntTotalSentInt
$object | Add-member -Name "External Emails Sent" -Membertype "Noteproperty" -Value $IntTotalSentExt
$object | Add-member -Name "Internal Emails Received" -Membertype "Noteproperty" -Value $intTotalRecInt
$object | Add-member -Name "External Emails Received" -Membertype "Noteproperty" -Value $intTotalRecExt
$tab2 += $object
}
############ Sort by number of sent emails
$tab2 = $tab2 | Sort-Object Sent -descending
############ ConvertTo-HTML
$body = $tabInfo | ConvertTo-HTML -head $head
$body += $tab2 | ConvertTo-HTML -head $head
############ Send emails with results
send-mailmessage -to "email@domain.com" -from "email@domain.com" -subject "Emails Sent and Received from $dt" -body ($body | out-string) -BodyAsHTML -SmtpServer "x.x.x.x"
############ end of Script
【问题讨论】:
-
向我们展示
C:\Test.csv文件的前 4 或 5 行(当然是经过消毒的。您现在正在使用Get-Content阅读此内容,它为您提供了一个字符串数组。您可能需要使用Import-Csv,但要明确回答这个问题,我们需要知道 CSV 的样子 -
添加到原始消息中。
-
当您执行
$object | Add-member -Name "User" -Membertype "Noteproperty" -Value $emails时,您将在那里输入整个数组$emails。相反,您应该使用用于迭代电子邮件数组的变量,在您的情况下为$i。 (注意,这是一个真的不好的名字.. $i 通常用于在编号循环for($i = 0; $i -lt $someArray; $i++)中进行迭代。但是您使用的是 foreach 循环,所以我建议将其更改为类似foreach ($userEmail in $emails)然后设置它$object | Add-member -Name "User" -Membertype "Noteproperty" -Value $userEmail -
非常感谢!这是这个和 anto418 建议的结合,但我们现在正在努力!
标签: powershell