Voici la classe que j’utilise, ça peut peut-être t’aider :
Compatible fonction mail() et email() (si la première n’est pas activée sur le serveur)
[cpp]//----------------------------------------------------------------------
// Class d’envoi de mail
//----------------------------------------------------------------------
class sys_mail {
//-------------------
//sys_mail
//Class pour l'envoi de mail
//--
//Dernière modification : 13/01/2005 14:55:27
//-------------------
var $exp;
var $dest;
var $cc;
var $cci;
var $objet;
var $message;
var $html;
var $mail_corps; // Corps total du mail
var $mime_separateur_alter;
var $mime_separateur_mixed;
var $retour_charriot;
var $mail_type; // 0 = text/plain, 1 = multipart/alternative, 2 = multipart/mixed
function sys_mail($exp, $dest, $cc, $cci, $objet, $message, $html = false) {
/** Initialisation des variables mères de la class **/
$timehash = md5(uniqid(time()));
$this->mime_separateur_alter = "----=Separateur_alternative_".$timehash;
$this->mime_separateur_mixed = "----=Separateur_mixed_".$timehash;
$this->retour_charriot = "\n"; // Doit prendre "\n" pour un OS Unix et "\r\n" pour un OS Windows //TODO: Détection automatique ?
//--
$this->exp = $exp;
$this->dest = $dest;
$this->cc = $cc;
$this->cci = $cci;
$this->objet = $objet;
if($this->retour_charriot == "\n") { // Si on utilise le \n,
$this->message = str_replace("\r\n", "\n", $message); // On remplace tous mes \r\n par des \n
}
else { // Sinon,
$this->message = str_replace("\n", "\r\n", $message); // On fait l'inverse
}
$this->html = $html;
if($this->html == true) { // Si le message du mail est en HTML
$this->mail_type = 1; // On change le type du mail pour 'multipart/alternative'
// Partie text/plain
$this->mail_corps = $this->mime_separateur_alter.$this->retour_charriot;
$this->mail_corps .= $this->create_text_block("Ce mail est au format HTML, pour le lire, il vous faut un logiciel de messagerie compatible avec les mails au format HTML" . $this->retour_charriot .
"Site de téléchargement des logiciels de messagerie Mozilla Mail et Thunderbird (produits gratuits de 'The Mozilla Organization') :" . $this->retour_charriot .
"http://www.mozilla.org/products/", 'plain');
// Partie text/html
$this->mail_corps .= $this->mime_separateur_alter.$this->retour_charriot;
$this->mail_corps .= $this->create_text_block($this->message, 'html'); // On mets le message (qui est normallement en HTML)
}
else { // Sinon,
$this->mail_type = 0; // On change le type du mail pour 'text/plain'
$this->mail_corps = $this->message;
}
}
function create_text_block($texte, $sub_type) {
$return = "Content-Type: text/".$sub_type.";".$this->retour_charriot;
$return .= "\tcharset=\"iso-8859-1\"".$this->retour_charriot;
$return .= "Content-Transfer-Encoding: quoted-printable".$this->retour_charriot;
$return .= $this->retour_charriot;
$return .= $texte.$this->retour_charriot;
$return .= $this->retour_charriot;
$return .= "--";
return $return;
}
function attacher($fichier, $fichier_type = false) {
// Adaptation du corps du mail si il était en 'multipart/alternative', car il faut mettre cette couche dans une couche de type 'multipart/mixed' qui va creer une sous-couche 'multipart/alternative' pour mettre le corps précedent
if($this->mail_type == 0) { // Si le fichier est déjà de type 'text/plain'
// Création du bloc 'text/plain' au sein du corps total du mail avec le message précedent
$this->mail_corps = $this->mime_separateur_mixed.$this->retour_charriot;
$this->mail_corps .= $this->create_text_block($this->message, 'plain');
}
elseif($this->mail_type == 1) { // Si le fichier est déjà de type 'multipart/alternative'
// Création de l'en-tête de la sous-couche 'multipart/alternative' au sein du corps total du mail et dans laquelle on va mettre la couche 'multipart/alternative' précedente
$rajout = $this->mime_separateur_mixed.$this->retour_charriot;
$rajout .= "Content-Type: multipart/alternative;".$this->retour_charriot;
$rajout .= "\tboundary=\"".$this->mime_separateur_alter."\"".$this->retour_charriot;
$rajout .= $this->retour_charriot;
$rajout .= $this->retour_charriot;
$rajout .= "--";
// Modification du corps total du mail
$this->mail_corps = $rajout.$this->mail_corps; // On mets l'en-tête qu'on vient de créer devant le contenu précedent
$this->mail_corps .= $this->mime_separateur_alter."--".$this->retour_charriot; // Puis on mets un morceau vide de type 'multipart/alternative'
$this->mail_corps .= $this->retour_charriot;
$this->mail_corps .= "--";
}
$this->mail_type = 2; // On change le type du mail pour un type 'multipart/mixed'
$fichier_types = array(
'.gz' => 'application/x-gzip',
'.tgz' => 'application/x-gzip',
'.zip' => 'application/zip',
'.pdf' => 'application/pdf"',
'.png' => 'image/png',
'.gif' => 'image/gif',
'.jpg' => 'image/jpeg',
'.txt' => 'text/plain',
'.htm' => 'text/html',
'.html' => 'text/html'
);
$fichier_nom = basename($fichier);
if($fichier_type == false) { // Si le type du fichier n'a pas été spécifié
$fichier_ext = strrchr($fichier_nom, '.');
if(array_key_exists($fichier_ext, $fichier_types)) { // Si l'extension est repertoriée dans le tableau
$fichier_type = $fichier_types[$fichier_ext]; // On peut mettre le type MIME exact
}
else {
$fichier_type = 'application/octet-stream'; // Sinon, on met le type par défaut 'application/octet-stream'
}
}
$sortie = $this->mime_separateur_mixed.$this->retour_charriot;
$sortie .= "Content-Type: ".$fichier_type.";".$this->retour_charriot;
$sortie .= "\tname=\"".$fichier_nom ."\"".$this->retour_charriot;
$sortie .= "Content-Transfer-Encoding: base64".$this->retour_charriot;
$sortie .= "Content-Disposition: attachment;".$this->retour_charriot;
$sortie .= "\tfilename=\"".$fichier_nom ."\"".$this->retour_charriot;
$sortie .= $this->retour_charriot;
$sortie .= $this->encoder_fichier($fichier).$this->retour_charriot;
$sortie .= $this->retour_charriot;
$sortie .= "--";
if(!empty($this->mail_corps)) { // Si le corps total du mail n'est pas vide, c'est que le mail est déjà en plusieurs parties
$this->mail_corps .= $sortie; // On rajoute ce fichier et ses en-têtes à la suite du corps total du mail
}
else { // Sinon, c'est que le mail est encore en un seul morceau
$this->mail_corps = $sortie; // Puis on rajoute le fichier et ses en-têtes
}
}
function encoder_fichier($fichier) {
if(is_readable($fichier)) {
$fopen_handle = fopen($fichier, 'r');
$contenu = fread($fopen_handle, filesize($fichier));
$encoded = chunk_split(base64_encode($contenu));
fclose($fopen_handle);
}
return $encoded;
}
function create_smtp_headers() {
$return = "From: ".$this->exp.$this->retour_charriot;
if(!empty($this->cc)) {
$return .= "Cc: ".$this->cc.$this->retour_charriot;
}
if(!empty($this->cci)) {
$return .= "Bcc: ".$this->cci.$this->retour_charriot;
}
$return .= "Reply-To: ".$this->exp.$this->retour_charriot;
$return .= "Return-Path: ".$this->exp.$this->retour_charriot;
$return .= "X-Mailer: PHP ".phpversion().$this->retour_charriot;
$return .= "X-Sender: ".$this->exp.$this->retour_charriot;
return $return;
}
function create_mime_headers() {
$mail_types = array(
"text/plain;".$this->retour_charriot."\tcharset=\"iso-8859-1\"".$this->retour_charriot."Content-Transfer-Encoding: 8bit",
"multipart/alternative;".$this->retour_charriot."\tboundary=\"".$this->mime_separateur_alter."\"",
"multipart/mixed;".$this->retour_charriot."\tboundary=\"".$this->mime_separateur_mixed."\""
);
$return = "MIME-Version: 1.0".$this->retour_charriot;
$return .= "Content-Type: ".$mail_types[$this->mail_type].$this->retour_charriot;
return $return;
}
function envoi() {
if($this->mail_type == 0) {
$this->mail_corps = $this->message;
}
else {
$this->mail_corps = "This is a multi-part message in MIME format.".$this->retour_charriot.$this->retour_charriot."--".$this->mail_corps; // On rajoute, au début, le texte indiquant que c'est un mail en plusieurs parties (pour les logiciels de messagerie non compatibles)
if($this->mail_type == 1) {
$this->mail_corps .= $this->mime_separateur_alter."--".$this->retour_charriot; // Puis on mets un morceau vide de type 'multipart/alternative'
}
elseif($this->mail_type == 2) {
$this->mail_corps .= $this->mime_separateur_mixed."--".$this->retour_charriot; // Puis on mets un morceau vide de type 'multipart/mixed'
}
}
if(function_exists('mail')) {
/** DEBUG
echo '<pre>';
echo '$this->dest : '.$this->dest.'
';
echo '$this->objet : '.$this->objet.'
';
echo '$this->mail_corps :
';
echo $this->mail_corps.'
';
echo '$this->create_smtp_headers().$this->create_mime_headers() :
';
echo $this->create_smtp_headers().$this->create_mime_headers().'
';
echo '';
**/
if(mail($this->dest, $this->objet, $this->mail_corps, $this->create_smtp_headers().$this->create_mime_headers())) {
return true;
}
else {
return false;
}
}
elseif(function_exists('email')) {
$smtp_headers = $this->create_smtp_headers();
$smtp_headers = preg_replace("/From: [^(".$this->retour_charriot.")]+".$this->retour_charriot."/", '', $smtp_headers); // On retire From: ... des en-têtes SMTP
$smtp_headers = preg_replace("/Reply-To: [^(".$this->retour_charriot.")]+".$this->retour_charriot."/", '', $smtp_headers); // On retire Reply-To: ... des en-têtes SMTP
$from = substr($this->exp, 0, strpos($this->exp, '@')); // On retire le '@' et tout ce qui suit
$mail_headers = $smtp_headers.$this->create_mime_headers();
/** DEBUG
echo '
';
echo '$from : '.$from.'
';
echo '$this->dest : '.$this->dest.'
';
echo '$this->objet : '.$this->objet.'
';
echo '$this->mail_corps :
';
echo $this->mail_corps.'
';
echo '$from : '.$from.'
';
echo '$mail_headers :
';
echo $mail_headers.'
';
echo '
';
**/
if(email($from, $this->dest, $this->objet, $this->mail_corps, $from, $mail_headers)) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
};[/cpp]