Fonction mail avec socket et comportement différent sous EasyPHP et Apache sous
DaCodeManiak
Messages postés3Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention17 janvier 2011
-
12 nov. 2007 à 17:29
DaCodeManiak
Messages postés3Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention17 janvier 2011
-
13 nov. 2007 à 06:48
Voilà... depuis le début de la journée, je me prends la tête pour trouver la raison pour laquelle, un script fonctionne à merveille sous XP / EasyPHP et refuse de de fonctionner sous Debian sur le serveur de prod.
En résumé...
Le code suivant :
// Envoi le PDF par mail au différents contacts
$mailer = new mail(false,"\n");
$mailer->setServerConfig(MAIL_SERVER,25);
$mailer->setMimeType(3); // Multipart avec pièce jointe
$mailer->set_ehlo_value("toto.fr"); // Message de présentation au serveur SMTP
$mailer->set_smtp_from_address("[mailto:info@toto.fr info@toto.fr]");
// Remplacer par le destinataire définitif
$mailer->set_rcpt_to_address($_SESSION["web_user"]->mail_address);
$mailer->setsubject("Confirmation de réservation");
// Remplacer par le destinataire du mail tiré du compte client
$mailer->to($_SESSION["web_user"]->client_nom_raison_sociale,$_SESSION["web_user"]->mail_address);
// Ajoute le fichier PDF généré
$mailer->addAttachment($file_manager);
$mailer->setbody("Un texte quelconque");
// Procède à l'envoi proprement dit
if(!$mailer->send()){
echo "Erreur d'envoi du mail
\n";
} // Force l'envoi par la fonction mail
FOnctionne très bien sous XP mais le mail n'est pas du tout envoyé lorsque je bascule en mode prod sous Debian/Apache2
SI je passe en commentaire la méthode addAttachment, le mail part bien... La méthode addAttachement est incluses dans une classe mail dérivée de PHP_Mailer.
SI quelqu'un a une idée ou est tombé sur un problème de ce genre, je suis preneur...
Merci
DaCodeMaNIaK
A voir également:
Fonction mail avec socket et comportement différent sous EasyPHP et Apache sous
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 12 nov. 2007 à 22:32
Hello,
difficile de t'aider sans voir la classe que tu utilises, parce que le problème vient d'elle, pas de ce code-ci.
En général, les probèmes de ce genre proviennent des headers...vérifie tes line feeds. Test \r\n et \n\n.
DaCodeManiak
Messages postés3Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention17 janvier 2011 13 nov. 2007 à 06:48
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
/**************************************************************************/
/* 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 = " helo " . $this->ehlo_value . "
" . fgets($smtpCnx,1024). "
";
/************************************************************************/
/* 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 */
/************************************************************************/
/**************************************************************************/
/* 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
// 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
// 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 "
\n";
echo "\n\n";
echo "Transaction SMTP
\n";
echo $this->debugLine;
echo "