2010-01-08 7 views
3

J'essaie d'envoyer par courrier électronique une image sur mon serveur en pièce jointe. Pour accomplir cette tâche, j'ai utilisé le script PHP suivant qui saisit un fichier JPG (appelé "php.jpg") situé dans un répertoire appelé "screenshots" de mon serveur et l'envoie en pièce jointe.Problème avec la pièce jointe dans le courrier électronique()

<?php 

$path = "screenshots/php.jpg"; 
$fp = fopen($path, 'r'); 
do //we loop until there is no data left 
{ 
     $data = fread($fp, 8192); 
     if (strlen($data) == 0) break; 
     $content .= $data; 
     } while (true); 
$content_encode = chunk_split(base64_encode($content)); 


$mime_boundary = "<<<--==+X[".md5(time())."]"; 

$headers .= "From: Automatic <[email protected]>\r\n"; 
$headers .= "To: SomeName <[email protected]>\r\n"; 

$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-Type: multipart/mixed;\r\n"; 
$headers .= " boundary=\"".$mime_boundary."\""; 

$message .= "This is a multi-part message in MIME format.\r\n"; 
$message .= "\r\n"; 
$message .= "--".$mime_boundary."\r\n"; 

$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"; 
$message .= "Content-Transfer-Encoding: 7bit\r\n"; 
$message .= "\r\n"; 
$message .= "Email content and what not: \r\n"; 
$message .= "This is the file you asked for! \r\n"; 
$message .= "--".$mime_boundary."\r\n"; 

$message .= "Content-Type: image/jpeg;\r\n"; 
$message .= " name=\"php.jpg\"\r\n"; 
$message .= "Content-Transfer-Encoding: quoted-printable\r\n"; 
$message .= "Content-Disposition: attachment;\r\n"; 
$message .= " filename=\"php.jpg\"\r\n"; 
$message .= "\r\n"; 
$message .= $content_encode; 
$message .= "\r\n"; 
$message .= "--".$mime_boundary."\r\n"; 

$ok = mail("[email protected]", "file by email", $message, $headers); 

Dans l'ensemble, le script fonctionne. Je reçois un e-mail dans ma boîte de réception contenant le texte du message spécifié ci-dessus et une pièce jointe JPG. Stack Overflow ne permet pas de poster une photo parce que je suis nouveau, mais une capture d'écran du message est disponible ici: http://i48.tinypic.com/xfuee0.png

Mon problème se produit lorsque j'essaie d'afficher la pièce jointe. Cliquer sur la pièce jointe ouvre simplement une nouvelle fenêtre de navigateur et affiche une icône d'image manquante.

Voyez-vous des problèmes avec mon script qui empêcheraient l'apparition de l'image?

Toute information serait géniale. Merci!

+0

J'ai essayé les suggestions de wallyk et martinr jusqu'à présent (merci les gars!), Mais pas de chance. Je me demande si la fonction mail est peut-être bien et c'est juste ma boucle fopen qui ne produit pas l'image correcte. Tout autre conseil que quelqu'un pourrait fournir serait apprécié. Merci tout le monde! – Matt

Répondre

0

Je peux voir une raison possible pour laquelle vous ne voyez pas votre image. (Il peut y avoir plus (!).)

Essayez de changer:

$message .= "--".$mime_boundary."\r\n"; 

à

$message .= "--".$mime_boundary."--\r\n"; 

Pour la dernière ligne avant l'appel à la poste (la limite "épilogue").

0

Trois choses sautent:

La première est que la première append aux variables $content et $message et $headers ne définit pas explicitement une nouvelle valeur. C'est, pourquoi ne pas

$headers = "From: Automatic <[email protected]>\r\n"; 

au lieu de comme vous avez:

$headers .= "From: Automatic <[email protected]>\r\n"; 

qui élimine la possibilité que des choses qui restent sont traîner dans les variables.

La seconde est qu'il y a \r\n au lieu de \n qui devrait fonctionner sur tous les systèmes, même Windows. Je doute que ce soit un problème. Troisièmement, la limite de mime de fermeture n'est pas la même que l'ouverture.

+1

Selon la RFC 822, \ r \ n est la bonne façon de terminer les champs d'en-tête. –

3

Pour quiconque rencontrera ce post dans le futur, le problème vient du "Content-Transfer-Encoding" qui aurait dû être défini sur base64.

$message .= "Content-Transfer-Encoding: quoted-printable\r\n"; 

devient:

$message .= "Content-Transfer-Encoding: base64\r\n"; 
Questions connexes