/**
  *	CMailFile
  *
  *	@param 	string	$subject             Topic/Subject of mail
  *	@param 	string	$to                  Recipients emails (RFC 2822: "Nom firstname <email>[, ...]" ou "email[, ...]" ou "<email>[, ...]")
  *	@param 	string	$from                Sender email      (RFC 2822: "Nom firstname <email>[, ...]" ou "email[, ...]" ou "<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 errors
  *	@param	string	$css                 Css option
  */
 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 = '')
 {
     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"));
     // On defini alternative_boundary
     $this->alternative_boundary = 'mul_' . dol_hash(uniqid("dolibarr3"));
     // 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}", 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
     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;
         $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));
             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));
                 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';
             }
         }
     }
 }
Example #2
0
	/**
	 *	CMailFile
	 *
	 *	@param 	subject             Topic/Subject of mail
	 *	@param 	to                  Recipients emails (RFC 2822: "Nom prenom <email>[, ...]" ou "email[, ...]" ou "<email>[, ...]")
	 *	@param 	from                Sender email      (RFC 2822: "Nom prenom <email>[, ...]" ou "email[, ...]" ou "<email>[, ...]")
	 *	@param 	msg                 Message
	 *	@param 	filename_list       List of files to attach (full path of filename on file system)
	 *	@param 	mimetype_list       List of MIME type of attached files
	 *	@param 	mimefilename_list   List of attached file name in message
	 *	@param 	addr_cc             Email cc
	 *	@param 	addr_bcc            Email bcc
	 *	@param 	deliveryreceipt		Ask a delivery receipt
	 *	@param 	msgishtml       	1=String IS already html, 0=String IS NOT html, -1=Unknown need autodetection
	 *	@param 	errors_to      		Email errors
	 *	@param	css			        Css option
	 */
	function CMailFile($subject,$to,$from,$msg,
	$filename_list=array(),$mimetype_list=array(),$mimefilename_list=array(),
	$addr_cc="",$addr_bcc="",$deliveryreceipt=0,$msgishtml=0,$errors_to='',$css='')
	{
		global $conf;

		// We define end of line (RFC 822bis section 2.3)
		$this->eol="\r\n";
		//if (preg_match('/^win/i',PHP_OS)) $this->eol="\r\n";
		//if (preg_match('/^mac/i',PHP_OS)) $this->eol="\r";

		// On defini mixed_boundary
		$this->mixed_boundary = md5(uniqid("dolibarr1"));

		// On defini related_boundary
		$this->related_boundary = md5(uniqid("dolibarr2"));

		// On defini alternative_boundary
		$this->alternative_boundary = md5(uniqid("dolibarr3"));

		// 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", 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
		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;
			$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();
				}

				$msg = $this->html;
			}

			// Define body in text_body
			$text_body = $this->write_body($msg);

			// Encode images
			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 et $this->message
			$this->headers = $smtp_headers . $mime_headers;

			$this->message = $text_body . $images_encoded . $files_encoded;
			$this->message.= "--" . $this->mixed_boundary . "--" . $this->eol;

			// 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);
		}
		else if ($conf->global->MAIN_MAIL_SENDMODE == 'smtps')
		{
			// Use SMTPS library
			// ------------------------------------------

			require_once(DOL_DOCUMENT_ROOT."/includes/smtps/SMTPs.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));

			if (! empty($this->html))
			{
				if (!empty($css))
				{
					$this->css = $css;
					$this->styleCSS = $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';
		}

	}