Jump to content

Transportregeln > Inhalt einer Mail im Filesystem abspeichern


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

auf einem Exchange 2010 SP3 RU6 kommen Zählerstände in Mails von Multifunktionsgeräten an. Gibt es in den Transportregeln vom Exchange die Möglichkeit den Inhalt zu parsen und ins Dateisystem zu schreiben? In den fertigen Aktionen war nichts dabei oder ich hatte Tomaten auf den Augen.

 

Gibt es mit der Powershell die Möglichkeit hier einzugreifen? Wenn ja, kann mich jemand in die richtige Richtung schubsen?

 

Vielen Dank schon im Voraus.

Link zu diesem Kommentar

Wenn die Daten im Postfach liegen, sind EWS immer eine Möglichkeit. Aber dann geht notfalls auch POP oder IMAP, um an die Inhalte zu kommen.

Das hier ist der Einstieg: http://edmguy.blogspot.co.uk/2009/08/managed-exchange-ews-api-vbnet-part-1.html

Ja, die Daten liegen in einem bestimmten Postfach, sollen automatisiert ausgelesen und in eine Datenbank befördert werden. Deshalb war auch meine Idee das ganze mit einer Transportregel abfackeln zu können.

 

BTW: Bei Lotus Notes gibt es dafür sog. Agenten, neue eingehende Mails konnte man mit Hilfe solcher Agenten in den jeweiligen Postfächern per Script bearbeiten. Anhänge automatisiert extrahieren und ins Dateisystem ablegen und so weiter und so fort. ;)

Link zu diesem Kommentar

So, 'Problem' ist gelöst. ;) Ich komm auf die betroffene Mailbox und kann alle Mails incl. Body auslesen, die im Posteingang sind. Verschieben oder ähnliches kommt später.

 

Quellen:

http://edmguy.blogspot.co.uk/2009/08/managed-exchange-ews-api-vbnet-part-1.html

 

Nimmt man nur den code vom ersten Link, bekommt man keine Verbindung, sondern eine Fehlermeldung. Abhilfe verschafft der Code von:

http://adel-aboulhuda.blogspot.de/2011/04/fw-connecting-to-user-mailbox-using.html

 

Allerdings kam auch mit dem Code von http://adel-aboulhuda.blogspot.de/2011/04/fw-connecting-to-user-mailbox-using.html kein Body zum Vorschein, auch nicht wenn man das einfach zusätzlich mit einfügt.

 

Dabei hat dann dieser Thread geholfen:

http://www.mycsharp.de/wbb2/thread.php?threadid=84020

Den Code voc mycsharp kann man mit Hilfe eines Konverters in VB.NET Code portieren.

http://codeconverter.sharpdevelop.net/SnippetConverter.aspx

Die Lösung war das .Load().

 

Und jetzt noch mein Code, der in einer Console den Inhalt der Mails ausliest, die im Posteingang liegen:

 

'Module1

Imports Microsoft.Exchange.WebServices
Imports Microsoft.Exchange.WebServices.Autodiscover
Imports Microsoft.Exchange.WebServices.Data
Imports System
Imports System.Net

Module MainModule

    Sub Main()

        Dim oService As ExchangeService = New ExchangeService(ExchangeVersion.Exchange2010_SP2)'Es gibt auch noch andere hier auswählbare Exchangeversionen.
        Dim strServerURI As String = "https://MeinExchangeServer/EWS/Exchange.asmx"
        oService.Url = New Uri(strServerURI)
        Dim strDomainName As String = "dieDomain.TLD"
        oService.Credentials = New NetworkCredential("MeinAdmin", "dasgeheimepasswort", strDomainName)' Evtl. kann man hier auch andere Credentials verwenden, am besten einen Account der nur auf diese Mailbox zugreifen darf. Zusätzlich steht ja auch das PW im Klartext im Code, bisher hab ich noch keine andere Möglichkeit gefunden.

        Dim strMailboxUser As String = "druckcounter@SMTPMailadresse.TLD"
        oService.ImpersonatedUserId = New ImpersonatedUserId(ConnectingIdType.SmtpAddress, strMailboxUser)
        
        'Hier wird die Function in der Klasse aufgerufen.
        TrustAllCertificatePolicy.OverrideCertificateValidation()

        Dim arrSearchFilter(1) As SearchFilter
        arrSearchFilter(0) = New SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, True)
        arrSearchFilter(1) = New SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, False)
        Dim oSearchFilter As SearchFilter = Nothing
        oSearchFilter = New SearchFilter.SearchFilterCollection(LogicalOperator.Or, arrSearchFilter)


        Dim oView As ItemView = New ItemView(20)
        Dim oResults As Object
        '---Fire the query for the unread items

        oResults = oService.FindItems(WellKnownFolderName.Inbox, oSearchFilter, oView)
        Dim oMessage As EmailMessage = Nothing

        Dim oMessageCollection = New DataTable
        Dim oColumn As New DataColumn
        oColumn.ColumnName = "ID"
        oColumn.AutoIncrement = True
        oMessageCollection.Columns.Add(oColumn)

        oColumn = New DataColumn
        oColumn.ColumnName = "Subject"
        oMessageCollection.Columns.Add(oColumn)

        oColumn = New DataColumn
        oColumn.ColumnName = "From"
        oMessageCollection.Columns.Add(oColumn)

        oColumn = New DataColumn
        oColumn.ColumnName = "Date Received"
        oMessageCollection.Columns.Add(oColumn)

        oColumn = New DataColumn
        oColumn.ColumnName = "Body"
        oMessageCollection.Columns.Add(oColumn)

        Dim oRow As DataRow

        For Each oMessage In oResults
            oMessage.Load() 'Das .Load() ist für das laden des Body zuständig, ohne gibt es keinen Body zu lesen.
            oRow = oMessageCollection.NewRow
            oRow("Subject") = oMessage.Subject
            oRow("From") = oMessage.From.Name
            oRow("Date Received") = oMessage.DateTimeReceived
            oRow("Body") = oMessage.Body

            oMessageCollection.Rows.Add(oRow)
            Console.WriteLine(oRow("Body")) 'Ausgabe der Body-Zeile auf eine Console.
            oRow = Nothing
        Next

    End Sub


End Module
Und noch der Code von der benötigten Klasse:

 

Imports System.Net
Imports System.Net.Security
Imports System.Security
Imports System.Security.Cryptography.X509Certificates

Public Class TrustAllCertificatePolicy

    Public Shared Sub OverrideCertificateValidation()
        ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf RemoteCertValidate)
    End Sub

    Private Shared Function RemoteCertValidate(ByVal sender As Object, ByVal cert As X509Certificate, ByVal chain As X509Chain, ByVal [error] As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function

End Class

Der o.g. Code funktioniert, es fehlt natürlich noch die Fehlerbehandlung und die Verarbeitung des Body. Den Rest darf jeder nach seinen eigenen Wünschen ergänzen. ;)
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...