Building A PHP-Based Mail Client (part 2) - A Picture Is Worth A Thousand Words
(Page 2 of 7 )
The best way to understand how message attachments work is with an example. Consider the following email message, which contains no attachments,
Return-Path: <jane@some.domain.com>
Received: from localdomain (unknown [205.89.123.112])
by mail.domain.com (Postfix) with ESMTP id B0AYBHA41
for <john@some.domain.com>; Thu, 6 Dec 2001 21:05:51 +0530 (IST)
Message-Id: <3.3.7.32.20011206210943.00b26d40@melonfire.com>
Date: Thu, 06 Dec 2001 21:09:43 +0500
To: John Doe <john@some.domain.com>
From: Jane Doe <jane@some.domain.com>
Subject: Photos
Mime-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Do you still have those vacation photos with you? Send me a copy if you do.
- Jane
and then contrast it with this one, which does.
Return-Path: <john@some.domain.com>
Received: from localdomain (unknown [205.89.123.112])
by mail.domain.com (Postfix) with ESMTP id B0AYBHA41
for <jane@some.domain.com>; Thu, 6 Dec 2001 21:05:51 +0530 (IST)
Message-Id: <3.0.3.32.20011207082225.006e927c@localhost>
Date: Fri, 07 Dec 2001 08:22:25 +0500
To: Jane Doe <jane@some.domain.com>
From: John Doe <john@some.domain.com>
Subject: Re: Photos
Mime-Version: 1.0
Content-Type: multipart/mixed;
boundary="=====================_1007675545==_"
--=====================_1007675545==_
Content-Type: text/plain; charset="us-ascii"
Hi Jane,
Find photos attached.
John
--=====================_1007675545==_
Content-Type: application/zip; name="photos1.zip";
x-mac-type="705A4950"; x-mac-creator="705A4950"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="photos1.zip"
UEsDBBQAAAAIABythCvu1mnpugIAALsIAAALAAAAY29tcG9zZS5waHC1lltP2zAUx59Xqd/
-- snip --
AK6LAAAAAA==
--=====================_1007675545==_
Content-Type: application/zip; name="photos2.zip";
x-mac-type="705A4950"; x-mac-creator="705A4950"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="photos2.zip"
UEsDBBQAAAAIAACRDSux3m3PFwIAABsIAAAXAAAAc29hcGxpYi5zb2FwaW50ZXJvcC5waHC
-- snip --
cFBLBQYAAAAACwALALcCAABRfQAAAAA=
--=====================_1007675545==_--
As you can see, the message containing attachments differs
from the plaintext message in a couple of important ways.
1. Since it consists of different parts (one for the body and one for each attachment), it's Content-Type: header specifies the message type as "multipart/mixed".
Content-Type: multipart/mixed;
2. The various message sections are demarcated by a boundary
"marker"; this marker is unique to each message, and is defined in the main message header so that MIME-compliant mail clients can distinguish between the various message parts.
Content-Type: multipart/mixed;
boundary="=====================_1007675545==_"
If you look at the example above, you'll see that, as
specified in the message header, the boundary marker "=====================_1007675545==_" is used as a separator between the different parts of the message.
3. Since the SMTP protocol cannot handle binary data, binary attachments - in this case, zip archives - must be encoded into a text representation using one of a number of different encoding methods. This information, together with information on the attachment type and original filename, appears in the header for each message section.
Content-Type: application/zip; name="photos2.zip";
x-mac-type="705A4950"; x-mac-creator="705A4950"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="photos2.zip"
This provides the mail client with all the information it
needs to decode and display the attachment. It can use the Content-Transfer-Encoding: header to determine how best to decode the text block back into binary data, the filename to determine what the resulting file should be called, and the Content-Disposition: header to decide whether the binary data should be displayed as an attachment or within the message body.
Note that this discussion is restricted to MIME attachments only. Other standards to handle mail attachments do exist. Take a look at
http://www.faqs.org/rfcs/rfc2045.html for the MIME specification.
Next: The Way Things Work >>
More PHP Articles
More By icarus, (c) Melonfire