Mailversand mit SMTPClient()
Moderator: Moderatoren
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Mailversand mit SMTPClient()
Hallo
seit einigen Tagen funktioniert der Mailversand mit SMTPClient() von Xbase++ mit den bei Google gehosteten Webseiten nicht mehr.
Nachforschungen zeigen dass der lange übliche Verbindungsaufbau mit Usernamen und Passwort nicht mehr aktzepiert wird und nun einzig oAuth2.0 verwendet werden muss.
Hat schon jemand den SMTPClient() Client mit OAuth2.0 erweitert und hätte da Code Beispiele?
seit einigen Tagen funktioniert der Mailversand mit SMTPClient() von Xbase++ mit den bei Google gehosteten Webseiten nicht mehr.
Nachforschungen zeigen dass der lange übliche Verbindungsaufbau mit Usernamen und Passwort nicht mehr aktzepiert wird und nun einzig oAuth2.0 verwendet werden muss.
Hat schon jemand den SMTPClient() Client mit OAuth2.0 erweitert und hätte da Code Beispiele?
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Muecke
- 1000 working lines a day
- Beiträge: 630
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Re: Mailversand mit SMTPClient()
Hallo Carlo
Gibt ein Assets dazu von Alaska
Vielleicht hilft dir das.
https://ilx.alaska-software.com/index.p ... e-365.84/
Gruss
Thomas
Gibt ein Assets dazu von Alaska
Vielleicht hilft dir das.
https://ilx.alaska-software.com/index.p ... e-365.84/
Gruss
Thomas
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Hallo Thomas
die habe ich schon gefunden. Funktioniert leider nicht. Weil Beispiel-Code für GMail ist fehlerhaft.
die habe ich schon gefunden. Funktioniert leider nicht. Weil Beispiel-Code für GMail ist fehlerhaft.
Valar Morghulis
Gruss Carlo
Gruss Carlo
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Ich habe es mit viel Mühe geschafft in dem asset die Fehler zu beseitigen so dass es läuft um dann von Google die die unten angezeigte Fehlermeldung zu erhalten dass meine App bezw. durch die die Xbase++ Funktionen gesendete Anforderung nicht aktzeptiert wird ......
Bin ich tatsächlich der einzige der oAuth verwenden muss? Wie sendet Ihr Mail mit oAuth?
Bin ich tatsächlich der einzige der oAuth verwenden muss? Wie sendet Ihr Mail mit oAuth?
- Dateianhänge
-
- error.jpg (45.01 KiB) 33516 mal betrachtet
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9877
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 138 Mal
- Danksagung erhalten: 470 Mal
- Kontaktdaten:
Re: Mailversand mit SMTPClient()
Ich kämpfe mich gerade durch die Beispiele von Chilkat, die kommen mir einfacher vor. Wir haben als Ausweichlösung einen Node.JS-Server auf einem zu diesem Zweck extra angemieteten Azure-Server eingerichtet, der das für uns und unsere Kunden erledigt. Es betrifft ja nicht nur Mail, sondern z.B. auch das Firebase-Pushing und perspektivisch möglicherweise leider auch die Maps-Dienste.
Herzlich,
Tom
Tom
- Jan
- Marvin
- Beiträge: 14905
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 36 Mal
- Danksagung erhalten: 126 Mal
- Kontaktdaten:
Re: Mailversand mit SMTPClient()
Hallo Carlo,
das Asset gibt es ja inzwischen in der Version 1.4. Die Ergänzungen und Fehlerbereinigungen gäbe es vermutlich nicht wenn da niemand mit arbeiten würde.
Hast Du die Probleme mal an den Support gemeldet? Was sagen die denn dazu?
Jan
das Asset gibt es ja inzwischen in der Version 1.4. Die Ergänzungen und Fehlerbereinigungen gäbe es vermutlich nicht wenn da niemand mit arbeiten würde.
Hast Du die Probleme mal an den Support gemeldet? Was sagen die denn dazu?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- azzo
- 1000 working lines a day
- Beiträge: 867
- Registriert: So, 28. Mär 2010 19:21
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 21 Mal
Re: Mailversand mit SMTPClient()
Carlo, warum nutzt du nicht die Gmail API via HTTPS? Damit sparst du dir das SMTP-Problem mit OAuth2. Ich hab’s unter FW so umgesetzt – funktioniert bestens. LG Otto
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
@Jan
Ich nutze schon 1.4 Version. Nein, ich habe nichts dem Support gemeldet, noch nicht ..... Weil es eilt ....
@Azzo
Die letzten Jahre hat das Mail versenden auch problelos funktioniert. Nur jetzt ist nur noch oAuth möglich.
@Tom
Da bin ich zum Glück nicht der einzige. Ich wundere mich nur dass Alaska dazu nichts Zeitgemässes bietet um auch mit oAuth umzugehen. ....
Ich nutze schon 1.4 Version. Nein, ich habe nichts dem Support gemeldet, noch nicht ..... Weil es eilt ....
@Azzo
Die letzten Jahre hat das Mail versenden auch problelos funktioniert. Nur jetzt ist nur noch oAuth möglich.
@Tom
Da bin ich zum Glück nicht der einzige. Ich wundere mich nur dass Alaska dazu nichts Zeitgemässes bietet um auch mit oAuth umzugehen. ....
Valar Morghulis
Gruss Carlo
Gruss Carlo
- azzo
- 1000 working lines a day
- Beiträge: 867
- Registriert: So, 28. Mär 2010 19:21
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 21 Mal
Re: Mailversand mit SMTPClient()
Beim E-Mail-Versand mit Google/Gmail wird die Gmail API über HTTPS empfohlen.
SMTP mit OAuth2 (XOAUTH2) ist sehr schwer umzusetzen und wird von Google nur noch für sehr ausgewählte Fälle unterstützt.
SMTP mit OAuth2 (XOAUTH2) ist sehr schwer umzusetzen und wird von Google nur noch für sehr ausgewählte Fälle unterstützt.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Da hast du allerdings recht. Das sehe ich in den Dokumenten von Google die ich inzwischen gefunden habe jetzt auch so ....
Wie soll das API über HTTPS funktionieren?
Valar Morghulis
Gruss Carlo
Gruss Carlo
- azzo
- 1000 working lines a day
- Beiträge: 867
- Registriert: So, 28. Mär 2010 19:21
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 21 Mal
Re: Mailversand mit SMTPClient()
Carlo – wichtig hier – du musst deine Frage in einem neuen Beitrag stellen. Gmail API (HTTPS, OAuth2, JSON, MIME) ist ein komplett anderes Thema.
LG
Otto
LG
Otto
- Muecke
- 1000 working lines a day
- Beiträge: 630
- Registriert: Di, 24. Okt 2006 7:19
- Wohnort: Samstagern CH
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
- Kontaktdaten:
Re: Mailversand mit SMTPClient()
Hallo Carlo
Ich musste dies zuerst unter 365 umstellen, damit der Schlüssel auch funktioniert.
Mit dem Link den du oben hast, ist doch alles erklärt
Schöne Grüsse
Thomas
Ich musste dies zuerst unter 365 umstellen, damit der Schlüssel auch funktioniert.
Mit dem Link den du oben hast, ist doch alles erklärt
Schöne Grüsse
Thomas
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Thomas, die Accounts die ich benutzen muss sind bei Google, nicht bei Microsoft's 365....
Die Beispiele unter deinem Link, habe hinbekommen dass kein Fehler mehr kommt, dann weisst Google jedoch das Login ab weil die App nicht von Google zertifiziert ist .....
Valar Morghulis
Gruss Carlo
Gruss Carlo
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Otto, es geht ja drum die Mails mit dem SMTPClient() zu versenden .... Google schreibt ja dass dies mit SMTP und oAuth geht. Nur wie?
Hast du denn eine Lösung die funktioniert?
Valar Morghulis
Gruss Carlo
Gruss Carlo
- azzo
- 1000 working lines a day
- Beiträge: 867
- Registriert: So, 28. Mär 2010 19:21
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 21 Mal
Re: Mailversand mit SMTPClient()
Carlo, da hast du meine Antwort falsch verstanden. Ich mache es mit Gmail API (HTTPS, OAuth2, JSON, MIME). Ich denke nicht, dass man es mit vertretbarem Aufwand mit SMTPClient() hinbekommt. Am einfachsten wäre es mit PowerShell, wenn du das verwenden darfst. LG Otto
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Ich habe eine Mail-Sende Funktion die in einem Windows Dienst die Mails unbeaufsichtigt versendet. Von da her sollte es keine Shell Funktion sein da keine Benutzereingaben möglich sind .....
Valar Morghulis
Gruss Carlo
Gruss Carlo
- azzo
- 1000 working lines a day
- Beiträge: 867
- Registriert: So, 28. Mär 2010 19:21
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 21 Mal
Re: Mailversand mit SMTPClient()
Hallo Carlo,
ich habe gerade gelesen, dass es mit App-Passwort-Methode und PowerShell auch mit SMTP-Skripten weiterhin funktionieren soll.
Wenn du nur Mails versenden willst, das Ganze auf einem eigenen PC oder Server nutzt und deine Anwendung nicht an Google-APIs hängt.
Vielleicht kannst du das kurz ausprobieren? Danke.
LG
Otto
Lösung mit App-Passwort
Schritt 1: Aktiviere 2FA bei deinem Google-Konto
Geh auf: https://myaccount.google.com/security
Aktiviere die 2-Stufen-Verifizierung
Schritt 2: Erzeuge ein App-Passwort
Nach der 2FA-Aktivierung, geh auf:
https://myaccount.google.com/apppasswords
Melde dich an.
Wähle App: Mail und Gerät: Windows-Computer
Google zeigt dir ein 16-stelliges Passwort – kopiere es. (z. B. abcd efgh ijkl mnop)
ich habe gerade gelesen, dass es mit App-Passwort-Methode und PowerShell auch mit SMTP-Skripten weiterhin funktionieren soll.
Wenn du nur Mails versenden willst, das Ganze auf einem eigenen PC oder Server nutzt und deine Anwendung nicht an Google-APIs hängt.
Vielleicht kannst du das kurz ausprobieren? Danke.
LG
Otto
Lösung mit App-Passwort
Schritt 1: Aktiviere 2FA bei deinem Google-Konto
Geh auf: https://myaccount.google.com/security
Aktiviere die 2-Stufen-Verifizierung
Schritt 2: Erzeuge ein App-Passwort
Nach der 2FA-Aktivierung, geh auf:
Melde dich an.
Wähle App: Mail und Gerät: Windows-Computer
Google zeigt dir ein 16-stelliges Passwort – kopiere es. (z. B. abcd efgh ijkl mnop)
Code: Alles auswählen
$smtpServer = "smtp.gmail.com"
$smtpPort = 587
$gmailUser = "otto@gmail.com"
$gmailPass = "abcdefghijklmnop" # ← hier das App-Passwort einfügen (ohne Leerzeichen!)
$from = "otto@gmail.com"
$to = "zieladresse@example.com"
$subject = "Test von PowerShell"
$body = "Hallo! Dies ist eine Testmail, gesendet über PowerShell und Gmail."
$message = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body
$smtp = New-Object Net.Mail.SmtpClient($smtpServer, $smtpPort)
$smtp.EnableSsl = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($gmailUser, $gmailPass)
$smtp.Send($message)
Write-Host "E-Mail wurde erfolgreich gesendet."
- Jan
- Marvin
- Beiträge: 14905
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 36 Mal
- Danksagung erhalten: 126 Mal
- Kontaktdaten:
Re: Mailversand mit SMTPClient()
Carlo,
was ich gerade gefunden habe: Du musst in der Google-Mailadresse die 2-Faktor-Authentifizierung aktivieren. Und Dir danach ein App-Passwort holen. Das muß dann beim Mailversand eingetragen werden, nicht das eigentliche Passwort.
Ich habe das bei mir aber nicht geschafft, das App-Passwort gibt es lt. Google-Hilfetext nicht bei Firmenkonten, 2-Faktor mit eingerichtetem Sicherheitsschlüssel, oder bei aktivierter erweiterter Sicherheit. Auf mich trifft wohl der erste Punkt zu. Wie ich damit weiter kommen könnte ist unklar, da lässt Google sich nicht weiter zu aus.
Vielleicht hilft Dir das ja weiter ...
Jan
was ich gerade gefunden habe: Du musst in der Google-Mailadresse die 2-Faktor-Authentifizierung aktivieren. Und Dir danach ein App-Passwort holen. Das muß dann beim Mailversand eingetragen werden, nicht das eigentliche Passwort.
Ich habe das bei mir aber nicht geschafft, das App-Passwort gibt es lt. Google-Hilfetext nicht bei Firmenkonten, 2-Faktor mit eingerichtetem Sicherheitsschlüssel, oder bei aktivierter erweiterter Sicherheit. Auf mich trifft wohl der erste Punkt zu. Wie ich damit weiter kommen könnte ist unklar, da lässt Google sich nicht weiter zu aus.
Vielleicht hilft Dir das ja weiter ...
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Danke an Otto und Jan
es ist genau so wie Ihr schreibt. So wie Otto beschrieben hat kann ein App-Passwort bezogen werden mit dem dann der Mailversand auch mit dem SMTPClient() einwandfrei funktionert. Jedoch nur mit einem Privaten Account.
Mit dem Firmen Account ist die möglichkeit nicht vorhanden. Da ist offenbar nur die problembehaftete Anmeldung mit oAuth möglich ....
Ich hoffe irgendwo einen Menschen ans Telefon zu bekommen und versuche noch weitere Infos zu finden ....
es ist genau so wie Ihr schreibt. So wie Otto beschrieben hat kann ein App-Passwort bezogen werden mit dem dann der Mailversand auch mit dem SMTPClient() einwandfrei funktionert. Jedoch nur mit einem Privaten Account.
Mit dem Firmen Account ist die möglichkeit nicht vorhanden. Da ist offenbar nur die problembehaftete Anmeldung mit oAuth möglich ....
Ich hoffe irgendwo einen Menschen ans Telefon zu bekommen und versuche noch weitere Infos zu finden ....
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Slavko
- Cut&Paste-Entwickler
- Beiträge: 40
- Registriert: Mi, 20. Dez 2023 11:03
- Wohnort: Negotin
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 7 Mal
- Kontaktdaten:
Re: Mailversand mit SMTPClient()
Jan,
Ja, das stimmt, ich verwende diese Methode seit Jahren. Sie benötigen ein spezielles App-Passwort, das von GMail für Ihr Konto generiert wird, und verwenden dieses Passwort für Ihre SMTP-Verbindung anstelle Ihres üblichen Passworts. Dieses Passwort dient dazu, sich von Ihrer externen App aus mit GMail zu verbinden. Sobald GMail es erkennt, ermöglicht es Ihnen die SMTP-Verbindung. Sie müssen eine SMTP-Verbindung über Port 465 herstellen und die Authentifizierung mit dem PLAIN-Typ verwenden. Verwenden Sie dazu Ihren E-Mail-Benutzernamen und Ihr GMail-App-Passwort und verwenden Sie keinen OAUTH-Authentifizierungstyp. Ich verwende diese Methode seit langem mit meiner PowerNet-Bibliothek und meinem SMTP-Client und sie funktioniert einwandfrei.
Zu Ihrer Information: Die gleiche Methode wird auch in Yahoo Mail verwendet. Tatsächlich war es Yahoo, das diese Methode vor langer Zeit als erstes implementiert hat, und Google hat sie später übernommen.
Ja, das stimmt, ich verwende diese Methode seit Jahren. Sie benötigen ein spezielles App-Passwort, das von GMail für Ihr Konto generiert wird, und verwenden dieses Passwort für Ihre SMTP-Verbindung anstelle Ihres üblichen Passworts. Dieses Passwort dient dazu, sich von Ihrer externen App aus mit GMail zu verbinden. Sobald GMail es erkennt, ermöglicht es Ihnen die SMTP-Verbindung. Sie müssen eine SMTP-Verbindung über Port 465 herstellen und die Authentifizierung mit dem PLAIN-Typ verwenden. Verwenden Sie dazu Ihren E-Mail-Benutzernamen und Ihr GMail-App-Passwort und verwenden Sie keinen OAUTH-Authentifizierungstyp. Ich verwende diese Methode seit langem mit meiner PowerNet-Bibliothek und meinem SMTP-Client und sie funktioniert einwandfrei.
Zu Ihrer Information: Die gleiche Methode wird auch in Yahoo Mail verwendet. Tatsächlich war es Yahoo, das diese Methode vor langer Zeit als erstes implementiert hat, und Google hat sie später übernommen.
Slavoljub Damnjanovic
SD-SoftDesign, Alaska Software Technology Partner
https://www.sd-softdesign.com
https://www.sd-softdesign.rs
SD-SoftDesign, Alaska Software Technology Partner
https://www.sd-softdesign.com
https://www.sd-softdesign.rs
- azzo
- 1000 working lines a day
- Beiträge: 867
- Registriert: So, 28. Mär 2010 19:21
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 21 Mal
Re: Mailversand mit SMTPClient()
Hallo Carlo,
ich habe mir gestern noch eine Anleitung mit KI-Hilfe für OAuth2 über HTTPS erstellt. Ich denke, eine gute Anleitung, und die müsste auch passen. Ich habe auch mit meiner FW-Lösung verglichen.
https://winhotel-sandbox.com/docs/gmail ... rshell.pdf
Ich denke, direkt aus Xbase ist es aufwendig: Kein JsonParse(), kein Base64Encode(), kein HttpPost(), kein einfacher WebView oder OAuth-Dialog.
Ich habe die Klasse die ich in FIVEWIN verwende in Funktionen umändern lassen: hier das Ergebnis (nicht getestet)
To-Do vor dem Ausführen:
In Google Cloud Console:
Gmail API aktivieren
OAuth2-Client anlegen
Redirect-URL http://localhost eintragen
CLIENT_ID & CLIENT_SECRET ins Programm eintragen
curl.exe ins Projektverzeichnis legen oder über %PATH% verfügbar machen.
Sollte das auch in Xbase++ funktionieren.
ChatGPT:
Gute Frage – die Antwort ist: „Mit kleinen Anpassungen: Ja, im Prinzip funktioniert es auch in Xbase++“, aber es gibt ein paar wichtige Unterschiede, auf die du achten musst.
Was funktioniert in Xbase++ problemlos:
curl.exe verwenden
Ja, das ist perfekt für Xbase++ – du brauchst keine HTTP-Bibliothek.
RUN oder WaitForProcess() funktioniert.
Du kannst über Textdateien (MEMOWRIT() / MEMOREAD() / FOpen() etc.) alles sauber einlesen.
Was du in Xbase++ anpassen musst:
HB_BASE64ENCODE() → ersetzen
HB_-Funktionen gibt’s nur in Harbour.
Du brauchst eine eigene Base64-Funktion oder nutzt z. B. die freie C-Library von René Nyffenegger, eingebunden als DLL oder als .prg-Code.
Alternativ: Base64 per curl.exe oder PowerShell kodieren lassen (wenn du’s clever baust).
JsonParse() → ersetzen
Xbase++ hat keinen eingebauten JSON-Parser.
Lösung:
Du kannst JSON als String analysieren mit AT(), SUBSTR() etc. (Quick & Dirty)
Oder du nutzt die Free JSON Library for Xbase++ (JsonObject/JsonArray)
Oder: Nutze curl.exe nur für Token und sende Mail mit einem kleinen Node.js-Helfer oder Proxy-API (wie im Forum erwähnt).
MEMOWRIT() / MEMOREAD() → in Xbase++ durch FWrite() / FRead() oder MemoWrit()/MemoRead()
In Xbase++ sind MemoWrit() und MemoRead() oft noch verfügbar, aber manchmal musst du eigene File-I/O verwenden.
Achte auf die richtige Textcodierung (UTF-8!), sonst meckert Google.
Rückgabe von RUN() → nicht immer direkt lesbar
Xbase++ unterscheidet zwischen RUN, WaitForProcess(), ShellExecute(), CreateProcess().
Wenn du keine direkte Rückgabe bekommst, speichere das Ergebnis immer über:
RUN /N "curl ... > result.txt"
Beispiel-Anpassung: Token holen unter Xbase++
Ja, dein Harbour/FiveWin-Beispiel mit curl.exe ist mit kleinen Anpassungen auch in Xbase++ machbar:
Kein SMTP mehr nötig
Kein HTTP-Modul nötig
Nur Text-Handling & curl.exe
Ich würde aber PowerShell nehmen – auch kannst du dann die Lösung mit PHP weiternutzen.
Warum PowerShell?
PowerShell ist wie ein „Super-curl.exe mit eingebautem JSON, Base64 und HTTP“. Damit kannst du:
HTTP-POST-Requests senden
JSON direkt parsen
Base64 einfach kodieren
Dateien anhängen
OAuth2-Flows umsetzen
… und das alles ohne externe Tools.
Self-contained PowerShell-Tool als .exe
Das bedeutet:
Du wandelst dein .ps1-Skript in eine eigenständig ausführbare .exe-Datei um.
Die EXE kann wie ein normales Windows-Programm doppelt geklickt oder per Autostart/Taskplaner ausgeführt werden.
Nutzer brauchen kein PowerShell-Fenster, keinen Editor, keine Konsole.
SICHERHEIT – Vergleiche mit dem Forumsbeitrag –
https://www.xbaseforum.de/viewtopic.php ... 27#p150027
Nur eine Frage: Kannst du dir nicht einfach ein zusätzliches kostenloses Gmail-Konto öffnen?
Nochmals:
Bei der .exe-Version brauchst du PowerShell nicht explizit freischalten
Du brauchst keine Änderung der ExecutionPolicy, kein Set-ExecutionPolicy, kein Admin-Recht.
https://winhotel-sandbox.com/docs/gmail ... rshell.pdf
LG
Otto
ich habe mir gestern noch eine Anleitung mit KI-Hilfe für OAuth2 über HTTPS erstellt. Ich denke, eine gute Anleitung, und die müsste auch passen. Ich habe auch mit meiner FW-Lösung verglichen.
https://winhotel-sandbox.com/docs/gmail ... rshell.pdf
Ich denke, direkt aus Xbase ist es aufwendig: Kein JsonParse(), kein Base64Encode(), kein HttpPost(), kein einfacher WebView oder OAuth-Dialog.
Ich habe die Klasse die ich in FIVEWIN verwende in Funktionen umändern lassen: hier das Ergebnis (nicht getestet)
Code: Alles auswählen
// ================================================
// GMail Mailversand über OAuth2 + curl.exe (ohne Klasse)
// Autor: ChatGPT für [Dich]
// Datum: 2025-03-27
// ================================================
// ----------------------------------------
// Konfiguration – bitte hier anpassen!
// ----------------------------------------
#DEFINE CLIENT_ID "DEINE_CLIENT_ID"
#DEFINE CLIENT_SECRET "DEIN_CLIENT_SECRET"
#DEFINE REDIRECT_URI "http://localhost" // Muss mit Google Console übereinstimmen!
// ----------------------------------------
// Hauptprogramm
// ----------------------------------------
PROCEDURE Main()
LOCAL cAuthUrl, cCode, cToken, lSuccess
// Schritt 1: Autorisierungs-URL anzeigen
cAuthUrl := BuildAuthUrl()
MsgInfo( "1. Öffne folgenden Link im Browser und logge dich ein:" + CRLF + cAuthUrl )
// Schritt 2: Benutzer gibt Autorisierungscode ein (von Google nach Login)
cCode := InputBox( "Google Code", "2. Bitte den Code hier eingeben:" )
// Schritt 3: Token mit curl holen
cToken := GetAccessTokenCurl( cCode )
// Schritt 4: Token prüfen und E-Mail senden
IF !Empty( cToken )
lSuccess := SendEmailCurl( cToken, "OAuth2-Mail", "Hallo! Diese E-Mail wurde per API gesendet.", "empfaenger@example.com" )
IF lSuccess
MsgInfo( "Mail erfolgreich gesendet!" )
ELSE
MsgError( "Mailversand fehlgeschlagen." )
ENDIF
ELSE
MsgError( "Zugangstoken konnte nicht geholt werden." )
ENDIF
RETURN
// ----------------------------------------
// Funktion: OAuth2-URL erzeugen
// ----------------------------------------
FUNCTION BuildAuthUrl()
RETURN ;
"https://accounts.google.com/o/oauth2/v2/auth?" + ;
"scope=https://www.googleapis.com/auth/gmail.send" + ;
"&response_type=code" + ;
"&redirect_uri=" + REDIRECT_URI + ;
"&client_id=" + CLIENT_ID
// ----------------------------------------
// Funktion: Access Token mit curl holen
// ----------------------------------------
FUNCTION GetAccessTokenCurl( cCode )
LOCAL cCommand, cJson, oJson
// curl-Kommandozeile für Token-Anforderung
cCommand := ;
'curl -s -X POST https://oauth2.googleapis.com/token ' + ;
'-d "code=' + cCode + ;
'&client_id=' + CLIENT_ID + ;
'&client_secret=' + CLIENT_SECRET + ;
'&redirect_uri=' + REDIRECT_URI + ;
'&grant_type=authorization_code"'
// Antwort als JSON laden
cJson := GetShellOutput( cCommand )
// JSON auswerten
oJson := JsonParse( cJson )
// Access Token extrahieren
IF ValType( oJson ) == "H"
RETURN oJson["access_token"]
ENDIF
RETURN ""
// ----------------------------------------
// Funktion: E-Mail über Gmail API senden
// ----------------------------------------
FUNCTION SendEmailCurl( cToken, cSubject, cBody, cTo )
LOCAL cRaw, cEncoded, cJson, cFile := "payload.json"
LOCAL cCmd, nResult
// MIME-Rohformat der E-Mail erzeugen
cRaw := ;
"From: me\r\n" + ;
"To: " + cTo + "\r\n" + ;
"Subject: " + cSubject + "\r\n" + ;
"Content-Type: text/plain; charset=UTF-8\r\n\r\n" + ;
cBody
// MIME in base64-url konvertieren
cEncoded := Base64Encode( cRaw )
cEncoded := StrTran( cEncoded, "+", "-" )
cEncoded := StrTran( cEncoded, "/", "_" )
cEncoded := RTrim( cEncoded, "=" )
// JSON-Body bauen
cJson := '{"raw": "' + cEncoded + '"}'
// JSON-Datei temporär speichern (curl kann damit arbeiten)
MEMOWRIT( cFile, cJson )
// curl-Aufruf zur Gmail API
cCmd := ;
'curl -s -o nul -w "%{http_code}" -X POST ' + ;
'https://gmail.googleapis.com/gmail/v1/users/me/messages/send ' + ;
'-H "Authorization: Bearer ' + cToken + '" ' + ;
'-H "Content-Type: application/json" ' + ;
'--data @' + cFile
// curl liefert HTTP-Statuscode zurück
nResult := Val( GetShellOutput( cCmd ) )
// Aufräumen
FERASE( cFile )
// Erfolg bei HTTP 2xx
RETURN nResult >= 200 .AND. nResult < 300
// ----------------------------------------
// Funktion: Konsolenausgabe von curl einlesen
// ----------------------------------------
FUNCTION GetShellOutput( cCommand )
LOCAL cTemp := "__temp_output.txt"
// Führt den Befehl aus und speichert Ausgabe in Datei
RUN ( cCommand + " > " + cTemp )
// Inhalt lesen und zurückgeben
RETURN MemoRead( cTemp )
// ----------------------------------------
// Funktion: Base64-Encodierung mit Harbour
// ----------------------------------------
FUNCTION Base64Encode( cText )
RETURN HB_BASE64ENCODE( cText )
// ----------------------------------------
// Funktion: Rechts abschneiden von Zeichen
// (z. B. '=' bei Base64 entfernen)
// ----------------------------------------
FUNCTION RTrim( cStr, cChar )
DO WHILE Right( cStr, 1 ) == cChar
cStr := Left( cStr, Len( cStr ) - 1 )
ENDDO
RETURN cStr
In Google Cloud Console:
Gmail API aktivieren
OAuth2-Client anlegen
Redirect-URL http://localhost eintragen
CLIENT_ID & CLIENT_SECRET ins Programm eintragen
curl.exe ins Projektverzeichnis legen oder über %PATH% verfügbar machen.
Sollte das auch in Xbase++ funktionieren.
ChatGPT:
Gute Frage – die Antwort ist: „Mit kleinen Anpassungen: Ja, im Prinzip funktioniert es auch in Xbase++“, aber es gibt ein paar wichtige Unterschiede, auf die du achten musst.
Ja, das ist perfekt für Xbase++ – du brauchst keine HTTP-Bibliothek.
RUN oder WaitForProcess() funktioniert.
Du kannst über Textdateien (MEMOWRIT() / MEMOREAD() / FOpen() etc.) alles sauber einlesen.
HB_-Funktionen gibt’s nur in Harbour.
Du brauchst eine eigene Base64-Funktion oder nutzt z. B. die freie C-Library von René Nyffenegger, eingebunden als DLL oder als .prg-Code.
Alternativ: Base64 per curl.exe oder PowerShell kodieren lassen (wenn du’s clever baust).
Xbase++ hat keinen eingebauten JSON-Parser.
Lösung:
Du kannst JSON als String analysieren mit AT(), SUBSTR() etc. (Quick & Dirty)
Oder du nutzt die Free JSON Library for Xbase++ (JsonObject/JsonArray)
Oder: Nutze curl.exe nur für Token und sende Mail mit einem kleinen Node.js-Helfer oder Proxy-API (wie im Forum erwähnt).
In Xbase++ sind MemoWrit() und MemoRead() oft noch verfügbar, aber manchmal musst du eigene File-I/O verwenden.
Achte auf die richtige Textcodierung (UTF-8!), sonst meckert Google.
Xbase++ unterscheidet zwischen RUN, WaitForProcess(), ShellExecute(), CreateProcess().
Wenn du keine direkte Rückgabe bekommst, speichere das Ergebnis immer über:
RUN /N "curl ... > result.txt"
Code: Alles auswählen
FUNCTION GetAccessTokenCurl( cCode )
LOCAL cCommand, cJson, cToken := ""
cCommand := ;
'curl -s -X POST https://oauth2.googleapis.com/token ' + ;
'-d "code=' + cCode + ;
'&client_id=' + CLIENT_ID + ;
'&client_secret=' + CLIENT_SECRET + ;
'&redirect_uri=' + REDIRECT_URI + ;
'&grant_type=authorization_code" > token.txt'
RUN ( cCommand )
IF FILE( "token.txt" )
cJson := MemoRead( "token.txt" )
// Beispiel: einfachen JSON-Wert extrahieren
IF AT( '"access_token":', cJson ) > 0
cToken := SubStr( cJson, AT( '"access_token":', cJson ) + 16 )
cToken := SubStr( cToken, 1, AT( '"', cToken ) - 1 )
ENDIF
ERASE "token.txt"
ENDIF
RETURN cToken
Kein SMTP mehr nötig
Kein HTTP-Modul nötig
Nur Text-Handling & curl.exe
Ich würde aber PowerShell nehmen – auch kannst du dann die Lösung mit PHP weiternutzen.
Warum PowerShell?
PowerShell ist wie ein „Super-curl.exe mit eingebautem JSON, Base64 und HTTP“. Damit kannst du:
HTTP-POST-Requests senden
JSON direkt parsen
Base64 einfach kodieren
Dateien anhängen
OAuth2-Flows umsetzen
… und das alles ohne externe Tools.
Self-contained PowerShell-Tool als .exe
Das bedeutet:
Du wandelst dein .ps1-Skript in eine eigenständig ausführbare .exe-Datei um.
Die EXE kann wie ein normales Windows-Programm doppelt geklickt oder per Autostart/Taskplaner ausgeführt werden.
Nutzer brauchen kein PowerShell-Fenster, keinen Editor, keine Konsole.
SICHERHEIT – Vergleiche mit dem Forumsbeitrag –
https://www.xbaseforum.de/viewtopic.php ... 27#p150027
Nur eine Frage: Kannst du dir nicht einfach ein zusätzliches kostenloses Gmail-Konto öffnen?
Nochmals:
Bei der .exe-Version brauchst du PowerShell nicht explizit freischalten
Du brauchst keine Änderung der ExecutionPolicy, kein Set-ExecutionPolicy, kein Admin-Recht.
https://winhotel-sandbox.com/docs/gmail ... rshell.pdf
LG
Otto
- azzo
- 1000 working lines a day
- Beiträge: 867
- Registriert: So, 28. Mär 2010 19:21
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 21 Mal
Re: Mailversand mit SMTPClient()
Hallo Carlo,
Ich denke, für einen Autoresponder eine einfache und günstige Lösung. Danke fürs Testen.
LG
Otto
Danke.Es ist genau so, wie ihr schreibt. So wie Otto beschrieben hat, kann ein App-Passwort bezogen werden, mit dem dann der Mailversand auch mit dem SMTPClient() einwandfrei funktioniert. Jedoch nur mit einem privaten Account.
Ich denke, für einen Autoresponder eine einfache und günstige Lösung. Danke fürs Testen.
LG
Otto
https://winhotel-sandbox.com/docs/gmail ... rshell.pdfMit dem Firmen Account ist die möglichkeit nicht vorhanden. Da ist offenbar nur die problembehaftete Anmeldung mit oAuth möglich ....
Ich hoffe irgendwo einen Menschen ans Telefon zu bekommen und versuche noch weitere Infos zu finden ....
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2604
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 23 Mal
- Danksagung erhalten: 92 Mal
Re: Mailversand mit SMTPClient()
Wir haben das Problem heute gelöst.
Wir wechseln übers WE den Hosting Provider. Der neue Provider hat was wir brauchen, hat wie hier alle lokalen Provider, persönlichen Technischen Support und wir bezahlen einen lokalen Service Provider ....
Wir wechseln übers WE den Hosting Provider. Der neue Provider hat was wir brauchen, hat wie hier alle lokalen Provider, persönlichen Technischen Support und wir bezahlen einen lokalen Service Provider ....
Valar Morghulis
Gruss Carlo
Gruss Carlo