In diesem Kapitel wird Ihnen ein SMTP-Client vorgestellt, dessen Besonderheit darin besteht, dass Sie eine EMail nicht direkt, sondern mit dem Standard-EMail-Programm Ihres Systems verschicken. Ihr Vorteil: Die Verbindungssicherheit und die erforderliche Authentifikationsmethode stellen Sie für das genutzte EMail-Konto im Standard-EMail-Programm des Systems ein.
Das Projekt nutzt die Methode SendMail(…) der Klasse Desktop der gleichnamigen Komponente, die bereits im → Kapitel 15.1.1 beschrieben wurde.
Mit Hilfe der Methode Desktop.SendMail(..) können Sie eine EMail aufbereiten und an den Standard-EMail-Client des Systems übergeben:
SendMail(TO As String[][,CC As String[], BCC As String[], Subject As String, Body As String, Attachment As String])
Die Angabe einer (aktiven) EMail-Adresse (TO) ist zwingend notwendig. Alle weiteren Argumente sind optional. Es reicht völlig aus, wenn Sie in Ihrem Gambas-Programm die notwendigen und optionalen Parameter programm-intern bereitstellen oder die Daten mit einem Formular erfassen:
Abbildung 24.4.2.1.1: GUI: SMTP-Client Nach dem Abschicken der EMail werden die Daten an den Standard-EMail-Client des Systems übergeben. Die folgenden Hinweise beziehen sich auf den EMail-Client Thunderbird:
Das liegt m.E. daran, dass intern das Konsolen-Programm xdg-email benutzt wird, um eine EMail an den bevorzugten EMail-Client zu schicken. Im Programm xdg-email wird ein feiner Unterschied zwischen mehreren Adressen bei TO und jeweils einer Adresse bei CC und BCC gemacht.
xdg-email [--utf8] [--cc address] [--bcc address] [--subject text] [--body text ] [--attach file] [ mailto-uri | address(es) ]
Abbildung 24.4.2.1.2: Standard-EMail-Programm im System mit den übergebenen Daten
Der Quelltext scheint sehr umfangreich zu sein – aber das täuscht, weil umfangreiche Prüfungen der erfassten Argumente für die Methode Desktop.SendMail(…) sicherstellen sollen, dass nur valide Daten übergeben werden:
' Gambas class file Private sEMailAnhangPfad As String Public Sub Form_Open() SetFormPropertys End ' Form_Open() Public Sub btnAddAttachment_Click() ' Es wird nur ein Anhang akzeptiert, denn der Parameter Attachment in SendMail(...) ist vom Typ String! If lboxAttachments.Count = 1 Then lboxAttachments.Remove(0) Endif Dialog.Title = "EMail-Anhang-Auswahl-Dialog" Dialog.Path = User.Home If Dialog.OpenFile() Then Return HSplit1.Layout = [75, 25] sEMailAnhangPfad = Dialog.Path lboxAttachments.Add(" " & File.Name(sEMailAnhangPfad)) lboxAttachments.Index = lboxAttachments.Count - 1 End ' btnAddAttachment_Click() Public Sub btnEMailToDesktopClient_Click() Dim sToList, sCCList, sBCCList, sSubject, sEMailBody As String Dim sAttachment, sMessage, sEMPattern, sElement As String Dim aSendTo1, aSendCC1, aSendBCC1 As New String[] Dim aSendTo, aSendCC, aSendBCC As New String[] sEMPattern = "^[\\w-]+(?:\\.[\\w-]+)*@(?:[\\w-]+\\.)+[a-zA-Z]{2,7}$" ' Muster zur Syntax-Prüfung ' sEMPattern = "^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,7}$" ' ---------------------------------------------------------------------- ' EMail-Adressen der Empfänger festlegen (mindestens eine EMail-Adresse ) aSendTo1 = New String[] If txbTo.Text Then sToList = Replace(txbTo.Text, Chr(32), "") If InStr(sToList, ",") Then aSendTo1 = Split(sToList, ",") Else aSendTo1.Add(sToList) Endif ' InStr(sToList, ",") ? Else Message.Warning("Die EMail hat keinen Empfänger!") txbTo.SetFocus Return Endif ' txbTo.Text ? aSendTo = New String[] For Each sElement In aSendTo1 If sElement Match sEMPattern Then aSendTo.Add(sElement) Else sMessage = Message.Warning("Mindestens eine Empfänger-EMail-Adresse ist nicht korrekt!") txbTo.SetFocus Return Endif Next ' ---------------------------------------------------------------------------- ' Option: Zusätzliche EMail-Adressen der Empfänger festlegen - CC (CarbonCopy) aSendCC1 = New String[] If txbCC.Text Then sCCList = Replace(txbCC.Text, Chr(32), "") If InStr(sCCList, ",") Then aSendCC1.Add(Split(sCCList, ",")[0]) ' Nur die erste Adresse wird übernommen Else aSendCC1.Add(sCCList) Endif ' InStr(sCCList, ",") ? aSendCC = New String[] For Each sElement In aSendCC1 If sElement Match sEMPattern Then aSendCC.Add(sElement) Else sMessage = "Mindestens eine CC-Empfänger-EMail-Adresse<br>(CarbonCopy) ist nicht korrekt!" Message.Warning(sMessage) txbCC.SetFocus Return Endif Next Endif ' txbCC.Text ? ' ---------------------------------------------------------------------------------------------- ' Option: Zusätzliche, versteckte EMail-Adressen der Empfänger festlegen - BCC (BlindCarbonCopy) aSendBCC1 = New String[] If txbBCC.Text Then sBCCList = Replace(txbBCC.Text, Chr(32), "") If InStr(sBCCList, ",") Then aSendBCC1.Add(Split(sBCCList, ",")[0]) ' Nur die erste Adresse wird übernommen Else aSendBCC1.Add(sBCCList) Endif ' InStr(sBCCList, ",") For Each sElement In aSendBCC1 If sElement Match sEMPattern Then aSendBCC.Add(sElement) Else sMessage = "Mindestens eine BCC-Empfänger-EMail-Adresse<br>(BlindCarbonCopy) ist nicht korrekt!" Message.Warning(sMessage) txbBCC.SetFocus Return Endif Next Endif ' txbBCC.Text ? ' -------------------------------------------------------------------- If txbSubject.Text Then sSubject = txbSubject.Text Else Message.Warning("Die EMail hat keinen Betreff!") txbSubject.SetFocus Return Endif ' txtSubject.Text ? ' -------------------------------------------------------------------- If txaMailBody.Text Then sEMailBody = txaMailBody.Text Else Message.Warning("Die EMail enthält keine Nachricht!") txaMailBody.SetFocus Return Endif ' txaMailBody ? ' --------------------------------- sAttachment = sEMailAnhangPfad ' --------------------------------- Try Desktop.SendMail(aSendTo, aSendCC, aSendBCC, sSubject, sEMailBody, sAttachment) If Error Then sMessage = "Fehler bei der Übergabe der EMail" sMessage &= gb.NewLine & "an das Desktop-Standard-EMail-Programm!" sMessage &= gb.NewLine & "Fehler-Text: " & Error.Text Message.Error(sMessage) Endif End ' btnEMailToClient_Click() Private Sub SetFormPropertys() FMain.Center FMain.Arrangement = Arrange.Vertical FMain.Expand = False FMain.Margin = True FMain.Spacing = True FMain.Utility = True ' Container HSplit HSplit1.Layout = [100, 0] ' Man sieht nach dem Programmstart die Box für die Anhänge zunächst nicht ' Container VBox links im Container HSplit vboxLeft.Margin = True ' Fester Abstand zwischen VBox-Rand und den 4 inneren HBoxen vboxLeft.Spacing = True ' Fester Abstand zwischen den 4 inneren HBoxen hboxTo.Spacing = True ' Fester Abstand zwischen TextLabel und TextBox in der HBox (Empfänger) txlTo.W = 168 ' Feste Breite des TextLabels → Gilt für alle 4 TextLabel txlTo.Alignment = Align.Right ' Text-Ausrichtung auf dem TextLabel ist "rechts" txbTo.Expand = True ' Die Weite der Textbox passt sich dynamisch an die Container-Weite an hboxCC.Spacing = True txlCC.W = 168 txlCC.Alignment = Align.Right txbCC.Expand = True hboxBCC.Spacing = True txlBCC.W = 168 txlBCC.Alignment = Align.Right txbBCC.Expand = True hboxSubject.Spacing = True lblSubject.W = 168 lblSubject.Alignment = Align.Right txbSubject.Expand = True ' Container rechts im Container HSplit ' panAttachment ist ein Panel mit spezifischen Eigenschaftswerten (ohne Rand, Anordnung vertikal) panAttachment.Border = Border.None ' Panel ohne Rand panAttachment.Arrangement = Arrange.Vertical ' Vertikale Anordnung der 2 inneren HBoxen panAttachment.Margin = True ' Fester Abstand zwischenPanel und den zwei inneren HBoxen panAttachment.Spacing = True ' Fester (vertikaler) Abstand zwischen den zwei inneren HBoxen lblAttachment.Alignment = Align.TopLeft ' Textanzeige in der linken, oberen Ecke hboxLIstBox.Expand = True ' Maximale Ausdehnung lboxAttachments.Expand = True ' Maximale Ausdehnung lboxAttachments.ScrollBar = Scroll.Vertical lboxAttachments.Mode = Select.Single ' Steuerelement TextArea MailBody.Expand = True ' Füllt automatisch die Fläche, die HSplit und HBox (unten) frei lassen ' Container HBox unten hboxBottom.Height = 24 hboxBottom.Margin = False hboxBottom.Spacing = True panSpace.Expand = True ' Schiebt die 2 Button an den linken bzw. an den rechten Rand des Containers btnEMailToDesktopClient.Text = " EMail an das Desktop-Standard-EMail-Programm schicken" txbTo.Clear txbCC.Clear txbBCC.Clear txbSubject.Clear txaMailBody.Clear txaMailBody.Wrap = True End ' SetFormPropertys