Einzelnen Beitrag anzeigen

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