Get-Queue, Microsoft Exchange Server (On-Premises) ortamlarında kullanılan bir PowerShell cmdlet’idir.
Bu komut Transport servislerinde (Mailbox Transport, Hub/Transport, Edge Transport) çalışan mail kuyruklarının (queue) durumunu görüntülemek için kullanılır. Yani Get-Queue komutu Exchange’in e-posta iletilerini hedeflerine gönderene kadar geçici olarak tuttuğu kuyrukları listeler.
Transport Mimarisi ve Kuyruk Mantığı
- Nerede çalışır? Mailbox sunucularındaki Transport (Front End, Hub/Transport, Mailbox Transport) servisleri ve Edge Transport.
- Kuyruk neden oluşur? Hedef sistemin geçici hatası, DNS/TLS problemi, alıcı taraf rate limit/greylist, yerel back-pressure, yönlendirme (routing) kararsızlıkları vb.
- Önemli kuyruk tipleri (QueueType):
- Submission: Kaynaktan gelen mesajların ilk durağı.
- Delivery: Dış hedefe/connnectora teslim için bekleyenler.
- MailboxDelivery / SmtpRelayToMailboxDelivery: Organizasyon içi teslim.
- Unreachable: Yönlendirme yapılamayan mesajlar.
- Shadow / Shadow redundancy: Dayanıklılık için yedek kopya kuyrukları.
- Poison: Şüpheli mesajlar (karantinaya benzer).
- Kritik alanlar:
Identity,Status(Active/Ready/Retry/Suspended),MessageCount,NextHopDomain,DeliveryType,LastError.
RBAC/Yetki: En az Organization Management/Transport yetkileri.
GUI muadili: Exchange Toolbox → Queue Viewer.
En Sık Kullanılan Komutlar
# Çalıştırdığın sunucudaki tüm kuyrukların görüntülenmesi;
Get-Queue
# Belirli bir sunucudaki kuyruklar
Get-Queue -Server EXCH01
Get-Queue -Server EXCH02
Get-Queue -Server EXCH03
# Tüm transport sunucularının kuyrukları listeler
Get-TransportServer | Get-Queue
# Kuyruklardaki mesajlar
Get-Queue | Get-Message
Filtre örnekleri
# 10'dan fazla mesajlı kuyruklar
Get-Queue -Filter { MessageCount -gt 10 }
# Alan adına göre
Get-Queue -Filter { NextHopDomain -like "*gmail*" }
Get-Queue -Filter { NextHopDomain -like "*kadirkozan*" }
Get-Queue -Filter { NextHopDomain -like "*hotmail.com*" }
# Durumu Retry olanlar
Get-Queue -Filter { Status -eq "Retry" }
# İnternet çıkış kuyrukları (DNS ile teslim)
Get-Queue -Filter { DeliveryType -eq "DnsConnectorDelivery" }
Mesaj işlemleri
# Mesajları askıya al
Get-Queue | Get-Message | Suspend-Message
# Askıdakileri devam ettir
Get-Queue | Get-Message | Resume-Message
# Mesajları .eml olarak dışa aktar
Get-Queue | Get-Message | Export-Message -Path "D:\Export"
# Mesajları kuyruktan sil (NDR göndermeden, onay sormadan)
Get-Queue | Get-Message | Remove-Message -WithNDR $false -Confirm:$false
Uyarı: Silme geri alınamaz. Uyumluluk gereksinimleri varsa önce Export-Message ile örnek al.
Kuyruk Seviyesi Yönetim (Suspend/Resume/Retry)
# Tek bir kuyruğu askıya al / devam ettir / yeniden dene
Suspend-Queue -Identity "EXCH01\123"
Resume-Queue -Identity "EXCH01\123"
Retry-Queue -Identity "EXCH01\123"
# Toplu retry (durumu Retry olanların hepsi)
Get-Queue -Filter { Status -eq "Retry" } | Retry-Queue
# Hedef alan adındaki kuyrukları askıya al
Get-Queue -Filter { NextHopDomain -like "*gmail*" } | Suspend-Queue
Kimlikleri hızlı görmek
Get-Queue | Select Identity,Status,MessageCount,NextHopDomain | ft -Auto
4) Mesaj Seviyesi Operasyonlar ve Av-Senaryoları
# En yoğun 3 kuyruğun ilk 50 mesajı (özet)
Get-Queue | Sort MessageCount -Descending | Select -First 3 |
Get-Message -ResultSize 50 |
Select FromAddress,Subject,Queue,Size,Status,DateReceived | ft -Auto
# Konuda 'invoice' geçen mesajlar
Get-Queue | Get-Message -ResultSize Unlimited | ? Subject -like "*invoice*"
# Belirli bir göndereni temizle (örnek spam alanı)
Get-Queue | Get-Message -ResultSize Unlimited | ? {
$_.FromAddress -like "*@spamdomain.com"
} | Remove-Message -WithNDR $false -Confirm:$false
# Tek bir mesajı export etmek
Get-Message -Identity <MessageIdentity> | Export-Message -Path "D:\Export\msg.eml"
İnceleme alanları: Recipients, LastError, SCL, InternetMessageId, DateReceived.
Operasyonel Playbook (Gerçek Hayat Senaryoları)
A) Dış alanlara mail gitmiyor (internet çıkışı)
- Durumu görüntüle:
Get-Queue -Filter { DeliveryType -eq "DnsConnectorDelivery" } | Select Identity,Status,MessageCount,LastError | ft -Auto LastError/Status=Retrykontrol et. DNS/TLS/smarthost/bağlantı sorunları olabilir.- Toplu yeniden dene:
Get-Queue -Filter { Status -eq "Retry" -and DeliveryType -eq "DnsConnectorDelivery" } | Retry-Queue - Send Connector, outbound TLS sertifikası/hostname, reverse DNS/SPF/DKIM/DMARC doğrula.
- Gerekirse Suspend + Export ile örnekle analiz et.
B) Tek bir alan adında (ör. gmail.com) birikme
Get-Queue -Filter { NextHopDomain -like "*gmail.com*" } |
Select Identity,MessageCount,LastError | ft -Auto
- Olası nedenler: Alıcı taraf rate-limit/greylist, TLS uyumsuzluğu, 451/4xx geçici hatalar.
- Retry-Queue ile yokla, hata sürer ise SMTP transcript/edge logları ve TLS’yi incele.
C) Organizasyon içi teslim yavaş (MailboxDelivery)
Get-Queue -Filter {
DeliveryType -eq "SmtpRelayToMailboxDelivery" -or
DeliveryType -eq "MailboxDelivery"
} | Select Identity,Status,MessageCount,LastError | ft -Auto
- DB/Copy durumu, DAG, Hub/Transport servisleri, mailbox sunucusu sağlığı, Back Pressure (disk/memory/CPU) kontrolü.
D) Unreachable / Poison kuyrukları
Get-Queue | Group-Object QueueType | Select Count,Name | ft -Auto
- Unreachable: Routing bilgisi yok; AD site/connector tanımlarını gözden geçir.
- Poison: Şüpheli; silmeden önce export edip güvenlikle birlikte incele.
6) Performans, Sağlık ve Loglar
Back Pressure (öz-koruma):
- Transport disk alanı/IO, RAM/CPU düşükse kendini kısıtlar.
- Olay günlükleri (Application/System) → “Resource pressure” uyarılarını kontrol et.
- Disk: Transport queue klasörleri AV real-time scan exclude listesinde olmalı.
TLS/Sertifika:
LastErroriçinde “TLS/Handshake” görürsen: Send Connector TLS seçenekleri, sertifika CN/SAN, zincir güveni ve saat senkronu (NTP) kontrolü.
DNS:
DnsConnectorDeliveryhatalarında recursive resolver erişimi (UDP/TCP 53), firewall, dahili DNS sağlığı.
Protokol günlükleri (diagnostics):
- Receive/Send Connector logları (SMTP transcript) → Hata kodlarını netleştirir.
- MessageTracking (teslim zincirini izle):
Get-MessageTrackingLog -Recipients user@contoso.com -Start (Get-Date).AddHours(-6)
Performans sayaçları (özet):
- MSExchangeTransport Queues: Retry Queue Length, Active Remote Delivery Queue Length, Submission Queue Length.
7) Raporlama ve Günlük Operasyon Script’leri
A) Günlük kuyruk özeti (e-posta raporu)
$now = Get-Date
$queues = Get-Queue | Select Server,Identity,Status,MessageCount,NextHopDomain,DeliveryType,LastError
$body = $queues | Sort MessageCount -Descending | ConvertTo-Html -Title "Exchange Queue Report $now" | Out-String
Send-MailMessage -To "ops@contoso.com" -From "exch-report@contoso.com" -SmtpServer "smtp.contoso.com" `
-Subject "Exchange Queue Report - $now" -Body $body -BodyAsHtml
B) 30+ mesajlı kuyrukları otomatik retry
Get-Queue -Filter { MessageCount -gt 30 -and Status -eq "Retry" } | Retry-Queue
C) 48 saatten eski Retry mesajlarını temizleme (dikkat!)
$cut = (Get-Date).AddHours(-48)
Get-Queue -Filter { DeliveryType -eq "DnsConnectorDelivery" } |
Get-Message -ResultSize Unlimited | Where-Object {
$_.Status -eq "Retry" -and $_.DateReceived -lt $cut
} | Remove-Message -WithNDR $false -Confirm:$false
Önce küçük bir örnek kümeyi Export-Message ile dışa aktararak doğrulama yapın.