NYCPHP Meetup

NYPHP.org

[nycphp-talk] Multi part related emails

Brian Pang bpang at bpang.com
Fri Aug 1 14:01:54 EDT 2003


This looks similar enough to one that I worked up... although mine seems
to have some unknown problem with Lotus Notes (1 client uses that so I
had to go with a PERL module solution for their site instead).

However, I found that the chunk_split() would insert a literal space
every chucklen (default of 76) which was totally screwing everything up.

So I just nixed the chunk_split() and it worked ok, except for Lotus
Notes.. but who cares about that ;)



> I had this same need and found this bit of code on the web which I
modified
> a bit to suit my need.  I can't remember where I got it, and I would
like to
> give credit back to the original author, but they didn't put anything into
> the comments.
> 
> The function should send any kind of file as part of a multi-part
email.  I
> used it for a gif.  In testing it, it seemed to work fine.  In terms of
> compatibility, I did find that one webmail client (IMP) didn't handle the
> attachment correctly, but forwarding it to another mail client from
IMP was
> fine.  Outlook 97 handles it fine.
> 
> Hope this helps.
> 
> Mike
> 
> Here it is.
> 
> <?php 
> // Read POST request params into global vars 
> 
> function mail_attachment
> ($to,$from,$subject,$message,$file_location,$filename) {
> 
> /*
> if you want to play with the function, just uncomment what you want from
> this section and shove some values in.
> 
> $to      = $_POST['to']; 
> $from    = $_POST['from']; 
> $subject = $_POST['subject']; 
> $message = $_POST['message'];
> 
> $to="someone at somewhere.com";
> $subject="test attachment";
> $message="this is just a test.";
> $file_location="/www/yourserver/somewhere/";
> $filename="yourfile.gif";
> */
> 
> 
> //File uploads in PHP 4.1 are placed in a special $_FILES array, so we
fetch
> the values we need out of it:
> 
> // Obtain file upload vars 
> $fileatt      = $_FILES['fileatt']['tmp_name']; 
> $fileatt_type = $_FILES['fileatt']['type']; 
> $fileatt_name = $_FILES['fileatt']['name'];
> 
> //For the sake of brevity, we'll assume that the required parameters ($to
> and $from) now have valid values (email addresses) in them. Normally we
> would check their format with regular expressions.
> 
> //Next, we use the $from value to begin building the extra headers for the
> email:
> 
> $headers = "From: $from";
> 
> //Next we check the $fileatt variable, which may or may not contain
the path
> and filename to an uploaded file attachment. We use PHP's is_uploaded_file
> function to find out:
> 
> if (file_exists($file_location.$filename)) { 
>  // Read the file to be attached ('rb' = read binary) 
>  $file = fopen($file_location.$filename,'rb'); 
>  $data = fread($file,filesize($file_location.$filename)); 
>  fclose($file);
> 
> //Having read in the data for the file attachment, we need to set up the
> message headers to send a multipart/mixed message:
> 
>  // Generate a boundary string 
>  $semi_rand = md5(time()); 
>  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
>   
>  // Add the headers for a file attachment 
>  $headers .= "\nMIME-Version: 1.0\n" . 
>              "Content-Type: multipart/mixed;\n" . 
>              " boundary=\"{$mime_boundary}\"";
> 
> //Now for the message body itself. This works just as we saw for the text
> part of a mixed message in the previous section:
> 
>  // Add a multipart boundary above the plain message 
>  $message = "This is a multi-part message in MIME format.\n\n" . 
>             "--{$mime_boundary}\n" . 
>             "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . 
>             "Content-Transfer-Encoding: 7bit\n\n" . 
>             $message . "\n\n";
> 
> //Now, to allow for binary file types, we need to use Base64 encoding to
> convert the (possibly binary) file attachment data to a text-only format
> suitable for sending by email. All email programs in popular use support
> Base64 encoding of file attachments, so this is the best way to go.
> Fortunately, PHP provides a function for Base64 encoding:
> 
>  // Base64 encode the file data 
>  $data = chunk_split(base64_encode($data));
> 
> //We now have everything we need to write the portion of the message that
> contains the file attachment. Here's the code:
> 
>  // Add file attachment to the message 
>  $message .= "--{$mime_boundary}\n" . 
>              "Content-Type: {$fileatt_type};\n" . 
>              " name=\"{$filename}\"\n" . 
>              "Content-Disposition: attachment;\n" . 
>              " filename=\"{$filename}\"\n" . 
>              "Content-Transfer-Encoding: base64\n\n" . 
>              $data . "\n\n" . 
>              "--{$mime_boundary}--\n"; 
> }
> 
> //That completes the modifications necessary to accommodate a file
> attachment. We can now send the message with a quick call to mail:
> 
> // Send the message 
> $ok = @mail($to, $subject, $message, $headers); 
> /*if ($ok) { 
>  echo "<p>Mail sent! Yay PHP!</p>"; 
> } else { 
>  echo "<p>Mail could not be sent. Sorry!</p>"; 
> } 
> */
> return $ok;
> } //end of function
> ?>
>  
> 
> 
> > Hello all!
> > 
> > I'm wondering if anyone has experience with multipart-related html
emails.
> > 
> > I'd like to send out an html email with embedded images, that do NOT
> > reference
> > an external img src, but rather another "part" of the email.
> > 
> > For eaxample, the first part is the html code, which references an image
> > thusly (it's quoted-printable):
> > *************************************************
> >                              
> > *************************************************
> > 
> > as a second part, the image is encoded:
> > *************************************************
> > ------=_NextPart_000_0000_01C35826.C5C0BC10
> > Content-Type: image/gif
> > Content-Transfer-Encoding: base64
> > Content-Location: file:email2.gif
> > 
> >
R0lGODlh8wF3AdUAAP///wAAAP8B/wAA/wD/AP8AAAH///7/AKWlpUNDQzHDw39/f/+5uf96eq
> > am
> > <snip>
> > *************************************************
> > 
> > My questions are:
> > 1. Does anyone know how well supported across email clients
> > "multipart-related" emails are?
> > 
> > 2. Does anyone know of a freely available script for authoring these?
> > 
> > Thanks all!
> > 
> > --
> > WF
> > 
> > _______________________________________________
> > talk mailing list
> > talk at lists.nyphp.org
> > http://lists.nyphp.org/mailman/listinfo/talk
> _______________________________________________
> talk mailing list
> talk at lists.nyphp.org
> http://lists.nyphp.org/mailman/listinfo/talk
> 
> 






More information about the talk mailing list