2011-07-20 30 views
6

Estoy tratando de enviar un correo electrónico utilizando la función mail() en php con un archivo adjunto en PDF. Estoy ejecutando el script en localmachine. Configuré el smtp ip en php.ini. puedo enviar un correo electrónico de texto perfectamente, pero con un archivo adjunto me sale el siguiente error:enviar correo electrónico con el archivo adjunto en PDF

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

¿Puede alguien decirme lo que está mal, por favor?

Aquí está mi código:

<?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); 

?> 
+0

reveladora es la que una línea 55 es que sería un buen comienzo. De lo contrario, este error es una respuesta del servidor * remoto * al que está intentando enviar el correo. – Bobby

+0

@Bobby: dado que solo hay una línea en el código que puede comunicarse con un servidor SMTP, creo que podemos adivinar de forma segura, pero (@Amjad) habría sido una buena práctica señalarlo. – symcbean

Respuesta

0

Yo sugeriría que utilice PHP Mailer para enviar correos electrónicos desde su PHP. Lo he usado con gran éxito en muchas configuraciones diferentes. La clase tiene todos los métodos necesarios para el manejo de las codificaciones, archivos adjuntos, cabeceras de atención al cliente al, enviando a través de Sendmail, etc., etc.

+0

bien, veré, pero puedo agradecer :) – Amjad

7

que utilizo SwiftMailer de PHP (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); 
+0

gracias a todos por la ayuda, el problema está resuelto: D – Amjad

+7

¡Debe aceptar la respuesta correcta! – Eamorr

7

¡El archivo adjunto no entra en los encabezados! Sólo deben declarar las cabeceras MIME:

// 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); 

Tenga en cuenta también que nunca se debe tener 2 terminaciones de línea consecutivos dentro de los encabezados - SMTP utiliza una línea en blanco como separador entre los encabezados y el cuerpo.

Además, la EOL no debe ser el valor por defecto en su sistema operativo - que debe ser la secuencia EOL según la definición de SMTP - es decir, CR + LF

Cuestiones relacionadas