FAQ Questions Générales

PHP : Utilisation de la fonction mail() de PHP

NOTA : Cette fonction est disponible sur l'ensemble des hébergements à l'exception des hébergements gratuits.

Auteur : Cédric Augustin
Site web : www.isoca.com
Date : 05/08/2001
Version : 1.0

Tout d'abord une lecture obligatoire, la documentation annotée de la fonction mail() sur www.php.net aux pages :

http://www.php.net/manual/fr/ref.mail.php
http://www.php.net/manual/fr/function.mail.php

Cas particulier d'NFrance :

Contrairement à beaucoup d'hébergeurs, NFrance donne accès à la fonction mail(). La conséquence c'est l'obligation de respecter la net-étiquette en ce qui concerne le spam.
Les dernières modifications de la configuration impose la présence d'un champ ” from ” valide, sinon l'email est rejeté.

Mailing liste

Comme c'est du php, il n'est pas possible de faire une mailling liste de grande taille car l'exécution d'une boucle sur plusieurs centaines d'adresses peut dépasser le timeout (durée max d'exécution d'un script). Chez NFrance le timeout est limité à 30 secondes.

Format des emails

Comme on peut construire de toute pièce son message et qu'un email n'est rien d'autre qu'un fichier texte, tous les formats sont possibles. Il faut donc construire son contenu selon le type de message. Il est possible d'envoyer des attachements ou des emails en html.

Limitation de la fonction mail

  • Il n'est pas possible de configurer l'émetteur technique du mail. Chez NFrance c'est forcément le compte qui fait tourner le script.

Donc en cas d'erreur, si vous n'avez pas configurez un compte email par défaut, le mail se perd dans la nature.

  • Une fois le message parti, il n'en reste rien.
  • En cas d'erreur de distribution, la fonction mail() renvois quand même TRUE.

Syntaxe de base

mail (destinataire, sujet, message, entête supplémentaire);

destinataire est une chaîne pouvant contenir plusieurs destinataires séparés par des virgules. Pour afficher le nom du destinataire à la réception au lieu de son email écrire :

Nom Prénom <adresse@email>.

Les règles contre le spam limitent le nombre de destinataires à 20 en général.
Idem pour les copies (cc) et copie cachées (cci).

sujet : le titre du mail. En principe il ne doit y avoir aucun caractère spécial ou accentué dans cette chaîne. Outlook s'en fiche, mais certain logiciels n'apprécient pas. Il faut donc encoder la chaîne pour remplacer tous les caractères à problème par des codes. La fonction imap_8bit() devrait le faire normalement, mais elle ne code pas tout conformément à la RFC 2447 ( http://www.faqs.org/rfcs/rfc2047.html ). Pour obtenir un résultat qui fonctionne pour l'essentiel des cas vous pouvez utiliser la ligne de code suivante :

$sujet_code = '=?iso-8859-1?q?'.str_replace('%', '=', rawurlencode($sujet_brut)).'?=';

message : c'est là dedans que vous mettez ce que vous voulez envoyer : le texte et les attachements. C'est à vous de construire le message pour qu'il respecte les règles. Les formats les plus fréquents sont texte et MIME (RFC2045 , RFC2046 , RFC2047 , RFC2048 et RFC2049, voir http://www.php.net/manual/fr/ref.imap.php ).

Entête supplémentaire : c'est là que se trouvent les informations comme le type de message (texte, html, avec des attachements…), mais aussi les champs comme le from (obligatoire chez HD) ou d'enventuelles autres informations (adresse de retour, nom du programme…).

Exemple d'envois d'un message au format texte

Soit un formulaire qui renvois les champs suivants : $sujet_brut, $from, $destinataire, $cc, $cci, $body.

// préparation du destinataire (les espaces au début provoques des erreurs)
$destinataire=trim($destinataire);
 
// préparation du sujet
$sujet_code = '=?iso-8859-1?q?'.str_replace('%', '=', rawurlencode($sujet_brut)).'?=';
 
// préparation de l'entête
$mailheaders = "From: $from\r\n";
$mailheaders .= "Reply-To: $from\r\n";
if ($cc != ""){$mailheaders .= "Cc: $cc\r\n";};
if ($cci != ""){$mailheaders .= "Bcc: $cci\r\n";};
 
// corps du message
$msg_body = stripslashes($body);
 
// envois du message
mail($destinataire, $sujet_code, $msg_body, $mailheaders);

Exemple d'envois d'un message au format html

C'est exactement la même chose sauf qu'il faut rajouter la ligne suivante à l'entête :

$mail_headers .= "Content-Type: text/html; charset=iso-8859-1\r\n";

et ensuite que le corps du message soit codé comme une page html. On peut bien sûr utiliser des styles et tous les tag html. Par contre les images devront être quelque part sur internet. Il est possible de faire référence dans l'html à des images jointe en attachement, mais ce n'est pas une chose simple (je ne sais pas faire).

Envois d'attachement

Désolé je ne rentrerais pas dans le détail. C'est plus simple de jeter un coup d'œil aux commentaires sur http://www.php.net ou de regarder un exemple tous fait. Il y a plusieurs auteurs qui fournissent des fonctions toutes faites pour construire un message au format MIME. Sinon il y a ce que j'ai fait : http://www.isoca.com/creation/webmail/ qui fonctionne pas trop mal, mais pour un seul attachement.

Conclusion

Avec ces informations, vous pouvez envoyer des emails respectant les standards, lisibles par tous les clients de messagerie.

Auteur : Cédric Augustin - Webmaster de Isoca

 
generale/php/utilisation_de_la_fonction_mail_de_php.txt · Dernière modification: 2008/07/04 15:15 par christophe
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki