2009-09-17 7 views
1

J'ai eu du mal à essayer d'envoyer un e-mail avec une pièce jointe en utilisant PHP. Cela fonctionnait mais le corps du message était brouillé. Maintenant j'ai le corps du message au travail mais l'attachement corrompt. J'avais l'habitude d'utiliser l'encodage base64 pour le corps du message mais maintenant j'utilise 7bit. Quelqu'un peut-il me dire ce que je fais mal? PS ne me dites pas que je devrais utiliser une classe pré-faite pour le faire. J'ai essayé plusieurs et ils ont tous échoué à travailler. Si je ne surmonte pas ces problèmes, je n'apprendrai jamais comment le faire correctement. MerciPHP mail() pièce jointe est corrompu

//define the receiver of the email 
$to = '[email protected]'; 
//define the subject of the email 
$subject = 'Your Disneyland Paris entry'; 
//create a boundary string. It must be unique 
//so we use the MD5 algorithm to generate a random hash 
$random_hash = md5(date('r', time())); 
//define the headers we want passed. Note that they are separated with \n 
$mime_boundary = "<<<--==+X[".md5(time())."]"; 

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/'; 
$fileContent = chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf'))); 


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

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

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

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

$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n"; 
$message .= "Content-Transfer-Encoding: 7bit\n"; 
$message .= "\n"; 
$message .= "messagebody \n"; 
$message .= "--".$mime_boundary."" . "\n"; 

$message .= "Content-Type: application/octet-stream;\n"; 
$message .= " name=\"CTF-brochure.pdf\"" . "\n"; 
$message .= "Content-Transfer-Encoding: 7bit \n"; 
$message .= "Content-Disposition: attachment;\n"; 
$message .= " filename=\"CTF_brochure.pdf\"\n"; 
$message .= "\n"; 
$message .= $fileContent; 
$message .= "\n"; 
$message .= "--".$mime_boundary."--\n"; 

//send the email 
$mail_sent = mail($to, $subject, $message, $headers); 
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed"; 
+3

Il est compréhensible que vous souhaitiez le faire par vous-même, mais vous n'allez pas apprendre beaucoup, en plus de simplement comprendre exactement comment encoder correctement un courrier ... :) Si je devais apprendre quelque chose, je déménagerais sur les parties intéressantes de mon projet, sans réinventer la roue ... – Palantir

+0

merci pour le conseil. c'est la seule partie du projet qui reste à régler. :) – Drew

Répondre

1

Je suggère de regarder phpmailer si vous voulez faire des emails complexes.

7

Je peux me tromper, mais je crois que vous devrez encoder le PDF en quelque sorte, 7bit ne fonctionnera pas comme le fichier PDF aura le contenu en dehors de la plage. Pourquoi ne pas utiliser base64 pour le PDF?

+0

merci. Je viens d'essayer et de ne pas changer. – Drew

+0

Quel code avez-vous spécifiquement changé? Avez-vous essayé encodage base64 le message entier ou juste la pièce jointe? À quoi ressemblaient les en-têtes MIME après avoir effectué le changement? – Josh

+0

Je viens de faire le changement à la pièce jointe. Si je base64 le message entier je reçois des caractères étranges comme le corps du message – Drew

1

Je sais que vous avez parlé des classes préfabriquées, mais il y a une raison pour laquelle les gens font cela: pourquoi réinventer la roue? J'utilise SwiftMailer pour les projets - cela ne pourrait pas être plus simple. Voir this SwiftMailer example pour 13 lignes (y compris certaines en blanc) de la façon de créer un message, ajouter une pièce jointe et envoyer. En ce qui concerne la résolution de votre requête actuelle, upvote à la réponse de Josh - je voudrais d'abord changer l'encodage et voir comment vous allez. Avez-vous essayé d'obtenir un exemple d'e-mail avec une pièce jointe qui fonctionne et d'examiner les données brutes?

+0

J'ai essayé swiftmailer pour cela mais il a refusé de travailler. le serveur sur lequel il est mis en place est très nerveux – Drew

Questions connexes