Da Microsoft im neuen Outlook die COM-Schnittstelle nicht mehr unterstützt, musste ich eine neue Lösung entwickeln, um E-Mails weiterhin über GuiXT an Outlook übergeben zu können.

Dazu wird nun ein VB-Programm benötigt, das über den GuiXT-Befehl CallVB aufgerufen wird.

Das zugehörige Testskript sieht wie folgt aus:

// --------------------------------------------------
// Test: Outlook-Entwurf mit mehreren Anhängen
// --------------------------------------------------
Clear text[guixtattachments]
Clear text[body]
// Liste der Anhänge aufbauen
Set V[attachment1] "C:\Temp\Test1.pdf"
Set V[attachment2] "C:\Temp\Test2.pdf"
Set V[attachment3] "C:\Temp\Test3.pdf"

CopyText fromString="attachment1" toText="guixtattachments"
CopyText fromString="attachment2" toText="guixtattachments" -appendLine
CopyText fromString="attachment3" toText="guixtattachments" -appendLine

Set V[body1] "Das ist mein neuer Langtext der endlos sein kann"
Set V[body2] "Hab ich doch gesagt, dass es klappt"

CopyText fromString="body1" toText="body"
CopyText fromString="body2" toText="body" -appendLine
// Outlook-Entwurf erstellen
CallVB Outlook_Mail.EmlBuilder.CreateDraftEml _
pfad:="&%[TMP]\GuiXT_Testmail.eml" _
empfaenger:="gerald@koehn.ch,office@koehn.ch" _
betreff:="GuiXT-Test mit mehreren Anhängen" _
textKoerper:="body" _
anhangLangtext:="guixtattachments" _
bodyformat:="TEXT" // bei HTML einfach "HTML" hier übergeben

if not Q[ok]
Message "Fehler: &V[_exception]"
endif

Dazu benötigt es eine entsprechende DLL Datei und die zugehörigen DLL’s. Diese können Sie hier runterladen.

Das entsprechende .Net Programm sieht wie folgt aus:

Imports System
Imports System.Diagnostics
Imports System.IO
Imports MimeKit

Public Class EmlBuilder

Private GuiXT As New guinet.guixt

Public Sub CreateDraftEml(
pfad As String,
empfaenger As String,
betreff As String,
textKoerper As String,
Optional anhangLangtext As String = Nothing,
Optional bodyFormat As String = "TEXT"
)

Try
' Pflichtangaben prüfen
If String.IsNullOrWhiteSpace(pfad) Then
Throw New ArgumentException(
"Es wurde kein Pfad für die EML-Datei angegeben."
)
End If

If String.IsNullOrWhiteSpace(empfaenger) Then
Throw New ArgumentException(
"Es wurde kein Empfänger angegeben."
)
End If

' Neue E-Mail erstellen
Dim message As New MimeMessage()

' Der Absender wird bei einem Outlook-Entwurf
' später durch Outlook ergänzt.
'
' Mehrere Empfänger erlauben:
' Komma oder Semikolon als Trennzeichen
Dim empfaengerListe As String =
empfaenger.Replace(";", ",")

message.To.AddRange(
InternetAddressList.Parse(empfaengerListe)
)

message.Subject = betreff

Dim builder As New BodyBuilder()

' Nachrichtentext aus GuiXT-Langtext auslesen
Dim nachrichtText As String = ""

If Not String.IsNullOrWhiteSpace(textKoerper) Then
nachrichtText = Convert.ToString(
GuiXT.GetText(textKoerper)
)
End If

' Body abhängig vom gewünschten Format setzen
Select Case If(bodyFormat, "").Trim().ToUpperInvariant()

Case "HTML"
builder.HtmlBody = nachrichtText

Case "TEXT", ""
builder.TextBody = nachrichtText

Case Else
Throw New ArgumentException(
"Ungültiges Body-Format '" &
bodyFormat &
"'. Erlaubt sind TEXT oder HTML.",
NameOf(bodyFormat)
)

End Select

' Anhänge aus dem GuiXT-Langtext übernehmen
If Not String.IsNullOrWhiteSpace(anhangLangtext) Then

Dim anhangListe As String =
Convert.ToString(
GuiXT.GetText(anhangLangtext)
)

If Not String.IsNullOrWhiteSpace(anhangListe) Then

' Windows- und andere Zeilenumbrüche berücksichtigen
Dim zeilen() As String =
anhangListe.Split(
New String() {vbCrLf, vbLf, vbCr},
StringSplitOptions.RemoveEmptyEntries
)

For Each zeile As String In zeilen

Dim anhangPfad As String = zeile.Trim()

If Not String.IsNullOrWhiteSpace(anhangPfad) Then

If File.Exists(anhangPfad) Then
builder.Attachments.Add(anhangPfad)
Else
Throw New FileNotFoundException(
"Der Anhang wurde nicht gefunden:" &
vbCrLf &
anhangPfad,
anhangPfad
)
End If

End If

Next

End If

End If

message.Body = builder.ToMessageBody()

' Outlook erkennt die EML-Datei dadurch als Entwurf
message.Headers.Add("X-Unsent", "1")

' EML-Datei speichern
message.WriteTo(pfad)

' EML-Datei mit dem zugeordneten Programm öffnen
Dim startInfo As New ProcessStartInfo()

startInfo.FileName = pfad
startInfo.UseShellExecute = True

Process.Start(startInfo)

Catch ex As Exception

MsgBox(
"EML-Datei konnte nicht erstellt werden." &
vbCrLf & vbCrLf &
ex.GetType().Name & ": " & ex.Message,
MsgBoxStyle.Critical,
"EML-Datei konnte nicht erstellt werden"
)

End Try

End Sub

End Class

Empfehlen