Yes... Effectivement, je n'ai pas inclu la classe mail, mais je vais remédier à ça de suite...
Le code est le suivant, et il est vrai que je me demande si le problème ne vient pas des séparateurs même si.... même si un autre script, incluant lui aussi une pièce jointe en csv de taille très réduite fonctionne très bien... Bref... Voilà le code de la classe mail :
<?
/******************************************************************************/
/* Nom : mail.class.php */
/* Auteur : Dièse Include */
/* Date : Juin 2007 */
/* Projet : Framework Dièse Include */
/* Objet : classe pour la gestion des mails */
/******************************************************************************/
class mail {
/**************************************************************************/
/* Définition des propriétés */
/**************************************************************************/
var $smtp_from_address = ""; // Adresse à utiliser
var $rcpt_to_address = array(); // Destinataire du protocole SMTP
var $ehlo_value = ""; // Valeur du ehlo à transmettre
var $from = ""; // Adresse de l'émetteur du message
var $fromname = ""; // Nickname de l'émetteur du message
var $to = array(); // Adresses des destinataires du message
// Tableau contenant les couples to_address | to_name
var $subject = ""; // Sujet du message
var $body = ""; // Corps du message (partie texte)
var $html_body = ""; // Corps HTML du message multipart
var $defaultMime = ""; // Type MIME complet pour l'envoi du message
var $returnPath = ""; // Adresse de retour pour les erreurs
var $reply_to = ""; // Adresse de réponse pour les messages
var $headers = array(); // En-tête additionnelles
var $attachments = array(); // Stocke les pièces jointes éventuelles
var $separator = ""; // Séparateur pour les données du message
var $server = "127.0.0.1"; // Adresse du serveur de mail
var $port = 25; // Port SMTP à utiliser
var $debug = false; // Gère le mode debug pour l'affichage de la transaction SMTP
var $debugLine = ""; // Ligne de debogage
var $boundary = ""; // Délimiteur pour les mails en multipart/alternative
/**************************************************************************/
/* Implémentation */
/**************************************************************************/
/**************************************************************************/
/* Constructeur : void mail(bool $debug=false,string $header_sep="\r\n") */
/* Paramètres : */
/* bool $debug=false => permet d'afficher le résultat du processus */
/* string $header_sep="\r\n" => séparateur des commandes SMTP */
/* Valeur de retour : */
/**************************************************************************/
function mail($debug=false, $header_sep="\r\n") {
$this->debug = $debug;
$this->separator = $header_sep;
return;
}
/**************************************************************************/
/* public bool send(bool force_using_internal=false) */
/* @access public */
/* @type Méthode d'envoi d'un courrier électronique */
/* @param optional bool $force_using_internal = false */
/* Permet de forcer l'utilisation de la fonction native mail */
/* Valeur de retour : */
/* booléen => valide ou non l'envoi du message */
/* Objet : envoie le mail en fonction des paramètres définis */
/* en utilisant les fonctions socket de PHP */
/* RFC : tous les serveurs n'acceptent pas les fonction sockets */
/* Prévoir un contrôle pour rebasculer sur la fonction mail() de PHP */
/**************************************************************************/
function send($force_using_internal=false){
/**********************************************************************/
/* Déclaration des variables locales */
/**********************************************************************/
$smtpCnx = null; // Objet de liaison SMTP
$use_std_mail = false; // Vrai si utilisation de la fonction mail() native
$email_message = ""; // Variables utilisées pour la fonction native mail()
$email_header = "";
$email_to = "";
$email_subject = "";
/**********************************************************************/
/* Implémentation */
/**********************************************************************/
$smtpCnx = fsockopen($this->server,$this->port,$errno,$errtext,60);
#stream_set_timeout($smtpCnx,60); // Définit le timeout nécessaire pour l'envoi des messages
if(!$smtpCnx){
$use_std_mail = true;
}
// Mise à jour Nov. 2007
if($force_using_internal)
$use_std_mail = true;
if(!($use_std_mail)){
/**********************************************************************/
/* Initialisation de la transaction SMTP */
/**********************************************************************/
fputs($smtpCnx,"ehlo " . $this->ehlo_value . $this->separator); // Début de transaction
$this->debugLine = "<b>helo " . $this->ehlo_value . "</b><br/><i>" . fgets($smtpCnx,1024). "</i><br/>";
fputs($smtpCnx,"mail from: " . $this->smtp_from_address . $this->separator); // Définit l'émetteur
$this->debugLine .= "<b>mail from :</b> " . $this->smtp_from_address . "<br/><i>" . fgets($smtpCnx,1024) . "</i><br/>";
// Génère la liste des destinataires
for($i=0;$i<sizeof($this->rcpt_to_address);$i++){
fputs($smtpCnx,"rcpt to: " . $this->rcpt_to_address[$i] . $this->separator); // Définit le destinataire
$this->debugLine .= "<b>rcpt to:<b> " . $this->rcpt_to_address[$i] . "<br/><i>" . fgets($smtpCnx,1024) . "</i><br/>";
}
/**********************************************************************/
/* Ajout des données */
/**********************************************************************/
fputs($smtpCnx,"data" . $this->separator); // Débute les données du message
$this->debugLine .= "<b>data</b><br/><i>" . fgets($smtpCnx,1024) . "</i>br/>";
fputs($smtpCnx,$this->returnPath); // Définit l'adresse de renvoi des erreurs d'envoi
$this->debugLine .= $this->returnPath . "<br/>";
fputs($smtpCnx,$this->reply_to); // Définit l'adresse de réponse
$this->debugLine .= $this->reply_to . "<br/>";
fputs($smtpCnx,$this->defaultMime); // Définit le type du message à envoyer
$this->debugLine .= $this->defaultMime . "<br/>";
fputs($smtpCnx,"from: " . $this->fromname . " " . $this->from . $this->separator); // En-têtes obligatoires
$this->debugLine .= "<b>from:</b> " . $this->fromname . " " . $this->from . "<br/>";
// Les detinataires peuvent être plusieurs
if(sizeof($this->to) > 0){
for($i=0;$i<sizeof($this->to);$i++){
if($this->to[$i]["to_name"] != "")
$email_to .= $this->to[$i]["to_name"] . " ";
else
$email_to .= $this->to[$i]["to_address"];
$email_to .= "<" . $this->to[$i]["to_address"] . ">,";
}
} else {
// Génère la liste des destinataires
for($i=0;$i<sizeof($this->rcpt_to_address);$i++){
$email_to .= $this->rcpt_to_address[$i] . " <" . $this->rcpt_to_address[$i] . ">,";
}
}
// Supprime la dernière virgule inutile
$email_to = substr($email_to,0,strlen($email_to)-1);
// Envoie l'information au socket courant
fputs($smtpCnx,"to: " . $email_to . $this->separator); // en-tête obligatoires
$this->debugLine .= "<b>to:</b> <code> " . $email_to . "</code><br/>\n";
fputs($smtpCnx,"subject: " . $this->subject . $this->separator);
$this->debugLine .= "<b>subject:</b> " . $this->subject . "<br/>";
// En-têtes supplémentaires
for($i=0;$i<sizeof($this->headers);$i++){
fputs($smtpCnx,$this->headers[$i] . $this->separator);
$this->debugLine .= $this->headers[$i] . "<br/>";
}
// Contenu du message : sujet et contenu
if(strstr($this->defaultMime,"multipart")){
fputs($smtpCnx,$this->getBoundary()); // Ajout le délimiteur
fputs($smtpCnx,$this->getMimePart().$this->separator); // Type du message
}
fputs($smtpCnx,$this->body . $this->separator);
$this->debugLine .= "<blockquote><table border=\"1\"><tr><td>Contenu texte du message : " . $this->body . "</td></tr></table></blockquote><br/>";
if($this->html_body != ""){
if(strstr($this->defaultMime,"alternative")){
fputs($smtpCnx,$this->getBoundary()); // Ajout le délimiteur
fputs($smtpCnx,$this->getMimePart(1).$this->separator); // text/html
fputs($smtpCnx,$this->html_body . $this->separator);
$this->debugLine .= "<blockquote><table border=\"1\"><tr><td>Contenu html du message : " . $this->html_body . "</td></tr></table></blockquote><br/>";
}
}
// Ajoute les éventuelles pièces jointes
for($i=0;$i<sizeof($this->attachments);$i++){
fputs($smtpCnx,$this->attachments[$i] . $this->separator);
$this->debugLine .= "Ajout des pièces jointes<br/>";
}
// Termine le message
fputs($smtpCnx,"." . $this->separator);
// Quitte la session SMTP
fputs($smtpCnx,"QUIT" . $this->separator);
$this->debugLine .= "<b>QUIT</b><br/><i>" . fgets($smtpCnx,1024) . "</i>br/>";
// Ferme le flux ouvert
fclose($smtpCnx);
if($this->debug)
$this->debugtoHTML();
return true;
} else { // Utilisation de la fonction mail() native de PHP
$email_message = $this->returnPath . $this->separator;
$email_message .= $this->reply_to . $this->separator;
$email_message .= $this->defaultMime . $this->separator;
$email_message .= "from: " . $this->fromname . " " . $this->from . $this->separator;
// Génère les en-têtes du message
for($i=0;$i<sizeof($this->headers);$i++){
$email_header .= $this->headers[$i];
}
// Contenu du message : sujet et contenu
if(strstr($this->defaultMime,"multipart")){
$email_message .= $this->getBoundary();
$email_message .= $this->getMimePart().$this->separator;
}
$email_message .= $this->body . $this->separator;
if($this->html_body != ""){
if(strstr($this->defaultMime,"alternative")){
$email_message .= $this->getBoundary();
$email_message .= $this->getMimePart(1) . $this->separator;
$email_message .= $this->html_body . $this->separator;
}
}
// Ajoute les éventuelles pièces jointes
for($i=0;$i<sizeof($this->attachments);$i++){
$email_message .= $this->attachments[$i] . $this->separator;
}
// Envoie du mail en mode PHP natif
$email_to = $this->toname . " " . $this->to;
$email_subject = $this->subject;
return mail($email_to,$email_subject,$email_message,$email_header);
}
}
/**************************************************************************/
/* public void set_smtp_from_address(string smtp_from_name) */
/* @access public */
/* @type setter */
/* @param string $smtp_from_name */
/* @return void */
/* @abstract Définit l'attribut $this->smtp_from_address */
/**************************************************************************/
function set_smtp_from_address($smtp_from_address){
/************************************************************************/
/* Déclaration des variables locales */
/************************************************************************/
/************************************************************************/
/* Implémentation */
/************************************************************************/
$this->smtp_from_address = $smtp_from_address;
return;
}
/**************************************************************************/
/* public void set_smtp_rcpt_to_address(mixed rcpt_to_address) */
/* @access public */
/* @type setter */
/* @param mixed $rcpt_to_address */
/* @return void */
/* @abstract Définit l'attribut $this->rcpt_to_address */
/**************************************************************************/
function set_rcpt_to_address($rcpt_to_address){
/************************************************************************/
/* Déclaration des variables locales */
/************************************************************************/
/************************************************************************/
/* Implémentation */
/************************************************************************/
if(!is_array($rcpt_to_address))
$this->rcpt_to_address[] = $rcpt_to_address; // Ajout un destinataire à la liste
else
$this->rcpt_to_address = $rcpt_to_address;
return;
}
/**************************************************************************/
/* public void set_ehlo_value(string ehlo_value) */
/* @access public */
/* @type setter */
/* @param string $ehlo_value => valeur de courtoisie serveur */
/* @return void */
/* @abstract Définit l'attribut $this->ehlo_value */
/**************************************************************************/
function set_ehlo_value($ehlo_value){
/************************************************************************/
/* Déclaration des variables locales */
/************************************************************************/
/************************************************************************/
/* Implémentation */
/************************************************************************/
$this->ehlo_value = $ehlo_value;
return;
}
/**************************************************************************/
/* Méthode : void to(string $to,string $to_name="") */
/* Paramètres : */
/* string $to => adresse e-mail du destinataire */
/* string $to_name => nom en clair du destinataire (optionnel) */
/* Valeur de retour : */
/* Objet : Ajoute un destinataire à la liste des destinataires */
/**************************************************************************/
function to($to,$toname=""){
/************************************************************************/
/* Définition des variables locales */
/************************************************************************/
$temp_array = array(); // Tableau temporaire pour la définition
/************************************************************************/
/* Implémentation */
/************************************************************************/
$temp_array["to_address"] = $to;
if(strlen($toname))
$temp_array["to_name"] = $toname;
else
$temp_array["to_name"] = "";
$this->to[] = $temp_array;
return;
}
/**************************************************************************/
/* Méthode : void from(string $from,string $from_name="") */
/* Paramètres : */
/* string $from => adresse e-mail de l'émetteur */
/* string $from_name => nom en clair de l'émetteur (optionnel) */
/* Valeur de retour : */
/* Objet : Défini l'émetteur du message */
/**************************************************************************/
function from($from,$fromname=""){
if(strlen($fromname))
$this->fromname = "\"$fromname\""; // Nom en clair affiché
$this->from = "<$from>"; // Adresse de l'émetteur
if($this->debug){
echo "Emétteur : " . $this->from . " ($from)<br/>";
}
return;
}
/**************************************************************************/
/* Méthode : void setsubject(string $subject) */
/* Paramètres : */
/* string $subject => sujet du message */
/* Valeur de retour : */
/* Objet : Définit le sujet du message */
/**************************************************************************/
function setsubject($subject){
$this->subject = $subject;
return;
}
/**************************************************************************/
/* Méthode : void setbody(string $body) */
/* Paramètres : */
/* string $body => Corps du message */
/* Valeur de retour : */
/* Objet : Définit le corps du message */
/**************************************************************************/
function setbody($body){
$this->body = $body;
return;
}
/**************************************************************************/
/* Méthode : void sethtmlbody(string $body) */
/* Paramètres : */
/* string $body => Corps du message */
/* Valeur de retour : */
/* Objet : Définit le corps du message */
/**************************************************************************/
function sethtmlbody($body){
$this->html_body = $body;
return;
}
/**************************************************************************/
/* Méthode : void replyto(string $replyto) */
/* Paramètres : */
/* string $replyto => adresse de réponse */
/* Valeur de retour : */
/* Objet : Définit l'adresse de réponse aux messages envoyés */
/**************************************************************************/
function replyto($replyto){
$this->reply_to = "Reply-To: <" . $replyto . ">" . $this->separator;
return;
}
/**************************************************************************/
/* Méthode : void addCc(string $cc) */
/* Paramètres : */
/* string $cc => adresse mail en copie conforme */
/* Valeur de retour : */
/* Objet : Ajoute une adresse de copie conforme */
/**************************************************************************/
function addCc($cc){
array_push($this->headers, "Cc: <" . $cc . ">");
return;
}
/**************************************************************************/
/* Méthode : void addBcc(string $bcc) */
/* Paramètres : */
/* string $bcc => adresse mail en copie invisible */
/* Valeur de retour : */
/* Objet : Ajoute une adresse de copie invisible */
/**************************************************************************/
function addBcc($bcc){
array_push($this->headers, "Bcc: <" . $bcc . ">");
return;
}
/**************************************************************************/
/* Méthode : void setPriority(int $priority) */
/* Paramètres : */
/* int $priority => définit le niveau de priorité du message */
/* Valeur de retour : */
/* Objet : Ajout le niveau de priorités aux en-têtes du message */
/**************************************************************************/
function setPriority($priority){
array_push($this->headers,"X-Priority: " . $priority);
return;
}
/**************************************************************************/
/* Méthode : void seterrorMailPath(string $errorMailAdd) */
/* Paramètres : */
/* string $errorMailAdd => adresse e-mail de destination des erreurs */
/* Valeur de retour : */
/* Objet : Définit l'adresse de retour des messages en erreur */
/**************************************************************************/
function seterrorMailPath($errorMailAdd){
$this->returnPath = "Return-Path: <" . $errorMailAdd . ">" . $this->separator;
return;
}
/**************************************************************************/
/* Méthode : void setMimeType(int $type) */
/* Paramètres : */
/* int $type => définit le type MIME du message à envoyer */
/* 0 => Texte plein */
/* 1 : Texte/HTML */
/* 2 : Multipart */
/* Valeur de retour : */
/* Objet : Définit le type MIME du message à envoyer */
/**************************************************************************/
function setMimeType($type=0){
$this->defaultMime = "MIME-Version: 1.0" . $this->separator . "Content-Type: ";
switch($type) {
case 0 : // Texte plein
$this->defaultMime .= "text/plain; charset=\"iso-8859-1\"";
break;
case 1 : // Texte HTML
$this->defaultMime .= "text/html; charset=\"iso-8859-1\"";
break;
case 2 : // Contenu multipart/alternative
$this->defaultMime .= "multipart/alternative;" . $this->separator;
$this->boundary = $this->makeBoundary(); // Récupère le délimiteur
$this->defaultMime .= "\t" . "boundary=\"" . $this->boundary . "\"";
break;
case 3 : // Multipart avec pièces jointes
$this->defaultMime .= "multipart/mixed;" . $this->separator;
$this->boundary = $this->makeBoundary(); // Récupère le délimiteur
$this->defaultMime .= "\t" . "boundary=\"" . $this->boundary . "\"";
break;
}
$this->defaultMime .= $this->separator;
return;
}
/**************************************************************************/
/* Méthode : void setServerConfig(string $server="localhost", */
/* int $port=25) */
/* Paramètres : */
/* string $server="localhost" => définit l'adresse du serveur SMTP */
/* int $port => port SMTP utilisé */
/* Valeur de retour : */
/* Objet : Définit les paramètres du serveur SMTP */
/**************************************************************************/
function setServerConfig($server="localhost",$port=25){
$this->server = $server;
$this->port = $port;
return;
}
/**************************************************************************/
/* Méthode : bool addAttachment(object $a_file, string $file_type="") */
/* Paramètres : */
/* object $a_file => Objet de type filemanager.class.php */
/* string $file_type="" => type MIME du fichier à joindre */
/* Valeur de retour : */
/* Objet : ajoute une pièce jointe au message */
/**************************************************************************/
function addAttachment($a_file){
/************************************************************************/
/* Définition des variables locales */
/************************************************************************/
$mime_type = ""; // Type du fichier à joindre
$return_header = ""; // Chaîne à ajouter en en-tête du message
$file_handle = null; // Handle sur le fichier à lire
$file_content = null; // Contenu du fichier
$content_disposition= ""; // Type de disposition de la pièce jointe
/************************************************************************/
/* Implémentation */
/************************************************************************/
// Teste si le fichier existe
if($a_file->exists()){
// Identifie le type de fichier à joindre au message
$mime_type = $a_file->get_file_info("src","file_mime_type");
// En fonction du type, détermine la disposition
if(strstr($mime_type,"image")){
$content_disposition = "inline";
} else {
$content_disposition = "attachment";
}
// Récupération du contenu du fichier
if($file_handle = fopen($a_file->get_file_info("src","file_complete_name"),"rb")){
while(!feof($file_handle)){
$file_content .= fread($file_handle,4096);
}
fclose($file_handle); // Ferme le fichier source
// Encodage du fichier récupéré
$file_content = chunk_split(base64_encode($file_content));
// Construit la chaîne d'attachement
$return_header = $this->getBoundary();
$return_header .= "Content-Type:$mime_type;";
$return_header .= " name=" . $a_file->get_file_info("src","file_name") . $this->separator;
$return_header .= "Content-Transfer-Encoding:base64" . $this->separator;
$return_header .= "Content-Disposition: $content_disposition; filename=\"" . $a_file->get_file_info("src","file_name") . "\"" . $this->separator . $this->separator;
$return_header .= $file_content . $this->separator; // Contenu de la pière jointe
$return_header .= $this->getBoundary();
// Ajoute l'en-tête au tableau des en-têtes
array_push($this->attachments,$return_header);
} else {
return false; // Impossible d'ouvrir le fichier à joindre
}
} else {
return false; // Le fichier n'existe pas
}
return true;
}
/**************************************************************************/
/* Définition des méthodes privées */
/**************************************************************************/
/**************************************************************************/
/* Méthode : private string makeBoundary(void) */
/* Paramètres : */
/* Valeur de retour : */
/* string boundary => chaîne unique de délimitation des parties */
/* d'un message multi-part */
/* Objet : Définit le délimiteur des parties d'un message */
/**************************************************************************/
function makeBoundary()
{
// fonction qui renvoie un numéro unique servant à délimiter les parties du message
srand((double)microtime()*10000);
return md5(uniqid(rand()));
}
/**************************************************************************/
/* Méthode : private string getBoundary(void) */
/* Paramètres : */
/* Valeur de retour : */
/* string boundary => chaîne unique de délimitation des parties */
/* d'un message multi-part */
/* Objet : Retourne le délimiteur des parties d'un message */
/**************************************************************************/
function getBoundary(){
return "--" . $this->boundary . $this->separator;
}
/**************************************************************************/
/* Méthode : private string getMultipartHeader(void) */
/* Paramètres : */
/* Valeur de retour : */
/* string header => contenu spécifique du message multi-part */
/* Objet : Retourne le délimiteur des parties d'un message */
/**************************************************************************/
function getMultipartHeader(){
return "This is a multi-part message in MIME format." . $this->separator;
}
/**************************************************************************/
/* Méthode : private string getMimePart(int $type=0) */
/* Paramètres : */
/* int $type=0 => retourne le type de message courant */
/* Valeur de retour : */
/* string mimePart => chaîne unique de délimitation des parties */
/* d'un message multi-part */
/* Objet : Retourne le type MIME du message courant */
/**************************************************************************/
function getMimePart($type=0){
if($type == 0)
return "Content-Type: text/plain; charset=\"iso-8859-1\"" . $this->separator;
else
return "Content-Type: text/html; charset=\"iso-8859-1\"" . $this->separator;
}
/**************************************************************************/
/* Méthode : void debugtoHTML(void) */
/* Paramètres : */
/* Valeur de retour : */
/* Objet : Renvoie les informations de debug sur la sortie HTML */
/**************************************************************************/
function debugtoHTML(){
echo "<div align=\"center\" style=\"border:1px dashed #000000\">\n";
echo "<blockquote>\n<pre>\n";
echo "<h2>Transaction SMTP</h2>\n";
echo $this->debugLine;
echo "</pre>\n</blockquote>\n</div>\n";
return;
}
} // Fin de la classe
?>
DaCodeMaNIaK