Autor |
Beitrag |
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: So 03.05.20 17:39
Hallo!
Aus meiner Anwendung sollen E-Mails verschickt werden können. Ich nutze dafür die INDY-Komponenten IdSMTP und IdMessage. Den Text kann der Anwender im RichEdit-Feld verfassen und theoretisch auch formatieren. Ich würde dem Anwender im Rahmen der Mail-Gestaltung gerne ermöglichen, seinen Text im Fettdruck zu verfassen, den Font in der Größe und Farbe zu variieren und eine Grafik einzufügen.
Ich habe inzwischen einiges probiert, so z. B. den RichText mit Formatierungen gestreamt und verschickt oder in html gewandelt und verschickt. Aber immer kommt eine Mail mit dem Quellcode bei mir an. Sowohl im Online-Webclient, wie auch in Outlook.
Wäre nett, wenn jemand einen Tipp hätte.
Gruß
Gagga
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 03.05.20 18:25
Hallo und ,
welchen Content-Type verwendest du denn beim Senden?
Vllt. hilft dir folgender Link weiter: How do you send HTML messages with Indy?
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: So 03.05.20 18:30
Hallo!
Danke für deine Antwort. Den Link kenne ich, habe die Snippets auch getestet. Also auch den Content-Typ (natürlich) entsprechend geändert. Kam aber immer zu den geschilderten Ergebnissen.
Gruß
Gagga
Moderiert von Th69: Vollzitat entfernt.
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 03.05.20 18:56
Dann zeig mal deinen (relevanten) Code dazu, sowie den empfangenen Text.
Und welche INDY-Version verwendest du?
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: So 03.05.20 19:53
Ich verwende Indy10. Der empfangene Text war:
HTML-Dokument 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| <html> <body> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loos e.dtd"> <html> <head> <title></title> <meta name="editor" content="html-editor phase 5"> </head> <body text="#000000" bgcolor="#F00FFF" link="#FF0000" alink="#FF0000" vlink="#FF0000"> Hallo<br>
<p align="center"><b><h2>Hallo</h 2></b></p> </body> </html> </body> </html> |
Wegen des Codes muss ich morgen schauen. Ich habe die Tests vor Wochen in einem "Versuchs-Projekt" parallel zum eigentlichen Projekt gemacht. Immer etwas neues probiert und es am Ende erst einmal gelassen. Muss etwas suchen, mich jetzt aber der Familie widmen.
Gruß
Gagga
Moderiert von Th69: HTML-Tags hinzugefügt
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 04.05.20 07:53
Da scheint ein komplettes HTML innerhalb von HTML-Body versendet zu werden.
Ich denke, du solltest mal der Reihe nach vorgehen und wieder von vorne die Tests machen: zuerst "text/plain", dann "text/html" etc. und jeweils mit einem einfachen Text. Und erst wenn das einwandfrei klappt, dann nach und nach Formatierungen einfügen.
Und wenn du dann eine fehlerhafte Mail erhältst, überprüfen, was du bei Indy entsprechend einstellen (bzw. ändern) mußt.
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: Mo 04.05.20 11:19
Genauso bin ich bei meinem erwähnten "Versuchs-Projekt" vorgegangen. Daher funktioniert mein Programm mit unformatiertem Text einwandfrei.
Versucht habe ich mich zunächst mit Formatierungen im RichEdit-Feld mit folgendem Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| var b: TIdMessageBuilderRtf; s: TStringStream; begin s := TSTringStream.Create; try
RE1.Lines.SaveToStream(s); b := TIdMessageBuilderRtf.Create; try s.Position := 0; b.Rtf.LoadFromStream(s); b.FillMessage(IdMessage1); finally b.Free; end;
finally s.Free; end;
try IdMessage1.From.Address := edFrom.Text; IdMessage1.Subject := eBetreff.Text; IdMessage1.ContentType:='application/rtf';
IdSMTP1.Connect; IdMessage1.Recipients.EMailAddresses := edTo.Text; IdSMTP1.Send(IdMessage1); finally IdSMTP1.Disconnect; end; |
Schaue ich mir die ankommende E-Mail in meinem Web-Client an, sehe ich ein leeres Textfeld und einen mit „Teilstück 1“ bezeichneten Anhang ohne Dateierweiterung. Öffne ich diesen Anhang mit Wordpad, sehe ich meinen formatierten Text.
In Outlook empfange ich eine E-Mail ohne Text mit zwei Anhängen, die beide den Namen des Betreffs tragen und die Dateiendung “dat“. Öffne ich diese Anhänge mit Wordpad, sehe ich jeweils meinen formatierten Text.
Dann habe ich mich mit folgender Funktion (gefunden in einem Forum) am html-Versand versucht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78:
| function MeinMailVersand(const aAbsender, aMailCopyTo, aUserName, aHost, aPassword, aEmpfaenger, aSubject, aTextBody, aHtmlBody, aDateianlage: string; var aMsg: string) : boolean; var Html: TStrings; HtmPart, TxtPart: TIdText; SMTP: TIdSMTP; BmpPart: TIdAttachmentFile; EMail: TIdMessage; begin aMsg := ''; Result := false; EMail := nil; Html := nil; SMTP := nil; try SMTP := TIdSMTP.Create; Html := TStringList.Create; EMail := TIdMessage.Create(nil); Html.Add('<html>'); Html.Add('<head>'); Html.Add('</head>'); Html.Add('<body>'+aHtmlBody); Html.Add('</body>'); Html.Add('</html>'); EMail.From.Address := aAbsender; EMail.Recipients.EMailAddresses := aEmpfaenger; EMail.Subject := aSubject; EMail.ContentType := 'multipart/mixed'; EMail.Body.Assign(Html); if aTextBody <> '' then begin TxtPart := TIdText.Create(email.MessageParts); TxtPart.ContentType := 'text/plain'; TxtPart.Body.Text := aTextBody; end; if aDateianlage <> '' then begin HtmPart := TIdText.Create(email.MessageParts, html); HtmPart.ContentType := 'text/html'; BmpPart := TIdAttachmentFile.Create(EMail.MessageParts, aDateianlage); BmpPart.ContentType := 'image/jpeg'; BmpPart.ContentDisposition := 'inline'; BmpPart.ExtraHeaders.Values['content-id'] := 'us.jpg'; BmpPart.DisplayName := 'us.jpg'; end; SMTP.Username := aUserName; SMTP.Host := aHost; SMTP.Password := aPassword; try SMTP.Connect; try SMTP.Send(EMail); if aMailCopyTo <> '' then begin EMail.Subject := '[Kopie E-Mail an ' + aEmpfaenger+ '] - ' + EMail.Subject; EMail.Recipients.EMailAddresses := aAbsender; EMail.ExtraHeaders.Clear; SMTP.Send(EMail); end; aMsg := 'E-Mail an <'+aEmpfaenger+'> erfolgreich gesendet um ' + DateTimeToStr(Now); Result := True; except on E: Exception do aMsg := 'Fehler beim Mail-Versand: ' + E.Message; end; finally SMTP.Disconnect; end; finally EMail.Free; Html.Free; SMTP.Free; end; end; |
Im Web-Client sehe ich das, was ich für aTextBody an die Funktion übergebe von dem, was ich als aHtmlBody übergebe, sehe ich nichts. Es gibt dort auch keinen Anhang.
In Outlook wird der html-Quelltext angezeigt:
HTML-Dokument 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <html> <head> </head> <body>Hallo<br>
<p align="center"><b><h2>Hallo</h 2></b></p>
</body> </html> |
Vorstehende Zeilen stehen in einem Memo-Feld: Diese Zeilen habe ich als aHtmlBody an die Funktion übergeben.
Mit diesen Ergebnissen habe ich meine Versuche Mitte April beendet. Jetzt bin ich soweit, dass alles andere läuft, Serienmails, Rundmails, aber eben ohne Formatierung.
Gruß
Gagga
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 04.05.20 12:26
Das ist rätselhaft
Beim RTF sehe ich jetzt auch keinen Fehler. Evtl. mal "text/rtf" probieren, aber das sollte eigentlich auch keinen Unterschied machen (und laut Internet unterstützt Outlook auch RTF).
Und beim HTML könntest du mal direkt "text/html" verwenden und den Text sowie den Anhang weglassen.
PS: Ich schreibe dir noch eine PN.
Für diesen Beitrag haben gedankt: Gagga
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: Mo 04.05.20 13:24
Ich danke Dir für die Antwort, allerdings sieht so mein Code an einschlägiger Stelle aus:
Delphi-Quelltext 1:
| ContentType:='text/richtext'; |
Text hatte ich auch schon weggelassen. Ohne Erfolg.
Gruß
Gagga
Moderiert von Th69: Vollzitat entfernt.
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 04.05.20 13:54
OK, Test-Mail ist bei mir erfolgreich angekommen (s. PN-Antwort).
PS: Bitte hier nicht immer Vollzitate (full quotes) verwenden!
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: Mo 04.05.20 15:18
Html an Outlook funktioniert, ohne dass ich nachvollziehen kann, was vorher nicht passte. Meinen Webclient haue ich in die Tonne.
RTF ist nach wie vor ein Problem. Versende ich mit text/rtf oder text/rich/text, bekomme ich jeweils eine leere Mail mit einem Anhang mit der Endung txt. In wordpad geöffnet, habe ich meinen formatierten Text. Mit text/html verschickt, bekomme ich ebenfalls eine leere Mail mit einem Anhang Endung txt. Auch hier finde ich meinen formatierten Text in wordpad.
Kannst Du mir noch eine Rückmeldung zu der Mail an Dich im RTF-Format geben?
Gruß
Gagga
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 04.05.20 15:43
Da ist keine weitere Mail bei mir angekommen. Dann hat das wohl mein Provider unterbunden, da mir nur die Auswahl zwischen "plain text" und "HTML" in der Ansicht angeboten wird.
Nachtrag: Da ist doch eine Mail um 16:54 bei mir angekommen, aber diese wird nur (in beiden Programmen) - wie bei dir - als leerer Text mit Anhang "Teilstück 1 (365 Bytes)" angezeigt. Und dadrin ist dann der RTF-formatierte Text.
Ich denke, du wirst dann wohl HTML benutzen müssen (wenn du möglichst viele EMail-Clients unterstützen möchtest).
Edit: Evtl. hilft dir dann aus der JEDI Komponentensammlung die Klasse TJvRichEditToHtml?!
Für diesen Beitrag haben gedankt: Gagga
|
|
Gagga
Beiträge: 103
Win 11
Delphi 12 Athen Pro
|
Verfasst: Mo 04.05.20 17:14
Da wird mir wohl nichts anderes übrig bleiben. Hatte mir die 24 MB schon `mal heruntergeladen, aber die Hoffnung gehegt, ich komme irgendwie anders zum Ziel.
Das grenzt langsam an Arbeit.
Dir auf jeden Fall ganz herzlichen Dank für Deine Unterstützung!
Gruß
Gagga
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 05.05.20 07:51
Wenigstens weißt du jetzt, daß es grundsätzlich mit dem HTML-Code funktioniert.
Ja, so ist das beim Programmieren: kaum hat man eine Sache am Laufen, kommen die nächsten Hürden...
|
|