Esempio n. 1
0
 /**
  *	CMailFile
  *
  *	@param 	string	$subject             Topic/Subject of mail
  *	@param 	string	$to                  Recipients emails (RFC 2822: "Name firstname <email>[, ...]" or "email[, ...]" or "<email>[, ...]"). Note: the keyword '__SUPERVISOREMAIL__' is not allowed here and must be replaced by caller.
  *	@param 	string	$from                Sender email      (RFC 2822: "Name firstname <email>[, ...]" or "email[, ...]" or "<email>[, ...]")
  *	@param 	string	$msg                 Message
  *	@param 	array	$filename_list       List of files to attach (full path of filename on file system)
  *	@param 	array	$mimetype_list       List of MIME type of attached files
  *	@param 	array	$mimefilename_list   List of attached file name in message
  *	@param 	string	$addr_cc             Email cc
  *	@param 	string	$addr_bcc            Email bcc (Note: This is autocompleted with MAIN_MAIL_AUTOCOPY_TO if defined)
  *	@param 	int		$deliveryreceipt     Ask a delivery receipt
  *	@param 	int		$msgishtml           1=String IS already html, 0=String IS NOT html, -1=Unknown make autodetection (with fast mode, not reliable)
  *	@param 	string	$errors_to      	 Email for errors-to
  *	@param	string	$css                 Css option
  *	@param	string	$trackid             Tracking string
  */
 function __construct($subject, $to, $from, $msg, $filename_list = array(), $mimetype_list = array(), $mimefilename_list = array(), $addr_cc = "", $addr_bcc = "", $deliveryreceipt = 0, $msgishtml = 0, $errors_to = '', $css = '', $trackid = '')
 {
     global $conf;
     // We define end of line (RFC 821).
     $this->eol = "\r\n";
     // We define end of line for header fields (RFC 822bis section 2.3 says header must contains \r\n).
     $this->eol2 = "\r\n";
     if (!empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)) {
         $this->eol = "\n";
         $this->eol2 = "\n";
     }
     // On defini mixed_boundary
     $this->mixed_boundary = "multipart_x." . time() . ".x_boundary";
     // On defini related_boundary
     $this->related_boundary = 'mul_' . dol_hash(uniqid("dolibarr2"), 3);
     // Force md5 hash (does not contains special chars)
     // On defini alternative_boundary
     $this->alternative_boundary = 'mul_' . dol_hash(uniqid("dolibarr3"), 3);
     // Force md5 hash (does not contains special chars)
     // If ending method not defined
     if (empty($conf->global->MAIN_MAIL_SENDMODE)) {
         $conf->global->MAIN_MAIL_SENDMODE = 'mail';
     }
     dol_syslog("CMailFile::CMailfile: MAIN_MAIL_SENDMODE=" . $conf->global->MAIN_MAIL_SENDMODE . " charset=" . $conf->file->character_set_client . " from={$from}, to={$to}, addr_cc={$addr_cc}, addr_bcc={$addr_bcc}, errors_to={$errors_to}, trackid={$trackid}", LOG_DEBUG);
     dol_syslog("CMailFile::CMailfile: subject={$subject}, deliveryreceipt={$deliveryreceipt}, msgishtml={$msgishtml}", LOG_DEBUG);
     // Detect if message is HTML (use fast method)
     if ($msgishtml == -1) {
         $this->msgishtml = 0;
         if (dol_textishtml($msg)) {
             $this->msgishtml = 1;
         }
     } else {
         $this->msgishtml = $msgishtml;
     }
     // Detect images
     if ($this->msgishtml) {
         $this->html = $msg;
         $findimg = $this->findHtmlImages($conf->fckeditor->dir_output);
         // Define if there is at least one file
         if ($findimg) {
             foreach ($this->html_images as $i => $val) {
                 if ($this->html_images[$i]) {
                     $this->atleastoneimage = 1;
                     dol_syslog("CMailFile::CMailfile: html_images[{$i}]['name']=" . $this->html_images[$i]['name'], LOG_DEBUG);
                 }
             }
         }
     }
     // Define if there is at least one file
     foreach ($filename_list as $i => $val) {
         if ($filename_list[$i]) {
             $this->atleastonefile = 1;
             dol_syslog("CMailFile::CMailfile: filename_list[{$i}]=" . $filename_list[$i] . ", mimetype_list[{$i}]=" . $mimetype_list[$i] . " mimefilename_list[{$i}]=" . $mimefilename_list[$i], LOG_DEBUG);
         }
     }
     // Add autocopy to (Note: Adding bcc for specific modules are also done from pages)
     if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_TO)) {
         $addr_bcc .= ($addr_bcc ? ', ' : '') . $conf->global->MAIN_MAIL_AUTOCOPY_TO;
     }
     // Action according to choosed sending method
     if ($conf->global->MAIN_MAIL_SENDMODE == 'mail') {
         // Use mail php function (default PHP method)
         // ------------------------------------------
         $smtp_headers = "";
         $mime_headers = "";
         $text_body = "";
         $files_encoded = "";
         // Define smtp_headers
         $this->subject = $subject;
         $this->addr_from = $from;
         $this->errors_to = $errors_to;
         $this->addr_to = $to;
         $this->addr_cc = $addr_cc;
         $this->addr_bcc = $addr_bcc;
         $this->deliveryreceipt = $deliveryreceipt;
         $this->trackid = $trackid;
         $smtp_headers = $this->write_smtpheaders();
         // Define mime_headers
         $mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list);
         if (!empty($this->html)) {
             if (!empty($css)) {
                 $this->css = $css;
                 $this->buildCSS();
                 // Build a css style (mode = all) into this->styleCSS and this->bodyCSS
             }
             $msg = $this->html;
         }
         // Define body in text_body
         $text_body = $this->write_body($msg);
         // Encode images
         $images_encoded = '';
         if ($this->atleastoneimage) {
             $images_encoded .= $this->write_images($this->images_encoded);
             // always end related and end alternative after inline images
             $images_encoded .= "--" . $this->related_boundary . "--" . $this->eol;
             $images_encoded .= $this->eol . "--" . $this->alternative_boundary . "--" . $this->eol;
             $images_encoded .= $this->eol;
         }
         // Add attachments to text_encoded
         if ($this->atleastonefile) {
             $files_encoded = $this->write_files($filename_list, $mimetype_list, $mimefilename_list);
         }
         // We now define $this->headers and $this->message
         $this->headers = $smtp_headers . $mime_headers;
         // On nettoie le header pour qu'il ne se termine pas par un retour chariot.
         // Ceci evite aussi les lignes vides en fin qui peuvent etre interpretees
         // comme des injections mail par les serveurs de messagerie.
         $this->headers = preg_replace("/([\r\n]+)\$/i", "", $this->headers);
         $this->message = 'This is a message with multiple parts in MIME format.' . $this->eol;
         $this->message .= $text_body . $images_encoded . $files_encoded;
         $this->message .= "--" . $this->mixed_boundary . "--" . $this->eol;
     } else {
         if ($conf->global->MAIN_MAIL_SENDMODE == 'smtps') {
             // Use SMTPS library
             // ------------------------------------------
             require_once DOL_DOCUMENT_ROOT . '/core/class/smtps.class.php';
             $smtps = new SMTPs();
             $smtps->setCharSet($conf->file->character_set_client);
             $smtps->setSubject($this->encodetorfc2822($subject));
             $smtps->setTO($this->getValidAddress($to, 0, 1));
             $smtps->setFrom($this->getValidAddress($from, 0, 1));
             $smtps->setTrackId($trackid);
             if (!empty($this->html)) {
                 if (!empty($css)) {
                     $this->css = $css;
                     $this->buildCSS();
                 }
                 $msg = $this->html;
                 $msg = $this->checkIfHTML($msg);
             }
             if ($this->msgishtml) {
                 $smtps->setBodyContent($msg, 'html');
             } else {
                 $smtps->setBodyContent($msg, 'plain');
             }
             if ($this->atleastoneimage) {
                 foreach ($this->images_encoded as $img) {
                     $smtps->setImageInline($img['image_encoded'], $img['name'], $img['content_type'], $img['cid']);
                 }
             }
             if ($this->atleastonefile) {
                 foreach ($filename_list as $i => $val) {
                     $content = file_get_contents($filename_list[$i]);
                     $smtps->setAttachment($content, $mimefilename_list[$i], $mimetype_list[$i]);
                 }
             }
             $smtps->setCC($addr_cc);
             $smtps->setBCC($addr_bcc);
             $smtps->setErrorsTo($errors_to);
             $smtps->setDeliveryReceipt($deliveryreceipt);
             $this->smtps = $smtps;
         } else {
             if ($conf->global->MAIN_MAIL_SENDMODE == 'phpmailer') {
                 // Use PHPMailer library
                 // ------------------------------------------
                 require_once DOL_DOCUMENT_ROOT . '/includes/phpmailer/class.phpmailer.php';
                 $this->phpmailer = new PHPMailer();
                 $this->phpmailer->CharSet = $conf->file->character_set_client;
                 $this->phpmailer->Subject($this->encodetorfc2822($subject));
                 $this->phpmailer->setTO($this->getValidAddress($to, 0, 1));
                 $this->phpmailer->SetFrom($this->getValidAddress($from, 0, 1));
                 // TODO Add trackid into smtp header
                 if (!empty($this->html)) {
                     if (!empty($css)) {
                         $this->css = $css;
                         $this->buildCSS();
                     }
                     $msg = $this->html;
                     $msg = $this->checkIfHTML($msg);
                 }
                 if ($this->msgishtml) {
                     $smtps->setBodyContent($msg, 'html');
                 } else {
                     $smtps->setBodyContent($msg, 'plain');
                 }
                 if ($this->atleastoneimage) {
                     foreach ($this->images_encoded as $img) {
                         $smtps->setImageInline($img['image_encoded'], $img['name'], $img['content_type'], $img['cid']);
                     }
                 }
                 if ($this->atleastonefile) {
                     foreach ($filename_list as $i => $val) {
                         $content = file_get_contents($filename_list[$i]);
                         $smtps->setAttachment($content, $mimefilename_list[$i], $mimetype_list[$i]);
                     }
                 }
                 $smtps->setCC($addr_cc);
                 $smtps->setBCC($addr_bcc);
                 $smtps->setErrorsTo($errors_to);
                 $smtps->setDeliveryReceipt($deliveryreceipt);
                 $this->smtps = $smtps;
             } else {
                 // Send mail method not correctly defined
                 // --------------------------------------
                 return 'Bad value for MAIN_MAIL_SENDMODE constant';
             }
         }
     }
 }