Der beschriebene SMTP-Client erweitert in unkomplizierter Weise das Projekt zur Langzeitmessung von Temperaturen im → Kapitel 13.6 TrayIcon. In diesem realen Experiment werden Temperaturen gemessen und protokolliert und sollen in diesem Projekt über SMTP als EMail verschickt werden. Auf eine aufwendige GUI kann verzichtet werden, denn das Programm zur Langzeitmessung wird in die System-Menüleiste geschickt. Dort erinnert nur ein Tray-Icon daran, dass im Hintergrund das Programm arbeitet.
Die Grundidee für das Projekt besteht darin,
Abbildung 24.4.3.1: Ausschnitt aus der Anzeige im EMail-Client Thunderbird
Hier der Quelltext, der die o.a. Idee in simulierter Form mit zufällig erzeugten Messdaten umsetzt. Eine Anpassung an reale Projekte sollte kein Problem sein:
' Gambas class file Public hSMTPClient As SMTPClient Public Sub Form_Open() FMain.Center FMain.Resizable = False TimerSend.Delay = 5000 ' 5 Sekunden für Tests TimerSend.Start RMkDir(Application.Path &/ "Logs") End ' Form_Open() Public Sub TimerSend_Timer() Dim sText, sBasisPath, sArchivPath, sLogPath As String Dim Cp As New Compress Randomize sText = gb.NewLine & "Protokoll zum Langzeit-Versuch LongTerm_TU" & gb.NewLine sText &= String$(46, "-") & gb.NewLine & gb.NewLine sText &= "Datum: " & Format(Now, "dd.mm.yyyy") & " Zeit: " & Format(Now, "hh:nn:ss") & " Uhr" sText &= gb.NewLine & "Mess-Station: Fuchsbau (52.7904° | 11.7533°)" sText &= gb.NewLine & gb.NewLine & String$(44, "-") & gb.NewLine sText &= "Temperatur = " & Str(Rand(16, 23)) & " °C" & gb.NewLine sText &= "Luftdruck = " & Str(Rand(977, 1023)) & " hPa" & gb.NewLine sText &= String$(44, "-") & gb.NewLine & gb.NewLine & gb.NewLine sText &= "Die Protokoll-Datei liegt im Anhang!" sBasisPath = Application.Path &/ "Logs" &/ Format(Now, "dd.mm.yyyy-hh:nn:ss") & "_log.txt" sLogPath = sBasisPath File.Save(sLogPath, sText) Wait sArchivPath = sBasisPath & ".gz" Cp.Type = "zlib" Cp.File(sLogPath, sArchivPath, 9) ' Kompression Wait SendProtocol(sText, sArchivPath) Kill sLogPath End ' TimerSend_Timer() Public Sub SendProtocol(EMailText As String, ArchivPath As String) Dim sMessage As String If hSMTPClient Then hSMTPClient = Null hSMTPClient = New SMTPClient ' hSMTPClient.Debug = True ' Nur für Testzwecke einschalten ' SMTP-Server hSMTPClient.Host = "smtp.server.net" ' <<--- ERSETZEN ' Port: hSMTPClient.Port = 465 ' <<--- PRÜFEN UND ERSETZEN ' Verbindungssicherheit hSMTPClient.Encrypt = Net.SSL ' <<--- PRÜFEN UND ERSETZEN ' EMail-Absender: Konto-Daten (Username und Passwort) hSMTPClient.User = "userXY" ' <<--- ERSETZEN hSMTPClient.Password = "passwordXY" ' <<--- ERSETZEN ' EMail-Absender: EMail-Adresse hSMTPClient.From = "Vorname Nachname <xyz@smtp.server.net>" ' <<--- ERSETZEN ' Liste der EMail-Empfänger hSMTPClient.To.Add("abc@freenet.de") ' <<--- ERSETZEN ' hSMTPClient.To.Add("to2@freenet.de") ' <<--- ERSETZEN ' Option: Liste zusätzlicher EMail-Empfänger (CC = CarbonCopy) ' hSMTPClient.Cc.Add("echo@tu-berlin.de") ' <<--- ERSETZEN ODER LÖSCHEN ' Option: Liste zusätzlicher, versteckter EMail-Empfänger (BCC = BlindCarbonCopy) ' hSMTPClient.Bcc.Add("echo@tu-berlin.de") ' <<--- ERSETZEN ODER LÖSCHEN ' Inhalt der Betreff-Zeile hSMTPClient.Subject = "Protokoll vom " & Format(Now, "dd.mm.yyyy hh:nn:ss") ' EMail-Text (Mime-Typ: text/plain;charset=utf-8) hSMTPClient.Body = EMailText ' Option: EMail-Anhänge ' Syntax: hSMTP.Add(Datei-Pfad, [ Mime-Typ, anzuzeigender Datei-Name ]) hSMTPClient.Add(File.Load(ArchivPath),"application/gzip",Format(Now,"dd.mm.yyyy-hh:nn:ss")&"_log.txt.gz") Try hSMTPClient.Send If Error Then sMessage = "Fehler beim Senden der EMail!" sMessage &= gb.NewLine sMessage &= Format(Now, "dd.mm.yyyy hh:nn:ss") & " Uhr" File.Save(Application.Path &/ "Logs" &/ "error.log", sMessage) Endif End ' SendProtocol() Public Sub MkFile(sFilePath As String) Dim hFile As File If Not Exist(sFilePath) Then hFile = Open sFilePath For Create Close #hFile Endif End ' MkFile(...) Public Sub RMkDir(sDirectory As String) If Not sDirectory Or If Exist(sDirectory) Then Return RMkDir(File.Dir(sDirectory)) Mkdir sDirectory End ' RMkDir(...) Public Sub Form_Close() TimerSend.Stop If hSMTPClient Then hSMTPClient = Null End ' Form_Close() Public Sub btnClose_Click() FMain.Close End ' btnClose_Click()
Hinweise:
Hier sehen Sie den Inhalt der Datei error.log bei einem (initiierten) Fehler:
Fehler beim Senden der EMail! 30.01.2016 14:56:59 Uhr
Achtung: Das Projekt nutzt nicht die originale Komponente gb.net.smtp, sondern eine vom Autor korrigierte und nun fehlerfreie Version im Projektordner. Die Komponente gb.net.smtp ist deshalb in den Projekt-Einstellungen nicht zu aktivieren! Die fehlerfreie Version steht ab Gambas 3.8.3 auch über die Gambas-Quellen zur Verfügung.