Drag And Drop von Faxen und Mails in .Net Anwendung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

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

    Quellcode

    1. 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:

    Quellcode

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

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

    Quellcode

    1. Private Sub OrdnerInhalt_DragDrop(sender As Object, e As DragEventArgs) Handles OrdnerInhalt.DragDrop
    2. If e.Data.GetDataPresent("#TobitMsgData") Then
    3. Dim Quellpfad As String = ""
    4. Dim Dateinamen As String()
    5. 'Quellpfad zu den David Dateien auslesen
    6. Using ms As MemoryStream = e.Data.GetData("#TobitMsgData")
    7. Dim bytes As Byte() = ms.ToArray()
    8. Dim n As Integer = 0
    9. Dim c As Char
    10. Do While True
    11. c = Convert.ToChar(bytes(n))
    12. If bytes(n) <> 0 Then
    13. Quellpfad &= c
    14. n += 1
    15. Else
    16. Exit Do
    17. End If
    18. Loop
    19. End Using
    20. 'Dateinamen der gedroppten Emails auslesen
    21. Using ms As MemoryStream = e.Data.GetData("FileGroupDescriptor")
    22. 'Header sind 4B
    23. 'Jeder Datensatz ist 332B
    24. 'Bei Index 72 des Datensatzes beginnt das "Dateiname.eml"
    25. Dim bytes As Byte() = ms.ToArray()
    26. ReDim Dateinamen(Int(bytes.Count / 332) - 1) ' Array mit so vielen Elementen wie Datensätze im FileGroupDescriptor sind
    27. Dim AnzahlMails As Integer = bytes(0)
    28. Dim Dateiname As String
    29. Dim n As Integer
    30. For i = 0 To AnzahlMails - 1
    31. Dateiname = ""
    32. n = 0
    33. Do While True
    34. 'Solange die Bytes auslesen, bis man einen vbNullChar liest
    35. If bytes(i * 332 + 4 + 72 + n) <> 0 Then
    36. Dateiname = Dateiname & Convert.ToChar(bytes(i * 332 + 4 + 72 + n))
    37. n += 1
    38. Else
    39. Exit Do
    40. End If
    41. Loop
    42. Dateinamen(i) = Dateiname
    43. Next
    44. End Using
    45. Using EntryDataEx As MemoryStream = e.Data.GetData("#TobitEntryDataEx")
    46. Dim bytes As Byte() = EntryDataEx.ToArray()
    47. 'Die Größe des Headers steht im ersten Byte
    48. Dim HeadExSize As Integer = bytes(0)
    49. 'Die Anzahl der Datensätze steht im 8. - 11. Byte
    50. Dim nCountEntries As Integer = BitConverter.ToInt32(bytes, 8)
    51. Dim nPositions(nCountEntries - 1) As Integer
    52. For i = 0 To nCountEntries - 1
    53. 'Datensätze in der #TobitEntryDataEx sind 269 Byte groß.
    54. 'In den ersten 4 Bytes steht die QID aus der archive.dat
    55. nPositions(i) = BitConverter.ToInt32(bytes, HeadExSize + i * 269)
    56. Next
    57. Using fs As New FileStream(Quellpfad & "\archive.dat", FileMode.Open, FileAccess.Read)
    58. 'archive.dat als MemoryStream kopieren
    59. Using ms As New MemoryStream
    60. fs.CopyTo(ms)
    61. 'MemoryStream in ein Byte-Array konvertieren
    62. Dim archiveBytes As Byte() = ms.ToArray()
    63. 'Datensätze in der archive.dat sind 430 Byte groß
    64. For i = 16 To archiveBytes.Length - 1 Step 430
    65. 'Das 17.-20. Byte ist die QID die wir suchen
    66. Dim QID As Integer = BitConverter.ToInt32(archiveBytes, i)
    67. 'Wenn die QID übereinstimmt mit einer der David-Mails, dann lies den Dateinamen im Archiv aus
    68. If nPositions.Contains(QID) Then
    69. 'Der Index der QID (0, ..., nCountEntries - 1)
    70. Dim nPosIndex As Integer = -1
    71. For j = 0 To nPositions.Length - 1
    72. If QID = nPositions(j) Then
    73. nPosIndex = j
    74. Exit For
    75. End If
    76. Next
    77. 'Alle Bytes ab dem 17. bis zum Ende des Datensatzes aus der archive.bat auslesen und als String konvertieren
    78. Dim byteString As String = ""
    79. For j = 0 To 429 - 17
    80. byteString &= Convert.ToChar(archiveBytes(i + j))
    81. Next
    82. 'Index der Id herausfinden (Index des Quellpfads im byteString + Länge des Quellpfads + 1 "\")
    83. Dim IdIndex As Integer = byteString.IndexOf(Quellpfad, StringComparison.OrdinalIgnoreCase) + Quellpfad.Length + 1
    84. 'Die Id sind dann die 8 Zeichen ab dem IdIndex
    85. Dim Id As String = byteString.Substring(IdIndex, 8)
    86. 'EML speichern
    87. DavidEmlSpeichern(Quellpfad, Dateinamen(nPosIndex), QID, Id)
    88. End If
    89. Next
    90. End Using
    91. End Using
    92. End Using
    93. End If
    94. End Sub
    Alles anzeigen

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

    Quellcode

    1. Private Sub DavidEmlSpeichern(ArchivePfad As String, Dateiname As String, ID As String, FaxID As String)
    2. Dim oApp As DavidAPIClass
    3. Dim oAcc As Account
    4. Dim oArchive As Archive
    5. Dim oMessageItems As MessageItems
    6. Dim oMailItem As MailItem
    7. oApp = New DavidAPIClass()
    8. oApp.LoginOptions = DvLoginOptions.DvLoginForceAsyncDuplicate
    9. oAcc = oApp.Logon("DavidServer", "", "", "", "", "NOAUTH")
    10. oArchive = oAcc.ArchiveFromID(ArchivePfad)
    11. If FaxID.First() = "M" Then
    12. 'Faxe beginnen mit M
    13. 'Bei Faxen kann man einfach die .001 Datei kopieren und als TIF speichern
    14. File.Copy(ArchivePfad & "\" & FaxID & ".001", "C:\Temp\" & Dateiname, True)
    15. ListeAktualisieren()
    16. ElseIf FaxID.First() = "I" Then
    17. 'Emails beginnen mit I
    18. 'Bei Emails muss man die DVEmlFromMailItem mit dem richtigen oMailItem aufrufen
    19. oMessageItems = oArchive.MailItems
    20. For Each oMailItem In oMessageItems
    21. If oMailItem._ID = ID Then
    22. Dim fileName As String = Space(260)
    23. If DVEmlFromMailItem(oMailItem, fileName) <> 0 Then
    24. fileName = Trim(fileName)
    25. fileName = fileName.Substring(0, fileName.Length - 1)
    26. File.Copy(fileName, "C:\Temp\" & Dateiname, True)
    27. ListeAktualisieren()
    28. End If
    29. Exit For
    30. End If
    31. Next
    32. End If
    33. End Sub
    Alles anzeigen

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


    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von thaenhusen () aus folgendem Grund: String Vergleich angepasst, sodass Probleme mit Groß- und Kleinschreibung verhindert wird