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
