/** * 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'; } } } }