Microsoft 365 ile gelen Exchange Online kurumların e-posta yönetiminde en çok tercih edilen çözümlerden biridir.
Kullanıcıların posta kutuları zamanla büyür, ekler, arşivlenen yazışmalar ve günlük e-posta trafiği nedeniyle kotaya yaklaşabilir.
IT yöneticileri için bu büyümeyi takip etmek önemlidir:
- Kapasite planlaması yapmak,
- Kota aşımı yaşanmadan önlem almak,
- Gereksiz büyüyen kutulara müdahale etmek,
- Düzenli raporlama ile üst yönetime bilgi sunmak.
Bu makalemde Exchange Online ortamındaki tüm kullanıcıların hem ana posta kutusu (Primary Mailbox) hem de arşiv posta kutusu (Archive Mailbox) boyutlarını topluca raporlayan bir PowerShell script’i bulacaksınız.
Exchange Online’a Bağlanmak
Öncelikle PowerShell üzerinden Exchange Online’a bağlanmamız gerekir. Bunun için gerekli modülün yüklü olduğundan emin olunuz.
Install-Module ExchangeOnlineManagement
Ardından oturum açınız. Bu komuttaki kullanici@domain.com yerine yetkili bir hesabınızı yazınız.
Connect-ExchangeOnline -UserPrincipalName kullanici@domain.com
Rapor Script’i
Aşağıdaki script:
- Tüm kullanıcı posta kutularını tarar,
- Her kullanıcının Primary ve Archive boyutlarını hesaplar,
- Sonuçları masaüstünde CSV dosyası olarak kaydeder.
$today = Get-Date -Format "yyyy-MM-dd"
$outputPath = "$env:USERPROFILE\Desktop\Mailbox_Boyut_Raporu_$today.csv"
$mailboxes = Get-Mailbox -ResultSize Unlimited -Filter {RecipientTypeDetails -eq 'UserMailbox'}
$results = foreach ($mb in $mailboxes) {
try {
$stat = Get-MailboxStatistics -Identity $mb.UserPrincipalName
$sizeString = $stat.TotalItemSize.ToString()
$byteMatch = [regex]::Match($sizeString, '\(([\d,\.]+)\sbytes\)').Groups[1].Value
$byteClean = $byteMatch -replace '\.', '' -replace ',', ''
$bytes = [double]::Parse($byteClean)
$primarySizeMB = [math]::Round($bytes / 1MB, 2)
} catch {
$primarySizeMB = 0
}
try {
if ($mb.ArchiveStatus -eq "Active") {
$archiveStat = Get-MailboxStatistics -Archive -Identity $mb.UserPrincipalName
$archiveString = $archiveStat.TotalItemSize.ToString()
$archiveMatch = [regex]::Match($archiveString, '\(([\d,\.]+)\sbytes\)').Groups[1].Value
$archiveClean = $archiveMatch -replace '\.', '' -replace ',', ''
$archiveBytes = [double]::Parse($archiveClean)
$archiveSizeMB = [math]::Round($archiveBytes / 1MB, 2)
} else {
$archiveSizeMB = 0
}
} catch {
$archiveSizeMB = 0
}
[PSCustomObject]@{
"Görünen Ad" = $mb.DisplayName
"E-Posta Adresi" = $mb.UserPrincipalName
"Posta Kutusu (MB)" = $primarySizeMB
"Arşiv Kutusu (MB)" = $archiveSizeMB
}
}
$results | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
4. Çıktı Örneği
Script çalıştıktan sonra masaüstünüzde Mailbox_Boyut_Raporu_yyyy-MM-dd.csv dosyası oluşur. Bu dosyayı Excel’de açarak kullanıcıların kutu boyutlarını analiz edebilirsiniz.
| Görünen Ad | E-Posta Adresi | Posta Kutusu (MB) | Arşiv Kutusu (MB) |
|---|---|---|---|
| Veli Kadir KOZAN | kadir.kozan@domain.com | 4850,23 | 10240,56 |
| Lena KOZAN | lena.kozan@domain.com | 3098,77 | 1232.52 |
Otomasyon:
Script’i Windows Task Scheduler ile günlük/haftalık çalışacak şekilde zamanlayabilir, raporun güncel kalmasını sağlayabilirsiniz.
E-posta ile gönderme:
Sonuç CSV dosyasını otomatik olarak yöneticilere e-posta gönderecek şekilde script’e SMTP satırları ekleyebilirsiniz.
Filtreleme:
Belirli departmanları veya OU’ları raporlamak için Get-Mailbox komutuna filtreler eklenebilir. Örneğin:
Get-Mailbox -ResultSize Unlimited -OrganizationalUnit "OU=Sales-Accounts,DC=domain,DC=com"
Birim Dönüşümü:
Script MB cinsinden rapor üretir. İsterseniz 1GB değerini kullanarak GB cinsinden çıktı alabilirsiniz.
Not :
- Arşivi olmayan kullanıcılar için değer 0 MB döner.
- Bağlantı hatalarında
Connect-ExchangeOnlineadımını kontrol edin. - Büyük tenant’larda çalıştırıldığında biraz zaman alabilir sabırlı olmak gerek.