2011-07-20 5 views
6

J'essaie d'envoyer un courriel en utilisant la fonction mail() en php avec une pièce jointe au format PDF. Je cours le script sur localmachine. J'ai mis en place l'ip smtp dans php.ini. Je peux envoyer un e-mail de texte parfaitement, mais avec une pièce jointe, je reçois l'erreur suivante:envoyer un courriel avec la pièce jointe 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

Quelqu'un peut-il me dire quel est le problème s'il vous plaît?

Voici mon 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); 

?> 
+0

Telling est que une ligne 55 est serait un bon début. Sinon, cette erreur est une réponse du serveur * distant * auquel vous essayez d'envoyer le courrier. – Bobby

+0

@Bobby - puisqu'il n'y a qu'une seule ligne dans le code qui peut parler à un serveur SMTP, je pense que nous pouvons le deviner en toute sécurité - mais (@Amjad) il aurait été bon de le signaler. – symcbean

Répondre

0

Je suggère que vous utilisez PHP Mailer pour envoyer des emails à partir de votre PHP. Je l'ai utilisé avec beaucoup de succès sur de nombreuses configurations différentes. La classe a toutes les méthodes nécessaires pour les encodages de manutention, les pièces jointes, les en-têtes de custome, l'envoi par sendmail, etc., etc.

+0

ok je verrai wut je peux faire merci :) – Amjad

7

J'utilise SwiftMailer 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

merci les gars pour l'aide le problème résolu: D – Amjad

+7

Vous devez accepter la bonne réponse! – Eamorr

7

La pièce jointe ne va pas dans les en-têtes! Ils ne devraient déclarer les en-têtes 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); 

Notez également que vous ne devriez jamais avoir 2 terminaisons de ligne consécutifs dans les en-têtes - SMTP utilise une ligne vide comme séparateur entre les en-têtes et le corps.

En outre, l'EOL ne doit pas être la valeur par défaut sur votre système d'exploitation - il devrait être la séquence de fin de vie telle que définie par SMTP - à savoir CR + LF

Questions connexes