
Dans les premières parties, j’ai détaillé le code pour les entêtes. Je vais donc m’attaquer dans ce billet au code pour générer le corps du mail. Voyons voir ce dont on a besoin construire ça. Il nous faut :
- Préciser l’encodage du message (et en définir un par défaut)
- Si l’on envoie le message en HTML, il faut penser à envoyer dans le mail le même message mais en texte pour que ceux qui ne puissent pas lire l’HTML puissent quand même voir le mail.
Pour 1. , c’est l’attribut utf8 de l’objet $mail (défini dans la première partie) qui va nous aider. Par défaut, on va considérer que notre message est en ISO-8858-1. Mais si l’on passe à l’objet $mail l’attribut utf8 à true, cela veut dire que l’on veut envoyer le mail en UTF-8. Il suffira alors de tester, une fois le message construit, la variable utf8 puis encoder le message comme ceci :
Pour le 2. , On voit bien que l’on peut avoir une ou deux partie pour le message. Il faut donc écrire ça de la bonne manière afin que le client puisse lire le mail correctement. En effet, un mail peut contenir du texte en HTML et du texte pur. Le client prendra donc l’une ou l’autre partie suivant les préférences définies par l’utilisateur. On utilise pour ça des frontières qui vont servir à délimiter ces deux parties du reste du mail. Ces frontières sont définies par l’attribut tboundary de l’objet $mail.
La fonction BuildMessage() :
-
function BuildMessage(){
-
$eol = $GLOBALS[‘eol’];
-
$msg = ‘This is a multi-part message in MIME format.’.$eol.$eol.
-
‘–’.$this->boundary.$eol.
-
‘Content-Type: multipart/alternative; boundary="’.$this->tboundary.‘"’.$eol.
-
$this->GetMessageText().
-
$this->GetMessageHtml().
-
$this->GetParts().
-
‘–’.$this->boundary.‘–’;
-
return $msg;
-
}
Cette fonction en appelle trois autres : GetMessageText() - GetMessageHtml() et GetParts(). Je vais détaillé les deux première, la troisième sera pour la partie III du tutorial
La Fonction GetMessageText() :
-
function GetMessageText(){
-
$eol = $GLOBALS[‘eol’];
-
$res = ‘–’.$this->tboundary.$eol.
-
‘Content-Type: text/plain; ‘.
-
(($this->utf8) ? ‘charset=utf-8′.$eol : ‘charset=iso-8859-1′.$eol ).
-
‘Content-Transfer-Encoding: 8bit’.$eol.$eol;
-
if($this->html){
-
$tmp =
ereg_replace("<(br[:blank:]?/?)>",
"n",
$this->
message);
-
-
-
} else {
-
$res .= $this->message;
-
}
-
$res .= $eol.$eol;
-
-
-
}
Comme vous pouvez le voir, on test d’abord si on veut le message en utf8 puis si le message est en HTML auquel cas on va supprimer toutes les balise de formatage du texte. On renvoie ensuite le message en l’encodant ou non toujours suivant l’attribut utf8
La Fonction GetMessageHtml() :
-
function GetMessageHtml(){
-
$eol = $GLOBALS[‘eol’];
-
if($this->html){
-
$res = ‘–’.$this->tboundary.$eol.
-
‘Content-Type: text/html; ‘.
-
(($this->utf8) ? ‘charset=utf-8′.$eol : ‘charset=iso-8859-1′.$eol ).
-
‘Content-Transfer-Encoding: 8bit’.$eol.$eol;
-
if(!
empty($this->
template)){
-
if(ereg(‘^<.*’,
$this->
template)){
-
$res .=
str_replace(‘%texte%’,
$this->
message,
$this->
template);
-
} else {
-
$f =
fopen($this->
template,
‘r’);
-
-
-
-
}
-
} else {
-
$res .= $this->message;
-
}
-
$res .= $eol.$eol;
-
-
-
}
-
}
On test toujours l’attribut html auquel cas on va traiter le message sinon en renvoie rien. Si on a initialisé html à true, on encode correctement le message et, petite subtilité, on teste si on utilise un template avec l’attribut template. Si c’est le cas, on ouvre ce fichier puis on remplace %texte%
par le message en html. On renvoie le tout à la fonction BuildMessage() pour ensuite récupérer les fichiers joints.
Mais on verra ça dans la partie III.