Mailversand mit SMTPClient()

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

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?
Valar Morghulis

Gruss Carlo
Benutzeravatar
Muecke
1000 working lines a day
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()

Beitrag von Muecke »

Hallo Carlo

Gibt ein Assets dazu von Alaska
Vielleicht hilft dir das.
https://ilx.alaska-software.com/index.p ... e-365.84/

Gruss
Thomas
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

Hallo Thomas

die habe ich schon gefunden. Funktioniert leider nicht. Weil Beispiel-Code für GMail ist fehlerhaft.
Valar Morghulis

Gruss Carlo
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

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?
Dateianhänge
error.jpg
error.jpg (45.01 KiB) 33516 mal betrachtet
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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()

Beitrag von Tom »

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
Benutzeravatar
Jan
Marvin
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()

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
azzo
1000 working lines a day
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()

Beitrag von azzo »

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
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

@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. ....
Valar Morghulis

Gruss Carlo
Benutzeravatar
azzo
1000 working lines a day
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()

Beitrag von azzo »

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.
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

azzo hat geschrieben: Do, 27. Mär 2025 13:59 SMTP mit OAuth2 (XOAUTH2) ist sehr schwer umzusetzen und wird von Google nur noch für sehr ausgewählte Fälle unterstützt.
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
Benutzeravatar
azzo
1000 working lines a day
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()

Beitrag von azzo »

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
Benutzeravatar
Muecke
1000 working lines a day
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()

Beitrag von Muecke »

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
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

Muecke hat geschrieben: Do, 27. Mär 2025 16:51 Ich musste dies zuerst unter 365 umstellen, damit der Schlüssel auch funktioniert.
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
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

azzo hat geschrieben: Do, 27. Mär 2025 16:35 Carlo – wichtig hier – du musst deine Frage in einem neuen Beitrag stellen. Gmail API (HTTPS, OAuth2, JSON, MIME) ist ein komplett anderes Thema.
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
Benutzeravatar
azzo
1000 working lines a day
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()

Beitrag von azzo »

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
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

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
Benutzeravatar
azzo
1000 working lines a day
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()

Beitrag von azzo »

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)

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."


Benutzeravatar
Jan
Marvin
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()

Beitrag von Jan »

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

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 ....
Valar Morghulis

Gruss Carlo
Benutzeravatar
Slavko
Cut&Paste-Entwickler
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()

Beitrag von Slavko »

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.
Slavoljub Damnjanovic
SD-SoftDesign, Alaska Software Technology Partner
https://www.sd-softdesign.com
https://www.sd-softdesign.rs
Benutzeravatar
azzo
1000 working lines a day
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()

Beitrag von azzo »

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)

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
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++

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
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
Benutzeravatar
azzo
1000 working lines a day
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()

Beitrag von azzo »

Hallo Carlo,
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.
Danke.
Ich denke, für einen Autoresponder eine einfache und günstige Lösung. Danke fürs Testen.
LG
Otto
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 ....
https://winhotel-sandbox.com/docs/gmail ... rshell.pdf
ramses
Der Entwickler von "Deep Thought"
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()

Beitrag von ramses »

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 ....
Valar Morghulis

Gruss Carlo
Antworten

Zurück zu „Web“