Skrypt czyszczący kolejki SMTP serwera Exchange 2000/2003
Udostępnij Follow CodeTwo on Facebook Follow CodeTwo on Twitter
Artykuł dotyczy: Exchange Server 2000/2003

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 ClearQueuesInLoop.

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ąć?