Avec PHP, envoyer un courriel avec un fichier en attachement est loin d'être un jeu d'enfant. On doit normalement construire le message ligne par ligne, ajouter le mime type, configurer le charset, l'encodage, etc... Et ça, c'est quand ça fonctionne correctement.
L'équipe du Zend Framework nous a encore une fois facilité la tâche en créant Zend_Mail. On crée l'instance en y spécifiant l'encodage désiré. Ensuite, on configure les différentes propriétés et on y ajoute l'attachement avec la fonction createAttachment(). Comme cette fonction est appelée de l'instance, le fichier est automatiquement lié à l'objet $mail référencé et fera parti de l'envoi lors de l'appel de send().
$mail = new Zend_Mail('UTF-8');Dans l'exemple ci-dessus, le fichier est transféré à partir d'un formulaire web, d'où l'utilisation de l'array PHP $_FILES mais il pourrait tout aussi bien provenir de l'espace de stockage sur le serveur. Quand vous transférez un fichier, n'oubliez pas de spécifier le enctype multipart/form-data comme dans le formulaire suivant:
// propriétés
$mail->setFrom('email');
$mail->addTo('email');
$mail->setSubject('Le sujet');
$mail->setBodyHtml('Bla bla bla...');
// créer l'attachement
$file = $mail->createAttachment(file_get_contents($_FILES['file_to_upload']['tmp_name']));
$file->type = $_FILES['file_to_upload']['type'];
$file->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$file->filename = $_FILES['file_to_upload']['name'];
$mail->send();
<form method="post" enctype="multipart/form-data">Avez-vous une solution plus claire à proposer ?
<label for="file_to_upload">Fichier en attachement</label>
<input type="file" name="file_to_upload" id="file_to_upload" value="" />
<input type="submit" name="btn" id="btn" value="Envoyer" />
</form>