Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Problem mit Email-Versand Indy (https://www.delphipraxis.net/196356-problem-mit-email-versand-indy.html)

Marco Steinebach 15. Mai 2018 14:55

Problem mit Email-Versand Indy
 
Hallo zusammen,
Seit heute habe ich die neueste Indy (5459) installiert.
Ich wollte eigentlich nur, und das erstmal unverschlüsselt, Emails versenden.
Allerdings kriege ich eine Schutzverletzung.

Code:
unit Main;
{SSL ist zwar schon da, aber noch auskommentiert.}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  idSmtp, idMessage, idSSLOpenSSL, StdCtrls;

type
  TForm1 = class(TForm)
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    smtp: TIdSmtp;
    SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  idGlobal, idExplicitTLSClientServerBase,
  idAttachmentFile, idUserPassProvider,
  IdSASL_CRAM_MD5, IdSASL_CRAM_SHA1, idSASLPlain,
  idSASLLogin, idSASLSKey, idSASLOTP, idSASLAnonymous,
  idSASLExternal;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  IdUserPassProvider: TIdUserPassProvider;
  IdSASLCRAMMD5: TIdSASLCRAMMD5;
  IdSASLCRAMSHA1: TIdSASLCRAMSHA1;
  IdSASLPlain: TIdSASLPlain;
  IdSASLLogin: TIdSASLLogin;
  IdSASLSKey: TIdSASLSKey;
  IdSASLOTP: TIdSASLOTP;
  IdSASLAnonymous: TIdSASLAnonymous;
  IdSASLExternal: TIdSASLExternal;
begin
  smtp := TIdSmtp.Create (Application);
(*
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(smtp);
  SSLHandler.MaxLineAction := maException;
  SSLHandler.SSLOptions.Method := sslvSSLV23;
  SSLHandler.SSLOptions.Mode := sslmClient;
  SSLHandler.SSLOptions.VerifyMode := [];
  SSLHandler.SSLOptions.VerifyDepth := 0;

  smtp.IOHandler := SSLHandler;

  IdUserPassProvider := TIdUserPassProvider.Create(SMTP);
  IdUserPassProvider.Username := 'web454p1';
  IdUserPassProvider.Password := 'LittleJamy16';
  IdSASLCRAMSHA1 := TIdSASLCRAMSHA1.Create(SMTP);
  IdSASLCRAMSHA1.UserPassProvider := IdUserPassProvider;
  IdSASLCRAMMD5 := TIdSASLCRAMMD5.Create(SMTP);
  IdSASLCRAMMD5.UserPassProvider := IdUserPassProvider;
  IdSASLSKey := TIdSASLSKey.Create(SMTP);
  IdSASLSKey.UserPassProvider := IdUserPassProvider;
  IdSASLOTP := TIdSASLOTP.Create(SMTP);
  IdSASLOTP.UserPassProvider := IdUserPassProvider;
  IdSASLAnonymous := TIdSASLAnonymous.Create(SMTP);
  IdSASLExternal := TIdSASLExternal.Create(SMTP);
  IdSASLLogin := TIdSASLLogin.Create(SMTP);
  IdSASLLogin.UserPassProvider := IdUserPassProvider;
  IdSASLPlain := TIdSASLPlain.Create(SMTP);
  IdSASLPlain.UserPassProvider := IdUserPassProvider;

  SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMSHA1;
  SMTP.SASLMechanisms.Add.SASL := IdSASLCRAMMD5;
  SMTP.SASLMechanisms.Add.SASL := IdSASLSKey;
  SMTP.SASLMechanisms.Add.SASL := IdSASLOTP;
  SMTP.SASLMechanisms.Add.SASL := IdSASLAnonymous;
  SMTP.SASLMechanisms.Add.SASL := IdSASLExternal;
  SMTP.SASLMechanisms.Add.SASL := IdSASLLogin;
  SMTP.SASLMechanisms.Add.SASL := IdSASLPlain;
*)
  smtp.host := 'webbox222.server-home.org';
  smtp.port := 25; //587;
  smtp.username := 'Bla';
  smtp.password := 'Bla';
  smtp.authtype := satDefault; // satSASL
//  smtp.UseTLS := utUseImplicitTLS;
  smtp.connect;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  m: TIdMessage;
begin
  m := TIdMessage.create (Application);
  m.clear;
  m.from.name := 'Marco';
  m.from.address := 'info@l-becker.de';
  M.Recipients.EMailAddresses := 'mo@stonesbrook-ranch.de';
  m.subject := 'Testmail';
  m.body.text := 'This is a very great test mail!';
//  if fDateiname <> '' then
//    TIdAttachmentFile.Create (m.MessageParts, fDateiname);
  if smtp.connected then
    smtp.send (m);
  m.free;
end;

end.
Es knallt beim smtp.send (m).
Hab ich was falsch gemacht, oder woran könnte es sonst liegen?

Herzliche Grüße
Marco

TiGü 15. Mai 2018 15:04

AW: Problem mit Email-Versand Indy
 
Knallt heißt genau was?

Marco Steinebach 15. Mai 2018 15:53

AW: Problem mit Email-Versand Indy
 
knallt heißt:
Schutzverletzung 04bb-bla lesen von Adresse 044 usw.

Marco Steinebach 15. Mai 2018 16:20

AW: Problem mit Email-Versand Indy
 
Ich bin ein bißchen weiter.
in
Code:
procedure TIdSMTP.InternalSend(AMsg: TIdMessage; const AFrom: String; ARecipients: TIdEMailAddressList);
wird
Code:
  AMsg.ExtraHeaders.Values[XMAILER_HEADER] := MailAgent;
aufgerufen und Mailagent ist
inaccessible
sagt mein Delphi...

Irgendwelche Ideen...

Viele Grüße
Marco

Hobbycoder 15. Mai 2018 17:10

AW: Problem mit Email-Versand Indy
 
Also zum einen würde ich das smtp.connect nicht schon im FormCreate machen.
Dafür könntest du dir eine function (z.B. ConnectSMTP) anlegen, in der auch alle Werte, die jetzt im FormCreate stehen, gesetzt werden.
Mir fallen nur sehr wenige Fälle ein, in denen es Sinn machen würde die SMTP-Verbindung während der ganzen Programmlaufzeit aufrecht zu halten. (Von den Problemen mal ganz abgesehen, wenn den Provider die zwischendurch kappt).

Diese Funktion sollte dann als Rückgabewert ein Boolean zurückgeben, je nachdem ob connected werden konnte oder nicht.

Zum anderen würde ich TIdMessage nicht mit Owner Application erzeugen.

Und die ButtonClick-Routine sollte dann so aussehen:

Delphi-Quellcode:
procedure ButtonClick(Sender: TObject);
var
  m: TIdMessage;
begin
  if connectSMTP then
  Try
    m:=TIdMessage.Create(nil);  //mit nil als Owner erzeugen.
    .
    .
    .
    SMTP.send(m);
  finally
    SMTP.disconnect; //oder SMTP.Connected:=false; das weiß ich jetzt aus dem Kopf nicht.
    m.free;
  end;
end;
Das hilft dir jetzt zwar nicht bei deinem Problem, ist aber sinnvoller.

Marco Steinebach 15. Mai 2018 17:27

AW: Problem mit Email-Versand Indy
 
Hi Hobbycoder,
;-) stimmt natürlich. Das Zeugs stammt aus einem weitaus größeren Projekt, wo ich das genauso mache, wie du es vorgeschlagen hast. Das hier ist nur die quick-and-dirty-version, um den Laufzeitfehler zu finden.
Viele Grüße
Marco

Hobbycoder 15. Mai 2018 17:48

AW: Problem mit Email-Versand Indy
 
Zitat:

Zitat von Marco Steinebach (Beitrag 1402193)
Hi Hobbycoder,
;-) stimmt natürlich. Das Zeugs stammt aus einem weitaus größeren Projekt, wo ich das genauso mache, wie du es vorgeschlagen hast. Das hier ist nur die quick-and-dirty-version, um den Laufzeitfehler zu finden.
Viele Grüße
Marco

Quick-And-Dirty macht einem aber gerade die Fehlersuche manchmal etwas schwer, bzw. man baut sich damit gerne neue Fehler ein.

Marco Steinebach 16. Mai 2018 11:02

AW: Problem mit Email-Versand Indy
 
Hallo zusammen,
falls nochmal jemand darüber fällt...
Es gibt einen Bug in D5, das overload-Prozeduren mit offenen Array-Parametern eine Schutzverletzung verursachen. Als Workarround mit abgeschalteter Optimierung und eingeschalteten Stackframes kompilieren, dann läuft's.
Ja, ja, ;-) oder auf eine vernünftige Delphi-Version wechseln, wenn man die nur mit Screenreadern bedienen könnte...

Herzliche Grüße
Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz