diff --git a/htdocs/actioncomm.class.php b/htdocs/actioncomm.class.php index 8452b6758d2..9a062fdd74f 100644 --- a/htdocs/actioncomm.class.php +++ b/htdocs/actioncomm.class.php @@ -38,6 +38,7 @@ class ActionComm var $id; var $db; + var $label; var $date; var $type_code; var $type; @@ -69,61 +70,53 @@ class ActionComm * \brief Ajout d'une action en base (et eventuellement dans webcalendar) * \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 - * \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; - - if (! $this->contact) - { - $this->contact = 0; - } - if (! $this->propalrowid) - { - $this->propalrowid = 0; - } - if (! $this->percent) - { - $this->percent = 0; - } - if (! $this->priority) - { - $this->priority = 0; - } - - $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) "; - $sql .= " VALUES ('$this->date', '$this->libelle', $this->type, $this->societe, $author->id,"; - $sql .= $this->user->id . ", $this->contact, '$this->percent', '$this->note', $this->priority, $this->propalrowid);"; - - if ($this->db->query($sql) ) - { - $idaction = $this->db->last_insert_id(MAIN_DB_PREFIX."actioncomm"); - - if ($conf->webcal->enabled) { - if (is_object($webcal)) - { - // Ajoute entrée dans webcal - $result=$webcal->add($author,$webcal->date,$webcal->texte,$webcal->desc); - if ($result < 0) { - $this->error="Echec insertion dans webcal: ".$webcal->error; + global $conf; + + if (! $this->percent) $this->percent = 0; + if (! $this->priority) $this->priority = 0; + + $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm"; + $sql.= "(datea,fk_action,fk_soc,note,fk_contact,fk_user_author,fk_user_action,label,percent,priority,"; + $sql.= "fk_facture,propalrowid)"; + $sql.= " VALUES (now(), '".$this->type_code."', '".$this->societe->id."' ,'".addslashes($this->note)."',"; + $sql.= ($this->contact->id?$this->contact->id:"null").","; + $sql.= "'$author->id', '".$this->user->id ."', '".$this->label."',100,'".$this->priority."',"; + $sql.= ($this->facid?$this->facid:"null").","; + $sql.= ($this->propalrowid?$this->propalrowid:"null"); + $sql.= ");"; + + if ($this->db->query($sql) ) + { + $idaction = $this->db->last_insert_id(MAIN_DB_PREFIX."actioncomm"); + + if ($conf->webcal->enabled) { + if (is_object($webcal)) + { + // Ajoute entrée dans webcal + $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) + { + // \todo On ajoute une entrée générique, pour l'instant pas utilis + } } - else if ($webcal == 1) - { - // \todo On ajoute une entrée générique, pour l'instant pas utilisé - - } + + return $idaction; } - - return $idaction; - } - else - { - dolibarr_print_error($this->db); - return -1; - } - + else + { + dolibarr_print_error($this->db); + return -1; + } + } /** diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 9b4d2755d79..2fd0ad91565 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -205,7 +205,7 @@ if ($_POST["action"] == 'send') // Envoi de la facture $mailfile = new CMailFile($subject,$sendto,$from,$message,$filepath,$mimetype,$filename,$sendtocc); - if (! $mailfile->sendfile()) + if ($mailfile->sendfile()) { $msg='
'.$langs->trans("MailSuccessfulySent",$from,$sendto).'.
'; diff --git a/htdocs/lib/CMailFile.class.php b/htdocs/lib/CMailFile.class.php index a6f2376f280..4aafaaa252f 100644 --- a/htdocs/lib/CMailFile.class.php +++ b/htdocs/lib/CMailFile.class.php @@ -1,33 +1,44 @@ + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2005 Laurent Destailleur + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * 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 - \author Dan Potter. - \author Eric Seigne - \author Laurent Destailleur. - \version $Revision$ +/** + \file htdocs/lib/CMailFile.class.php + \brief Classe permettant d'envoyer des mail avec attachements + \author Dan Potter. + \author Eric Seigne + \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 $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filename,$mimetype); \remarks $mailfile->sendfile(); @@ -35,172 +46,217 @@ to chunk_split class CMailFile { - var $subject; - var $addr_from; - var $addr_to; - var $addr_cc; - var $addr_bcc; - var $text_body; - var $text_encoded; - var $mime_headers; - var $mime_boundary = "--==================_846811060==_"; - var $smtp_headers; + var $subject; + var $addr_from; + var $addr_to; + var $addr_cc; + var $addr_bcc; + var $text_body; + var $text_encoded; + var $mime_headers; + var $mime_boundary; + var $smtp_headers; /** - \brief CMailFile - \param subject sujet - \param to email destinataire - \param from email emetteur - \param msg message - \param filename_list tableau de fichiers attachés - \param mimetype_list tableau des types des fichiers attachés - \param mimefilename_list tableau des noms des fichiers attachés - \param addr_cc email cc - \param addr_bcc email bcc + \brief CMailFile + \param subject sujet + \param to email destinataire + \param from email emetteur + \param msg message + \param filename_list tableau de fichiers attachés + \param mimetype_list tableau des types des fichiers attachés + \param mimefilename_list tableau des noms des fichiers attachés + \param addr_cc email cc + \param addr_bcc email bcc */ function CMailFile($subject,$to,$from,$msg,$filename_list,$mimetype_list,$mimefilename_list,$addr_cc="",$addr_bcc="") { - $this->subject = $subject; - $this->addr_from = $from; - $this->addr_to = $to; - $this->addr_cc = $addr_cc; - $this->addr_bcc = $addr_bcc; - $this->smtp_headers = $this->write_smtpheaders(); - $this->text_body = $this->write_body($msg, $filename_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); - } + $this->mime_boundary = md5( uniqid("dolibarr") ); + + $this->subject = $subject; + $this->addr_from = $from; + $this->addr_to = $to; + $this->addr_cc = $addr_cc; + $this->addr_bcc = $addr_bcc; + $this->smtp_headers = $this->write_smtpheaders(); + $this->text_body = $this->write_body($msg, $filename_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 - \param filename_list - \param mimetype_list - \param mimefilename_list + \brief permet d'attacher un fichier + \param filename_list + \param mimetype_list + \param mimefilename_list */ function attach_file($filename_list,$mimetype_list,$mimefilename_list) { - 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]; - $out = $out . "--" . $this->mime_boundary . "\n"; - if (! $mimetype_list[$i]) { $mimetype_list[$i] = "application/octet-stream"; } - $out = $out . "Content-type: " . $mimetype_list[$i] . "; name=\"$filename_list[$i]\";\n"; - $out = $out . "Content-Transfer-Encoding: base64\n"; - $out = $out . "Content-disposition: attachment; filename=\"$filename_list[$i]\"\n\n"; - $out = $out . $encoded . "\n"; - } - $out = $out . "--" . $this->mime_boundary . "--" . "\n"; - return $out; - // added -- to notify email client attachment is done + 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]; + $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; + // added -- to notify email client attachment is done } /** - \brief permet d'encoder un fichier - \param sourcefile + \brief Permet d'encoder un fichier + \param sourcefile + \return < 0 si erreur, fichier encodé si ok */ function encode_file($sourcefile) { - // print "
 on encode $sourcefile 
\n"; - if (is_readable($sourcefile)) - { - $fd = fopen($sourcefile, "r"); - $contents = fread($fd, filesize($sourcefile)); - $encoded = my_chunk_split(base64_encode($contents)); - fclose($fd); - } - return $encoded; - } + if (is_readable($sourcefile)) + { + $fd = fopen($sourcefile, "r"); + $contents = fread($fd, filesize($sourcefile)); + $encoded = chunk_split(base64_encode($contents)); + //$encoded = my_chunk_split(base64_encode($contents)); + fclose($fd); + } + 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() { - $headers .= $this->smtp_headers . $this->mime_headers; - $message = $this->text_body . $this->text_encoded; - return mail($this->addr_to,$this->subject,stripslashes($message),$headers); + $headers = $this->smtp_headers . $this->mime_headers; + $message = $this->text_body . $this->text_encoded; + + $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 - \param msgtext - \param filename_list + * \brief Ecrit le mail dans un fichier. + * Utilisation pour le debuggage + */ + 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) { - if (count($filename_list)) - { - $out = "--" . $this->mime_boundary . "\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 . $msgtext . "\n"; - return $out; + if (count($filename_list)) + { + $out = "--" . $this->mime_boundary . "\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 . $msgtext . "\n"; + return $out; } /** - \brief création des headers mime - \param filename_list - \param mimefilename_list + \brief création des headers mime + \param filename_list + \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"; + $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; } - return $out; - } /** - \brief création des headers smtp + \brief création des headers smtp */ function write_smtpheaders() { - $out = "From: ".$this->addr_from."\n"; - if ($this->addr_cc) $out = $out . "Cc: ".$this->addr_cc."\n"; - if ($this->addr_bcc) $out = $out . "Bcc: ".$this->addr_bcc."\n"; + $out = "From: ".$this->addr_from."\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->reply_to) $out = $out . "Reply-To: ".$this->reply_to."\n"; - $out = $out . "Reply-To: $addr_from\n"; - $out = $out . "X-Mailer: Dolibarr version " . DOL_VERSION ."\n"; - $out = $out . "X-Sender: $addr_from\n"; - $out = $out . "Return-path: $addr_from\n"; - return $out; + // if($this->errors_to != "") + //$out = $out . "Errors-to: ".$this->errors_to."\n"; + + $out = $out . "X-Mailer: Dolibarr version " . DOL_VERSION ."\n"; + $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) - \param str - \remarks function chunk_split qui remplace celle de php si nécéssaire - \remarks 76 caractères par ligne, terminé par "\r\n" + \brief Permet de diviser une chaine (RFC2045) + \param str + \remarks function chunk_split qui remplace celle de php si nécéssaire + \remarks 76 caractères par ligne, terminé par "\r\n" */ function my_chunk_split($str) { - $stmp = $str; - $len = strlen($stmp); - $out = ""; - while ($len > 0) { - if ($len >= 76) { - $out = $out . substr($stmp, 0, 76) . "\r\n"; - $stmp = substr($stmp, 76); - $len = $len - 76; + $stmp = $str; + $len = strlen($stmp); + $out = ""; + while ($len > 0) { + if ($len >= 76) { + $out = $out . substr($stmp, 0, 76) . "\r\n"; + $stmp = substr($stmp, 76); + $len = $len - 76; + } + else { + $out = $out . $stmp . "\r\n"; + $stmp = ""; $len = 0; + } } - else { - $out = $out . $stmp . "\r\n"; - $stmp = ""; $len = 0; - } - } - return $out; + return $out; }