Fix: Corrige pb envoi propal par mail.

This commit is contained in:
Laurent Destailleur 2005-06-25 13:02:39 +00:00
parent 150b737737
commit 0db9887ed7
3 changed files with 240 additions and 191 deletions

View File

@ -38,6 +38,7 @@ class ActionComm
var $id; var $id;
var $db; var $db;
var $label;
var $date; var $date;
var $type_code; var $type_code;
var $type; var $type;
@ -69,61 +70,53 @@ class ActionComm
* \brief Ajout d'une action en base (et eventuellement dans webcalendar) * \brief Ajout d'une action en base (et eventuellement dans webcalendar)
* \param author auteur de la creation de l'action * \param author auteur de la creation de l'action
* \param webcal ressource webcalendar: 0=on oublie webcal, 1=on ajoute une entrée générique dans webcal, objet=ajout de l'objet dans webcal * \param webcal ressource webcalendar: 0=on oublie webcal, 1=on ajoute une entrée générique dans webcal, objet=ajout de l'objet dans webcal
* \return int id de l'action créée * \return int id de l'action créée, < 0 si erreur
*/ */
function add($author, $webcal=0) function add($author, $webcal=0)
{ {
global $conf; global $conf;
if (! $this->contact) if (! $this->percent) $this->percent = 0;
{ if (! $this->priority) $this->priority = 0;
$this->contact = 0;
} $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm";
if (! $this->propalrowid) $sql.= "(datea,fk_action,fk_soc,note,fk_contact,fk_user_author,fk_user_action,label,percent,priority,";
{ $sql.= "fk_facture,propalrowid)";
$this->propalrowid = 0; $sql.= " VALUES (now(), '".$this->type_code."', '".$this->societe->id."' ,'".addslashes($this->note)."',";
} $sql.= ($this->contact->id?$this->contact->id:"null").",";
if (! $this->percent) $sql.= "'$author->id', '".$this->user->id ."', '".$this->label."',100,'".$this->priority."',";
{ $sql.= ($this->facid?$this->facid:"null").",";
$this->percent = 0; $sql.= ($this->propalrowid?$this->propalrowid:"null");
} $sql.= ");";
if (! $this->priority)
{ if ($this->db->query($sql) )
$this->priority = 0; {
} $idaction = $this->db->last_insert_id(MAIN_DB_PREFIX."actioncomm");
$sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm (datea, label, fk_action, fk_soc, fk_user_author, fk_user_action, fk_contact, percent, note,priority,propalrowid) "; if ($conf->webcal->enabled) {
$sql .= " VALUES ('$this->date', '$this->libelle', $this->type, $this->societe, $author->id,"; if (is_object($webcal))
$sql .= $this->user->id . ", $this->contact, '$this->percent', '$this->note', $this->priority, $this->propalrowid);"; {
// Ajoute entrée dans webcal
if ($this->db->query($sql) ) $result=$webcal->add($author,$webcal->date,$webcal->texte,$webcal->desc);
{ if ($result < 0) {
$idaction = $this->db->last_insert_id(MAIN_DB_PREFIX."actioncomm"); $this->error="Echec insertion dans webcal: ".$webcal->error;
}
if ($conf->webcal->enabled) { }
if (is_object($webcal)) else if ($webcal == 1)
{ {
// Ajoute entrée dans webcal // \todo On ajoute une entrée générique, pour l'instant pas utilis
$result=$webcal->add($author,$webcal->date,$webcal->texte,$webcal->desc);
if ($result < 0) {
$this->error="Echec insertion dans webcal: ".$webcal->error;
} }
} }
else if ($webcal == 1)
{ return $idaction;
// \todo On ajoute une entrée générique, pour l'instant pas utilisé
}
} }
else
return $idaction; {
} dolibarr_print_error($this->db);
else return -1;
{ }
dolibarr_print_error($this->db);
return -1;
}
} }
/** /**

View File

@ -205,7 +205,7 @@ if ($_POST["action"] == 'send')
// Envoi de la facture // Envoi de la facture
$mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc); $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc);
if (! $mailfile->sendfile()) if ($mailfile->sendfile())
{ {
$msg='<div class="ok">'.$langs->trans("MailSuccessfulySent",$from,$sendto).'.</div>'; $msg='<div class="ok">'.$langs->trans("MailSuccessfulySent",$from,$sendto).'.</div>';

View File

@ -1,33 +1,44 @@
<?php <?php
/* notes from Dan Potter: /* Copyright (C) 2000-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
Sure. I changed a few other things in here too though. One is that I let * Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
you specify what the destination filename is (i.e., what is shows up as in * Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net>
the attachment). This is useful since in a web submission you often can't *
tell what the filename was supposed to be from the submission itself. I * This program is free software; you can redistribute it and/or modify
also added my own version of chunk_split because our production version of * it under the terms of the GNU General Public License as published by
PHP doesn't have it. You can change that back or whatever though =). * the Free Software Foundation; either version 2 of the License, or
Finally, I added an extra "\n" before the message text gets added into the * (at your option) any later version.
MIME output because otherwise the message text wasn't showing up. *
/* * This program is distributed in the hope that it will be useful,
note: someone mentioned a command-line utility called 'mutt' that * but WITHOUT ANY WARRANTY; without even the implied warranty of
can mail attachments. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*/ * GNU General Public License for more details.
/* *
If chunk_split works on your system, change the call to my_chunk_split * You should have received a copy of the GNU General Public License
to chunk_split * along with this program; if not, write to the Free Software
*/ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/* Note: if you don't have base64_encode on your sytem it will not work */ * or see http://www.gnu.org/
*
* $Id$
* $Source$
*
* 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
* to my_chunk_split
*/
/** \file htdocs/lib/CMailFile.class.php /**
\brief fichier de la classe d'envoi de mails \file htdocs/lib/CMailFile.class.php
\author Dan Potter. \brief Classe permettant d'envoyer des mail avec attachements
\author Eric Seigne \author Dan Potter.
\author Laurent Destailleur. \author Eric Seigne
\version $Revision$ \author Laurent Destailleur.
\version $Revision$
*/ */
/** \class CMailFile /**
\brief Classe d'envoi de mails et pièces jointes. Encapsule mail() avec d'éventuel attachements. \class CMailFile
\brief Classe d'envoi de mails et pièces jointes. Encapsule mail() avec d'éventuel attachements.
\remarks Usage: \remarks Usage:
\remarks $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filename,$mimetype); \remarks $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filename,$mimetype);
\remarks $mailfile->sendfile(); \remarks $mailfile->sendfile();
@ -35,172 +46,217 @@ to chunk_split
class CMailFile class CMailFile
{ {
var $subject; var $subject;
var $addr_from; var $addr_from;
var $addr_to; var $addr_to;
var $addr_cc; var $addr_cc;
var $addr_bcc; var $addr_bcc;
var $text_body; var $text_body;
var $text_encoded; var $text_encoded;
var $mime_headers; var $mime_headers;
var $mime_boundary = "--==================_846811060==_"; var $mime_boundary;
var $smtp_headers; var $smtp_headers;
/** /**
\brief CMailFile \brief CMailFile
\param subject sujet \param subject sujet
\param to email destinataire \param to email destinataire
\param from email emetteur \param from email emetteur
\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
*/ */
function CMailFile($subject,$to,$from,$msg,$filename_list,$mimetype_list,$mimefilename_list,$addr_cc="",$addr_bcc="") function CMailFile($subject,$to,$from,$msg,$filename_list,$mimetype_list,$mimefilename_list,$addr_cc="",$addr_bcc="")
{ {
$this->subject = $subject; $this->mime_boundary = md5( uniqid("dolibarr") );
$this->addr_from = $from;
$this->addr_to = $to; $this->subject = $subject;
$this->addr_cc = $addr_cc; $this->addr_from = $from;
$this->addr_bcc = $addr_bcc; $this->addr_to = $to;
$this->smtp_headers = $this->write_smtpheaders(); $this->addr_cc = $addr_cc;
$this->text_body = $this->write_body($msg, $filename_list); $this->addr_bcc = $addr_bcc;
if (count($filename_list)) { $this->smtp_headers = $this->write_smtpheaders();
$this->mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list); $this->text_body = $this->write_body($msg, $filename_list);
$this->text_encoded = $this->attach_file($filename_list,$mimetype_list,$mimefilename_list); if (count($filename_list))
} {
$this->mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list);
$this->text_encoded = $this->attach_file($filename_list,$mimetype_list,$mimefilename_list);
}
} }
/** /**
\brief permet d'attacher un fichier \brief permet d'attacher un fichier
\param filename_list \param filename_list
\param mimetype_list \param mimetype_list
\param mimefilename_list \param mimefilename_list
*/ */
function attach_file($filename_list,$mimetype_list,$mimefilename_list) function attach_file($filename_list,$mimetype_list,$mimefilename_list)
{ {
for ($i = 0; $i < count($filename_list); $i++) { for ($i = 0; $i < count($filename_list); $i++)
$encoded = $this->encode_file($filename_list[$i]); {
if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i]; $encoded = $this->encode_file($filename_list[$i]);
$out = $out . "--" . $this->mime_boundary . "\n"; 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 . "\n";
$out = $out . "Content-type: " . $mimetype_list[$i] . "; name=\"$filename_list[$i]\";\n"; if (! $mimetype_list[$i]) { $mimetype_list[$i] = "application/octet-stream"; }
$out = $out . "Content-Transfer-Encoding: base64\n"; $out .= "Content-type: " . $mimetype_list[$i] . "; name=\"$filename_list[$i]\";\n";
$out = $out . "Content-disposition: attachment; filename=\"$filename_list[$i]\"\n\n"; $out .= "Content-Transfer-Encoding: base64\n";
$out = $out . $encoded . "\n"; $out .= "Content-disposition: attachment; filename=\"$filename_list[$i]\"\n\n";
} $out .= $encoded . "\n";
$out = $out . "--" . $this->mime_boundary . "--" . "\n"; }
return $out; $out = $out . "--" . $this->mime_boundary . "--" . "\n";
// added -- to notify email client attachment is done return $out;
// added -- to notify email client attachment is done
} }
/** /**
\brief permet d'encoder un fichier \brief Permet d'encoder un fichier
\param sourcefile \param sourcefile
\return < 0 si erreur, fichier encodé si ok
*/ */
function encode_file($sourcefile) function encode_file($sourcefile)
{ {
// print "<pre> on encode $sourcefile </pre>\n"; 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 = my_chunk_split(base64_encode($contents)); //$encoded = my_chunk_split(base64_encode($contents));
fclose($fd); fclose($fd);
} }
return $encoded; else
} {
dolibarr_syslog("CMailFile::encode_file: Can't read file $sourcefile");
}
return $encoded;
}
/** /**
\brief permet d'envoyer un fichier \brief Envoi le mail
\return boolean vrai si mail envoyé, faux sinon
*/ */
function sendfile() function sendfile()
{ {
$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;
return mail($this->addr_to,$this->subject,stripslashes($message),$headers);
$errorlevel=error_reporting();
error_reporting($errorlevel ^ E_WARNING); // Désactive warnings
if ($this->errors_to)
{
dolibarr_syslog("CMailFile::sendfile with errorsto : ".$this->errors_to);
$res = mail($this->addr_to,$this->subject,stripslashes($message),$headers,"-f".$this->errors_to);
}
else
{
dolibarr_syslog("CMailFile::sendfile");
$res = mail($this->addr_to,$this->subject,stripslashes($message),$headers);
}
error_reporting($errorlevel); // Réactive niveau erreur origine
//$this->write_to_file();
return $res;
} }
/** /**
\brief permet d'ecrire le body d'un message * \brief Ecrit le mail dans un fichier.
\param msgtext * Utilisation pour le debuggage
\param filename_list */
function write_to_file()
{
$headers = $this->smtp_headers . $this->mime_headers;
$message = $this->text_body . $this->text_encoded;
$fp = fopen("/tmp/mail","w");
fputs($fp, $headers);
fputs($fp, $message);
fclose($fp);
}
/**
\brief Permet d'ecrire le corps du message
\param msgtext
\param filename_list
*/ */
function write_body($msgtext, $filename_list) function write_body($msgtext, $filename_list)
{ {
if (count($filename_list)) if (count($filename_list))
{ {
$out = "--" . $this->mime_boundary . "\n"; $out = "--" . $this->mime_boundary . "\n";
$out = $out . "Content-Type: text/plain; charset=\"iso8859-15\"\n\n"; $out = $out . "Content-Type: text/plain; charset=\"iso8859-15\"\n\n";
// $out = $out . "Content-Type: text/plain; charset=\"us-ascii\"\n\n"; // $out = $out . "Content-Type: text/plain; charset=\"us-ascii\"\n\n";
} }
$out = $out . $msgtext . "\n"; $out = $out . $msgtext . "\n";
return $out; return $out;
} }
/** /**
\brief création des headers mime \brief création des headers mime
\param filename_list \param filename_list
\param mimefilename_list \param mimefilename_list
*/ */
function write_mimeheaders($filename_list, $mimefilename_list) { function write_mimeheaders($filename_list, $mimefilename_list) {
$out = "MIME-version: 1.0\n"; $out = "MIME-version: 1.0\n";
$out = $out . "Content-type: multipart/mixed; "; $out = $out . "Content-type: multipart/mixed; ";
$out = $out . "boundary=\"$this->mime_boundary\"\n"; $out = $out . "boundary=\"$this->mime_boundary\"\n";
$out = $out . "Content-transfer-encoding: 7BIT\n"; $out = $out . "Content-transfer-encoding: 7BIT\n";
for($i = 0; $i < count($filename_list); $i++) { for($i = 0; $i < count($filename_list); $i++) {
if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i]; if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
$out = $out . "X-attachments: $filename_list[$i];\n\n"; $out = $out . "X-attachments: $filename_list[$i];\n\n";
}
return $out;
} }
return $out;
}
/** /**
\brief création des headers smtp \brief création des headers smtp
*/ */
function write_smtpheaders() function write_smtpheaders()
{ {
$out = "From: ".$this->addr_from."\n"; $out = "From: ".$this->addr_from."\n";
if ($this->addr_cc) $out = $out . "Cc: ".$this->addr_cc."\n"; if ($this->addr_cc) $out = $out . "Cc: ".$this->addr_cc."\n";
if ($this->addr_bcc) $out = $out . "Bcc: ".$this->addr_bcc."\n"; if ($this->addr_bcc) $out = $out . "Bcc: ".$this->addr_bcc."\n";
if ($this->reply_to) $out = $out . "Reply-To: ".$this->reply_to."\n";
$out = $out . "Reply-To: $addr_from\n"; // if($this->errors_to != "")
$out = $out . "X-Mailer: Dolibarr version " . DOL_VERSION ."\n"; //$out = $out . "Errors-to: ".$this->errors_to."\n";
$out = $out . "X-Sender: $addr_from\n";
$out = $out . "Return-path: $addr_from\n"; $out = $out . "X-Mailer: Dolibarr version " . DOL_VERSION ."\n";
return $out; $out = $out . "X-Sender: $this->addr_from\n";
$out = $out . "Return-path: $this->addr_from\n";
return $out;
} }
} }
/** /**
\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 "\r\n"
*/ */
function my_chunk_split($str) function my_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) . "\r\n";
$stmp = substr($stmp, 76); $stmp = substr($stmp, 76);
$len = $len - 76; $len = $len - 76;
}
else {
$out = $out . $stmp . "\r\n";
$stmp = ""; $len = 0;
}
} }
else { return $out;
$out = $out . $stmp . "\r\n";
$stmp = ""; $len = 0;
}
}
return $out;
} }