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ışı)

  1. Durumu görüntüle: Get-Queue -Filter { DeliveryType -eq "DnsConnectorDelivery" } | Select Identity,Status,MessageCount,LastError | ft -Auto
  2. LastError/Status=Retry kontrol et. DNS/TLS/smarthost/bağlantı sorunları olabilir.
  3. Toplu yeniden dene: Get-Queue -Filter { Status -eq "Retry" -and DeliveryType -eq "DnsConnectorDelivery" } | Retry-Queue
  4. Send Connector, outbound TLS sertifikası/hostname, reverse DNS/SPF/DKIM/DMARC doğrula.
  5. 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:

  • LastError içinde “TLS/Handshake” görürsen: Send Connector TLS seçenekleri, sertifika CN/SAN, zincir güveni ve saat senkronu (NTP) kontrolü.

DNS:

  • DnsConnectorDelivery hataları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.