Email avec pièce jointe en PHP

Envoyer des fichiers grâce à la fonction mail.

Envoyer un mail en PHP est assez simple grâce à la fonction mail. Il est en revanche plus compliqué d'ajouter une pièce jointe.

Le corps du mail doit ainsi respecter une structure très particulière dont les blocs sont délimités par des frontières. Nous aurons besoin de 2 types de frontières. La première pour séparer le message de la pièce-jointe. La seconde pour délimiter les alternatives du message: HTML ou texte brut.

Envoyer un fichier par mail en PHP

<?php $to = 'foo@bar.com'; $from = 'baz@toto.com'; $subject = 'Email avec fichier'; $messageHhtml = '<b>Le message en HTML</b>'; $fileContent = 'Contenu du fichier.'; $boundaryStructure = md5(rand()); $boundaryAlternatives = md5(rand()); $headers = [ "From: $from", "Reply-To: $from", "Content-Type: multipart/mixed; boundary="$boundaryStructure"" ]; /* Encodage du fichier à envoyer, en accord avec la RFC 2045. */ $attachment = chunk_split(base64_encode($fileContent)); /* * La meilleure façon de faire serait d'externaliser ce qui suit dans un fichier de template. * Pour l'exemple un ob_start est plus facile à comprendre. */ ob_start(); ?> --<?=$boundaryStructure . PHP_EOL /* Première partie de la structure: le message */?> Content-Type: multipart/alternative; boundary="<?=$boundaryAlternatives?>" --<?=$boundaryAlternatives . PHP_EOL /* Première alternative: plain text */?> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit <?=strip_tags($messageHtml)?> --<?=$boundaryAlternatives . PHP_EOL /* Seconde alternative: HTML */?> Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: 8bit <?=$messageHtml?> --<?=$boundaryAlternatives /* Fin des alternatives */?>-- --<?=$boundaryStructure . PHP_EOL /* Seconde partie de la structure: le fichier */?> Content-Type: text/csv; name="nom_fichier.csv" Content-Transfer-Encoding: base64 Content-Disposition: attachment <?=$attachment?> --<?=$boundaryStructure /* Ferme la structure */?>-- <?php $message = ob_get_clean(); $isMailSent = mail($to, $subject, $message, implode(PHP_EOL, $headers));