Create your own Mime Mail

Introduction

Une fois n'est pas coutume, parlons Paix, Hache, Pets chez les lutins. Qui ne s'est jamais retrouvé avec un site OUAIB DEUX ZERO a faire, comprenant un formulaire web, ou j'sais pas, une page d'inscription sur un OUAIB FORUM DEUX ZEO, ou un truc qui envoie des mails à des gens ? Toi ? Ok… Onsenfou.

Problème, le nombre de gus out there qui utilisent autre chose que Thunderbird (icedove pour les puristes) pour lire leurs mails, et qui du coup se retrouvent avec un nouveau spam ou un mail HTML tout beurk qui passe pas dans leur Outplook ou leur Hotmail ou leur SaleMaileReader.

Problème second, le serveur apache tourne sur une vieille red-hat 7.2 pas mise à jour, avec un php 4 toumoizi, quand c'est pas un php 3 toupourri. Bien sûr tu ne peux pas le mettre à jour, et tu ne peux pas installer pear, ou une classe qui te faciliterai bien ta vie pour envoyer des mails au format MIME.

Problème troisième, la fonction mail() de php est assez rudimentaire, et la RFC est longue, et puis t'as pas le temps, t'es un codeur/decidorz pressé comme une poire.

Alors, question existentielle : “Mais pourquoi ces p de mails passent pas sous Outplook ?” Réponse (pleine d'humour et de subtilité incroyablement subtile) : “Il faut passer à la 3D !”

Explication détaillée

Mange du jambon ! Ca va vite ! Et donc comme j'ai pas trop le temps, voici comment tu dois faire pour envoyer un mail HTML MIME avec une pièce jointe en sus !

<?php

 /*
  * Ton fichier au format MIME tout propre en base64
  * Si t'as pas file_get_contents tu peux y aller à coup de fopen/fgets/flose
  */
 $file = chunk_split( base64_encode( file_get_contents("/tmp/mapiecejointe.pdf") ) );
 
 /*
  * Le truc pour séparer les machins... Va lire ta RFC
  */
 $boundary = "=_".md5(time());

 $filename = "MONFICHIER.pdf";

 $html =<<<EOT

<table>
 <tr><td><img src="http://monsupersite.com/img/monimage.png"/></td></tr>
 <tr><td><img src="http://monsupersite.com/img/monimage2.png"/></td></tr>
 <tr><td>MON SUPER CONTENU !</td></tr>
</table>
EOT;

 /*
  * Le truc magique qui va faire que ton mail va passer partout comme un nain 
  * avec des clés qui se dit être Dédé Le Rockeur et qui chante faux comme une pelle.
  */
 $html = str_replace('="', '=3D"', $html);
 
 $end = "\n--$boundary
Content-Type: application/octet-stream; tname=\"$filename\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=\"$filename\"\n
$file"."--".$boundary."--";

 $html = 
  "--".$boundary."\n".
  'Content-Transfer-Encoding: quoted-printable'. "\n".
  'Content-Type: text/html; charset="ISO-8859-1"'."\n".
  rtrim($html) .
  $end;

 $from = "moi@moi.com";

 /*
  * Attention, l'ordre est important
  */
 $header = "";
 $header .= 'Return-Path: '.$from. "\n";
 $header .= 'MIME-Version: 1.0' . "\n";
 $header .= 'From: Moi <'.$from.'>' . "\n";
 $header .= 'Bcc: TOI <toi@toi.org>'."\n";
 $header .= 'Content-Type: multipart/mixed; boundary="'.$boundary.'"';

 mail("quelqun@somewhere.net", "UN MAIL MIME QUI PASSE", $html, $header);

?>

Et voila, en respectant cette “procédure” à la lettre, le mail passera partout comme un nain qui… (vous connaissez la suite) Le truc c'est qu'Outplook (je ne sais pas pourquoi, j'avoue) enlève le quillemet et le premier caractère qui suit dans une experession du genre <a href=“/dossier1/page.php”/>

En passant à la 3D tout roule ! Même sur ton vieux PIII avec apache 1.0 et php3 !

La classe, hein ? Non ? Ouais… Mais quand même…

Si ça marche ne pas, vérifies de ne pas avoir ajouté ou oublié un saut de ligne entre la dernière ligne d'un header et le contenu, ou avant/après un $boundary. A noter que dans un mail au format HTML on évite les balise HTML/HEAD/BODY et on met le CSS directement dans les balises via style=“” si on veut que ça passe partout. A noter également que le saut de ligne avant le <table> est important. A noter enfin qu'utiliser \r\n est inutile et va faire merder Outproot lorsqu'on a un vieux Qmail qui tourne sur le vieux serveur vieillement puant.

(Ouais c'est super drôle de dire Outplook et Outproot, si si)

jfg 2009/04/07 16:13

codaz/php/un_nain_mail_qui_passe_partout.txt · Last modified: 2010/01/12 13:29 (external edit)