AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)
Thema durchsuchen
Ansicht
Themen-Optionen

Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

Ein Thema von Rene2 · begonnen am 26. Jul 2014 · letzter Beitrag vom 5. Jun 2024
Antwort Antwort
Rene2

Registriert seit: 26. Nov 2007
15 Beiträge
 
#1

Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 26. Jul 2014, 16:13
Ich möchte aus einer App heraus eine Email versenden. Die App soll universell auf Windows, Android und iOS Geräten einsetzbar sein. Mit dem untenstehenden Code läuft alles super unter Windows und Android. Leider stürzt die App bei iOS einfach ab. Der code ist als universell einsetzbare Klasse geschrieben, so dass er für den einen oder anderen nutzbar sein könnte. Daher poste ich hier mal die ganze Unit. Es wäre super, wenn jemand wüsste was man tun muss, um es unter iOS zum Laufen zu bringen.
Der code basiert auf einem Vorschlag von: Remy Lebeau (TeamB): https://forums.embarcadero.com/messa...ssageID=526373 :

Delphi-Quellcode:
unit UnitSendEmail;

interface

uses
  IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
  IdMessageClient, IdSMTPBase, IdSMTP, IdBaseComponent, IdMessage, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin,
  IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5,
  IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest,
  IdSASLAnonymous, IdUserPassProvider, System.Classes;

type
  TSSLEmail = class
    constructor Create;
    destructor Destroy; override;
  private
    { Private declarations }
  public
    { Public declarations }
    edSMTPServer: string;
    edSMTPPort: integer;
    edUserName: string;
    edPassword: string;
    edSSLConnection: boolean;
    edSenderEmail: string;
    edSenderName: string;
    edToEmail: string;
    edCCEmail: string;
    edBCCEmail: string;
    edSubject: string;
    edPriority: TIdMessagePriority;
    edBody: TStrings;
    Procedure Init;
    procedure SendEmail;
  end;

Var
  SSLEmail1: TSSLEmail;

implementation

constructor TSSLEmail.Create;
begin
  inherited;
  edBody := TStringList.Create;
end;

destructor TSSLEmail.Destroy;
begin
  edBody.Free;
  inherited;
end;

procedure TSSLEmail.Init;
begin
    edSMTPServer := '';
    edSMTPPort := 0;
    edUserName := '';
    edPassword := '';
    edSSLConnection := True;
    edSenderEmail := '';
    edSenderName := '';
    edToEmail := '';
    edCCEmail := '';
    edBCCEmail := '';
    edSubject := '';
    edPriority := TIdMessagePriority.mpNormal;
    edBody.Clear;
end;

procedure TSSLEmail.SendEmail;
var
  IdMessage: TIdMessage; // enthält Eigenschaften der Email
  SMTP: TIdSMTP; // enthält Eigenschaften des SMTP Servers
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL; // alles weitere ist für die SSL Verschlüsselung
  IdUserPassProvider: TIdUserPassProvider;
  IdSASLCRAMMD5: TIdSASLCRAMMD5;
  IdSASLCRAMSHA1: TIdSASLCRAMSHA1;
  IdSASLPlain: TIdSASLPlain;
  IdSASLLogin: TIdSASLLogin;
  IdSASLSKey: TIdSASLSKey;
  IdSASLOTP: TIdSASLOTP;
  IdSASLAnonymous: TIdSASLAnonymous;
  IdSASLExternal: TIdSASLExternal;
begin
  IdMessage := TIdMessage.Create(nil);
  try
    // Eigenschaften der email setzen
    IdMessage.ContentType := 'text/plain';
    IdMessage.Charset := 'UTF-8';
    IdMessage.Body.Assign(edBody);
    IdMessage.Sender.Text := edSenderEMail;
    IdMessage.From.Name := edSenderName;
    IdMessage.From.Address := edSenderEMail;
    IdMessage.ReplyTo.EMailAddresses := edSenderEmail;
    IdMessage.Recipients.EMailAddresses := edToEmail;
    IdMessage.Subject := edSubject;
    IdMessage.Priority := edPriority;
    IdMessage.CCList.EMailAddresses := edCCEMail;
    IdMessage.ReceiptRecipient.Text := '';
    IdMessage.BccList.EMailAddresses := edBCCEMail;

    SMTP := TIdSMTP.Create(nil);
    try
      if edSSLConnection then begin
        SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
        // SSLHandler.MaxLineAction := maException;
        SSLHandler.SSLOptions.Method := sslvSSLv23; // SSL/TLS handshake determines the highest available SSL/TLS version dynamically
        SSLHandler.SSLOptions.Mode := sslmClient;
        SSLHandler.SSLOptions.VerifyMode := [];
        SSLHandler.SSLOptions.VerifyDepth := 0;
        SMTP.IOHandler := SSLHandler;
        if edSMTPPort=587 then
          SMTP.UseTLS := utUseExplicitTLS
        else
          SMTP.UseTLS := utUseImplicitTLS; // ImplicitTLS insbesondere auch bei Port 465
      end;

      if (edUserName<>'') or (edPassword<>'') then begin
        SMTP.AuthType := satSASL;

        // Username und Passwort verschlüsselt bereitstellen
        IdUserPassProvider := TIdUserPassProvider.Create(SMTP);
        IdUserPassProvider.Username := edUserName;
        IdUserPassProvider.Password:= edPassword;

        // SASL-Komponenten für SSL Verschlüsselung
        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;
      end else begin
        SMTP.AuthType := satNone;
      end;

      // Verbindung zum Server herstellen und email senden
      SMTP.Host := edSMTPServer;
      SMTP.Port := edSMTPPort;
      SMTP.ConnectTimeout := 30000;
      SMTP.UseEHLO := True;
      SMTP.Connect; // verbinden
      try
        SMTP.Send(IdMessage); // senden
      finally
        SMTP.Disconnect; // Verbindung lösen
      end;
    finally
      SMTP.Free;
    end;
  finally
    IdMessage.Free;
  end;
end;

end.
Die Unit kann man z.B. wie folgt benutzen:

Delphi-Quellcode:
procedure THeaderFooterForm.Button1Click(Sender: TObject);
begin
  if Edit1.Text<>'then begin
    With SSLEmail1 do begin
      // Konkrete Daten dieser Email
      edSenderName := 'Mein Name'; // Name, der als Absender erscheint
      edSenderEmail := 'Username@gmail.com'; // Meine Emailadresse, von der ich sende;
      edToEmail := Edit1.Text;
      edCCEmail := '';
      edBCCEmail := '';
      edSubject := Edit2.Text;
      edBody := Memo1.Lines;
      SendEmail; // Email absenden
      Edit1.Text:='';
      Edit2.Text:='';
      Memo1.SelectAll;
      Memo1.DeleteSelection;
    end;
  end;
end;

procedure THeaderFooterForm.FormCreate(Sender: TObject);
begin
  SSLEmail1 := TSSLEmail.Create;
  // Serverdaten und Verbindungseigenschaften festlegen
  With SSLEmail1 do begin
    Init;
    edSMTPServer := 'smtp.googlemail.com'; // SMTP Server hier das Beispiel von Google-Mail
    edSMTPPort := 465; // Port auf dem Server
    edSSLConnection := True; // SSL Verbindung verwenden
    edUserName := 'Username@gmail.com'; // Mein Username von dem ich die Mail sende
    edPassword := 'Passwort'; // Mein Passwort dazu
  end;
end;
Unter iOS tritt der Fehler in der Zeile "SMTP.Connect;" auf. Das Fenster geht einfach zu und nichts passiert. Unter Windos und Android wird die mail wie gewünscht verschickt. Es wäre super, wenn ihr mir helfen könntet, den code auch unter iOS zum Laufen zu bringen.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 27. Jul 2014, 10:56
iOS habe ich leider nicht, aber einen "Absturz" auf Windows am Programmende konnte ich durch Freigabe des TSSLEmail Objekts nach dem Senden der Mail erreichen. Ursache ist die fehlerhafte Zuweisung des Body Textes, hier muss Assign verwendet werden.

Weitere kleine Änderungen: Units die im Interface nicht benötigt werden habe ich in implementation verschoben, Create(nil) durch Create ersetzt und die implizite published Sichtbarkeit des Konstruktors und Destruktors auf public geändert.

Delphi-Quellcode:
unit IndySecureMailClient;

interface

uses
  IdMessage, Classes;

type
  TSSLEmail = class(TObject)
  private
    FedBody: TStrings;
    procedure SetBody(const Value: TStrings);
  public
    edSMTPServer: string;
    edSMTPPort: integer;
    edUserName: string;
    edPassword: string;
    edSSLConnection: boolean;
    edSenderEmail: string;
    edSenderName: string;
    edToEmail: string;
    edCCEmail: string;
    edBCCEmail: string;
    edSubject: string;
    edPriority: TIdMessagePriority;

    constructor Create;
    destructor Destroy; override;

    procedure Init;
    procedure SendEmail;

    property edBody: TStrings read FedBody write SetBody;
  end;

implementation

uses
  IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
  IdMessageClient, IdSMTPBase, IdSMTP, IdBaseComponent, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin,
  IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5,
  IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest,
  IdSASLAnonymous, IdUserPassProvider;

constructor TSSLEmail.Create;
begin
  inherited;
  FedBody := TStringList.Create;
end;

destructor TSSLEmail.Destroy;
begin
  edBody.Free;
  inherited;
end;

procedure TSSLEmail.SetBody(const Value: TStrings);
begin
  FedBody.Assign(Value);
end;

procedure TSSLEmail.Init;
begin
  edSMTPServer := '';
  edSMTPPort := 0;
  edUserName := '';
  edPassword := '';
  edSSLConnection := True;
  edSenderEmail := '';
  edSenderName := '';
  edToEmail := '';
  edCCEmail := '';
  edBCCEmail := '';
  edSubject := '';
  edPriority := TIdMessagePriority.mpNormal;
  edBody.Clear;
end;

procedure TSSLEmail.SendEmail;
var
  IdMessage: TIdMessage; // enthält Eigenschaften der Email
  SMTP: TIdSMTP; // enthält Eigenschaften des SMTP Servers
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL; // alles weitere ist für die SSL Verschlüsselung
  IdUserPassProvider: TIdUserPassProvider;
  IdSASLCRAMMD5: TIdSASLCRAMMD5;
  IdSASLCRAMSHA1: TIdSASLCRAMSHA1;
  IdSASLPlain: TIdSASLPlain;
  IdSASLLogin: TIdSASLLogin;
  IdSASLSKey: TIdSASLSKey;
  IdSASLOTP: TIdSASLOTP;
  IdSASLAnonymous: TIdSASLAnonymous;
  IdSASLExternal: TIdSASLExternal;
begin
  IdMessage := TIdMessage.Create;
  try
    // Eigenschaften der email setzen
    IdMessage.ContentType := 'text/plain';
    IdMessage.Charset := 'UTF-8';
    IdMessage.Body.Assign(edBody);
    IdMessage.Sender.Text := edSenderEMail;
    IdMessage.From.Name := edSenderName;
    IdMessage.From.Address := edSenderEMail;
    IdMessage.ReplyTo.EMailAddresses := edSenderEmail;
    IdMessage.Recipients.EMailAddresses := edToEmail;
    IdMessage.Subject := edSubject;
    IdMessage.Priority := edPriority;
    IdMessage.CCList.EMailAddresses := edCCEMail;
    IdMessage.ReceiptRecipient.Text := '';
    IdMessage.BccList.EMailAddresses := edBCCEMail;

    SMTP := TIdSMTP.Create;
    try
      if edSSLConnection then
      begin
        SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
        SSLHandler.SSLOptions.Method := sslvSSLv23; // SSL/TLS handshake determines the highest available SSL/TLS version dynamically
        SSLHandler.SSLOptions.Mode := sslmClient;
        SSLHandler.SSLOptions.VerifyMode := [];
        SSLHandler.SSLOptions.VerifyDepth := 0;
        SMTP.IOHandler := SSLHandler;
        if edSMTPPort = 587 then
          SMTP.UseTLS := utUseExplicitTLS
        else
          SMTP.UseTLS := utUseImplicitTLS; // ImplicitTLS insbesondere auch bei Port 465
      end;

      if (edUserName<>'') or (edPassword<>'') then
      begin
        SMTP.AuthType := satSASL;

        // Username und Passwort verschlüsselt bereitstellen
        IdUserPassProvider := TIdUserPassProvider.Create(SMTP);
        IdUserPassProvider.Username := edUserName;
        IdUserPassProvider.Password:= edPassword;

        // SASL-Komponenten für SSL Verschlüsselung
        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;
      end else begin
        SMTP.AuthType := satNone;
      end;

      SMTP.Host := edSMTPServer;
      SMTP.Port := edSMTPPort;
      SMTP.ConnectTimeout := 30000;
      SMTP.UseEHLO := True;
      SMTP.Connect;
      try
        SMTP.Send(IdMessage);
      finally
        SMTP.Disconnect;
      end;
    finally
      SMTP.Free;
    end;
  finally
    IdMessage.Free;
  end;
end;

end.
Michael Justin

Geändert von mjustin (27. Jul 2014 um 12:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 27. Jul 2014, 11:11
Das generelle Problem liegt wohl bei der OpenSSL-Bibliothek.

Siehe dazu http://blog.marcocantu.com/blog/usin...elphi_ios.html

BTW: Der Code ist echt grausam, da läuft es mir kalt den Rücken runter
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Rene2

Registriert seit: 26. Nov 2007
15 Beiträge
 
#4

AW: Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 27. Jul 2014, 13:47
Ihr seid großartig! Es funktioniert jetzt mit iOS.

Man muss folgendes im code ergänzen: In der Uses-Liste einfügen: IdSSLOpenSSLHeaders_Static und die zugehörigen Files (libcrypto.a und libssl.a) downloaden, wie in dem oben genannten Artikel beschrieben. Ich habe sie von folgender Seite heruntergeladen: http://indy.fulgan.com/SSL/OpenSSLStaticLibs.7z und dann in den Ordner mit meinem Quellcode abgelegt.

Wie von Michael empfohlen, habe ich auch noch im Hauptprogramm die Zuweisung des Body-Textes geändert in: edBody.Assign(Memo1.Lines); und die Unit verwendet, wie er sie gepostet hat.

Herzlichen Dank nochmal!
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 4. Jun 2024, 18:30
Hallo Zusammen,

dieses Thema ist zwar schon sehr alt, hat mir aber trotzdem sehr geholfen. Ich habe die Unit um HTML und Anhänge erweitert und die Zugangsdaten in eine *.ini Datei gepackt. Daher poste ich die Unit hier trotzdem noch einmal...

Delphi-Quellcode:
unit TSendMail;

interface

uses
   IdMessage, Classes;

type
   TSSLEmail = class(TObject)
   private
      FedBody: TStrings;
      FedAttachments: TStrings;
      procedure SetBody(const Value: TStrings);
      procedure SetedAttachments(const Value: TStrings);
   public
      edSMTPServer: string;
      edSMTPPort: integer;
      edUserName: string;
      edPassword: string;
      edSSLConnection: boolean;
      edSenderEmail: string;
      edSenderName: string;
      edToEmail: string;
      edCCEmail: string;
      edBCCEmail: string;
      edSubject: string;
      edPriority: TIdMessagePriority;
      edIsBodyHTML: boolean;

      constructor Create;
      destructor Destroy; override;

      procedure Init;
      procedure SendEmail;

      property edBody: TStrings read FedBody write SetBody;
      property edAttachments: TStrings read FedAttachments write SetedAttachments;
end;

implementation

uses
   IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
   IdMessageClient, IdSMTPBase, IdSMTP, IdBaseComponent, IdIOHandler,
   IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdSASLLogin,
   IdSASL_CRAM_SHA1, IdSASL, IdSASLUserPass, IdSASL_CRAMBase, IdSASL_CRAM_MD5,
   IdSASLSKey, IdSASLPlain, IdSASLOTP, IdSASLExternal, IdSASLDigest, IniFiles,
   IdSASLAnonymous, IdUserPassProvider, IdSSLOpenSSLHeaders_Static,
   IdAttachment, IdAttachmentFile, System.SysUtils, IdMessageBuilder;

constructor TSSLEmail.Create;
begin
   inherited;
   FedBody := TStringList.Create;
   FedAttachments := TStringList.Create;
end;

destructor TSSLEmail.Destroy;
begin
   edBody.Free;
   edAttachments.Free;
   inherited;
end;

procedure TSSLEmail.SetBody(const Value: TStrings);
begin
   FedBody.Assign(Value);
end;

procedure TSSLEmail.SetedAttachments(const Value: TStrings);
begin
   FedAttachments.Assign(Value);
end;

procedure TSSLEmail.Init;
begin
   edSMTPServer := '';
   edSMTPPort := 0;
   edUserName := '';
   edPassword := '';
   edSSLConnection := True;
   edSenderEmail := '';
   edSenderName := '';
   edToEmail := '';
   edCCEmail := '';
   edBCCEmail := '';
   edSubject := '';
   edIsBodyHTML:= true;
   edPriority := TIdMessagePriority.mpNormal;
   edBody.Clear;
   edAttachments.Clear;
end;

procedure TSSLEmail.SendEmail;
var IdMessage: TIdMessage; // enthält Eigenschaften der Email
      SMTP: TIdSMTP; // enthält Eigenschaften des SMTP Servers
      SSLHandler: TIdSSLIOHandlerSocketOpenSSL; // alles weitere ist für die SSL Verschlüsselung
      IdUserPassProvider: TIdUserPassProvider;
      IdSASLCRAMMD5: TIdSASLCRAMMD5;
      IdSASLCRAMSHA1: TIdSASLCRAMSHA1;
      IdSASLPlain: TIdSASLPlain;
      IdSASLLogin: TIdSASLLogin;
      IdSASLSKey: TIdSASLSKey;
      IdSASLOTP: TIdSASLOTP;
      IdSASLAnonymous: TIdSASLAnonymous;
      IdSASLExternal: TIdSASLExternal;
      INI: TIniFile;
      INI_FileName: string;
      edAttachmentPath: string;
      IdBuilder: TIdMessageBuilderHtml;
begin
   INI_FileName:= ExtractFilePath(ParamStr(0)) + 'Res\MailProps.ini';
   INI:= TIniFile.Create(INI_FileName);
   IdMessage := TIdMessage.Create;
   IdBuilder := TIdMessageBuilderHtml.Create;
   try
      // Eigenschaften der email setzen
      IdMessage.ContentType := INI.ReadString('IdMessageProps','MessageContentType','');
      IdMessage.Charset := INI.ReadString('IdMessageProps','Charset','');
      IdMessage.Sender.Text := edSenderEMail;
      IdMessage.From.Name := edSenderName;
      IdMessage.From.Address := edSenderEMail;
      IdMessage.ReplyTo.EMailAddresses := edSenderEmail;
      IdMessage.Recipients.EMailAddresses := edToEmail;
      IdMessage.Subject := edSubject;
      IdMessage.Priority := edPriority;
      IdMessage.CCList.EMailAddresses := edCCEMail;
      IdMessage.ReceiptRecipient.Text := '';
      IdMessage.BccList.EMailAddresses := edBCCEMail;
      //Hinzugefügt
      edSMTPServer:= INI.ReadString('SSLConnection','SMTPServer','');
      edSMTPPort:= INI.ReadInteger('SSLConnection','SMTPPort',0);
      edSSLConnection:= INI.ReadBool('SSLConnection','SSL',true);
      edUserName:= INI.ReadString('SSLConnection','User','');
      edPassword:= INI.ReadString('SSLConnection','Password','');

      if edIsBodyHTML then begin
         IdBuilder.Html.Text := edBody.Text;
         IdBuilder.HtmlCharSet := INI.ReadString('IdMessageProps','Charset','');
         IdBuilder.HtmlContentTransfer := INI.ReadString('IdMessageProps','ContentTransfer','');
      end else begin
         IdBuilder.PlainText.Text := edBody.Text;
         IdBuilder.PlainTextCharSet := INI.ReadString('IdMessageProps','Charset','');
         IdBuilder.PlainTextContentTransfer := INI.ReadString('IdMessageProps','ContentTransfer','');
      end;

      if edAttachments <> nil then begin
         for edAttachmentPath in edAttachments do begin
            if FileExists(edAttachmentPath) then begin
               IdBuilder.Attachments.Add(edAttachmentPath);
            end;
         end;
      end;

      IdBuilder.FillMessage(IdMessage);
      SMTP := TIdSMTP.Create;
      try
         if edSSLConnection then begin
            SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
            SSLHandler.SSLOptions.Method := sslvSSLv23; // SSL/TLS handshake determines the highest available SSL/TLS version dynamically
            SSLHandler.SSLOptions.Mode := sslmClient;
            SSLHandler.SSLOptions.VerifyMode := [];
            SSLHandler.SSLOptions.VerifyDepth := 0;
            SMTP.IOHandler := SSLHandler;
            if edSMTPPort = 587 then begin
               SMTP.UseTLS := utUseExplicitTLS
            end
            else begin
               SMTP.UseTLS := utUseImplicitTLS; // ImplicitTLS insbesondere auch bei Port 465
            end;
         end;

         if (edUserName<>'') or (edPassword<>'') then begin
            SMTP.AuthType := satSASL;

            // Username und Passwort verschlüsselt bereitstellen
            IdUserPassProvider := TIdUserPassProvider.Create(SMTP);
            IdUserPassProvider.Username := edUserName;
            IdUserPassProvider.Password:= edPassword;

            // SASL-Komponenten für SSL Verschlüsselung
            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;
         end else begin
            SMTP.AuthType := satNone;
         end;

         SMTP.Host := edSMTPServer;
         SMTP.Port := edSMTPPort;
         SMTP.ConnectTimeout := 30000;
         SMTP.UseEHLO := True;
         SMTP.Connect;
         try
            SMTP.Send(IdMessage);
         finally
            SMTP.Disconnect;
         end;
      finally
         SMTP.Free;
      end;
   finally
      IdMessage.Free;
      INI.Free;
      IdBuilder.Free;
   end;
end;

end.
Ich habe eine Mini-*.ini Datei erstellt:
Code:
[IdMessageProps]
TextContentType=text/html
MessageContentType=multipart/mixed
Charset=UTF-8
ContentTransfer=8bit
[SSLConnection]
SMTPServer=xxx.xxx.xxx.xxx
SMTPPort=587
SSL=true
User=xxx@xxxxxx.de
Password=*******
Der Aufruf sieht dann abgekürzt so aus:
Delphi-Quellcode:
procedure TForm_Main.CreateSendReport;
var AttachPfad, AttachFile: string;
      BodyPfad, BodyFile: string;
      Absender, MailAn, MailCC, MailBCC, Betreff: string;
      Sig_Mail, Sig_DWahl, Sig_APartner, Anrede: string;
      vDate, bDate: TDate;
      KdNr, ReportTitel: string;
      SG: TAdvStringGrid;
      Body : TStringList;
      KW: string;
      SendMail: TSSLEmail;
begin
   //Variablen mit Werten füllen
   SendMail:= TSSLEmail.Create;
   Try
      //Hier werden Daten in das StringGrid SG geladen
      Export_Grid(SG, ReportTitel, AttachPfad + AttachFile, false, false, false);
      Body := //HTML-Body erstellen
      
      With SendMail do begin
         Init; //Alles auf Anfang setzen
         edSenderName := Sig_APartner; // Name, der als Absender erscheint
         edSenderEmail := Absender; // Meine Emailadresse, von der ich sende;
         edToEmail := MailAn;
         edCCEmail := MailCC;
         edBCCEmail := MailBCC;
         edSubject := Betreff;
         edBody := Body;
         edAttachments.Add(AttachPfad + AttachFile);
         SendEmail;
      end;
   Finally
      SG.Free;
      Body.Free;
      SendMail.Free
   End;
end;
So funktioniert das bei mir wunderbar. Eine Sache stört mich noch, nämlich dass ich im Outlook in der Mailliste statt der ersten Zeile des Mailtestes die Info bekomme: Zum Anzeigen der Meldung ist ein HTML-Viewer erforderlich <Ende>

Ich habe mal zwei Screenshots hochgeladen, die es zeigen. Hat jemand eine Idee, wie man das noch wegbekommen könnte?

Vielen Dank
Patrick
Miniaturansicht angehängter Grafiken
mailoverviews_wrong.jpg   mailoverviews_right.jpg  
Patrick
  Mit Zitat antworten Zitat
zeras
Online

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.643 Beiträge
 
Delphi 12 Athens
 
#6

AW: Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 4. Jun 2024, 20:52
Bei Outlook kann man einstellen, ob man die Mail als Text oder als HTML senden möchte. Das scheint hier ein Hinweis zu sein, dass dies eine HTML Mail ist und du das mit einem "HTML Viewer anzeigen lassen musst. Wo du das aber einstellen kannst, weiß ich leider nicht.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
898 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 4. Jun 2024, 22:40
Du hast hier ja
TextContentType=text/html
stehen. Damit versendest du HTML-Mail.
Wenn du
TextContentType=text/plain
nimmst, ist es keine HTML-Mail und es ist kein HTML-Viewer notwendig.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Email mit SSL Verschlüsselung versenden (Windows, Android, iOS)

  Alt 5. Jun 2024, 00:32
Hallo zusammen,
Vielen Dank für eure Antworten! Ich habe die Mail bewusst als HTML verschickt, weil auch ein Firmen, Logo und Formatierungen enthalten sind.
Diese Darstellungsart wird erst seit der Verwendung des HTML Builders angezeigt. In meinem Outlook bekomme ich andere HTML Mails auch in der Vorschau angezeigt, so wie in dem zweiten Screenshot. Es muss also irgendwo etwas in dem Code drin stecken, dass das hervorruft…
Vielen Dank.
Patrick
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 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