Poniższy skrypt automatycznie czyści wybrane kolejki SMTP serwera Exchange 2000/2003. Jest bardzo przydatny w przypadku, gdy przez przypadek włączymy relying serwera Exchange lub musimy posprzątać kolejki po początkującym administratorze. Serwer pocztowy z włączonym relyingiem jest bardzo szybko wykrywany przez spamerów i w kolejkach SMTP pojawiają się tysiące wiadomości, których ręczne usuwanie staje się praktycznie niemożliwe. Skrypt usuwa wiadomości z kolejek w taki sposób, że do ich nadawców nie są wysyłane raporty o niedoręczeniu, czyli jest to metoda No-NDR. Wiadomości usuwane są tylko z tych kolejek, które zawierają w nazwie kropkę, czyli są przeznaczone do wysłania na zewnątrz. W ten sposób omijane są kolejki przeznaczone do wewnętrznego przetwarzania i dostarczania wiadomości. Dodatkowo skrypt nie usuwa wiadomości przeznaczonych do dwóch domen zewnętrznych: Outlook.pl i CodeTwo.com (linia kodu oznaczona jako (*2)). Skrypt napisany jest w VBA. Najwygodniej jest go uruchomić na serwerze Exchange w dowolnym edytorze VBA (Visual Basic for Applications) pakietu Office. Mamy wtedy możliwość śledzenia jego wykonywania, a wyniki możemy na bieżąco obserwować w oknie rezultatów (Immediate). W linii oznaczonej (*1) należy wpisać nazwę net bios serwera Exchange, na którym skrypt uruchamiamy, w przykładzie jest to serwera o nazwie ?alpha?. Następnie należy uruchomić procedurę o nazwie
Sub ClearQueuesInLoop()
Dim bResult As Boolean
bResult = True
Do While bResult = True
bResult = ClearQueues()
Loop
End Sub
Function ClearQueues() As Boolean
ClearQueues = False
Set oWmi = GetObject("winmgmts://alpha/root/MicrosoftExchangeV2")
Set oQueues = oWmi.InstancesOf("Exchange_SMTPQueue")
For Each oQueue In oQueues
Err.Clear
On Error GoTo ErrorHandler
If (InStr(oQueue.QueueName, ".") > 0) And _
(InStr(oQueue.QueueName, "codetwo.com") = 0) And _ '(*2)
(InStr(oQueue.QueueName, "outlook.pl") = 0) Then
strQuery = "Select * From Exchange_QueuedSMTPMessage Where ProtocolName='SMTP' " & _
" AND LinkID='" & oQueue.LinkID & "'" & _
" AND LinkName='" & oQueue.LinkName & "'" & _
" AND QueueID='" & oQueue.QueueID & "'" & _
" AND QueueName='" & oQueue.QueueName & "'" & _
" AND VirtualMachine='" & oQueue.VirtualMachine & "'" & _
" AND VirtualServerName='" & oQueue.VirtualServerName & "'"
Debug.Print oQueue.QueueName & " : " & oQueue.MessageCount
Set oMessagesList = oWmi.ExecQuery(strQuery)
If Not oMessagesList Is Nothing Then
On Error Resume Next
For Each oMessage In oMessagesList
Err.Clear
oMessage.DeleteNoNDR
If Err.Number <> 0 Then
Debug.Print " Error " & oMessage.Sender & " " & oMessage.MessageId & " " & Err.Description
Else
ClearQueues = True
Debug.Print " Success " & oMessage.MessageId
End If
Set oMessage = Nothing
Next
Set oMessagesList = Nothing
End If
End If
Next
Exit Function
ErrorHandler:
MsgBox Err.Description
End Function
Jeśli masz jakieś pytania lub komentarze dotyczące tego artykułu, napisz na forum. (c) CodeTwo Wszelkie prawa zastrzeżone. Artykuł ten nie może być kopiowany lub publikowany bez wyraźnej zgody autora. Słowa kluczowe: Exchange Server 2003, serwer Exchange 200, skrypt do czyszczenie kolejek SMTP, Jak z automatu wyczyścić kolejki SMTP w serwerze Exchange. Tysiące wiadomości email w kolejkach SMTP serwera, jak je usunąć? |
||