Microsoft Outlook troubleshooting
Skrypt czyszczący kolejki SMTP serwera Exchange 2000/2003

Skrypt czyszczący kolejki SMTP serwera Exchange 2000/2003

autor CodeTwo 2008-03-05 00:00:00 w Exchange Server

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 naszym forum.

(c) CodeTwo. Wszelkie prawa zastrzeżone.



© Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.