![]() |
SMTP über Strato
Moin,
bisher habe ich Emails immer über einen eigenen Mailserver verschickt - jetzt würde ich das gerne aber direkt bei Strato machen. Mit folgender function hatte das bisher geklappt:
Delphi-Quellcode:
Wobei es mit:
function TMailForm.SendeMail(MailEmpfaenger, CCListe, Betreff, Anhang :string; Body :TStringList; MailAbsender, MailPasswort, MailServer: String; MailPort: Integer) : boolean;
var iAttachment : TIdAttachment; Erfolg: Boolean; begin (* Connect mit Server *) MailForm.IdSMTP1.AuthType := satDefault; // simpler Login ohne Authentifizierung MailForm.IdSMTP1.Host := MailServer; MailForm.IdSMTP1.Port := MailPort; MailForm.IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL -> Port dann in aller Regel 587 MailForm.IdSMTP1.Username := MailAbsender; // Benutzername MailForm.IdSMTP1.Password := MailPasswort; // Passwort // Verbinden mit Server try MailForm.IdSMTP1.Connect; except on E: Exception do begin result := false; Application.MessageBox (PChar(E.Message),'Verbindungsfehler Connect !',MB_OK); MailForm.IdSMTP1.Disconnect; exit; end; end; (* Mail erstellen *) MailForm.IdMessage1.ContentType := 'multipart/*'; // mit Anhang! iAttachment := TIdAttachmentFile.Create(MailForm.IdMessage1.MessageParts, Anhang) ; MailForm.IdMessage1.Body.Assign(Body); // der eigentliche eMail -Text aus einem TMemo MailForm.IdMessage1.Priority := TIdMessagePriority(2); // Priorität MailForm.IdMessage1.Recipients.EMailAddresses := MailEmpfaenger; // Empfängeradresse MailForm.IdMessage1.ReplyTo.EMailAddresses := MailAbsender; // Anwortadresse MailForm.IdMessage1.From.Text := MailAbsender; // Absenderadresse MailForm.IdMessage1.Subject := Betreff; try MailForm.IdSMTP1.Send(MailForm.IdMessage1); except on E: Exception do begin result := false; Application.MessageBox (PChar(E.Message),'Verbindungsfehler Versand !',MB_OK); MailForm.IdSMTP1.Disconnect; exit; end; end; result := true; MailForm.IdSMTP1.Disconnect; end; MailAbsender = h.bothur@beispiel.de MailPasswort = 123456789ABC MailServer = 192.168.20.5 MailPort = 465 MailEmpfaenger=hans@beispiel.de immer - wenn man im entsprechendem Netzwerk war - funktioniert hat. Wenn ich es jetzt aber direkt bei Strato versuchen will: MailAbsender = h.bothur@beispiel.de MailPasswort = 123456789ABC MailServer = smtp.strato.de MailPort = 465 MailEmpfaenger=hans@beispiel.de dann bekomme ich bei
Delphi-Quellcode:
eine Fehlermeldung:
MailForm.IdSMTP1.Send(MailForm.IdMessage1);
Im Projekt MailVersand.exe ist eine Exception der Klasse EidOSSLUnderlyingCryptoError mit der Meldung "Fehler beim erbinden mit SSL. error: 1409442E:SSL3_READ_BYTES:tlsv 1 alert protocol version" aufgetreten. Delphi ist Embarcadero® Delphi 10.4 Version 27.0.40680.4203 ssleay32.dll und libeay32.dll liegen im Programmverzeichnis. Kann mir das jemand erklären was ich da falsch mache ? Gruss Hans |
AW: SMTP über Strato
ohne SSL wird es wohl bei Strato nicht funktionieren.
procedure TfeMailKonto.bTestClick(Sender: TObject); var smtp : TIdSMTP; Msg: TIdMessage; begin screen.Cursor := crHourGlass; smtp := TIdSMTP.Create(nil); msg := TIdMessage.Create(); try try Msg.From.Address:= eEmail.Text; Msg.Recipients.EMailAddresses:= eEmail.Text; Msg.Subject := 'Test eMail'; Msg.ReceiptRecipient.Text := eEmail.Text; if eBCC.Text <> '' then Msg.BCCList.Add.Text := eBCC.Text; with TIdText.Create(msg.MessageParts) do begin Body.Add('Test eMail'); ContentType := 'text/html; charset=utf-8;'; end; // with SMTP.Host:= eSMTP.Text; SMTP.Username:= eKontoname.Text; SMTP.Password := ePasswort.Text; SMTP.Port := strtoint(eSMTPPort.Text); SMTP.IOHandler := indySSL; SMTP.USETLS := TIdUseTLS(cbTLS.ItemIndex); SMTP.ConnectTimeout := 1000; try SMTP.Connect(); SMTP.Authenticate; SMTP.Send(Msg); showMessage('eMail erfolgreich versendet'); finally SMTP.Disconnect; end; // try except on E: Exception do showMessage(E.Message); end; // try finally msg.Free; smtp.Free; screen.Cursor := crDefault; end; // try end; |
AW: SMTP über Strato
Das hilft jetzt nicht, weil du auf mehrere Bezeichner deiner Form zugreifst, die der TE nicht hat.
Eigentlich musst du nur deinen TIdSSLIOHandlerSocketOpenSSL erstellen, Protokoll auf TLS 1.2 stellen und den IOHandler zuweisen. UseTLS allein reicht nicht. |
AW: SMTP über Strato
Sorry - vielleicht hätte ich das gleich schreiben sollen:
ich habe auf der Form: IdMessage1 IdSMTP1 IOHandlerSocketOpenSSL1 IOHandlerSocketOpenSSL1.Method = sslvTLSv1_2 Damit habe ich doch schon SSL auf die V1.2 gestellt . denn zu min. lt. Website müsste das bei Strato reichen. Oder muss ich in IdSMTP1.UseTLS auch noch was einstellen _OBWOHL_ ich den IOHändler auf IOHandlerSocketOpenSSL1 gesetzt habe ? Gruss Hans |
AW: SMTP über Strato
Zitat:
Das könnte die Fehlermeldung erklären, wenn die zum Beispiel bereits durch vorher gestartete Prozesse geladen werden. In Indy gibt es m.W. eine Methode mit der sich Informationen zur aktiven OpenSSL DLL ermitteln lassen. |
AW: SMTP über Strato
Zitat:
im Office16\odbc-Verzeichns im Embarcader/Studio(21-Verzeichnis im AusweisApp2-Verzeichnis ... und und und Und natürlich alle mit unterschiedlichen Daten. Wie kann man denn feststellen weklche Version geladen worden ist ? Gruss Hans |
AW: SMTP über Strato
Zitat:
|
AW: SMTP über Strato
Zitat:
Und wie ermittle ich den die Version ? gruss Hans |
AW: SMTP über Strato
Delphi-Quellcode:
unit CheckOpenSSLUnit;
interface uses WinApi.Windows, System.SysUtils, vcl.Dialogs; procedure CheckOpenSSL; implementation procedure CheckOpenSSL; var ssleay32, libeay32: HMODULE; ModulePath: array[0..MAX_PATH] of Char; VerInfoSize: Cardinal; VerInfo: Pointer; VerValueSize: Cardinal; VerValue: PVSFixedFileInfo; sPathSsleay32: string; sPathLibeay32: string; sVerInfoSsleay32: String; sVerInfoLibeay32: String; Dummy: Cardinal; begin ssleay32 := LoadLibrary('ssleay32.dll'); if ssleay32 <> 0 then begin Dummy := ssleay32; GetModuleFileName(ssleay32, ModulePath, length(ModulePath)); sPathSsleay32 := String(ModulePath); //-- VerInfoSize := GetFileVersionInfoSize(PChar(sPathSsleay32), Dummy); GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(sPathSsleay32), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); sVerInfoSsleay32 := 'Version '+IntToStr(VerValue^.dwFileVersionMS shr 16); sVerInfoSsleay32 := sVerInfoSsleay32 + '.' + IntToStr(VerValue^.dwFileVersionMS and $FFFF); sVerInfoSsleay32 := sVerInfoSsleay32 + '.' + IntToStr(VerValue^.dwFileVersionLS shr 16); sVerInfoSsleay32 := sVerInfoSsleay32 + '.' + IntToStr(VerValue^.dwFileVersionLS and $FFFF); end; libeay32 := LoadLibrary('libeay32.dll'); if libeay32 <> 0 then begin Dummy := libeay32; GetModuleFileName(libeay32, ModulePath, length(ModulePath)); sPathLibeay32 := String(ModulePath); //-- VerInfoSize := GetFileVersionInfoSize(PChar(sPathLibeay32), Dummy); GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(sPathLibeay32), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); sVerInfoLibeay32 := 'Version '+IntToStr(VerValue^.dwFileVersionMS shr 16); sVerInfoLibeay32 := sVerInfoLibeay32 + '.' + IntToStr(VerValue^.dwFileVersionMS and $FFFF); sVerInfoLibeay32 := sVerInfoLibeay32 + '.' + IntToStr(VerValue^.dwFileVersionLS shr 16); sVerInfoLibeay32 := sVerInfoLibeay32 + '.' + IntToStr(VerValue^.dwFileVersionLS and $FFFF); end; Showmessage(sPathSsleay32+' - '+sVerInfoSsleay32+#10+sPathLibeay32+' - '+sVerInfoLibeay32); end; end. |
AW: SMTP über Strato
Zitat:
aus dem richtigen Verzeichnis (Programmverzeichnis) Und Version ist 1.0.2.21 Und wie komme ich jetzt weiter ? Hans |
AW: SMTP über Strato
Aus
![]()
Delphi-Quellcode:
Das könnte hier helfen, um die aktuell verwendete Version von OpenSSL zu ermitteln.
{$IFDEF ANDROID}
IdOpenSSLSetLibPath(String.Empty); IdSSLOpenSSLHeaders.Load(); error:=IdSSLOpenSSLHeaders.WhichFailedToLoad(); if (length(error)>0) then begin IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetLibraryPath)); IdSSLOpenSSLHeaders.Load(); error:=IdSSLOpenSSLHeaders.WhichFailedToLoad(); if (length(error)>0) then begin IdOpenSSLSetLibPath(IncludeTrailingPathDelimiter(TPath.GetDocumentsPath)); IdSSLOpenSSLHeaders.Load(); log.d('SSL-Version(3): '+OpenSSLVersion); error:=IdSSLOpenSSLHeaders.WhichFailedToLoad(); if (length(error)>0) then begin log.d('SSL-Errors: '+error); end; end else begin log.d('SSL-Version(2): '+OpenSSLVersion); end; end else begin log.d('SSL-Version(1): '+OpenSSLVersion); end; {$ENDIF} Die Funktion OpenSSLVersion ist in der Indy-Unit Protocols/IdSSLOpenSSL enthalten. |
AW: SMTP über Strato
Also wenn die Firewall für den Port frei ist und es die 32Bit oder 64Bit DLL ist dann sollte es gehen. Verlangt Strato 1.2 TLS?
|
AW: SMTP über Strato
Zitat:
![]() |
AW: SMTP über Strato
So wird es bei uns gemacht:
Delphi-Quellcode:
function SendSMTP(ESMTP:TSMTP;Von,An,CC,BCC,Body,ContentType:String):Boolean;
var I,J : Integer; RS,TS : TStringList; begin RESULT:=False; TS:=TStringList.Create; RS:=TStringList.Create; try IdMessage.ContentType:=ContentType; IdMessage.CCList.Clear; IdMessage.From.Address:=Von; TS.CommaText:=CC; For I:=0 to TS.Count-1 do begin IdMessage.CCList.Add.Address:=TS.Strings[i]; end; IdMessage.BccList.Clear; TS.CommaText:=BCC; For I:=0 to TS.Count-1 do begin IdMessage.BccList.Add.Address:=TS.Strings[i]; end; IdMessage.Recipients.Clear; RS.CommaText:=An; For J:=0 to RS.Count-1 do begin IdMessage.Recipients.Add.Address:=RS.Strings[J]; end; IDMessage.Body.Text:=Body; //-- IdSmtp.Host := ESMTP.Host; IdSmtp.Username := ESMTP.User; IdSmtp.Password := ESMTP.Passwort; IdSmtp.Port := ESMTP.Port; case ESMTP.Authen of 0: IdSmtp.AuthType := satDefault; 1: IdSmtp.AuthType := satNone; 2: IdSmtp.AuthType := satSASL; else end; //-- IdSmtp.Connect; IdSmtp.Send(IdMessage); RESULT:=True; Finally IdSmtp.Disconnect; FreeAndNil(TS); FreeAndNil(RS); end; end; |
AW: SMTP über Strato
Zitat:
Allerdings gibt es eine Exception "Die Verbindung wurde erfolgreich geschlossen" nach dem Versand der Mail:
Delphi-Quellcode:
Aber warum in drei Teufels Namen ... und wie verhindere ich das diese Exception angezeigt wird ?
try
MailForm.IdSMTP1.Send(MailForm.IdMessage1); except on E: Exception do begin result := false; Application.MessageBox (PChar(E.Message),'Verbindungsfehler Versand !',MB_OK); MailForm.IdSMTP1.Disconnect; exit; end; end; Hans |
AW: SMTP über Strato
Zitat:
Delphi-Quellcode:
except
on EIdSilentException do begin end; on E: Exception do begin result := false; Application.MessageBox (PChar(E.Message),'Verbindungsfehler Versand !',MB_OK); MailForm.IdSMTP1.Disconnect; exit; end; end; |
AW: SMTP über Strato
Zu Post 1.
Wer innerhalb einer Klasse (TMailForm) auf die "vermeintlich" richtige globale Variable (MailForm) zugreift, der gehört irgendwann mal dafür vollkommen zu Recht bestraft. -> Weglassen (sowas macht man niemals nicht) oder Self benutzen. Ja, nicht alle Exceptions will man sehen/ausgeben. Vor allem kein EAbort und Nachfahren, sowie andere "Silent"-Exceptions. Wer kennt es nicht, das berühmte "Vorgang erfolgreich beended" aka S_OK, NOERROR, bzw. Fehlercode 0. Wenn möglich diese Exceptions anhand des Types ausschließen, und falls sonst nichts hilft, dann (fehleranfällig) versuchen es über die Exception.Message zu machen. (scheitert z.B. gern, wenn andere Sprache eingestellt) Einige Exception-Klassen haben auch noch Zusatzinfos, wie z.B. einen nummerischen ErrorCode, welcher einfacher/sicherer vergleichbar ist, als wie die Message. |
AW: SMTP über Strato
Moin,
Zitat:
Das habe ich jetzt so versucht:
Delphi-Quellcode:
Da sagt der Compiler aber E2003: Undeklarierter Bezeichner :-( Ich bin mir sicher das ich irgendeine Unit noch einbinden muss damit ich das so abfangen kann - aber welche ?
try
IdSMTP1.Send(IdMessage1); except (* Wenn Verbindung erfolgreich geschlossen dann nix machen *) on EIdConnClosedGracefully do begin end; on E: Exception do begin Gruss Hans |
AW: SMTP über Strato
Der Kompiler sagt Dir bestimmt auch, welcher Bezeichner nicht gefunden wurde. Dann den Namen davon nehmen und bei der Suchmaschine Deiner Wahl eingeben.
Vermutlich handelt es sich hier um EIdSilentException. Ergibt bei der Suche mit der Suchmaschine meiner Wahl im ersten Ergebnis den entsprechenden Hinweis: ![]() |
AW: SMTP über Strato
Hallo,
evtl. hilft's das 'MailForm.IdSMTP1.Disconnect;' im Try Except Block wegzulassen bzw. das Ereignis IdSMTP1Disconnected(Sender: TObject); der Komponente anzupassen. Wäre jetzt aber ein einfach ärgerlicher Fehler. Gruß |
AW: SMTP über Strato
Macht Strato eigentlich immernoch sowas, wo man erst Mails abrufen muß, bevor man Mails versenden darf?
|
AW: SMTP über Strato
Zitat:
on E1: EIdConnClosedGracefully do begin end; Grüße TurboMagic |
AW: SMTP über Strato
Wenn man die Variable nicht verwenden will, sondern das ON nur als Filter benutzt, dann muß sie nicht angegeben werden.
Genauso, wie man das leere
Delphi-Quellcode:
weglassen könnte.
begin end
Kann sein, dass man es doch angeben muß und ich mich täusche, aber der Fehler klingt mehr so, als wenn die Unit fehlt, wo das EIdConnClosedGracefully her kommt. (falls es diese Zeile ist, weil wurde ja nicht gesagt wo der Fehler meckert) |
AW: SMTP über Strato
Zitat:
![]() Laut Hinweis am Seitenende wird diese Liste noch gepflegt ("Zuletzt aktualisiert: 14.08.2022"). Anscheinend wird "POP3 vor SMTP" fast nirgendwo mehr unterstützt, einziger Eintrag bei GMX: Zitat:
|
AW: SMTP über Strato
Zitat:
Gruss + vielen Dank ! Hans |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz