[long] Re: [Ilugc] Mail attachment in php

  • From: suraj@xxxxxxxxxxx (Suraj Kumar)
  • Date: Thu, 19 Dec 2002 10:32:47 +0530

S.Balasubramanian wrote on Wed, Dec 18, 2002 at 05:54:21PM +0530: 

| How to send attachment through mail in php.  Please explain.

A Mail attachment isn't a seperate entity in Internet mail.  The stock
mail functions in PHP donot have a way of adding attachments as simply
as  passing a filename  parameter!  (I've  heard JSP  has a  rich mail
class where you pass a filename as a parameter).

I'm  giving a  quick howto  on  sending an  attachment.  Before  doing
anything,  send  a mail  with  attachments  to  you@localhost and  cat
/var/spool/mail/you.   Try and  understand how  it is  formatted.  All
Internet  mails have  a  Content-Type header  and  a 'boundary'.   The
boundary specifies the start and end of each section within a mail.

The mail msg will use  the "randomstring" specified in the boundary to
differentiate between various parts of  your mail. For instance a mail
with a short message and a small attachment will be like this:

Mail header:

 Content-Type: <content type>; boundary="randomstring"

Mail Body:

 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 this is the mail's main message.  this is not an attachment. your MUA
 will display this.
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="attachment.txt"
 this is the content of the attachment.

Here,   the   various  portions   of   your   mail   starts  with   a
--<randomstring> and the entire  stuff ends with a --<randomstring>--
(note the trailing '--'s).

To sum up all this, the following PHP code should give a small idea of
how you can implement this:


function random_string($len) {

         srand((double) microtime() * 1000000);
         for ($i = 0; $i < $len; $i++) {
             $ret = $ret . chr (rand (65, 65 + 25));

         return $ret;

function add_attachment(&$body, $boundary, $attachment_file) {
  static $init = false;
  $fp = fopen ($attachment_file, 'r');
  $file_data = fread ($fp, filesize ($attachment_file));
  $abs_filename = preg_replace ('/.*\//', '', $attachment_file);
  $buffer = "\r\n" . '--' . $boundary . "\r\n";
  $buffer = $buffer . 'Content-Type: text/plain; charset=us-ascii' . "\r\n";
  $buffer = $buffer . 'Content-Disposition: attachment; filename="' 
    . $abs_filename . '"' 
    . "\r\n\r\n";
  $buffer = $buffer . $file_data;
  if (!$init) {
    $pre = '--' . $boundary . "\r\n"
      . 'Content-Type: text/plain; charset=us-ascii' . "\r\n"
      . 'Content-Disposition: inline' . "\r\n\r\n";
    $init = true;
  $body = $pre . $body . $buffer;

function end_attachments(&$body, $boundary) {
  $body = $body . "\r\n" . '--' . $boundary . '--' . "\r\n";

function get_header($boundary) {
  return 'Content-Type: multipart/mixed; boundary="' . $boundary . '"';


$message = "hi,\nhow are you?\n";

$boundary = random_string(10);
add_attachment($message, $boundary, "/con/con/foo.txt");
add_attachment($message, $boundary, "/con/con/bar.txt");
end_attachments($message, $boundary);
$header = get_header($boundary);
$to = 'suraj@localhost';
$subject = 'attachment test';

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


I would recommend  you to find a full-blown  attachment class first at
phpclasses.org.  What I've given above is just a sample to demonstrate
how to do attachments in PHP.  For sending binary data you may have to
handle a lot more different techniques (base64 encoding, etc.,).  Read
the appropriate RFCs (rfc822, rfc1521,  rfc1522), if you plan to write
your  own ones.  (note that  most of  the code  at  phpclasses.org are
GPLed,  so  it is  illegal  to  misuse  them for  writing  proprietary
| Rarer deeds are signs of greatness,                                  |
| lesser mortals achieve no success                                    |
| (greatness of ascetics - 6), Thirukkural                             |

Other related posts: