|
Antwort |
Registriert seit: 20. Jan 2004 Ort: Zug CH 83 Beiträge Delphi 7 Professional |
#1
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:
Beispiel:
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;
Delphi-Quellcode:
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
sendNewsLetter(an, Formatt.ListBoxFiles.items, editor, 'Absender_EMail', EditBetreff.text, 'mpnormal', 'text/html',
'SmtpServer', 'SmtpBenutzername', 'SmtpPasswort', 25, 0, 'PopServer', 'PopBenutzername', 'PopPasswort', 110)); [edit=Chakotay1308]Delphi-Tags korrigiert. Mfg, Chakotay1308[/edit] |
Zitat |
Registriert seit: 20. Jan 2004 Ort: Zug CH 83 Beiträge Delphi 7 Professional |
#2
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:
Greetz Cyrus
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+'"' else if source.SelText='<' then s:=s+'<' else if source.SelText='>' then s:=s+'>' else if source.SelText='ä' then s:=s+'ä' else if source.SelText='Ä' then s:=s+'Ä' else if source.SelText='ö' then s:=s+'ö' else if source.SelText='Ö' then s:=s+'Ö' else if source.SelText='ü' then s:=s+'ü' else if source.SelText='Ü' then s:=s+'Ü' else if source.SelText='ß' then s:=s+'ß' 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; [edit=Chakotay1308]Code-Tags korrigiert. Mfg, Chakotay1308[/edit] |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |