如何用PowerShell获取Exchange Online邮件(含附件)大小?
解决方法:通过Microsoft Graph PowerShell获取Office 365邮件大小(字节)
要获取邮件的原始大小(对应MAPI属性PidTagMessageSize即0x0E08),你之前的调用格式有误,以下是两种可行的实现方式:
方法1:一次性获取邮件时包含大小属性(推荐,减少API调用)
直接在Get-MgUserMailFolderMessage中通过扩展属性筛选并获取邮件大小,无需循环调用单独的cmdlet:
$UPN = "user@domain.com" # 连接Graph并获取目标文件夹 Connect-MgGraph -Scopes "Mail.Read" $inboxFolder = Get-MgUserMailFolder -UserId $UPN -Filter "DisplayName eq 'Inbox'" # 获取邮件时同时扩展并选择大小属性 $mails = Get-MgUserMailFolderMessage -UserId $UPN -MailFolderId $inboxFolder.Id -Top 1 ` -ExpandProperty "singleValueExtendedProperties(`$filter=id eq 'Long 0x0E08')" ` -Select Subject,singleValueExtendedProperties # 遍历提取大小值 foreach($currEmail in $mails){ Write-Host "主题: $($currEmail.Subject)" $mailSizeInBytes = $currEmail.SingleValueExtendedProperties | Where-Object { $_.Id -eq 'Long 0x0E08' } | Select-Object -ExpandProperty Value Write-Host "邮件大小(字节): $mailSizeInBytes" }
方法2:单独调用扩展属性cmdlet(适合单邮件场景)
如果需要单独获取某封邮件的大小,需使用-Filter参数指定正确的属性格式,而非-Property:
$UPN = "user@domain.com" Connect-MgGraph -Scopes "Mail.Read" $inboxFolder = Get-MgUserMailFolder -UserId $UPN -Filter "DisplayName eq 'Inbox'" $mails = Get-MgUserMailFolderMessage -UserId $UPN -MailFolderId $inboxFolder.Id -Top 1 foreach($currEmail in $mails){ Write-Host "主题: $($currEmail.Subject)" # 正确筛选扩展属性 $sizeProperty = Get-MgUserMessageSingleValueExtendedProperty -UserId $UPN -MessageId $currEmail.Id ` -Filter "id eq 'Long 0x0E08'" $mailSizeInBytes = $sizeProperty.Value Write-Host "邮件大小(字节): $mailSizeInBytes" }
关键说明
- 你之前的错误在于:
Get-MgUserMessageSingleValueExtendedProperty的-Property参数需要的是属性逻辑名称,而非MAPI十六进制ID;要指定MAPI属性,必须用-Filter参数并遵循格式id eq '类型 属性ID'(这里0x0E08是Long类型)。 - 批量处理时优先使用方法1,避免频繁API调用触发限流。
- 你的环境(PowerShell 5.1 + Microsoft.Graph 1.16.0)完全支持上述命令。
内容的提问来源于stack exchange,提问作者NickJP
相关产品推荐
相关产品推荐

