Home arrow PHP arrow Page 2 - Building A PHP-Based Mail Client (part 2)

A Picture Is Worth A Thousand Words - PHP

Now that you've got a basic mail reader up and running, it's timeto learn a little more about attachments. This second segment analyzesMIME-encoded attachments, demonstrating how to decode and download them,and then integrates attachment handling features into the primitive mailclient previously demonstrated.

TABLE OF CONTENTS:
  1. Building A PHP-Based Mail Client (part 2)
  2. A Picture Is Worth A Thousand Words
  3. The Way Things Work
  4. Structure And Syntax
  5. Room With A View
  6. Getting Down
  7. Miles To Go
By: icarus, (c) Melonfire
Rating: starstarstarstarstar / 12
January 11, 2002

print this article
SEARCH DEV SHED

TOOLS YOU CAN USE

advertisement
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.

 
 
>>> More PHP Articles          >>> More By icarus, (c) Melonfire
 

blog comments powered by Disqus
   

PHP ARTICLES

- PHP Closures as View Helpers: Lazy-Loading F...
- Using PHP Closures as View Helpers
- PHP File and Operating System Program Execut...
- PHP: Effects of Wrapping Code in Class Const...
- PHP: Building Concrete Validators
- Sanitizing Input with PHP
- Executing Shell Commands with PHP
- Handling File Data with PHP
- File Security and Resources with PHP
- ArrayObject PHP Class Examples
- ArrayObject PHP Class: An Introduction
- Getting File System Data with PHP
- PHP Tools for Working with the File and Oper...
- Working with the File and Operating System w...
- PHP Proxy Patterns: Completing a Blog


© 2003-2012 by Developer Shed. All rights reserved. DS Cluster 4 - Follow our Sitemap

Dev Shed Tutorial Topics: