<?php
/*******************************************************************************
*
*		    [ ./includes/class/class_mail.php (français) ]
*
*	--------------------------------------------------------------------------
*	Commencé le : 	20 octobre 2004
*	Copyright : 	Grummfy
*	Site Web : 		http://www.grummfy.com
*	E-mail : 		grummfy@yahoo.fr
*	--------------------------------------------------------------------------
*	Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les 
*	termes de la Licence Publique Générale GNU publiée par la Free Software Foundation 
*	(version 2). Reportez-vous à la Licence Publique Générale GNU pour plus de détails. 
*	Vous devez avoir reçu une copie de la Licence Publique Générale GNU en même temps 
*	que ce programme ; si ce n'est pas le cas, écrivez à la Free Software Foundation, 
*	Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, États-Unis. 
*	--------------------------------------------------------------------------
* 
*	Dernière modification le 10 avril 2006 par Grummfy
*	Templates : 0
*
*******************************************************************************/

//
// Classe Mail développée par Grummfy pour FSB 1.0.x
//
/**
* Permet d'envoyer des emails
* @author Grummfy
* @copyright 2004-2006 Grummfy <grummfy@yahoo.fr>
*/
class Mail
{
	// Déclaration des variables de la classe

	/**
	* Encodage du mail
	*/
	var $charset;

	/**
	* le destinataire
	*/
	var $destinataire = array();

	/**
	* l'expéditeur du message
	*/
	var $expediteur = array();

	/**
	* la partie header du message ce qui est en général cacher mais bon faut bien le definir
	*/
	var $headers = array();

	/**
	* sujet du message
	*/
	var $sujet;

	/**
	* le message à propremetn parler
	*/
	var $message;

	/**
	* la signature du message
	*/
	var $signature;

	/**
	* le type de mail, html(true) ou texte(false)
	*/
	var $type_mail;

	/**
	* utiliser si on utilise les templates
	*/
	var $tpl_mail;
	var $tpl_src;

	/**
	* langue du mail utiliser s on utilise les templates
	*/
	var $langue_mail;

	/**
	* définit si on utilise des tpl ou pas, true si on en utilise pas , false si on en utilise
	*/
	var $not_use_tpl;

	/**
	* Constructeur de la classe, recoit l'encodage des mails.
	* Par défaut on utilise le syteme de templates.
	*
	* @param string charset encodage du charactère
	* @param bool use_tpl true si on utilise les templates
	*/
	function Mail($charset = 'ISO-8859-1', $use_tpl = true)
	{
		$this->charset = $charset;
		$this->reset_vars();

		// Utilises t'on le système de template?
		if ($use_tpl)
		{
			$this->use_tpl();
		}
	}

	/**
	* Si on utilise les tpl, il faut obligatoirement passer par ici.....
	*/
	function use_tpl()
	{
		global $racine;
		
		$this->tpl_mail = new Tpl($racine);
		$this->not_use_tpl = FALSE;
	}

	/**
	* En cas d'utilisation du template...
	* On définit le nom du fichier tpl
	*
	* @param string file fichier tpl utiliser
	*/
	function set_mail($file)
	{
		global $racine;

		$file_tpl = 'langues/' . $this->langue_mail . 'mail/' . $file;
		$this->tpl_mail->set_filenames(array('mail' => $file_tpl));
	}

	/**
	* Non utilisation du template...
	* Pour envoyer rapidement un mail en mode texte c'est ici.
	*
	* @param string to email du destinataire
	* @param string from email de l'expéditeur
	* @param string message message à envoyer au format choisi
	* @param string sujet sujet de l'email
	* @param string mime_type type mime du mail exemple : text/plain ou text/html
	*
	* @return bool true en cas de succès
	*/
	function simple_mail($to, $from, $message, $sujet, $mime_type = 'text/plain')
	{
		$this->message(array(), $message);
		$this->sujet($sujet);
		$this->expediteur($from);
		$this->destinataire($to);
		$this->type_mime_mail($mime_type . '; charset="' . $this->charset . '"');

		return ($this->envoie());
	}

	/**
	* Définit la langue du mail.
	*
	* @param string langage répertoire langue (exemple fr/ )
	*/
	function set_langue($langage)
	{
		$this->langue_mail = $langage;
	}

	/**
	* On donne l'adresse du destinataire et si on le désire son nom.
	*
	* @param string dest_mail email de destination de l'email
	* @param string dest_name nom du destinataire de l'email (par exemple : toto ou une "bête")
	*/
	function destinataire($dest_mail, $dest_name = '')
	{
		$this->destinataire['to'] = (empty($dest_name)) ? trim($dest_mail) : trim('"' . str_replace('"', '\"', trim($dest_name)) . '" <' . trim($dest_mail) . '>');
	}

	/**
	* Destinataire du mail en copie
	*
	* @param string dest_mail email de destination de l'email
	* @param string dest_name nom du destinataire de l'email (par exemple : toto ou une "bête")
	*/
	function cc($dest_mail, $dest_name = '')
	{	
		$this->destinataire['cc'][] = (!empty($dest_name)) ? '"' . str_replace('"', '\"', trim($dest_name)) . '" <' . trim($dest_mail) . '>' : trim($dest_mail);
	}

	/**
	* Destinataire du mail en copie cachée
	*
	* @param string dest_mail email de destination de l'email
	* @param string dest_name nom du destinataire de l'email (par exemple : toto ou une "bête")
	*/
	function bcc($dest_mail, $dest_name = '')
	{
		$this->destinataire['bcc'][] = (!empty($dest_name)) ? '"' . str_replace('"', '\"', trim($dest_name)) . '" <' . trim($dest_mail) . '>' : trim($dest_mail);
	}

	/**
	* Expéditeur du messsage.
	*
	* @param string exp_mail email de l'expéditeur
	* @param string exp_name nom de l'expéditeur
	*/
	function expediteur($exp_mail, $exp_name = '')
	{
		$this->expediteur['from'] = (!empty($exp_name)) ? '"' . str_replace('"', '\"', trim($exp_name)) . '" <' . trim($exp_mail) . '>' : trim($exp_mail);
	}

	/**
	* Repondre à...
	*
	* @param string exp_mail email de l'expéditeur
	* @param string exp_name nom de l'expéditeur
	*/
	function reply_to($exp_mail, $exp_name = '')
	{
		$this->destinataire['reply-to'][] = (!empty($exp_name)) ? '"' . str_replace('"', '\"', trim($exp_name)) . '" <' . trim($exp_mail) . '>' : trim($exp_mail);
	}

	/**
	* permet l'ajout d'options spécial au headers
	* 
	* ATTENTION bien comprendre les headers pour pouvoir l'utiliser
	* quelques explication suplémentaires là : http://phpcodeur.net/articles/php/emails ; http://www.sitepoint.com/article/advanced-email-php ; http://www.mailsbroadcast.com/email.bolts&nuts/emailing.nutshell.htm
	* les définition de base :  http://www.faqs.org/rfcs/rfc822 ; http://www.faqs.org/rfcs/rfc2822 ; http://www.faqs.org/rfcs/rfc2045 ; http://www.faqs.org/rfcs/rfc2046 ; http://www.faqs.org/rfcs/rfc2047 ; http://www.faqs.org/rfcs/rfc2049 ; http://www.faqs.org/rfcs/rfc1896 ; http://www.faqs.org/rfcs/rfc4356
	*
	* @param string type type de l'header (exemple : X-Priority, reply-to, from, ...)
	* @param string headers la valeur du type.
	*/
	function headers_mail($type, $headers)
	{
		$this->headers[$type] = trim($headers);
	}

	/**
	* definit la priorité du message de 5 à 1
	*
	* @param int prior priorité de l'email de 1 (high) à 5 (low)
	*/
	function priorite($prior = 3)
	{
		switch ($prior)
		{
			case 1:
				// non standart mais ancien système
				$this->headers_mail('X-Priority', '1 (highest)');
				// standart mais pas toujours suporter
				$this->headers_mail('X-Mms-Priority', 'High');
				// standart et pris par défaut ...
				$this->headers_mail('Importance', 'High');
				// special microsoft ....
				$this->headers_mail('X-MSMail-Priority', 'High');
				break;
			case 2:
				$this->headers_mail('X-Priority', '2 (high)');
				$this->headers_mail('X-Mms-Priority', 'High');
				$this->headers_mail('X-MSMail-Priority', '');
				$this->headers_mail('Importance', 'High');
				break;
			case 3:
				$this->headers_mail('X-Priority', '3 (normal)');
				$this->headers_mail('X-MSMail-Priority', 'Normal');
				// pas de importance ni de mms car la priorité normal ne dit rien ...
				break;
			case 4:
				$this->headers_mail('X-Priority', '4 (low)');
				$this->headers_mail('X-Mms-Priority', 'Low');
				$this->headers_mail('X-MSMail-Priority', 'Low');
				$this->headers_mail('Importance', 'Low');
				break;
			case 5:
				$this->headers_mail('X-Priority', '5 (lowest)');
				$this->headers_mail('X-Mms-Priority', 'Low');
				$this->headers_mail('X-MSMail-Priority', 'Low');
				$this->headers_mail('Importance', 'Low');
			default:
				$this->priorite(3);
		}
	}

	/**
	* definit l'adresse de retour en cas d'erreur
	*
	* @param string erreur_mail adresse email d'envoi du mail d'erreur.
	*/
	function erreur_mail($erreur_mail)
	{
		$this->headers_mail('Return-Path', $erreur_mail);
	}

	/**
	* Set le type mime du mail
	*
	* @param string type type de l'email (exemple: text/plain, text/html, text/enriched, ...)
	*/
	function type_mime_mail($type)
	{
		$this->type_mail = (preg_match('/text\/html/si', $type)) ? TRUE : FALSE;
		$this->headers_mail('Content-Type', $type);
	}

	/**
	* utiliser la notification de mail et donner l'adresse de reception de cette notification
	*
	* @param string maildenotification email de notification de réception du message
	*/
	function notification_mail($maildenotification)
	{
		$this->headers_mail('Disposition-Notification-To', $maildenotification);
	}

	/**
	* utiliser la notification de mail et donner l'adresse de reception de cette notification
	*
	* @param string maildenotification email de notification de lecture du message
	*/
	function notificationdelecture($maildenotification)
	{
		$this->headers_mail('X-Confirm-Reading-To', $maildenotification);
	}

	/**
	* définit l'encodage utilisé par le contenu de l'email ou une partie de celui-ci
	*
	* @param string encodage_mail encodage de l'email (exemple : 7bit, 8bit)
	*/
	function encodage_mail($encodage_mail)
	{
		$this->headers_mail('Content-Transfer-Encoding', $encodage_mail);
	}

	/**
	* Assigne un sujet au mail.
	*
	* @param string sujet sujet de l'email
	*/
	function sujet($sujet)
	{
		$this->sujet = trim($sujet);
	}

	/**
	* Assigne un message au mail
	*
	* @param array t_var tableau contenant les variable tpl à remplacer ( exemple : 'TOTO' => $toto, .... )
	* @param string message message lorsque l'on n'utilise pas de tpl ...
	*/
	function message($t_var = array(), $message = '')
	{
		if (!$this->not_use_tpl)
		{
			$this->tpl_mail->assign_vars($t_var);
			$this->message = $this->tpl_mail->pparse('mail', GET_CODE);
		}
		else
		{
			$this->message = $message;
		}
	}

	/**
	* On définit la signature si il y a lieu
	*
	* @param string sign signature du mail, sera inséré dans le bas de l'email
	*/
	function signature($sign)
	{
		if ($this->not_use_tpl)
		{
			$this->signature = $sign;
		}
		else
		{
			$this->tpl_mail->assign_vars(array('SIGNATURE' => $sign));
		}
	}

	/**
	* On envoi l'email avec tout ce qui à été précédement prédéfinit
	* renvoi TRUE ou FALSE.
	*
	* @param bool sendmail true si on utilise smtp
	*
	* @return bool true si le mail à été envoyé
	*/
	function envoie($sendmail = false)
	{
		global $HTTP_SERVER_VARS;

		unset($header);
		$header = 'From: ' . $this->expediteur['from'] . "\n";
		$header .= (!empty($this->expediteur['reply-to'])) ? 'Reply-to: ' . $this->expediteur['reply-to'] . "\n" : '' ;

		if (count($this->destinataire['cc']))
		{
			// on sépare les destinataires par des virgules
			$cc_mail = implode(", ", $this->destinataire['cc']);
			$header .= (!empty($cc_mail)) ? 'Cc: ' . $cc_mail . "\n" : '';
		}

		if (count($this->destinataire['bcc']))
		{
			// on sépare les destinataires par des virgules
			$bcc_mail = implode(", ", $this->destinataire['bcc']);
			$header .= (!empty($bcc_mail)) ? 'Bcc: ' . $bcc_mail . "\n" : '' ;
		}


		$this->headers['X-Mailer'] = 'FSB 1.0.x';
		$this->headers['X-AntiAbuse']  = 'Sender IP - ' . $HTTP_SERVER_VARS['REMOTE_ADDR'] . '/Server Name - <' . $HTTP_SERVER_VARS['SERVER_NAME'] . '>';
		$this->headers['MIME-Version'] = '1.0';
		
		// si il n'y a pas de type défini c'est du texte par défaut
		if (empty($this->headers['Content-Type']))
		{
			$this->type_mime_mail('text/plain; charset="' . $this->charset . '"');
		}

		// si il n'y a pas de date définie on la définit
		if (empty($this->headers['Date']))
		{
			$this->headers['Date'] = date("D, j M Y H:i:s O");
		}

		// on met générer le message_id qui caractérise un message unique....
		$this->headers['Message-ID'] = '<' . md5(uniqid(rand())) . '@' . $HTTP_SERVER_VARS['HTTP_HOST'] . '>';

		if (count($this->headers))
		{
			foreach($this->headers as $key => $value)
			{
				$header .= $key . ': ' . $value . "\n";
			}
		}

		// pour eviter des bug on enleve tout les retours à la ligne et n les remetes ....
		$dest = str_replace("/\r\n?/", "", $this->destinataire['to']);
		$sujet = str_replace("/\r\n?/", "", $this->sujet);
		if ($this->not_use_tpl)
		{
			// evite quelque bug et double retour à la ligne....
			if(!$this->type_mail)
			{
				$msg = str_replace("/\r\n?/", "\n", $this->message);
				if (isset($this->signature))
				{
				    $msg = $msg . "\n\n--\n" . $this->signature;
				}
				$msg = str_replace("\r\n", "\n", $msg);
				$msg = str_replace("\n", "\r\n", $msg);
			}
			else
			{
				$msg = nl2br($this->message);
				if ( isset($this->signature) )
				{
				    $msg = $msg . '<br /><br /><hr />' . $this->signature;
				}
			}
		}
		else
		{
			if ($this->type_mail)
			{
				$msg = nl2br($this->message);
			}
			else
			{
				$msq = $this->message;
				$msg = str_replace("\r\n", "\n", $msg);
				$msg = str_replace("\n", "\r\n", $msg);
			}
		}

		$header = str_replace("\r\n", "\n", $header);
		$header = str_replace("\n\n", "\r\n", $header);

		// on utilise sendmail ou smtp
		if($sendmail)
		{
			$this->Mail_SMTP('', $this->expediteur['from']);
		}

		return (@mail($dest, $sujet, $msg, $header));
	}

	/**
	* remet le tout à 0
	*/
	function reset_vars()
	{
		$this->destinataire = array('to' => '', 'cc' => array(), 'bcc' => array());
		$this->expediteur = array('from' => '', 'reply-to' => '');
		$this->headers = array();
		$this->sujet = '';
		$this->message = '';
		$this->signature = '';

		// encodage par défaut de la taille du texte
		$this->encodage_mail('8bit');

		// par defaut type html
		$this->type_mime_mail('text/html; charset="' . $this->charset . '"');
		$this->set_langue('fr/');

		$this->not_use_tpl = TRUE;
	}

	/**
	* Initialise les variables système pour l'utilisation du smtp
	*
	* @param string $smtp Sous Windows seulement : adresse DNS ou adresse IP du SMTP que PHP doit utiliser pour envoyer un mail avec la fonction mail
	* @param string $from Sous Windows seulement : valeur du champ "From:" qui doit être utilisée lors de l'envoi de mail.
	* @param int $port Sous Windows seulement : numéro de port à utiliser pour se connecter au serveur SMTP lors de l'envoi de mail avec la fonction mail ; Uniquement disponible depuis PHP 4.3.0. 
	*/
	function Mail_SMTP($smtp = '', $from = '', $port = 25)
	{
		if ($smtp == '')
		{
			$smtp = $GLOBALS['config']['smtp_smtp'];
			$port = $GLOBALS['config']['smtp_port'];
		}

		@ini_set("sendmail_from", $from);
		@ini_set("smtp_port", $port);
		@ini_set("SMTP", $smtp);
	}
}

?>