Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Funktion für E-Mail Versand (https://www.delphipraxis.net/129883-funktion-fuer-e-mail-versand.html)

Andidreas 27. Feb 2009 07:55


Funktion für E-Mail Versand
 
aloah zusammen,

ich weiß über das aussehen von source code kann man sich streiten...
in diesem falle gehts mir auch nicht dadrum wie schön ich meinen source code formatiert habe (ect.) sonder mir geht es darum ob jemand fehler in der funktionalität sieht...

mit der beigefügten funktion soll man e-mails verschicken können:
edit: zum versand der e-mails verwende ich die indy komponenten

Delphi-Quellcode:
unit AS_Globals;

interface

uses
  Dialogs, Forms, SysUtils, Windows, StdCtrls, Classes, Clipbrd,  IdMessage,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
  IdMessageClient, IdSMTPBase, IdSMTP;

type
  TIdSMPTP = class(TIdSMTPBase);

  //Functions
  function fnSendEMail(sHost, sUsername, sPassword, sFrom, sSenderEMail, sReceipt,
                       sSubject : String; strlBody : TStrings; iPort : Integer) : Boolean;

implementation


//******************************************************************************
//                                                                             *
//                         F U N C T I O N S                                  *
//                                                                             *
//******************************************************************************

//******************************************************************************
// fnSendEMail --> Send E-Mail                                                *
// Parameter  --> sHost       = E-Mail Server                               *
//                 sUsername   = E-Mail User Account                         *
//                 sPassword   = E-Mail User Account Password                *
//                 sFrom       = From Text                                   *
//                 sSenderEMail = E-Mail Adress from Sender                   *
//                 sReceipt    = Receipt E-Mail Adress                       *
//                 sSubject    = E-Mail Subject                              *
//                 strlBody    = E-Mail Text                                 *
//                 iPort       = E-Mail Server Port                          *
// Return     --> Boolean (True/False)                                       *
//******************************************************************************

function fnSendEMail(sHost, sUsername, sPassword, sFrom, sSenderEMail, sReceipt,
                       sSubject : String; strlBody : TStrings; iPort : Integer) : Boolean;

var
SMTP : TIdSMTP;
idMessage : TIdMessage;

begin

  Result := True;

  //Create TIdSMTP and TIdMessage Componente
  SMTP := TIdSMTP.Create();
  idMessage := TIdMessage.Create();

  //Configure SMPTP
  SMTP.Host := sHost;
  SMTP.Username := sUsername;
  SMTP.Password := sPassword;
  SMTP.Port := iPort;

  //Configure idMessage
  idMessage.From.Text := sFrom;
  idMessage.Sender.Text := sSenderEMail;
  idMessage.Recipients.EMailAddresses := sReceipt;
  idMessage.Subject := sSubject;

  idMessage.Body.Clear;
  idMessage.Body := strlBody;

  //Send E-Mail
  Try
    SMTP.Connect;
    SMTP.Send(idMessage);
    SMTP.Disconnect;
  Except
    Result := False;
    If SMTP.Connected = True Then
    Begin
      Try
        SMTP.Disconnect;
      Except
        MessageDlg('Could not disconnect from the E-Mail Server: ' + sHost, mtError, [mbOK], 0);
      End;
    End;
    MessageDlg('Could not send E-Mail to: ' + sReceipt, mtError, [mbOk], 0);
  End;

  //Destroy TIdSMTP and TIdMessage Componente
  SMTP.Free;
  idMessage.Free;

end;
folgende frage(n) hätte ich hierzu:
1) ist das komponenten erstellen und entfernen so korrekt oder erzeuge ich mir hier speicherlecks?
2) ich erzeuge ja am anfang der unit einen type... muss ich denn auch wieder entsorgen?

die frage(n) mögen vielleicht für manchen zu einfach oder doof klingen, aber ich hab noch nie wirklich funktionen programmiert die keine form zur verfügung hatten und auf dennen man hätte die komponenten ablegen können...

über antworten würde ich mich freuen...

DeddyH 27. Feb 2009 08:52

Re: Funktion für E-Mail Versand
 
Ich habe den Source nur überflogen, aber Du solltest das grundsätzlich so machen:
Delphi-Quellcode:
Obj := TKlasse.Create;
try
  MachWasMitObj();
finally
  Obj.Free;
end;
Somit sollten die Objekte auch bei Exceptions immer freigegeben werden. Und die Typdeklaration ist ja nur die Beschreibung einer Klasse und keine Instanz. Da gibt es somit nichts freizugeben.

Micha88 27. Feb 2009 10:08

Re: Funktion für E-Mail Versand
 
Also ich weis nicht ..

ich regele meine eMail-Versendungen immer über IdHTTP zusammen mit einem PHP-Script.
IdHTTP geht per GET an das Script und regelt alles ohne IE, FF oder sonstwas.

Vorteile:
Man ist nicht Login-Daten-bezogen.

Zwar kann der Server off sein, dann geht beides nicht mehr, aber ich verwende der unkompliziertheit halber lieber ein PHP-Script.
( Stichwort, PHP:Mail() )

himitsu 27. Feb 2009 10:27

Re: Funktion für E-Mail Versand
 
Zitat:

Zitat von MichaelLinden
ich regele meine eMail-Versendungen immer über IdHTTP zusammen mit einem PHP-Script.

dann mußt du aber den PHP-Script aufpassen, nicht daß da jemand Fremdes dieses benutzt und darüber nette Spam-Mails verschickt

Andidreas 27. Feb 2009 10:29

Re: Funktion für E-Mail Versand
 
@deddyh

danke für den tipp...
ich habs versenden nun so abgeändert:

Delphi-Quellcode:
  //Send E-Mail
  Try
    Try
      SMTP.Connect;
      SMTP.Send(idMessage);
      SMTP.Disconnect;
    Except
      Result := False;
      If SMTP.Connected = True Then
      Begin
        Try
          SMTP.Disconnect;
        Except
          MessageDlg('Could not disconnect from the E-Mail Server: ' + sHost, mtError, [mbOK], 0);
        End;
      End;
      MessageDlg('Could not send E-Mail to: ' + sReceipt, mtError, [mbOk], 0);
    End;
  Finally
    //Destroy TIdSMTP and TIdMessage Componente
    SMTP.Free;
    idMessage.Free;
  End;
@michallinden
danke für dein anmerkung... aber warum sollte ich mir hier jetzt noch die arbeit machen und ein php script schreiben?
für meinen e-mail versand brauch ich auch keinen IE oder FF oder sonst irgend nen i-explorer...
und login daten brauch ich hierfür auch nicht einmal... die sind nur zur vollständigkeit drinne...

Micha88 27. Feb 2009 10:36

Re: Funktion für E-Mail Versand
 
"und login daten brauch ich hierfür auch nicht einmal"

Nicht?

Die Funktion fnSendEMail connected sich doch da mit irgentwas?

Oder, da müssen doch zumindest Logindaten in der SMTP-Komponente stehen.

Micha88 27. Feb 2009 10:38

Re: Funktion für E-Mail Versand
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von MichaelLinden
ich regele meine eMail-Versendungen immer über IdHTTP zusammen mit einem PHP-Script.

dann mußt du aber den PHP-Script aufpassen, nicht daß da jemand Fremdes dieses benutzt und darüber nette Spam-Mails verschickt

Das habe ich fachlich abgesichert :D

Die Adresse des Scripts kennt wohl niemand. Natürlich könnte man die irgentwie während der Laufzeit meiner Anwendung abzweigen, aber wird wohl nicht so sein.

Meflin 27. Feb 2009 10:41

Re: Funktion für E-Mail Versand
 
Zitat:

Zitat von MichaelLinden
Die Adresse des Scripts kennt wohl niemand. Natürlich könnte man die irgentwie während der Laufzeit meiner Anwendung abzweigen, aber wird wohl nicht so sein.

Pillepalle. Solange du nicht irgendwelche One-Time-Keys zur Authentifizierung mitsendest ist das ein offenes Loch in deinem Server.

Micha88 27. Feb 2009 10:47

Re: Funktion für E-Mail Versand
 
OneTimeKeys muss man mir wohl erst erklären :roll:

Meflin 27. Feb 2009 10:49

Re: Funktion für E-Mail Versand
 
Zitat:

Zitat von MichaelLinden
OneTimeKeys muss man mir wohl erst erklären :roll:

Naja, irgendein Schlüssel halt, der für jeden Aufruf generiert wird und nur einmal (für genau diesen Aufruf) funktioniert. Weil sonst könnte man ja den Schlüssel mit klauen und schon wär man wieder am Punkt ganz ohne Sicherung...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Seite 1 von 2  1 2      

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