Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Internet / LAN / ASP.NET (https://www.delphipraxis.net/23-library-internet-lan-asp-net/)
-   -   Delphi Mail Senden über Indy (https://www.delphipraxis.net/15049-mail-senden-ueber-indy.html)

CTV 21. Jan 2004 10:34


Mail Senden über Indy
 
Mit dieser Funktion können E-Mails versendet werden Es werden keine Komponenten auf der Form Benötigt (die werden dynmisch erzeugt) Jedoch müssen die Indy Komponenten installiert sein und die uses für die Indy Komponenten eingetragen sein.

Hinweis
Es ist von Vorteil wenn man eine Funktion hat welche RTF in HTML konvertieren kann, denn dann kann man ganz einfach ein Richedit zu HTML wandeln und dann den HTML Quelltext im Mail mit senden.

Paramenter:
Delphi-Quellcode:
an: Tstringlist      //Enthält die Empfänger E-Mail Adressen
att1: Tstrings       //Enthält die Dateipfade zu den Attachments
Nachricht: Trichedit //Enthält die Mail Nachricht
vonMail: String      //Enhält die Absender E-Mail Adresse
Betreff: String      //Enhälst den Mail Betreff
Priority: String     //Gibt die Mail Priorität an Werte:[mpHighest, mpHigh, mpNormal, mpLow, mpLowest]
CT: String           //Content Type des Mails
SMTPServer: String   //Zu verwendender SMTP Server
SMTPUsername: String //SMTP Username (meist identisch zu Pop Username)
SMTPPass: String     //SMTP Passwort (meist identisch zu Pop Passwort)
SMTPPort: Integer    //SMTP Port (25
SmtpAuthType: Integer //0=Normal 1=SMTPAuth 2=AfterPop 3=SMPTAuth und AfterPop
POPServer: String    //Zu verwendender POP Server
POPUser: String      //POP Username
POPPass: String      //POP Passwort
POPPort: Integer     //POP Port (110)
Delphi-Quellcode:
procedure sendNewsLetter(an: Tstringlist; att1: Tstrings; Nachricht: Trichedit;
vonMail, Betreff, Priority, CT, SMTPServer, SMTPUsername, SMTPPass: String;
SMTPPort, SmtpAuthType: integer; PopServer, PopUser, PopPass: String; PopPort: integer);
var
  IdMsgSend: TidMessage;
  SMTP: TidSmtp;
  POP: TidPop3;
  i: integer;
  s: string;
begin
  IdMsgSend := TidMessage.Create(nil);
  SMTP := TidSmtp.Create(nil);
  POP := TidPop3.create(nil);
  IdMsgSend.Clear;

  // Plain Text
  with TIdText.Create(IdMsgSend.MessageParts, nil) do
  begin
    ContentType := 'text/plain';
    Body.Text := Nachricht.Text;
  end;

  // HTML Part
  with TIdText.Create(IdMsgSend.MessageParts, nil) do
  begin
    ContentType := 'text/html';
    Body.Text := RtfToHtml('MetaHead', Nachricht); //Benötigt funktion um RTF zu HTML umzuwandeln
  end;

  with IdMsgSend do
  begin
    ContentType := CT;
    From.Text := vonMail;
    ReplyTo.EMailAddresses := vonMail;
    Subject := Betreff;
    Priority := Priority ;
    s := '';
    for i := 0 to an.Count-1 do
    begin
      s := s + BccList.EMailAddresses+an.Strings[i] + ';'
    end;
    BccList.EMailAddresses := s;
    ReceiptRecipient.Text := '';
  end;

  if att1.Count >= 1 then
  begin
    for i := 0 to att1.Count - 1 do
    begin
      TIdAttachment.Create(IdMsgSend.MessageParts, att1.Strings[i] );
    end;
  end;
  IdMsgSend.ContentType := CT ;

  case SmtpAuthType of
    0: SMTP.AuthenticationType := atNone; //Normal
    1: SMTP.AuthenticationType := atLogin; //SMTPAuth
    2: begin //AfterPop
         SMTP.AuthenticationType := atNone;
         POP.Host := POPServer;
         POP.Username := POPUser;
         POP.Password := POPPass;
         POP.Port := POPPort;
         POP.Connect(5);
         POP.Disconnect;
       end;
    3: begin //afterPop+SMTPAuth
         SMTP.AuthenticationType := atLogin;
         POP.Host := POPServer;
         POP.Username := POPUser;
         POP.Password := POPPass;
         POP.Port := POPPort;
         POP.Connect(5);
         POP.Disconnect;
       end;
  end;
  SMTP.Username := SMTPUsername;
  SMTP.Password := SMTPPass;

  SMTP.Host := SMTPServer;
  SMTP.Port := SMTPPort;

  SMTP.Connect;

  ShowMessage(IntToStr(IdMsgSend.MessageParts.Count));
  try
    SMTP.Send(IdMsgSend);
  finally
    SMTP.Disconnect;
  end;
  IdMsgSend.free;
  SMTP.free;
  POP.free;
end;
Beispiel:
Delphi-Quellcode:
sendNewsLetter(an, Formatt.ListBoxFiles.items, editor, 'Absender_EMail', EditBetreff.text, 'mpnormal', 'text/html',
  'SmtpServer', 'SmtpBenutzername', 'SmtpPasswort', 25, 0, 'PopServer', 'PopBenutzername', 'PopPasswort', 110));
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
[edit=Chakotay1308]Delphi-Tags korrigiert. Mfg, Chakotay1308[/edit]

CTV 21. Jan 2004 11:57

Re: Mail Senden über Indy
 
ich hab eine die hab ich jedoch nicht von Grund auf selber gemacht ich hab von nem tortutial abgeguckt aber das währe sie:

Delphi-Quellcode:
function RtfToHtml(contenthead:string; Source:TRichedit):string;
var loop,loop2:integer; // Counter
    s,s2:string; // Strings, zur Bearbeitung
    fett,kursiv,us,bullet:boolean; // welche Attribute hatte das letzte Zeichen?
    Aktcolor:tColor; // aktuelle Farbe
    aktSize:integer; // aktuelle Schriftgröße
    AktLine:Integer; // welche Zeile bearbeiten wir
    Align1:TAlignment; // wie ist die Ausrichtung
    ReihenFolge:TList; // in welche Reihenfolge werden die Tags bearbeitet
     // 1= fett
     // 2 = kursiv
     // 3 = unterstrichen
     // 4 = Color
     // 5 = Size
     // 6 = li

function CalculateSize(pt:integer):integer;
begin
  case pt of
   0..7: result:=1;
   8..10: result:=2;
   11..13: result:=3;
   14..16: result:=4;
   17..20: result:=5;
   21..24: result:=6;
   else result:=7;
  end;
end; // CalculateSize;

begin
   result:='';
   Source.Visible:=false;
   Source.Width:=32000;


   ReihenFolge:=TList.Create;

   // der Header
   s:=
   '<html><head><meta name="generator" content="'+contenthead+'"></head>'+
   '<body text="#000000" bgcolor="#FFFFFF" link="#FF0000"alink="#FF0000" vlink="#FF0000">';

   fett:=false;
   kursiv:=false;
   us:=false;
   bullet:=false;

   // wieviele Zeichen insgesamt
   Source.SelectAll;
   loop2:=Source.SelLength;

   // die Daten des ersten Zeichens herausfinden
   Source.SelLength:=1;
   AktColor:=Source.SelAttributes.Color;
   AktSize:=CalculateSize(Source.SelAttributes.Size);
   Align1:=Source.Paragraph.Alignment;

   // erstmal eine völlig willkürliche Reihenfolge festlegen
   ReihenFolge.Add(Pointer(1));
   ReihenFolge.Add(Pointer(2));
   ReihenFolge.Add(Pointer(3));
   ReihenFolge.Add(Pointer(4));
   ReihenFolge.Add(Pointer(5));
   ReihenFolge.Add(Pointer(6));

   AktLine:=0;

   // Die Fonteinstellungen des ersten Zeichens
   s:=s+'<font size="'+IntToStr(aktsize)+'" color="#'+
   IntToHex(GetRValue(AktColor),2)+
   IntToHex(GetGValue(AktColor),2)+
   IntToHex(GetBValue(AktColor),2)+'">';

   // Der erste Paragraph
   case Align1 of
    taLeftJustify:s:=s+'<p align="left">';
    taRightJustify:s:=s+'<p align="right">';
    taCenter:s:=s+'<p align="center">';
   end;

   for loop:=0 to loop2 do
    begin
     // immer das nächste zeichen
     Source.SelStart:=loop;
     Source.SelLength:=1;

     // jetzt wird geschaut, ob sich etwas getan hat
     with Source.SelAttributes do
      begin

     // Testen, ob wir eine neue Zeile erreicht haben, wenn ja,
     // dann entweder neuer Paragraph oder
 
     if AktLine <> SendMessage (Source.Handle, EM_LINEFROMCHAR,
                                Source.SelStart, 0) then
      begin
       // wenn wir in einer Aufzählung sind, dann wird durch eine neue
       // Zeile diese immer abgeschlossen
       if bullet then
        begin
         s:=s+'';
         bullet:=false;

         ReihenFolge.Move(ReihenFolge.IndexOf(Pointer(6)),ReihenFolge.Count-1);
         // wenn in der neuen Zeile nicht wieder eine Aufzählung ist,
         // dann erstellen wir eine neue Zeile
         if Source.Paragraph.Numbering <> nsBullet then
          begin
          // Bevor wir in die neue Zeile wechseln, schließen wir alle offenen Tags
          for loop2:=0 to ReihenFolge.Count-1 do
           case Integer(Reihenfolge[loop2]) of
            1: if fett then s:=s+'[/b]';
            2: if kursiv then s:=s+'[/i]';
            3: if us then s:=s+'</u>';
            4: s:=s+'</font>';
           end; // case
          fett:=false;
          kursiv:=false;
          us:=false;

           s:=s+'
';
          end;
        end
        else
        begin
         if Trim(Source.Lines[AktLine])='' then
         // wenn die nächste Zeile leer ist, dann fügen wir einen neuen Paragraphen
         // ein, sonst nur ein
 
          begin
          // Alle offenen Tags werden geschlosssen
           for loop2:=0 to ReihenFolge.Count-1 do
            case Integer(Reihenfolge[loop2]) of
             1: if fett then s:=s+'[/b]';
             2: if kursiv then s:=s+'[/i]';
             3: if us then s:=s+'</u>';
             4: s:=s+'</font>';
            end; // case
           fett:=false;
           kursiv:=false;
           us:=false;
           s:=s+'</p>';
           Align1:=Source.Paragraph.Alignment;
           case Align1 of
            taLeftJustify:s:=s+'<p align="left">';
            taRightJustify:s:=s+'<p align="right">';
            taCenter:s:=s+'<p align="center">';
           end;
          end else s:=s+'
';

         end; // keine Aufzählung
       AktLine:=SendMessage (Source.Handle, EM_LINEFROMCHAR,
                             Source.SelStart, 0);
      end; // neue Zeile

       for loop2:=0 to ReihenFolge.Count-1 do
        case Integer(ReihenFolge[loop2]) of

         1: if fsBold in Style then
              begin
               if not fett then
                begin
                 s:=s+'[b]';
                 fett:=true;
                 ReihenFolge.Move(loop2,0);
               end;
              end else begin
               if fett then
                begin
                 s:=s+'[/b]';
                 fett:=false;
                 ReihenFolge.Move(loop2,ReihenFolge.Count-1);
                end;
              end;

            2: if fsItalic in Style then
                begin
                 if not kursiv then
                  begin
                   s:=s+'[i]';
                   kursiv:=true;
                   ReihenFolge.Move(loop2,0);
                  end;
                end else begin
                 if kursiv then
                  begin
                   s:=s+'[/i]';
                   kursiv:=false;
                   ReihenFolge.Move(loop2,ReihenFolge.Count-1);
                  end;
                end;

            3: if fsUnderline in Style then
                begin
                 if not us then
                  begin
                   s:=s+'<u>';
                   us:=true;
                   ReihenFolge.Move(loop2,0);
                  end;
                 end else begin
                  if us then
                   begin
                    s:=s+'</u>';
                    us:=false;
                    ReihenFolge.Move(loop2,ReihenFolge.Count-1);
                   end;
                 end;

             4 : if Color<>aktcolor then
                 begin
                  aktcolor:=color;
                  s:=s+'</font><font size="'+
                  IntToStr(aktsize)+'" color="#'+
              IntToHex(GetRValue(AktColor),2)+ 
              IntToHex(GetGValue(AktColor),2)+
              IntToHex(GetBValue(AktColor),2)+'">';
                  ReihenFolge.Move(loop2,0);
                end;

             5: if CalculateSize(Size)<>aktSize then
                 begin
                  aktsize:=CalculateSize(size);
                  s:=s+'</font><font size="'+IntToStr(aktsize)+'">';
                  ReihenFolge.Move(loop2,0);
                 end;

             6: if Source.Paragraph.Numbering =nsBullet then
                 begin
                  if not bullet then
                   begin
                    s:=s+'[*]';
                    bullet:=true;
                    ReihenFolge.Move(loop2,0);
                   end;
                 end else begin
                  if bullet then
                    begin
                     s:=s+'';
                     bullet:=false;
                     ReihenFolge.Move(loop2,ReihenFolge.Count-1);
                   end;
                  end;

       end; // case

      end; // with selattributes do


      // jetzt wird erst mal alles gesäubert, was in der HTM-Datei nicht so nett
      // aussehen würde
      if source.SelText='"' then
        s:=s+'&quot;'
       else
      if source.SelText='<' then
        s:=s+'&lt;'
       else
      if source.SelText='>' then
        s:=s+'&gt;'
       else
      if source.SelText='ä' then
        s:=s+'&auml;'
       else
      if source.SelText='Ä' then
        s:=s+'&Auml;'
       else
      if source.SelText='ö' then
        s:=s+'&ouml;'
       else
      if source.SelText='Ö' then
        s:=s+'&Ouml;'
       else
      if source.SelText='ü' then
        s:=s+'&uuml;'
       else
      if source.SelText='Ü' then
        s:=s+'&Uuml;'
       else
      if source.SelText='ß' then
        s:=s+'&szlig;'
       else
        s:=s+Source.SelText;
    end; // jedes zeichen

     // Zum Abschluß schließen wir die ganzen Tags nochmal
     for loop2:=0 to ReihenFolge.Count-1 do
      case Integer(Reihenfolge[loop2]) of
       1: if fett then s:=s+'[/b]';
       2: if kursiv then s:=s+'[/i]';
       3: if us then s:=s+'</u>';
       4: s:=s+'</font>';
       6: s:=s+'';
      end; // case

      // der letzte Paragraph wird geschlossen
    s:=s+'</p>';

   // jetzt leerzeichen raus
   for loop:=100 downto 2 do
    begin
     s2:='';
     for loop2:=1 to loop do
      s2:=s2+' ';
     s:=StringReplace(s,s2,'',
                       [rfReplaceAll,rfIgnoreCase]);
    end;
   for loop:=100 downto 2 do
    begin
     s2:='';
     for loop2:=1 to loop do
      s2:=s2+'';
     s:=StringReplace(s,'',s2,
                       [rfReplaceAll,rfIgnoreCase]);
    end;

   // jetzt sind wir fertig
   s:=s+'</html>';
   result:=s;
   Reihenfolge.free;

   Source.Width:=630;
   Source.Visible:=true;
end;
Greetz Cyrus

[edit=Chakotay1308]Code-Tags korrigiert. Mfg, Chakotay1308[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 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