Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   INDY10, EMail multipart/alternative (https://www.delphipraxis.net/172031-indy10-email-multipart-alternative.html)

FrankJ28 9. Dez 2012 17:31

INDY10, EMail multipart/alternative
 
Hallo,
wie komme ich an die Inhalte eines Mail multipart/alternative ran? Die Mail steckt derzeit in einem TidMessage.
Danke an die Wissenden
Ciao
Frank

Olli73 9. Dez 2012 21:52

AW: INDY10, EMail multipart/alternative
 
Also ich ermittle den Mailbody (Text) folgendermaßen:
Code:
  //Mailbody ermitteln:
  S := '';
  S3 := LowerCase(Msg.ContentType);
  if (S3 = 'text/plain') OR (S3 = 'text/html') then begin
    S := Msg.Body.Text;
  end else begin
    IsAlternative := ( S3 = 'multipart/alternative' );
    for i := 0 to Msg.MessageParts.Count - 1 do begin
      if (Msg.MessageParts.Items[i] is TIdText) then begin
        if LowerCase(Msg.MessageParts.Items[i].ContentType) = 'multipart/alternative' then begin
          isAlternative := true;
        end else if LowerCase(Msg.MessageParts.Items[i].ContentType) = 'text/plain' then begin
          if NOT isAlternative then
            S := S + TIdText(Msg.MessageParts.Items[i]).Body.Text;
        end else if LowerCase(Msg.MessageParts.Items[i].ContentType) = 'text/html' then begin
          S := S + TIdText(Msg.MessageParts.Items[i]).Body.Text;
        end else begin
          S := S + TIdText(Msg.MessageParts.Items[i]).Body.Text;
        end;
      end;
    end;
  end;
Bei "multipart/alternative" wird dabei nur die HTML-Version angezeigt.
.

FrankJ28 10. Dez 2012 07:43

AW: INDY10, EMail multipart/alternative
 
Hallo,
danke für deinen Snippet, der funktioniert auch als solcher. Nun fallen mir auch Mail vom Typ multipart/related in die Hände. Da haben die MessageParts einen ContentType multipart/alternative. Wie löst man denn die auf?
Danke und ciao
Frank

Olli73 10. Dez 2012 12:40

AW: INDY10, EMail multipart/alternative
 
Zitat:

Zitat von FrankJ28 (Beitrag 1194894)
Nun fallen mir auch Mail vom Typ multipart/related in die Hände. Da haben die MessageParts einen ContentType multipart/alternative. Wie löst man denn die auf?

Ich nutze bisher nur obigen Code plus einen Codeteil, der die Anhänge auflistet und zum Download anbietet. Das funktioniert prinzipiell auch mit "multipart/related", nur mit dem "Problem", dass die Anhänge/Objekte bei "multipart/related" normalerweise inline dargestellt werden sollten und bei mir dort halt nix oder ein Platzhalter erscheint und das Objekt (Bild, ...) dafür als Anlage zum Download angeboten wird.

Will man es (korrekterweise) inline darstellen, muss man im Text nach (z.B.) "{image file=cid:950118.AECB@XIson.com}" suchen und an dieser Stelle die Anlage mit der entsprechenden Content-ID einfügen/anzeigen.

FrankJ28 10. Dez 2012 17:26

AW: INDY10, EMail multipart/alternative
 
Hallo Olli,
so dachte ich bislang auch. Nur stoße ich derzeit vermehrt auf Mail, die den Textinhalt im related oder mixed-Teil unterbringen. Da gibt es plötzlich jede Menge Abschnitte mit multipart/alternative und darin erst die eigentliche Message

Code:
Content-Type: multipart/alternative; boundary="----=_Part_1650115_1696814479.1355114756495";
   boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"

--FwDNomqXkhucLd61sob0y=_quOXxxqWTyj
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Ciao
Frank

Olli73 10. Dez 2012 18:20

AW: INDY10, EMail multipart/alternative
 
Hast du meinen Code getestet? Wo genau liegt das Problem?
Da ich alle Message-Parts durchgehe und dabei alle Texte "übernehme", sollten zumindest am Ende alle Textteile vorhanden sein.

Eventuell mal zum Testen bei dem
Code:
if NOT isAlternative then
  S := S + TIdText(Msg.MessageParts.Items[i]).Body.Text;
die erste Zeile weglassen, dann sind es wirklich alle Texte, auch wenn sie "doppelt" (html + plain) sind.

FrankJ28 10. Dez 2012 18:44

AW: INDY10, EMail multipart/alternative
 
Hi,
das Problem liegt darin, das es nur einen MessagePart gibt (Content-Type: multipart/alternative;) und darin verbergen sich die Inhalte (text/plain, text/html etc). Nach deiner Lösung sehe ich dann den Inhalt des kompletten multipart/alternatives oder multipart/mixed. Ich hoffte, dass es Methoden gibt, über die man an die eingebetteten Teile kommt.
Ciao
Frank

Olli73 10. Dez 2012 18:50

AW: INDY10, EMail multipart/alternative
 
Zitat:

Zitat von FrankJ28 (Beitrag 1194945)
Code:
Content-Type: multipart/alternative; boundary="----=_Part_1650115_1696814479.1355114756495";
   boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"
...

Was mir allerdings komisch vorkommt, dass da "boundary" 2 mal vorkommt. Da sollte eigentlich (auch bei multipart/alternative) nur 1 Angabe stehen, siehe hier (das Beispiel). Wobei ich sehe gerade, dort weiter unten steht auch was von unterschiedlichen Content-ID's... :gruebel:

Olli73 10. Dez 2012 18:56

AW: INDY10, EMail multipart/alternative
 
Zitat:

Zitat von FrankJ28 (Beitrag 1194956)
Hi,
das Problem liegt darin, das es nur einen MessagePart gibt (Content-Type: multipart/alternative;) und darin verbergen sich die Inhalte (text/plain, text/html etc). Nach deiner Lösung sehe ich dann den Inhalt des kompletten multipart/alternatives oder multipart/mixed. Ich hoffte, dass es Methoden gibt, über die man an die eingebetteten Teile kommt.

Aber das mache ich doch und es funktioniert bei mir auch. Ich laufe alle Message-Parts (das sind alle Texte UND Anhänge) durch und (nur) bei TIdText (html / plain / ...) kopiere ich den Inhalt (bei Alternative nur einen davon -> html) in den string...

Olli73 10. Dez 2012 19:04

AW: INDY10, EMail multipart/alternative
 
Zitat:

Zitat von FrankJ28 (Beitrag 1194956)
Hi, das Problem liegt darin, das es nur einen MessagePart gibt (Content-Type: multipart/alternative;) und darin verbergen sich die Inhalte (text/plain, text/html etc).

Sicher dass es dann nur 1 MessagePart (multipart/alternative) gibt? Also ich erhalte da 3 MessageParts: multipart/alternative, text/plain und text/html.

Habe es selbst mit einigen solcher Nachrichten erfolgreich getestet, allerdings hatten die nur 1 Boundary-Angabe, wie oben schon erwähnt.

FrankJ28 10. Dez 2012 21:17

AW: INDY10, EMail multipart/alternative
 
Hi,
Zitat:

Return-Path: <20121210044556c7036e85cd5d422ea3a2d8502c7d84d4-C17QV6P2K14K3F@bounces.amazon.com>
Date: Mon, 10 Dec 2012 05:45:56 +0100
From: "Amazon.de" <promotion5@amazon.de>
To: "f@a.de" <f@ade>
Subject: Smartphones, TVs, Kameras,
=?UTF-8?B?S29wZmjDtnJlcg==?= und mehr
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Wn=_j6vvMfV6akXAulegGZrbmlsRUc1Tx9"
Bounces-to: 20121210044556c7036e85cd5d422ea3a2d8...ces.amazon.com
Reply-To:
20121210044556c7036e85cd5d422ea3a2d8...ces.amazon.com

This is a multi-part message in MIME format

--Wn=_j6vvMfV6akXAulegGZrbmlsRUc1Tx9
Content-Type: multipart/alternative; boundary="----=_Part_1650115_1696814479.1355114756495";
boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"

--FwDNomqXkhucLd61sob0y=_quOXxxqWTyj
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Amazon.de
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3 D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Liebe Kundin, lieber Kunde,=20

jede Woche neue Schn=E4ppchen bei unseren Elektronik & Foto Restposten=
sichern.

Hier klicken
http://www.amazon.de/gp/search/ref=3...F8&page=3D1&r=
h=3Dn%3A562066%2Cn%3A%21425405031%2Cn%3A%214254060 31%2Cn%3A10406341&bb=
n=3D10406341


--FwDNomqXkhucLd61sob0y=_quOXxxqWTyj
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline



<html>
<head>
<title>Amazon.de</title>
</head>
<body bgcolor=3D"#ffffff" style=3D"margin: 10px 10px;"

><img src=3D"http://www.amazon.de/gp/r.html?R=3D1RE7WII0UVNB9&C=3D18KE=
R15IVQKMF&H=3DWV33YI5GCVJZPHIF2MCUOKCJTO4A&T=3DO&U =3Dhttp%3A%2F%2Fimag=
es-eu.amazon.com%2Fimages%2FG%2F01%2Fnav%2Ftransp.gif " /

>
<img src=3D"http://www.amazon.de/gp/r.html?R=3D1RE7WII0UVNB9&C=3D18KER=
15IVQKMF&H=3DJBG7FGKYNTBA2ROFJTAF3QNACSGA&T=3DE&U= 3Dhttp%3A%2F%2Fimage=
s-eu.amazon.com%2Fimages%2FG%2F01%2Fnav%2Ftransp.gif " /></body>
</html>


--FwDNomqXkhucLd61sob0y=_quOXxxqWTyj--

--Wn=_j6vvMfV6akXAulegGZrbmlsRUc1Tx9--

.
Hier ist einmal so ein Beispiel. Bekommst Du das ordentlich ausgepackt?
Danke und ciao
Frank

Olli73 10. Dez 2012 22:40

AW: INDY10, EMail multipart/alternative
 
[QUOTE=FrankJ28;1194987]
Zitat:

Content-Type: multipart/alternative; boundary="----=_Part_1650115_1696814479.1355114756495";
boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"
Das erste boundary kommt mich komisch vor, zumal es im gesamten Text sonst nicht mehr vorkommt, bei der zweiten Zeile ist drauf zu achten, dass sie mit einem "TAB" beginnt.

Ich hatte Anfangs ähnliche Probleme (doppelte Einträge, falsche Umbrüche), beim Versenden(!) von mails mit den Indy-Komponenten in D2009, die noch fehlerhaft waren. Die anderen Mailprogramme konnten es dann auch nicht darstellen.

Hast du mal verglichen, wie deine obige mail in anderen Mailprogrammen ankam/ankommt (doppeltes boundary, ...)?

FrankJ28 10. Dez 2012 23:13

AW: INDY10, EMail multipart/alternative
 
Hi,
jo, das File als eml und in Outlook geladen klappt. Von der Sorte habe ich neuerdings zu Hauf.
Mein Mail-Client lief bislang die letzten Jahre problemlos.
Ciao
Frank

Olli73 10. Dez 2012 23:19

AW: INDY10, EMail multipart/alternative
 
Ich habe deine "mail" jetzt mal in meine Datenbank eingefügt und versucht anzuzeigen - geht wirklich nicht, auch wenn ich das boundary anpasse. Ich habe aber genügend mails, die den gleichen Aufbau haben und einwandfrei funktionieren... :gruebel:

FrankJ28 11. Dez 2012 09:48

AW: INDY10, EMail multipart/alternative
 
Hi,
jo, das Kopfkratzen teile ich mit dir. INDY gibt ja nur einen MessagePart zurück, vom Typ multipart/alternative. Nun hoffte ich eben, dass man über

Delphi-Quellcode:
idMsg.MessageParts.Items[i].MessageParts.Count
an die dort eingebetteten Teile kommt, da wieder durchiteriert und sich die gewünschten Teile zieht.
Ciao
Frank

Olli73 11. Dez 2012 10:24

AW: INDY10, EMail multipart/alternative
 
Zitat:

Zitat von FrankJ28 (Beitrag 1195020)
Hi,
jo, das Kopfkratzen teile ich mit dir. INDY gibt ja nur einen MessagePart zurück, vom Typ multipart/alternative. Nun hoffte ich eben, dass man über
idMsg.MessageParts.Items[i].MessageParts.Count an die dort eingebetteten Teile kommt, da wieder durchiteriert und sich die gewünschten Teile zieht.

Normalerweise(!) wird aus dieser Hierarchie eine "flache Liste", man kann also in einem Rutsch alle Parts durchlaufen (wie in meinem Code).

FrankJ28 11. Dez 2012 10:37

AW: INDY10, EMail multipart/alternative
 
Jo, das dachte/hoffte ich auch. Vielleicht liest ja jemand von den Indy-Gurus hier mit. Könnte ja auch ein Bug bei INDY sein.
Ciao
Frank

Olli73 11. Dez 2012 11:19

AW: INDY10, EMail multipart/alternative
 
Also das hier geht bei mir:

Code:
Return-Path: <20121210044556c7036e85cd5d422ea3a2d8502c7d84d4-C17QV6P2K14K3F@bounces.amazon.com>
Date: Mon, 10 Dec 2012 05:45:56 +0100
From: "Amazon.de" <promotion5@amazon.de>
To: "f@a.de" <f@ade>
Subject: Smartphones, TVs, Kameras,
 =?UTF-8?B?S29wZmjDtnJlcg==?= und mehr
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Wn=_j6vvMfV6akXAulegGZrbmlsRUc1Tx9"
Bounces-to: [email]20121210044556c7036e85cd5d422ea3a2d8502c7d84d4-C17QV6P2K14K3F@bounces.amazon.com[/email]
Reply-To:
 [email]20121210044556c7036e85cd5d422ea3a2d8502c7d84d4-C17QV6P2K14K3F@bounces.amazon.com[/email]

This is a multi-part message in MIME format

--Wn=_j6vvMfV6akXAulegGZrbmlsRUc1Tx9
Content-Type: multipart/alternative;
   boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"

--FwDNomqXkhucLd61sob0y=_quOXxxqWTyj
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Amazon.de
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Liebe Kundin, lieber Kunde,=20

jede Woche neue Schn=E4ppchen bei unseren Elektronik & Foto Restposten=
 sichern.

Hier klicken
[url]http://www.amazon.de/gp/search/ref=3Dpe_IntroBut/?ie=3DUTF8&page=3D1&r=[/url]
h=3Dn%3A562066%2Cn%3A%21425405031%2Cn%3A%21425406031%2Cn%3A10406341&bb=
n=3D10406341


--FwDNomqXkhucLd61sob0y=_quOXxxqWTyj
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline



<html>
<head>
<title>Amazon.de</title>
</head>
<body bgcolor=3D"#ffffff" style=3D"margin: 10px 10px;">
test <b> test </b> test
<img src=3D"http://images.delphipraxis.net/misc/home_48x48.png" />
</body>
</html>


--FwDNomqXkhucLd61sob0y=_quOXxxqWTyj--

--Wn=_j6vvMfV6akXAulegGZrbmlsRUc1Tx9--

.
Habe das eine boundary gelöscht (wie bereits angesprochen) und das HTML bearbeitet, insbesondere das ursprüngliche "img src" hat mir Probleme bereitet.

FrankJ28 11. Dez 2012 15:20

AW: INDY10, EMail multipart/alternative
 
Hallo,
jo, das scheint die Lösung.

Ursprung
Zitat:

Content-Type: multipart/alternative; boundary="----=_Part_1650115_1696814479.1355114756495";
boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"
Korrektur
Zitat:

Content-Type: multipart/alternative;
boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"
dann erkennt INDY korrekt den multipart/alternative. Wo auch immer der 2. boundary herkommen mag, steht der Content-Type solo, klappt es.
Danke Olli für deine Mühe. Jetzt müssen wir nur noch zur Laufzeit so einen Fehler erkennen, korrigieren und der idMessage wieder unterjubeln.
Ciao
Frank

Olli73 11. Dez 2012 15:48

AW: INDY10, EMail multipart/alternative
 
Zitat:

Zitat von FrankJ28 (Beitrag 1195078)
Hallo,
jo, das scheint die Lösung.

Ursprung
Zitat:

Content-Type: multipart/alternative; boundary="----=_Part_1650115_1696814479.1355114756495";
boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"
Korrektur
Zitat:

Content-Type: multipart/alternative;
boundary="FwDNomqXkhucLd61sob0y=_quOXxxqWTyj"
dann erkennt INDY korrekt den multipart/alternative. Wo auch immer der 2. boundary herkommen mag,

Ist ja nicht so, dass ich es nicht schon in Beitrag #8 erwähnt hätte ;)

FrankJ28 11. Dez 2012 16:34

AW: INDY10, EMail multipart/alternative
 
Jo, stimmt schon. Ich habe meinen Hoster einmal auf die Spur geschickt. Dort laufen ja verschiedene Filter. Mir scheint, dass dort Bockmist passiert.


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