Envoyer un email html avec pièce jointe en PHP
CrazyCat » 05/ 10/2009 16:50
PHP
|
Envoyer à un ami |
Fil des commentaires de ce billet
C'est toujours un casse-tête pour envoyer un email avec des pièces jointes.
Cette classe est très simple d'utilisation et possède seulement les options basiques. Elle prépare le contenu du mail et utilise simplement la fonction mail() de php pour l'expédier. Le code ne sera quasiment pas détaillé, ci-dessous vous trouverez essentiellement l'explication de l'utilisation et l'accès aux sources.
Configuration de la classe
Il est possible de configurer dans la classe certaines valeurs par défaut:
private $maildatas = array( 'from' => '', // Expéditeur de l'email 'replyto' => '', // Champ Reply-to (si différent de l'expéditeur) 'to' => array(), // Il est possible de remplir ce tableau avec des destinataires par défaut 'cc' => array(), // Idem qu'au-dessus 'bcc' => array(), // Idem qu'au-dessus 'subject' => '', // Sujet de l'email 'body' => '', // Corps du mail 'attlist' => array() // Liste des fichiers joints );
Les divers champs de type email peuvent être de forme simple ( moi@domain.tld ) ou complexe ( Le CrazyCat <moi@domain.tld> ).
Utilisation
Initialisation
La classe peut être instanciée sans arguments, ce qui est utile si des valeurs par défaut ont été configurées, ou en lui passant jusqu'à 4 arguments: $from, $to, $subject et $body.
Notez que dans le cas du To, comme pour les destinataires en Copie Carbone (Cc) et Copie Carbone Aveugle (Bcc), les valeurs s'ajoutent pour permettre d'envoyer le mail à plusieurs personnes en une seule fois.
<?php // instaciation simple $mail =& new PhpMail(); // instanciation avancée $mail =& new PhpMail('moi@pas.la', 'destinataire@invalid.com', 'Sujet de l\'email');
Modification de l'émetteur et du Reply-to
L'adresse d'expédition et de retour peuvent être modifiées, il y a deux formes d'appel de ces méthodes:
// Forme simple, ne mettra que l'adresse email $mail->setFrom( 'crazycat@g33k-zone.org'); // Forme améliorée // Créera une adresse de réponse de la forme "CrazyCat <crazycat@g33k-zone.org>" $mail->setReplyTo( 'crazycat@g33k-zone.org', 'CrazyCat');
Ajout de destinataires
Il est possible d'ajouter des destinataires dans les trois types de champs (To, Cc, Bcc). La syntaxe est la même que pour le From ou le ReplyTo, mais il s'agit bien là d'ajout et non pas de modification. Les 3 méthodes sont:
- addTo($mail, $name)
- addCc($mail, $name)
- addBcc($mail, $name)
Ces méthodes peuvent être appelées plusieurs fois, par exemple:
$mail->addTo('test1@domain.tld', 'Destinataire 1'); $mail->addCc('test2@domain.tld', 'Destinataire 2'); $mail->addCc('test3@domain.tld', 'Destinataire 3'); $mail->addBcc('test4@domain.tld', 'Destinataire 4'); $mail->addBcc('test5@domain.tld', 'Destinataire 5'); $mail->addBcc('test6@domain.tld', 'Destinataire 6');
Ceci enverra le mail à Destinataire 1, avec copies à Destinataire 2 et Destinataire 3, et copie cachée aux trois derniers.
Ajout de pièces jointes
Les pièces jointes doivent être des fichiers présents sur le serveur, leur chemin d'accès peut être soit relatif soit absolu. Ils sont ajoutés par la méthode addAttachement($filename). Il n'y a pas de limitation particulière au niveau de la classe
Sujet, corps du mail
Les méthodes setSubject($subject) et setBody($body) permettent préparer le sujet et le corps de l'email. Aucune vérification n'est faite sur ces champs lors de leur création, mais si le sujet est vide il y aura une erreur fatale.
Envoi du mail
Il suffit d'appeler la méthode execMail():
$mail->execMail();
Options supplémenatires
Charset
Vous pouvez modifier l'encodage de l'email (par défaut iso-8859-1) avec la méthode setCharset().
Attention: Aucune vérification n'est faite sur cette valeur.
Forçage de l'envoi en plain-text
Il est possible d'appeler la méthode execMail() avec le paramètre false. Si aucune pièce n'est jointe au mail, le mail sera donc envoyé en mode texte.
Note générale: Dans la source, de nombreux tests sont effectués en interne (vérification de syntaxe d'email, de chaîne non-vide, ...). Ceci est à titre d'exemple, mais il est préférable d'utiliser la classe Assert pour tout ces tests afin de centraliser les tests.
Commentaires
Le 16/ 02/2010 17:13
Bonjour,
en testant ta classe j'ai obtenu une erreur:
Warning: array_shift() function.array-shift: The argument should be an array
J'ai corrigé le script comme ceci:
$tmpto = $this->getTo();
$tmpto = array();
$to = array_shift($tmpto);