DvAPI EML-Export unter .Net

Tags: .NET

Eigentlich sollte der Export einer DavidZehn Mail ins EML-Format dank der DvAPI kein großes Problem sein. Ein entsprechendes Beispiel gibt es sogar in der API Dokumentation:

PrivateDeclare Function DVEmlFromMailItem Lib "DvApi32" (ByVal oMailItem As DvApi32.MailItem, ByVal strFileName As String) As Long

Private Sub eMail2eml_Click()
	‘Save all MailItems entries as .eml

	Dim oApp As DvApi32.IApplication
	Dim oAccount As DvApi32.Account
	Dim oArchive As DvApi32.Archive
	Dim oMailItem As DvApi32.MailItem
	Dim oMessageItems As DvApi32.MessageItems
	Dim Filename As String
	Dim i As Integer

	Set oApp = CreateObject("DVOBJAPILib.DvISEAPI")
	Set oAccount = oApp.Logon("", "", "", "", "", "AUTH")
	Set oArchive = oAccount.GetSpecialArchive(DvApi32.DvArchiveTypes.DvArchivePersonalIn)
	Set oMessageItems = oArchive.AllItems

	For i = 0 To oMessageItems.Count – 1
		If oMessageItems.Item(i).Type = DvApi32.DvItemTypes.DvEMailItem Then
			oMailItem = oMessageItems.Item(i)
			Filename = Space(260)
			If DVEmlFromMailItem(oMailItem, Filename) <> 0 Then
				‘ In Filename are the saved EML file
				FileCopy Filename, "c:\" & oMailItem.Subject & ".eml"
			End If
		End If
	Next
End Sub

Aber leider funktioniert dieses Beispiel unter .Net nicht, denn die Funktion FileCopy wirft hier eine Exception "Illegales Zeichen im Pfad". Das Problem liegt in der Zeile "Filename = Space(260)", welche die Variable mit 260 Leerzeichen initialisiert. In diese Variable wird von der API der temporäre Filename der EML Datei geschrieben, aber die überzähligen Leerzeichen werden dabei nicht entfernt. .Net kann diese Leerzeichen nicht verarbeiten und wirft eine Exception. Auch ein Trim(Filename) hilft nicht weiter. Aber man kann den temporären Filenamen einfach zerlegen und schneidet damit alle Leerzeichen nach dem eigentlichen Filenamen ab:

For i = 0 To oMessageItems.Count – 1
	If oMessageItems.Item(i).Type = DvApi32.DvItemTypes.DvEMailItem Then
		oMailItem = oMessageItems.Item(i)
		Filename = Space(260)
		If DVEmlFromMailItem(oMailItem, Filename) <> 0 Then
			‘ In Filename are the saved EML file
			Filename = Filename.Substring(0, Filename.LastIndexOf(".tmp") + 4)

			FileCopy Filename, "c:\" & oMailItem.Subject & ".eml"
		End If
	End If
Next

Ein weiterer Lösungsansatz wäre, mit der IWshRuntimeLibrary zu arbeiten, denn der CopyFile Befehl des FileSystemObject (IWshRuntimeLibrary.FileSystemObject()) stört sich nicht an den Leerzeichen:

For i = 0 To oMessageItems.Count – 1
	If oMessageItems.Item(i).Type = DvApi32.DvItemTypes.DvEMailItem Then
		oMailItem = oMessageItems.Item(i)
		Filename = Space(260)
		If DVEmlFromMailItem(oMailItem, Filename) <> 0 Then
			Dim objFileSystemObject As New IWshRuntimeLibrary.FileSystemObject()

			‘ In Filename are the saved EML file
			objFileSystemObject.CopyFile(Filename, "c:\" & oMailItem.Subject & ".eml")
		End If
	End If
Next

3 Comments

  • Sebastian said

    Hallo,

    kannst du mir sagen, wo ich die API-Dokumentation finden kann?

    Vielen Dank im Voraus!

    Sebastian

  • nepumuk said

    Die Funktion DVEmlFromMailItem(oMailItem, Filename) schreibt den Dateinamen in Filename und füllt den Rest der Variable mit 0-Bytes auf. Für .Net Entwickler eher ungewohnt. Aber die einfaste Möglichkeit ist wohl die Überladung von Trim zu verwenden: Filename = Filename.Trim(Chr(0))

Add a Comment