Drag And Drop von Faxen und Mails in .Net Anwendung

  • Hallo,

    hier mal ein kleines Code Beispiel, um Mails / Faxe aus dem David Client in eine .Net Anwendung mit Drag And Drop zu kopieren.

    Das ganze ist ein VB.Net Windows Forms Projekt in Visual Studio 2015.

    Ein Verweis auf die DvApi32.dll muss natürlich vorhanden sein.

    Zuerst braucht man die DVEmlFromMailItem Funktion, um EML Dateien zu generieren.

    Code
    Private Declare Function DVEmlFromMailItem Lib "DvApi32" (ByVal oMailItem As MailItem, ByVal strFileName As String) As Long


    Im DragEnter Ereignis des Steuerelements prüfen, ob das DataObject einen #TobitMsgData MemoryStream enthält:

    Code
    Private Sub OrdnerInhalt_DragEnter(sender As Object, e As DragEventArgs) Handles OrdnerInhalt.DragEnter        'Prüfen ob in der Drag Zwischenablage Mails vom David sind        If e.Data.GetDataPresent("#TobitMsgData") Then            'Wenn ja, dann den Copy Effect benutzen            e.Effect = DragDropEffects.Copy        End If    End Sub


    Die MemoryStreams "#TobitMsgData", "FileGroupDescriptor" und "#TobitEntryDataEx" auslesen.
    In der archive.dat im Archivordner die ID der Nachrichten herausfinden.

    Code
    Private Sub OrdnerInhalt_DragDrop(sender As Object, e As DragEventArgs) Handles OrdnerInhalt.DragDrop        If e.Data.GetDataPresent("#TobitMsgData") Then            Dim Quellpfad As String = ""            Dim Dateinamen As String()            'Quellpfad zu den David Dateien auslesen            Using ms As MemoryStream = e.Data.GetData("#TobitMsgData")                Dim bytes As Byte() = ms.ToArray()                Dim n As Integer = 0                Dim c As Char                Do While True                    c = Convert.ToChar(bytes(n))                    If bytes(n) <> 0 Then                        Quellpfad &= c                        n += 1                    Else                        Exit Do                    End If                Loop            End Using            'Dateinamen der gedroppten Emails auslesen            Using ms As MemoryStream = e.Data.GetData("FileGroupDescriptor")                'Header sind 4B                'Jeder Datensatz ist 332B                'Bei Index 72 des Datensatzes beginnt das "Dateiname.eml"                Dim bytes As Byte() = ms.ToArray()                ReDim Dateinamen(Int(bytes.Count / 332) - 1) ' Array mit so vielen Elementen wie Datensätze im FileGroupDescriptor sind                Dim AnzahlMails As Integer = bytes(0)                Dim Dateiname As String                Dim n As Integer                For i = 0 To AnzahlMails - 1                    Dateiname = ""                    n = 0                    Do While True                        'Solange die Bytes auslesen, bis man einen vbNullChar liest                        If bytes(i * 332 + 4 + 72 + n) <> 0 Then                            Dateiname = Dateiname & Convert.ToChar(bytes(i * 332 + 4 + 72 + n))                            n += 1                        Else                            Exit Do                        End If                    Loop                    Dateinamen(i) = Dateiname                Next            End Using            Using EntryDataEx As MemoryStream = e.Data.GetData("#TobitEntryDataEx")                Dim bytes As Byte() = EntryDataEx.ToArray()                'Die Größe des Headers steht im ersten Byte                Dim HeadExSize As Integer = bytes(0)                'Die Anzahl der Datensätze steht im 8. - 11. Byte                Dim nCountEntries As Integer = BitConverter.ToInt32(bytes, 8)                Dim nPositions(nCountEntries - 1) As Integer                For i = 0 To nCountEntries - 1                    'Datensätze in der #TobitEntryDataEx sind 269 Byte groß.                    'In den ersten 4 Bytes steht die QID aus der archive.dat                    nPositions(i) = BitConverter.ToInt32(bytes, HeadExSize + i * 269)                Next                Using fs As New FileStream(Quellpfad & "\archive.dat", FileMode.Open, FileAccess.Read)                    'archive.dat als MemoryStream kopieren                    Using ms As New MemoryStream                        fs.CopyTo(ms)                        'MemoryStream in ein Byte-Array konvertieren                        Dim archiveBytes As Byte() = ms.ToArray()                        'Datensätze in der archive.dat sind 430 Byte groß                        For i = 16 To archiveBytes.Length - 1 Step 430                            'Das 17.-20. Byte ist die QID die wir suchen                            Dim QID As Integer = BitConverter.ToInt32(archiveBytes, i)                            'Wenn die QID übereinstimmt mit einer der David-Mails, dann lies den Dateinamen im Archiv aus                            If nPositions.Contains(QID) Then                                'Der Index der QID (0, ..., nCountEntries - 1)                                Dim nPosIndex As Integer = -1                                For j = 0 To nPositions.Length - 1                                    If QID = nPositions(j) Then                                        nPosIndex = j                                        Exit For                                    End If                                Next                                'Alle Bytes ab dem 17. bis zum Ende des Datensatzes aus der archive.bat auslesen und als String konvertieren                                Dim byteString As String = ""                                For j = 0 To 429 - 17                                    byteString &= Convert.ToChar(archiveBytes(i + j))                                Next                                'Index der Id herausfinden (Index des Quellpfads im byteString + Länge des Quellpfads + 1 "\")                                Dim IdIndex As Integer = byteString.IndexOf(Quellpfad, StringComparison.OrdinalIgnoreCase) + Quellpfad.Length + 1                                'Die Id sind dann die 8 Zeichen ab dem IdIndex                                Dim Id As String = byteString.Substring(IdIndex, 8)                                'EML speichern                                DavidEmlSpeichern(Quellpfad, Dateinamen(nPosIndex), QID, Id)                            End If                        Next                    End Using                End Using            End Using        End If    End Sub


    Zum Schluss noch die Prozedur, um die Eml / Tif Dateien zu generieren.


    Weitere Informationen zum #TobitEntryDataEx hier und zur archive.dat hier bzw. hier.


    Gruß

    Einmal editiert, zuletzt von thaenhusen (16. Oktober 2017 um 16:30) aus folgendem Grund: String Vergleich angepasst, sodass Probleme mit Groß- und Kleinschreibung verhindert wird

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!