Méga debuggage de la classe CMailFile. Modif pour:

Fonctionner sous MAC.
Permettre gestion mail html.
Gérer les serveur qui ne comprenne pas les RFC2822.
Permettre de spécifier son propre serveur SMTP.
Avoir des traces plus parlantes.
This commit is contained in:
Laurent Destailleur 2006-08-06 18:34:37 +00:00
parent f29ac1fb25
commit b9a87cb6ca
10 changed files with 396 additions and 220 deletions

View File

@ -159,6 +159,7 @@ class Adherent
); );
$texttosend = preg_replace ($patterns, $replace, $text); $texttosend = preg_replace ($patterns, $replace, $text);
$subjectosend = preg_replace ($patterns, $replace, $subject); $subjectosend = preg_replace ($patterns, $replace, $subject);
$msgishtml=0;
// Envoi mail confirmation // Envoi mail confirmation
include_once(DOL_DOCUMENT_ROOT."/lib/CMailFile.class.php"); include_once(DOL_DOCUMENT_ROOT."/lib/CMailFile.class.php");
@ -166,7 +167,9 @@ class Adherent
$from=$conf->email_from; $from=$conf->email_from;
if ($conf->global->ADHERENT_MAIL_FROM) $from=$conf->global->ADHERENT_MAIL_FROM; if ($conf->global->ADHERENT_MAIL_FROM) $from=$conf->global->ADHERENT_MAIL_FROM;
$mailfile = new CMailFile($subject,$this->email,$from,$mesg,array(),array(),array()); $mailfile = new CMailFile($subject,$this->email,$from,$mesg,
array(),array(),array(),
'', '', 0, $msgishtml);
if ($mailfile->sendfile()) if ($mailfile->sendfile())
{ {

View File

@ -494,6 +494,8 @@ class BonPrelevement
$arr_file = array(); $arr_file = array();
$arr_mime = array(); $arr_mime = array();
$arr_name = array(); $arr_name = array();
$msgishtml=0;
if ($joinfile == 1) if ($joinfile == 1)
{ {
$arr_file = array(DOL_DATA_ROOT.'/prelevement/bon/'.$this->ref.'.ps'); $arr_file = array(DOL_DATA_ROOT.'/prelevement/bon/'.$this->ref.'.ps');
@ -501,7 +503,9 @@ class BonPrelevement
$arr_name = array($this->ref.".ps"); $arr_name = array($this->ref.".ps");
} }
$mailfile = new CMailFile($subject,$sendto,$from,$message,$arr_file,$arr_mime,$arr_name); $mailfile = new CMailFile($subject,$sendto,$from,$message,
$arr_file,$arr_mime,$arr_name,
'', '', 0, $msgishtml);
$result=$mailfile->sendfile(); $result=$mailfile->sendfile();

View File

@ -73,17 +73,24 @@ if ($_POST["action"] == 'send')
$arr_mime = array(); $arr_mime = array();
$arr_name = array(); $arr_name = array();
$mailfile = new CMailFile($mil->sujet,$sendto,$from,$mil->body,$arr_file,$arr_mime,$arr_name); // Le message est-il en html
$msgishtml=0; // Non par defaut
if ($conf->fckeditor->enabled && $conf->global->FCKEDITOR_ENABLE_MAILING) $msgishtml=1;
if (eregi('[ \t]*<html>',$message)) $msgishtml=1;
$mailfile = new CMailFile($mil->sujet,$sendto,$from,$mil->body,
$arr_file,$arr_mime,$arr_name,
'', '', 0, $msgishtml);
$result=$mailfile->sendfile(); $result=$mailfile->sendfile();
if($result) if ($result)
{ {
$message='<div class="ok">'.$langs->trans("MailSuccessfulySent",$from,$sendto).'</div>'; $message='<div class="ok">'.$langs->trans("MailSuccessfulySent",$from,$sendto).'</div>';
} }
else else
{ {
$message='<div class="error">'.$langs->trans("ResultKo").'</div>'; $message='<div class="error">'.$langs->trans("ResultKo").'<br>'.$mailfile->error.'</div>';
} }
$_GET["action"]=''; $_GET["action"]='';

View File

@ -622,7 +622,7 @@ if ($_GET['action'] == 'down' && $user->rights->facture->creer)
/* /*
* Action envoi de mail * Action envoi de mail
*/ */
if ($_POST['action'] == 'send' || $_POST['action'] == 'relance') if (($_POST['action'] == 'send' || $_POST['action'] == 'relance') && ! $_POST['cancel'])
{ {
$langs->load('mails'); $langs->load('mails');
@ -698,42 +698,51 @@ if ($_POST['action'] == 'send' || $_POST['action'] == 'relance')
// Envoi de la facture // Envoi de la facture
$mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,'',$deliveryreceipt); $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc,'',$deliveryreceipt);
if ($mailfile->error)
if ($mailfile->sendfile())
{ {
$msg='<div class="ok">'.$langs->trans('MailSuccessfulySent',$from,$sendto).'.</div>'; $msg='<div class="error">'.$mailfile->error.'</div>';
// Insertion action
require_once(DOL_DOCUMENT_ROOT.'/contact.class.php');
require_once(DOL_DOCUMENT_ROOT.'/actioncomm.class.php');
$actioncomm = new ActionComm($db);
$actioncomm->type_id = $actiontypeid;
$actioncomm->label = $actionmsg2;
$actioncomm->note = $actionmsg;
$actioncomm->date = time();
$actioncomm->percent = 100;
$actioncomm->contact = new Contact($db,$sendtoid);
$actioncomm->societe = new Societe($db,$fac->socidp);
$actioncomm->user = $user; // User qui a fait l'action
$actioncomm->facid = $fac->id;
$ret=$actioncomm->add($user); // User qui saisit l'action
if ($ret < 0)
{
dolibarr_print_error($db);
}
else
{
// Renvoie sur la fiche
Header('Location: '.$_SERVER["PHP_SELF"].'?facid='.$fac->id.'&msg='.urlencode($msg));
exit;
}
} }
else else
{ {
$langs->load("other"); if ($mailfile->sendfile())
$msg='<div class="error">'.$langs->trans('ErrorFailedToSendMail',$from,$sendto).' !</div>'; {
$msg='<div class="ok">'.$langs->trans('MailSuccessfulySent',$from,$sendto).'.</div>';
// Insertion action
require_once(DOL_DOCUMENT_ROOT.'/contact.class.php');
require_once(DOL_DOCUMENT_ROOT.'/actioncomm.class.php');
$actioncomm = new ActionComm($db);
$actioncomm->type_id = $actiontypeid;
$actioncomm->label = $actionmsg2;
$actioncomm->note = $actionmsg;
$actioncomm->date = time();
$actioncomm->percent = 100;
$actioncomm->contact = new Contact($db,$sendtoid);
$actioncomm->societe = new Societe($db,$fac->socidp);
$actioncomm->user = $user; // User qui a fait l'action
$actioncomm->facid = $fac->id;
$ret=$actioncomm->add($user); // User qui saisit l'action
if ($ret < 0)
{
dolibarr_print_error($db);
}
else
{
// Renvoie sur la fiche
Header('Location: '.$_SERVER["PHP_SELF"].'?facid='.$fac->id.'&msg='.urlencode($msg));
exit;
}
}
else
{
$langs->load("other");
$msg='<div class="error">';
$msg.=$langs->trans('ErrorFailedToSendMail',$from,$sendto);
if ($mailfile->error) $msg.='<br>'.$mailfile->error;
$msg.='</div>';
}
} }
} }
else else
@ -963,7 +972,6 @@ if ($_GET['action'] == 'create')
if (! $_GET['propalid'] && ! $_GET['commandeid'] && ! $_GET['contratid']) print '">'; if (! $_GET['propalid'] && ! $_GET['commandeid'] && ! $_GET['contratid']) print '">';
print ' '.$langs->trans("Currency".$conf->monnaie); print ' '.$langs->trans("Currency".$conf->monnaie);
print '</td><td>'.img_info().' '; print '</td><td>'.img_info().' ';
$absolute_discount=$soc->getCurrentDiscount();
if ($absolute_discount) if ($absolute_discount)
{ {
print $langs->trans("CompanyHasAbsoluteDiscount",$absolute_discount,$langs->trans("Currency".$conf->monnaie)); print $langs->trans("CompanyHasAbsoluteDiscount",$absolute_discount,$langs->trans("Currency".$conf->monnaie));
@ -1523,7 +1531,6 @@ else
print '<tr><td>'.$langs->trans('Discounts').'</td><td colspan="5">'; print '<tr><td>'.$langs->trans('Discounts').'</td><td colspan="5">';
if ($soc->remise_client) print $langs->trans("CompanyHasRelativeDiscount",$soc->remise_client); if ($soc->remise_client) print $langs->trans("CompanyHasRelativeDiscount",$soc->remise_client);
else print $langs->trans("CompanyHasNoRelativeDiscount"); else print $langs->trans("CompanyHasNoRelativeDiscount");
$absolute_discount=$soc->getCurrentDiscount();
print '. '; print '. ';
if ($absolute_discount) if ($absolute_discount)
{ {
@ -2286,8 +2293,8 @@ else
$filename=sanitize_string($fac->ref); $filename=sanitize_string($fac->ref);
$filedir=$conf->facture->dir_output . '/' . sanitize_string($fac->ref); $filedir=$conf->facture->dir_output . '/' . sanitize_string($fac->ref);
$urlsource=$_SERVER['PHP_SELF'].'?facid='.$fac->id; $urlsource=$_SERVER['PHP_SELF'].'?facid='.$fac->id;
$genallowed=($fac->statut == 1 && $user->rights->facture->creer); $genallowed=($fac->statut == 1 && $user->rights->facture->creer);
$delallowed=$user->rights->facture->supprimer; $delallowed=$user->rights->facture->supprimer;
$var=true; $var=true;
@ -2496,6 +2503,7 @@ else
$formmail->withfile=1; $formmail->withfile=1;
$formmail->withbody=1; $formmail->withbody=1;
$formmail->withdeliveryreceipt=1; $formmail->withdeliveryreceipt=1;
$formmail->withcancel=1;
// Tableau des substitutions // Tableau des substitutions
$formmail->substit['__FACREF__']=$fac->ref; $formmail->substit['__FACREF__']=$fac->ref;
// Tableau des paramètres complémentaires du post // Tableau des paramètres complémentaires du post

View File

@ -200,7 +200,8 @@ class RejetPrelevement
$subject = "Prélèvement rejeté"; $subject = "Prélèvement rejeté";
$sendto = $emuser->fullname." <".$emuser->email.">"; $sendto = $emuser->fullname." <".$emuser->email.">";
$from = $this->user->fullname." <".$this->user->email.">"; $from = $this->user->fullname." <".$this->user->email.">";
$msgishtml=0;
$arr_file = array(); $arr_file = array();
$arr_mime = array(); $arr_mime = array();
$arr_name = array(); $arr_name = array();
@ -210,7 +211,8 @@ class RejetPrelevement
$message .= "\n\n--\n".$this->user->fullname; $message .= "\n\n--\n".$this->user->fullname;
$mailfile = new CMailFile($subject,$sendto,$from,$message, $mailfile = new CMailFile($subject,$sendto,$from,$message,
$arr_file,$arr_mime,$arr_name); $arr_file,$arr_mime,$arr_name,
'', '', 0, $msgishtml);
$mailfile->errors_to = $this->user->email; $mailfile->errors_to = $this->user->email;
$result=$mailfile->sendfile(); $result=$mailfile->sendfile();

View File

@ -24,7 +24,7 @@
* Lots of code inspired from Dan Potter's CMailFile class * Lots of code inspired from Dan Potter's CMailFile class
* *
* If chunk_split does not works on your system, change the call to chunk_split * If chunk_split does not works on your system, change the call to chunk_split
* to my_chunk_split * to _chunk_split
*/ */
/** /**
@ -47,8 +47,7 @@
class CMailFile class CMailFile
{ {
var $subject; var $subject;
var $addr_from_email; var $addr_from;
var $addr_from_name;
var $addr_to; var $addr_to;
var $addr_cc; var $addr_cc;
var $addr_bcc; var $addr_bcc;
@ -58,77 +57,72 @@ class CMailFile
var $mime_boundary; var $mime_boundary;
var $smtp_headers; var $smtp_headers;
var $deliveryreceipt; var $deliveryreceipt;
var $eol;
var $atleastonefile=0;
var $error='';
/** /**
\brief CMailFile \brief CMailFile
\param subject sujet \param subject sujet
\param to email destinataire ("Nom <email>" ou "email" ou "<email>") \param to email destinataire (RFC 2822: "Nom prenom <email>[, ...]" ou "email[, ...]" ou "<email>[, ...]")
\param from email emetteur ("Nom <email>" ou "email" ou "<email>") \param from email emetteur (RFC 2822: "Nom prenom <email>[, ...]" ou "email[, ...]" ou "<email>[, ...]")
\param msg message \param msg message
\param filename_list tableau de fichiers attachés \param filename_list tableau de fichiers attachés
\param mimetype_list tableau des types des fichiers attachés \param mimetype_list tableau des types des fichiers attachés
\param mimefilename_list tableau des noms des fichiers attachés \param mimefilename_list tableau des noms des fichiers attachés
\param addr_cc email cc \param addr_cc email cc
\param addr_bcc email bcc \param addr_bcc email bcc
\param msgishtml message is a html message
*/ */
function CMailFile($subject,$to,$from,$msg, function CMailFile($subject,$to,$from,$msg,
$filename_list=array(),$mimetype_list=array(),$mimefilename_list=array(), $filename_list=array(),$mimetype_list=array(),$mimefilename_list=array(),
$addr_cc="",$addr_bcc="",$deliveryreceipt=0) $addr_cc="",$addr_bcc="",$deliveryreceipt=0,$msgishtml=0)
{ {
dolibarr_syslog("CMailFile::CMailfile: from=$from, to=$to, filename_list[0]=$filename_list[0], mimetype_list[0]=$mimetype_list[0] mimefilename_list[0]=$mimefilename_list[0]"); dolibarr_syslog("CMailFile::CMailfile: from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc");
dolibarr_syslog("CMailFile::CMailfile: subject=$subject, deliveryreceipt=$deliveryreceipt, msgishtml=$msgishtml");
foreach ($filename_list as $i => $val)
{
if ($filename_list[$i])
{
$this->atleastonefile=1;
dolibarr_syslog("CMailFile::CMailfile: filename_list[$i]=".$filename_list[$i].", mimetype_list[$i]=".$mimetype_list[$i]." mimefilename_list[$i]=".$mimefilename_list[$i]);
}
}
$this->mime_boundary = md5( uniqid("dolibarr") ); $this->mime_boundary = md5( uniqid("dolibarr") );
// On definit fin de ligne
$this->eol="\n";
if (eregi('^win',PHP_OS)) $this->eol="\r\n";
if (eregi('^mac',PHP_OS)) $this->eol="\r";
$this->msgishtml = $msgishtml;
// Genere en-tete dans $this->smtp_headers
$this->subject = $subject; $this->subject = $subject;
if (eregi('(.*)<(.+)>',$from,$regs)) $this->addr_from = $from;
{
$this->addr_from_name = trim($regs[1]);
$this->addr_from_email = trim($regs[2]);
}
else
{
$this->addr_from_name = $from;
$this->addr_from_email = $from;
}
$this->addr_to = $to; $this->addr_to = $to;
$this->addr_cc = $addr_cc; $this->addr_cc = $addr_cc;
$this->addr_bcc = $addr_bcc; $this->addr_bcc = $addr_bcc;
$this->deliveryreceipt = $deliveryreceipt; $this->deliveryreceipt = $deliveryreceipt;
$this->smtp_headers = $this->write_smtpheaders(); $this->smtp_headers = $this->write_smtpheaders();
$this->text_body = $this->write_body($msg, $filename_list);
if (count($filename_list)) // Genere en-tete suite dans $this->mime_headers
if ($this->atleastonefile)
{ {
$this->mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list); $this->mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list);
$this->text_encoded = $this->attach_file($filename_list,$mimetype_list,$mimefilename_list); }
}
}
// Genere corps message dans $this->text_body
/** $this->text_body = $this->write_body($msg, $filename_list);
\brief permet d'attacher un fichier
\param filename_list // Genere corps message suite (fichiers attachés) dans $this->text_encoded
\param mimetype_list if ($this->atleastonefile)
\param mimefilename_list
*/
function attach_file($filename_list,$mimetype_list,$mimefilename_list)
{
for ($i = 0; $i < count($filename_list); $i++)
{ {
dolibarr_syslog("CMailFile::attach_file: i=$i"); $this->text_encoded = $this->write_files($filename_list,$mimetype_list,$mimefilename_list);
$encoded = $this->encode_file($filename_list[$i]);
if ($encoded != -1)
{
if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
$out = $out . "--" . $this->mime_boundary . "\n";
if (! $mimetype_list[$i]) { $mimetype_list[$i] = "application/octet-stream"; }
$out .= "Content-type: " . $mimetype_list[$i] . "; name=\"$filename_list[$i]\";\n";
$out .= "Content-Transfer-Encoding: base64\n";
$out .= "Content-disposition: attachment; filename=\"$filename_list[$i]\"\n\n";
$out .= $encoded . "\n";
}
} }
$out = $out . "--" . $this->mime_boundary . "--" . "\n";
return $out;
} }
@ -137,166 +131,294 @@ class CMailFile
\param sourcefile \param sourcefile
\return <0 si erreur, fichier encodé si ok \return <0 si erreur, fichier encodé si ok
*/ */
function encode_file($sourcefile) function _encode_file($sourcefile)
{ {
if (is_readable($sourcefile)) if (is_readable($sourcefile))
{ {
$fd = fopen($sourcefile, "r"); $fd = fopen($sourcefile, "r");
$contents = fread($fd, filesize($sourcefile)); $contents = fread($fd, filesize($sourcefile));
$encoded = chunk_split(base64_encode($contents)); $encoded = chunk_split(base64_encode($contents), 68, $this->eol);
//$encoded = my_chunk_split(base64_encode($contents)); //$encoded = _chunk_split(base64_encode($contents));
fclose($fd); fclose($fd);
return $encoded; return $encoded;
} }
else else
{ {
dolibarr_syslog("CMailFile::encode_file: Can't read file '$sourcefile'"); $this->error="Error: Can't read file '$sourcefile'";
dolibarr_syslog("CMailFile::encode_file: ".$this->error);
return -1; return -1;
} }
} }
/** /**
\brief Envoi le mail \brief Envoi le mail
\return boolean vrai si mail envoyé, faux sinon \return boolean true si mail envoyé, false sinon
*/ */
function sendfile() function sendfile()
{ {
global $conf; global $conf,$langs;
$headers = $this->smtp_headers . $this->mime_headers; $headers = $this->smtp_headers . $this->mime_headers;
$message=$this->text_body . $this->text_encoded; $message = $this->text_body . $this->text_encoded;
// Fix si windows, la fonction mail ne traduit pas les \n, il faut donc y mettre dolibarr_syslog("CMailFile::sendfile addr_to_name=".$this->addr_to_name.", addr_to_email=".$this->addr_to_email.", subject=".$this->subject);
// des champs \r\n (imposés par SMTP). dolibarr_syslog("CMailFile::sendfile header=\n".$headers);
if (eregi('^win',PHP_OS)) dolibarr_syslog("CMailFile::sendfile message=\n".$message);
{ //$this->send_to_file();
$message = eregi_replace("\r","", $this->text_body . $this->text_encoded);
$message = eregi_replace("\n","\r\n", $message);
}
dolibarr_syslog("CMailFile::sendfile addr_to=".$this->addr_to.", subject=".$this->subject);
//dolibarr_syslog("CMailFile::sendfile message=\n".$message);
//dolibarr_syslog("CMailFile::sendfile header=\n".$headers);
$errorlevel=error_reporting(); $errorlevel=error_reporting();
//error_reporting($errorlevel ^ E_WARNING); // Désactive warnings //error_reporting($errorlevel ^ E_WARNING); // Désactive warnings
if (! $conf->global->MAIN_DISABLE_ALL_MAILS) if (! $conf->global->MAIN_DISABLE_ALL_MAILS)
{ {
if ($conf->global->MAIN_MAIL_SMTP_SERVER) ini_set('SMTP',$conf->global->MAIN_MAIL_SMTP_SERVER);
if ($conf->global->MAIN_MAIL_SMTP_PORT) ini_set('smtp_port',$conf->global->MAIN_MAIL_SMTP_PORT);
if ($this->errors_to) if ($this->errors_to)
{ {
dolibarr_syslog("CMailFile::sendfile with errorsto : ".$this->errors_to); dolibarr_syslog("CMailFile::sendfile: mail start SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port').", with errorsto : ".getValidAddress($this->errors_to,1));
$res = mail($this->addr_to,$this->subject,stripslashes($message),$headers,"-f".$this->errors_to); $res = mail(getValidAddress($this->addr_to,2),$this->subject,stripslashes($message),$headers,"-f".getValidAddress($this->errors_to,2));
} }
else else
{ {
dolibarr_syslog("CMailFile::sendfile"); dolibarr_syslog("CMailFile::sendfile: mail start SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port'));
$res = mail($this->addr_to,$this->subject,stripslashes($message),$headers); $res = mail(getValidAddress($this->addr_to,2),$this->subject,stripslashes($message),$headers);
}
if (! $res)
{
$this->error=$langs->trans("Failed to send mail to SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Check your server logs and your firewalls setup");
dolibarr_syslog("CMailFile::sendfile: mail end res=$res ".$this->error);
}
else
{
dolibarr_syslog("CMailFile::sendfile: mail end res=$res");
} }
//if (! $res) $this->error=
}
error_reporting($errorlevel); // Réactive niveau erreur origine
//$this->write_to_file(); if ($conf->global->MAIN_MAIL_SMTP_SERVER) ini_restore('SMTP');
if ($conf->global->MAIN_MAIL_SMTP_PORT) ini_restore('smtp_port');
}
else
{
dolibarr_syslog("CMailFile::sendfile: No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS");
}
error_reporting($errorlevel); // Réactive niveau erreur origine
return $res; return $res;
} }
/** /**
* \brief Ecrit le mail dans un fichier. * \brief Ecrit le mail dans un fichier.
* Utilisation pour le debuggage * Utilisation pour le debuggage
*/ */
function write_to_file() function send_to_file()
{ {
$headers = $this->smtp_headers . $this->mime_headers; $headers = $this->smtp_headers . $this->mime_headers;
$message = $this->text_body . $this->text_encoded; $message = $this->text_body . $this->text_encoded;
$fp = fopen("/tmp/mail","w"); $fp = fopen("/tmp/dolibarr_mail","w");
fputs($fp, $headers); fputs($fp, $headers);
fputs($fp, $message); fputs($fp, $message);
fclose($fp); fclose($fp);
} }
/**
\brief Permet d'ecrire le corps du message
\param msgtext
\param filename_list
*/
function write_body($msgtext, $filename_list)
{
global $conf;
$out='';
if (count($filename_list))
{
$out = "--" . $this->mime_boundary . "\n";
$out .= "Content-Type: text/plain; charset=\"iso8859-15\"\n\n";
// $out = $out . "Content-Type: text/plain; charset=\"us-ascii\"\n\n";
}
if ($conf->fckeditor->enabled && $conf->global->FCKEDITOR_ENABLE_MAILING)
{
$out .= "<html><BODY>\n";
$out .= "<html><head><title></title></head><body>";
$out .= $msgtext;
$out .= "</body></html>";
}
else
{
$out .= $msgtext . "\n";
}
return $out;
}
/** /**
\brief création des headers mime \brief Création des headers smtp
\param filename_list \remarks On construit tout avec \n. Toute correction se fait plus tard.
\param mimefilename_list
*/
function write_mimeheaders($filename_list, $mimefilename_list) {
$out = "MIME-version: 1.0\n";
$out = $out . "Content-type: multipart/mixed; ";
$out = $out . "boundary=\"$this->mime_boundary\"\n";
$out = $out . "Content-transfer-encoding: 7BIT\n";
for($i = 0; $i < count($filename_list); $i++) {
if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
$out = $out . "X-attachments: $filename_list[$i];\n\n";
}
return $out;
}
/**
\brief création des headers smtp
*/ */
function write_smtpheaders() function write_smtpheaders()
{ {
global $conf;
$out = ""; $out = "";
$out .= "X-Mailer: Dolibarr version " . DOL_VERSION ."\n"; // Sender
$out .= "X-Sender: <$this->addr_from_email>\n"; //$out .= "X-Sender: ".getValidAddress($this->addr_from,2).$this->eol;
$out .= "From: ".getValidAddress($this->addr_from,0).$this->eol;
$out .= "Return-Path: ".getValidAddress($this->addr_from,0).$this->eol;
if (isset($this->reply_to) && $this->reply_to) $out .= "Reply-To: ".getValidAddress($this->reply_to,2).$this->eol;
if (isset($this->errors_to) && $this->errors_to) $out .= "Errors-To: ".getValidAddress($this->errors_to,2).$this->eol;
// Receiver
if (isset($this->addr_cc) && $this->addr_cc) $out .= "Cc: ".getValidAddress($this->addr_cc,2).$this->eol;
if (isset($this->addr_bcc) && $this->addr_bcc) $out .= "Bcc: ".getValidAddress($this->addr_bcc,2).$this->eol;
// Accusé réception
if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out .= "Disposition-Notification-To: ".getValidAddress($this->addr_from,1).$this->eol;
$out .= "X-Mailer: Dolibarr version " . DOL_VERSION .$this->eol;
//$out .= "X-Priority: 3\n"; //$out .= "X-Priority: 3\n";
$out .= "Return-path: <$this->addr_from_email>\n"; if ($this->msgishtml)
$out .= "From: $this->addr_from_name <".$this->addr_from_email.">\n";
if (isset($this->addr_cc) && $this->addr_cc) $out .= "Cc: ".$this->addr_cc."\n";
if (isset($this->addr_bcc) && $this->addr_bcc) $out .= "Bcc: ".$this->addr_bcc."\n";
if (isset($this->reply_to) && $this->reply_to) $out .= "Reply-To: ".$this->reply_to."\n";
//accusé réception
if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out .= "Disposition-Notification-To: ".$this->addr_from_email."\n";
// if($this->errors_to != "")
//$out = $out . "Errors-to: ".$this->errors_to."\n";
if ($conf->fckeditor->enabled && $conf->global->FCKEDITOR_ENABLE_MAILING)
{ {
$out .= "Content-Type: text/html; charset=\"iso-8859-15\"\n"; $out.= "Content-Type: text/html; charset=\"iso-8859-1\"".$this->eol;
$out .= "Content-Transfer-Encoding: 8bit\n"; $out.= "Content-Transfer-Encoding: 8bit".$this->eol;
} }
else
{
$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
}
dolibarr_syslog("CMailFile::write_smtpheaders $out"); dolibarr_syslog("CMailFile::write_smtpheaders $out");
return $out; return $out;
} }
/**
\brief Création header MIME
\param filename_list
\param mimefilename_list
\remarks On construit tout avec \n. Toute correction se fait plus tard.
*/
function write_mimeheaders($filename_list, $mimefilename_list)
{
$mimedone=0;
for ($i = 0; $i < count($filename_list); $i++)
{
if ($filename_list[$i])
{
if (! $mimedone)
{
$out = "";
$out.= "MIME-Version: 1.0".$this->eol;
$out.= "Content-Type: multipart/mixed; boundary=\"".$this->mime_boundary."\"".$this->eol;
$mimedone=1;
}
if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
$out.= "X-attachments: $filename_list[$i]".$this->eol;
}
}
$out.= $this->eol;
return $out;
}
/**
\brief Permet d'ecrire le corps du message
\param msgtext
\param filename_list
\remarks On construit tout avec \n. Toute correction se fait plus tard.
*/
function write_body($msgtext, $filename_list)
{
$out='';
if ($this->atleastonefile)
{
$out.= "--" . $this->mime_boundary . $this->eol;
if ($this->msgishtml)
{
$out.= "Content-Type: text/html; charset=\"iso-8859-1\"".$this->eol;
}
$out.= $this->eol;
}
if ($this->msgishtml)
{
// Check if html header already in message
$htmlalreadyinmsg=0;
if (eregi('^[ \t]*<html>',$msgtext)) $htmlalreadyinmsg=1;
if (! $htmlalreadyinmsg) $out .= "<html><head><title></title></head><body>";
$out.= $msgtext;
if (! $htmlalreadyinmsg) $out .= "</body></html>";
}
else
{
$out.= $msgtext;
}
$out.= $this->eol;
return $out;
}
/**
\brief Permet d'attacher un fichier
\param filename_list Tableau
\param mimetype_list Tableau
\param mimefilename_list Tableau
\return out Chaine fichiers encodés
\remarks On construit tout avec \n. Toute correction se fait plus tard.
*/
function write_files($filename_list,$mimetype_list,$mimefilename_list)
{
$out = "";
for ($i = 0; $i < count($filename_list); $i++)
{
if ($filename_list[$i])
{
dolibarr_syslog("CMailFile::write_files: i=$i");
$encoded = $this->_encode_file($filename_list[$i]);
if ($encoded >= 0)
{
if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
if (! $mimetype_list[$i]) { $mimetype_list[$i] = "application/octet-stream"; }
$out = $out . "--" . $this->mime_boundary . $this->eol;
$out.= "Content-Type: " . $mimetype_list[$i] . "; name=\"".$filename_list[$i]."\"".$this->eol;
$out.= "Content-Transfer-Encoding: base64".$this->eol;
$out.= "Content-Disposition: attachment; filename=\"".$filename_list[$i]."\"".$this->eol;
$out.= $this->eol;
$out.= $encoded;
$out.= $this->eol;
}
else
{
return $encoded;
}
}
}
// Fin de tous les attachements
$out = $out . "--" . $this->mime_boundary . "--" . $this->eol;
return $out;
}
}
/**
\brief Renvoie une adresse acceptée par le serveur SMTP
\param adresses Exemple: 'Jhon Doe <jhon@doe.com>' ou 'jhon@doe.com'
\param format 0=Auto, 1=emails avec <>, 2=emails sans <>
\return string Renvoi: '<john@doe.com>' ou 'Jhon Doe <jhon@doe.com>' ou 'john@doe.com'
*/
function getValidAddress($adresses,$format)
{
global $conf;
$ret="";
$arrayaddress=split(',',$adresses);
// Boucle sur chaque composant de l'adresse
foreach($arrayaddress as $val)
{
if (eregi('^(.*)<(.+)>$',trim($val),$regs))
{
$name = trim($regs[1]);
$email = trim($regs[2]);
}
else
{
$name = '';
$email = trim($val);
}
if ($format == 2)
{
$ret=($ret ? $ret.',' : '').$email;
}
if ($format == 1)
{
$ret=($ret ? $ret.',' : '').'<'.$email.'>';
}
if ($format == 0)
{
if ($conf->global->MAIN_MAIL_NO_FULL_EMAIL) $ret=($ret ? $ret.',' : '').'<'.$email.'>';
elseif (! $name) $ret=($ret ? $ret.',' : '').'<'.$email.'>';
else $ret=($ret ? $ret.',' : '').$name.' <'.$email.'>';
}
}
return $ret;
} }
@ -304,21 +426,21 @@ class CMailFile
\brief Permet de diviser une chaine (RFC2045) \brief Permet de diviser une chaine (RFC2045)
\param str \param str
\remarks function chunk_split qui remplace celle de php si nécéssaire \remarks function chunk_split qui remplace celle de php si nécéssaire
\remarks 76 caractères par ligne, terminé par "\r\n" \remarks 76 caractères par ligne, terminé par "\n"
*/ */
function my_chunk_split($str) function _chunk_split($str)
{ {
$stmp = $str; $stmp = $str;
$len = strlen($stmp); $len = strlen($stmp);
$out = ""; $out = "";
while ($len > 0) { while ($len > 0) {
if ($len >= 76) { if ($len >= 76) {
$out = $out . substr($stmp, 0, 76) . "\r\n"; $out = $out . substr($stmp, 0, 76) . "\n";
$stmp = substr($stmp, 76); $stmp = substr($stmp, 76);
$len = $len - 76; $len = $len - 76;
} }
else { else {
$out = $out . $stmp . "\r\n"; $out = $out . $stmp . "\n";
$stmp = ""; $len = 0; $stmp = ""; $len = 0;
} }
} }

View File

@ -140,7 +140,8 @@ class Notify
$subject = $langs->trans("DolibarrNotification"); $subject = $langs->trans("DolibarrNotification");
$message = $texte; $message = $texte;
$filename = split("/",$file); $filename = split("/",$file);
$msgishtml=0;
$replyto = $conf->notification->email_from; $replyto = $conf->notification->email_from;
$mailfile = new CMailFile($subject, $mailfile = new CMailFile($subject,
@ -149,7 +150,8 @@ class Notify
$message, $message,
array($file), array($file),
array("application/pdf"), array("application/pdf"),
array($filename[sizeof($filename)-1]) array($filename[sizeof($filename)-1]),
'', '', 0, $msgishtml
); );
if ( $mailfile->sendfile() ) if ( $mailfile->sendfile() )

View File

@ -906,6 +906,7 @@ class User
require_once DOL_DOCUMENT_ROOT."/lib/CMailFile.class.php"; require_once DOL_DOCUMENT_ROOT."/lib/CMailFile.class.php";
$subject = $langs->trans("SubjectNewPassword"); $subject = $langs->trans("SubjectNewPassword");
$msgishtml=0;
$mesg .= "Bonjour,\n\n"; $mesg .= "Bonjour,\n\n";
$mesg .= "Votre mot de passe pour accéder à Dolibarr a été changé :\n\n"; $mesg .= "Votre mot de passe pour accéder à Dolibarr a été changé :\n\n";
@ -917,7 +918,9 @@ class User
$mesg .= "--\n"; $mesg .= "--\n";
$mesg.= $user->fullname; $mesg.= $user->fullname;
$mailfile = new CMailFile($subject,$this->email,$conf->email_from,$mesg,array(),array(),array()); $mailfile = new CMailFile($subject,$this->email,$conf->email_from,$mesg,
array(),array(),array(),
'', '', 0, $msgishtml);
if ($mailfile->sendfile()) if ($mailfile->sendfile())
{ {

View File

@ -113,7 +113,8 @@ function envoi_mail($oldemail,$message,$total)
$subject = "[Dolibarr] Liste des factures impayées"; $subject = "[Dolibarr] Liste des factures impayées";
$sendto = $oldemail; $sendto = $oldemail;
$from = $conf->global->MAIN_EMAIL_FROM; $from = $conf->global->MAIN_EMAIL_FROM;
$msgishtml = 0;
print "Envoi mail pour $oldemail, total: $total\n"; print "Envoi mail pour $oldemail, total: $total\n";
dolibarr_syslog("factures-impayees-commerciaux: send mail to $oldemail"); dolibarr_syslog("factures-impayees-commerciaux: send mail to $oldemail");
@ -127,7 +128,8 @@ function envoi_mail($oldemail,$message,$total)
$mail = new CMailFile($subject, $mail = new CMailFile($subject,
$sendto, $sendto,
$from, $from,
$allmessage,array(),array(),array()); $allmessage,array(),array(),array()
'', '', 0, $msgishtml);
$mail->errors_to = $errorsto; $mail->errors_to = $errorsto;

View File

@ -80,23 +80,28 @@ $sql .= " LIMIT 1";
$resql=$db->query($sql); $resql=$db->query($sql);
if ($resql) if ($resql)
{ {
$num = $db->num_rows($resql); $num = $db->num_rows($resql);
$i = 0; $i = 0;
if ($num == 1)
{
$obj = $db->fetch_object($resql);
dolibarr_syslog("mailing-send: mailing ".$id); if ($num == 1)
{
$obj = $db->fetch_object($resql);
$id = $obj->rowid; dolibarr_syslog("mailing-send: mailing ".$id);
$subject = $obj->sujet;
$message = $obj->body;
$from = $obj->email_from;
$errorsto = $obj->email_errorsto;
$i++; $id = $obj->rowid;
} $subject = $obj->sujet;
$message = $obj->body;
$from = $obj->email_from;
$errorsto = $obj->email_errorsto;
// Le message est-il en html
$msgishtml=0; // Non par defaut
if ($conf->fckeditor->enabled && $conf->global->FCKEDITOR_ENABLE_MAILING) $msgishtml=1;
if (eregi('[ \t]*<html>',$message)) $msgishtml=1;
$i++;
}
} }
@ -129,13 +134,31 @@ if ($resql)
$i = 0; $i = 0;
while ($i < $num ) while ($i < $num )
{ {
$res=1;
$obj = $db->fetch_object($resql); $obj = $db->fetch_object($resql);
// sendto en RFC2822
$sendto = stripslashes($obj->prenom). " ".stripslashes($obj->nom) ."<".$obj->email.">"; $sendto = stripslashes($obj->prenom). " ".stripslashes($obj->nom) ."<".$obj->email.">";
$mail = new CMailFile($subject, $sendto, $from, $message, array(), array(), array());
$mail->errors_to = $errorsto; // Fabrication du mail
$mail = new CMailFile($subject, $sendto, $from, $message,
if ( $mail->sendfile() ) array(), array(), array(),
'', '', 0, $msgishtml);
if ($mail->error)
{
$res=0;
}
// Envoi du mail
if ($res)
{
$mail->errors_to = $errorsto;
$res=$mail->sendfile();
}
if ($res)
{ {
// Mail envoye avec succes // Mail envoye avec succes
$nbok++; $nbok++;