Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

send email with pdf attachment

Tags:

php

email

pdf

I'm trying to send an email using the mail() function in php with a pdf attachment. I'm running the script on localmachine. I set up the smtp ip in php.ini. I can send a text email perfectly but with an attachment I get the following error:

Warning: mail() [function.mail]: SMTP server response: 503 Unexpected command or sequence of commands in C:\AppServ\www\PhpProject1\CV-Generator\testemail2.php on line 55

Can anyone tell me what's wrong please?

Here is my code:

<?php
// download fpdf class (http://fpdf.org)
require('./pdf/fpdf.php');

// fpdf object
$pdf = new FPDF();

// generate a simple PDF (for more info, see http://fpdf.org/en/tutorial/)
$pdf->AddPage();
$pdf->SetFont("Arial","B",14);
$pdf->Cell(40,10, "this is a pdf example");

// email stuff (change data below)
$to = $_GET['send']; 
$from = "[email protected]"; 
$subject = "send email with pdf attachment"; 
$message = "<p>Please see the attachment.</p>";

// a random hash will be necessary to send mixed content
$separator = md5(time());

// carriage return type (we use a PHP end of line constant)
$eol = PHP_EOL;

// attachment name
$filename = "example.pdf";

// encode data (puts attachment in proper format)
$pdfdoc = $pdf->Output("", "S");
$attachment = chunk_split(base64_encode($pdfdoc));


// main header (multipart mandatory)
$headers  = "From: ".$from.$eol;
$headers .= "MIME-Version: 1.0".$eol; 
$headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol.$eol; 
$headers .= "Content-Transfer-Encoding: 7bit".$eol;
$headers .= "This is a MIME encoded message.".$eol.$eol;

// message
$headers .= "--".$separator.$eol;
$headers .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
$headers .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$headers .= $message.$eol.$eol;

// attachment
$headers .= "--".$separator.$eol;
$headers .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
$headers .= "Content-Transfer-Encoding: base64".$eol;
$headers .= "Content-Disposition: attachment".$eol.$eol;
$headers .= $attachment.$eol.$eol;
$headers .= "--".$separator."--";

// send message
mail($to, $subject, "", $headers);

?>
like image 462
Amjad Avatar asked Jul 20 '11 10:07

Amjad


People also ask

How to send an e-mail from a PDF file?

The e-mail body (send via the SMTP DATA command) needs to contain the attachment. This requires code to read the PDF file contents - via UTL_FILE, via DBMS_LOB, via FTP (using UTL_TCP), via UTL_HTTP, etc. Then base64 encode a chunk read.

Can I send a PDF file as an attachment?

Sending a PDF file as an attachment also allows users to open them and review it without intrusion or interruptions by advertisements or data from other sources. Now, let’s take a look at a couple of different ways to send a PDF file as an attachment. How Can I Send A PDF File As An Email Attachment?

How do I attach a PDF file to a chat message?

On your contact list, select the recipient/s of your PDF files. On the text field, click on the Paper Clip icon. Then, on the options that appear on your screen, select the Document option. After that, select the PDF file you wish to attach to your chat message on the list of documents that appear on the screen.

How long does it take to send a PDF file?

Depending on the size of the PDF file you are sending, it can take only a few seconds to a few minutes for the file to attach to the email, chat, or text you are sending. Most email platforms allow you to attach single or multiple files to the message body at a time.


2 Answers

The attachment doesn't go in the headers! They should only declare the MIME headers:

// main header (multipart mandatory)
$headers  = "From: ".$from.$eol;
$headers .= "MIME-Version: 1.0".$eol; 
$headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol; // see below 
$headers .= "Content-Transfer-Encoding: 7bit".$eol;


// message
$msg = "--".$separator.$eol;
$msg .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
$msg .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$msg .= $message.$eol.$eol;

// attachment
$msg .= "--".$separator.$eol;
$msg .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
$msg .= "Content-Transfer-Encoding: base64".$eol;
$msg .= "Content-Disposition: attachment".$eol;
$msg .= $attachment.$eol;
$msg .= "--".$separator."--".$eol;

// send message
mail($to, $subject, $msg, $headers);

Note also that you should NEVER have 2 consecutive line terminations within the headers - SMTP uses a blank line as the seperator between headers and the body.

Also, the EOL should NOT be the default on your operating system - it should be the EOL sequence as defined by SMTP - i.e. CR+LF

like image 121
symcbean Avatar answered Oct 03 '22 18:10

symcbean


I use PHP's SwiftMailer (http://swiftmailer.org/):

require_once('../lib/swiftMailer/lib/swift_required.php');

...


$body="Dear $fname,\n\nPlease find attached, an invoice for the period $startDate - $endDate\n\nBest regards,\n\nMr X";

$message = Swift_Message::newInstance('Subject goes here')
    ->setFrom(array($email => "[email protected]"))
    ->setTo(array($email => "$fname $lname"))
    ->setBody($body);
$message->attach(Swift_Attachment::fromPath("../../invoices_unpaid/$id.pdf"));

$result = $mailer->send($message);
like image 30
Eamorr Avatar answered Oct 03 '22 19:10

Eamorr