Martin aus Wien: Multipart Email

Liebe alle,

ich blick nicht mehr durch, bitte um Hilfe: Was ist hier falsch?

Es soll eine HTML-Mail erzeugt werden, die inline ein Bild enthält. Als Alternative wird eine plain text Nachricht angeboten, und ein PDF-Attachment soll auch mitgeschickt werden.

Outlook gibt die Mail so wieder, wie sie sein soll. Es zeigt die HTML mit dem Bild an und zeigt an, dass ein Attachment vorhanden ist. Das Attachment lässt sich korrekt öffnen.

Nicht aber Pegasus und diverse Webmails, die ich getestet habe. Pegasus zeigt die HTML-Mail an, aber ohne das Bild (Auch nicht mit Sicherheits-Platzhalter). Es erkennt, dass zwei alternative message formats vorhanden sind, findet aber darüber hinaus nur ein attachment type unknown, erkennt also weder das JPG noch das PDF.

Hier ist der relevante Code:

---------------------------------------------------------------
---------------------------------------------------------------

$headers .= "
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="$mime_boundary_1"";

$message = "
--$mime_boundary_1
Content-type: multipart/related; boundary="$mime_boundary_2"

--$mime_boundary_2
Content-type: multipart/alternative; boundary="$mime_boundary_3"

--$mime_boundary_3
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 7bit
Content-description: Mail message body

$text_message

--$mime_boundary_3
Content-type: text/html; charset=iso-8859-1
Content-transfer-encoding: 7bit
Content-description: Mail message body

$html_message

--$mime_boundary_3--

--$mime_boundary_2
Content-type:image/jpeg;
name="header.jpg"
Content-ID: <".$header_img_id.">
Content-disposition: attachment;
filename="header.jpg"
Content-transfer-encoding: base64

$header_img_data

--$mime_boundary_2--

--$mime_boundary_1
Content-type:$attm_type;
name="".basename($attm_filename).""
Content-disposition: attachment;
filename="".basename($attm_filename).""
Content-transfer-encoding: base64

$attachment_data

--$mime_boundary_1--
";

mail($to,$subject,$message,$headers);
}

-------------------------------------------------------
-------------------------------------------------------

Und hier ist auch die raw message die Pegasus anzeigt:

...
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="==Multipart_Boundary_1_xb4c34109a545adab07a54d98f5c11be7x"
X-Track: ZnJvb3psZTp3d3cua3dpa2suaW5mbw==
X-Qmail-Scanner-Message-ID: 118223751276814180@oak
X-Spam-Virus: No
X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on avocado
X-Spam-Level:
X-Spam-Status: No, score=-0.6 required=5.0 tests=ALL_TRUSTED,
 HTML_IMAGE_ONLY_08,HTML_MESSAGE,HTML_TAG_EXIST_TBODY,HTML_TITLE_EMPTY
 autolearn=disabled version=3.0.3
X-PMFLAGS: 570949760 0 1 PJY91L1R.CNM

--==Multipart_Boundary_1_xb4c34109a545adab07a54d98f5c11be7x
Content-type: multipart/related; boundary="==Multipart_Boundary_2_x9f4ed0e71ba7829960fee3bc6c68819cx"

--==Multipart_Boundary_2_x9f4ed0e71ba7829960fee3bc6c68819cx
Content-type: multipart/alternative; boundary="==Multipart_Boundary_3_x67aaacb0a36c5f010b2249ebc94b806dx"

--==Multipart_Boundary_3_x67aaacb0a36c5f010b2249ebc94b806dx
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 7bit
Content-description: Mail message body

Das ist eine Testmail
Hier kommt Text

Hier müsste der Footer stehen

--==Multipart_Boundary_3_x67aaacb0a36c5f010b2249ebc94b806dx
Content-type: text/html; charset=iso-8859-1
Content-transfer-encoding: 7bit
Content-description: Mail message body

<html>
<head>
  <title></title>
</head>
<body>
 <P>
<TABLE style="WIDTH: 750px; BORDER-COLLAPSE: collapse">
<TBODY>
<TR>
<TD><IMG height=216 src="cid:cbceeca0bc4619ee0d9e0fb2acd9ab75@Gioia" width=758 align=left border=0></TD></TR>
<TR>
<TD style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; PADDING-BOTTOM: 15px; PADDING-TOP: 15px">
<H3>Das ist eine Testmail</H3>
<DIV><EM>Hier kommt Text</EM></DIV></TD></TR>
<TR>
<TD style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; PADDING-BOTTOM: 15px; PADDING-TOP: 15px">
<HR>
<STRONG>Hier müsste der Footer stehen</STRONG></TD></TR></TBODY></TABLE></P>
</body>
</html>

--==Multipart_Boundary_3_x67aaacb0a36c5f010b2249ebc94b806dx--

--==Multipart_Boundary_2_x9f4ed0e71ba7829960fee3bc6c68819cx
Content-type:image/jpeg;
name="header.jpg"
Content-ID: cbceeca0bc4619ee0d9e0fb2acd9ab75@Gioia
Content-disposition: attachment;
filename="header.jpg"
Content-transfer-encoding: base64

/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwM
DAwMEAwODxAPDgwTExQ ...

--==Multipart_Boundary_2_x9f4ed0e71ba7829960fee3bc6c68819cx--
--==Multipart_Boundary_1_xb4c34109a545adab07a54d98f5c11be7x
Content-type:application/pdf;
name="Newsletter_Dummy.pdf"
Content-disposition: attachment;
filename="Newsletter_Dummy.pdf"
Content-transfer-encoding: base64

JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVyIC9GbGF0ZURlY29k
ZT4+CnN0cmVhbQp4nO1aS2/cNhC+61foVqnAsnw/j ...

--==Multipart_Boundary_1_xb4c34109a545adab07a54d98f5c11be7x--

---------------------------------------------------------------
---------------------------------------------------------------

Gruß und Dank (herzlichst)

Martin

  1. Also, ich hab eine Lösung gefunden, die mir aber nicht sauber erscheint - obwohl sie in allen Email-Programmen, die ich erreichen kann, richtig angezeigt wird.

    Die ganze multipart/related Geschichte scheint jetzt überflüssig zu sein.

    Wie gesagt, da ich jetzt nur durch rumprobieren draufgekommen bin, wäre ich doch dankbar, wenn mir jemand die Fehler im ersten Versuch erklären könnte. (Das mit Einrücken der Header-Fortsetzungszeilen hab ich inzwischen schon gemerkt).

    Hier der neue Code:

    ----------------------------------------------------------------
    ----------------------------------------------------------------

    $message = "

    --$mime_boundary_1
    Content-type: multipart/related;
     boundary="$mime_boundary_2"

    --$mime_boundary_2
    Content-type: multipart/alternative;
     boundary="$mime_boundary_3"

    --$mime_boundary_3
    Content-type: text/plain;
     charset=iso-8859-1
    Content-transfer-encoding: 8bit
    Content-description: Mail message body

    $text_message

    --$mime_boundary_3
    Content-type: text/html;
     charset=iso-8859-1
    Content-transfer-encoding: 8bit
    Content-description: Mail message body

    $html_message

    --$mime_boundary_3--

    --$mime_boundary_2--

    --$mime_boundary_1
    Content-type:$attm_type;
     name="".basename($attm_filename).""
    Content-disposition: attachment;
     filename="".basename($attm_filename).""
    Content-transfer-encoding: base64

    $attachment_data

    --$mime_boundary_1
    Content-type:image/jpeg;
     name="header.jpg"
    Content-ID:<$header_img_id>
    Content-disposition: inline;
     filename="header.jpg"
    Content-transfer-encoding: base64

    $header_img_data

    --$mime_boundary_1--
    ";

    mail($to,$subject,$message,$headers);

    -----------------------------------------------------
    -----------------------------------------------------

    Gruß und Dank

    Martin

    1. Eine Teilantwort, für alle, die's interessiert: Tabs sind keine Leerzeilen. Nur kann man die leicht übersehen. Wenn man also statt einer Leerzeile eine Zeile mit einem Tab hat, erkennt das Email-Programm den Header nicht als Header. Jedenfalls nicht, wenn es sich strikt an den(die, das) RFC hält.

      Gruß und Dank an alle, die sich möglicherweise mit meiner Frage beschäftigt haben.

      Martin

  2. Hallo!

    Ich kann dir da nicht direkt helfen aber ich verwende zum Versenden das Framework htmlmimemail5.
    Funktioniert einwandfrei und ist einfach zu implementieren.

    mfg
      frafu

    1. Danke, das schau ich mir gern an. Aber ich möchte einmal die Grundlagen kapieren, darum: Weiterhin dankbar für jede Auskunft!

      Martin