AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mail Senden über Indy

Ein Thema von CTV · begonnen am 21. Jan 2004 · letzter Beitrag vom 21. Jan 2004
Antwort Antwort
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#1

Mail Senden über Indy

  Alt 21. Jan 2004, 11:34
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]
  Mit Zitat antworten Zitat
Benutzerbild von CTV
CTV

Registriert seit: 20. Jan 2004
Ort: Zug CH
83 Beiträge
 
Delphi 7 Professional
 
#2

Re: Mail Senden über Indy

  Alt 21. Jan 2004, 12:57
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+'<'  
       else
      if source.SelText='>then
        s:=s+'>'
       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]
  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 16:59 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