diff --git a/phpBB/includes/emailer.php b/phpBB/includes/emailer.php index 0d86df6d82..5e2ca54f07 100755 --- a/phpBB/includes/emailer.php +++ b/phpBB/includes/emailer.php @@ -50,9 +50,7 @@ class emailer $this->mimeOut = ''; } - // // Resets all the data (address, template file, etc etc to default - // function reset() { $this->tpl_file = ''; @@ -62,26 +60,20 @@ class emailer $this->vars = ''; } - // // Sets an email address to send to - // function email_address($address) { $this->address = ''; $this->address .= $address; } - // // set up subject for mail - // function set_subject($subject = '') { $this->subject = $subject; } - // // set up extra mail headers - // function extra_headers($headers) { $this->extra_headers = $headers; @@ -91,18 +83,18 @@ class emailer { global $config, $phpbb_root_path; - if ( $template_lang == '' ) + if ($template_lang == '') { $template_lang = $config['default_lang']; } $this->tpl_file = $phpbb_root_path . 'language/' . $template_lang . '/email/' . $template_file . '.txt'; - if ( !file_exists($this->tpl_file) ) + if (!file_exists($this->tpl_file)) { trigger_error('Could not find email template file ' . $template_file); } - if ( !$this->load_msg() ) + if (!$this->load_msg()) { trigger_error('Could not load email template file ' . $template_file); } @@ -110,17 +102,15 @@ class emailer return true; } - // // Open the template file and read in the message - // function load_msg() { - if ( $this->tpl_file == NULL ) + if ($this->tpl_file == NULL) { trigger_error('No template file set'); } - if ( !($fd = fopen($this->tpl_file, 'r')) ) + if (!($fd = fopen($this->tpl_file, 'r'))) { trigger_error('Failed opening template file'); } @@ -133,13 +123,12 @@ class emailer function assign_vars($vars) { - $this->vars = ( empty($this->vars) ) ? $vars : $this->vars . $vars; + $this->vars = (empty($this->vars)) ? $vars : $this->vars . $vars; } function parse_email() { - @reset($this->vars); - while (list($key, $val) = @each($this->vars)) + foreach ($this->vars as $key => $val) { $$key = $val; } @@ -150,203 +139,101 @@ class emailer eval("\$this->msg = '$this->msg';"); - // // We now try and pull a subject from the email body ... if it exists, // do this here because the subject may contain a variable - // + $drop_header = ''; $match = array(); - preg_match("/^(Subject:(.*?)[\r\n]+?)?(Charset:(.*?)[\r\n]+?)?(.*?)$/is", $this->msg, $match); + if (preg_match('#^(Subject:(.*?))$#m', $this->msg, $match)) + { + $this->subject = (trim($match[2]) != '') ? trim($match[2]) : (($this->subject != '') ? $this->subject : 'No Subject'); + $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#'); + } + else + { + $this->subject = (($this->subject != '') ? $this->subject : 'No Subject'); + } - $this->msg = ( isset($match[5]) ) ? trim($match[5]) : ''; - $this->subject = ( $this->subject != '' ) ? $this->subject : trim($match[2]); - $this->encoding = ( trim($match[4]) != '' ) ? trim($match[4]) : 'iso-8859-1'; + if (preg_match('#^(Charset:(.*?))$#m', $this->msg, $match)) + { + $this->encoding = (trim($match[2]) != '') ? trim($match[2]) : trim($lang['ENCODING']); + $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#'); + } + else + { + $this->encoding = trim($lang['ENCODING']); + } + + if ($drop_header != '') + { + $this->msg = trim(preg_replace('#' . $drop_header . '#s', '', $this->msg)); + } + + // Split up message into 76 chars as per RFC2045 + // $this->msg = chunk_split($this->msg); return true; } - // // Send the mail out to the recipients set previously in var $this->address - // function send() { global $phpEx, $phpbb_root_path; - if ( $this->address == NULL ) + if ($this->address == NULL) { trigger_error('No email address set'); } - if ( !$this->parse_email() ) + if (!$this->parse_email()) { return false; } - // - // Add date and encoding type - // - $universal_extra = "MIME-Version: 1.0\nContent-type: text/plain; charset=" . $this->encoding . "\nContent-transfer-encoding: 8bit\nDate: " . gmdate('D, d M Y H:i:s', time()) . " UT\n"; - $this->extra_headers = $universal_extra . $this->extra_headers; + $universal_extra = "MIME-Version: 1.0\nContent-type: text/plain; charset=" . $this->encoding . "\nContent-transfer-encoding: 8bit\nDate: " . gmdate('D, d M Y H:i:s', time()) . " UT\nX-Priority: 3\nX-MSMail-Priority: Normal\nX-Mailer: PHP\n"; + $this->extra_headers = $universal_extra . trim($this->extra_headers); - $result = ( $this->use_smtp ) ? smtpmail($this->address, $this->subject, $this->msg, $this->extra_headers) : @mail($this->address, $this->subject, $this->msg, $this->extra_headers); + $result = ($this->use_smtp) ? smtpmail($this->address, $this->subject, $this->msg, $this->extra_headers) : @mail($this->address, $this->subject, $this->msg, $this->extra_headers); - if ( !$result ) + if (!$result) { - trigger_error('Failed sending email'); + trigger_error('Failed sending email :: ' . $result); } - + return true; } - - - // - // Attach files via MIME. - // - function attachFile($filename, $mimetype = "application/octet-stream", $szFromAddress, $szFilenameToDisplay) - { - $mime_boundary = "--==================_846811060==_"; - - $this->mailMsg = '--' . $mime_boundary . "\nContent-Type: text/plain;\n\tcharset=\"iso-8859-1\"\n\n" . $this->mailMsg; - - if ($mime_filename) - { - $filename = $mime_filename; - $encoded = $this->encode_file($filename); - } - - $fd = fopen($filename, "r"); - $contents = fread($fd, filesize($filename)); - - $this->mimeOut = "--" . $mime_boundary . "\n"; - $this->mimeOut .= "Content-Type: " . $mimetype . ";\n\tname=\"$szFilenameToDisplay\"\n"; - $this->mimeOut .= "Content-Transfer-Encoding: quoted-printable\n"; - $this->mimeOut .= "Content-Disposition: attachment;\n\tfilename=\"$szFilenameToDisplay\"\n\n"; - - if ( $mimetype == "message/rfc822" ) - { - $this->mimeOut .= "From: ".$szFromAddress."\n"; - $this->mimeOut .= "To: ".$this->emailAddress."\n"; - $this->mimeOut .= "Date: ".date("D, d M Y H:i:s") . " UT\n"; - $this->mimeOut .= "Reply-To:".$szFromAddress."\n"; - $this->mimeOut .= "Subject: ".$this->mailSubject."\n"; - $this->mimeOut .= "X-Mailer: PHP/".phpversion()."\n"; - $this->mimeOut .= "MIME-Version: 1.0\n"; - } - - $this->mimeOut .= $contents."\n"; - $this->mimeOut .= "--" . $mime_boundary . "--" . "\n"; - - return $out; - // added -- to notify email client attachment is done - } - - function getMimeHeaders($filename, $mime_filename="") - { - $mime_boundary = "--==================_846811060==_"; - - if ($mime_filename) - { - $filename = $mime_filename; - } - - $out = "MIME-Version: 1.0\n"; - $out .= "Content-Type: multipart/mixed;\n\tboundary=\"$mime_boundary\"\n\n"; - $out .= "This message is in MIME format. Since your mail reader does not understand\n"; - $out .= "this format, some or all of this message may not be legible."; - - return $out; - } - - // - // Split string by RFC 2045 semantics (76 chars per line, end with \r\n). - // - function myChunkSplit($str) - { - $stmp = $str; - $len = strlen($stmp); - $out = ""; - - while ($len > 0) - { - if ($len >= 76) - { - $out .= substr($stmp, 0, 76) . "\r\n"; - $stmp = substr($stmp, 76); - $len = $len - 76; - } - else - { - $out .= $stmp . "\r\n"; - $stmp = ""; - $len = 0; - } - } - return $out; - } - - // - // Split the specified file up into a string and return it - // - function encode_file($sourcefile) - { - if (is_readable($sourcefile)) - { - $fd = fopen($sourcefile, "r"); - $contents = fread($fd, filesize($sourcefile)); - $encoded = $this->myChunkSplit(base64_encode($contents)); - fclose($fd); - } - - return $encoded; - } - } // class emailer -// -// This function has been modified as provided -// by SirSir to allow multiline responses when +// This function has been modified as provided by SirSir to allow multiline responses when // using SMTP Extensions -// function server_parse($socket, $response) { - while ( substr($server_response,3,1) != ' ' ) + while (substr($server_response,3,1) != ' ') { - if( !( $server_response = fgets($socket, 256) ) ) + if (!($server_response = fgets($socket, 256))) { trigger_error('Could not get mail server response codes'); } } - if( !( substr($server_response, 0, 3) == $response ) ) + if (!(substr($server_response, 0, 3) == $response)) { trigger_error("Ran into problems sending Mail. Response: $server_response"); } } -/**************************************************************************** -* Function: smtpmail -* Description: This is a functional replacement for php's builtin mail -* function, that uses smtp. -* Usage: The usage for this function is identical to that of php's -* built in mail function. -****************************************************************************/ +// Replacement or substitute for PHP's mail command function smtpmail($mail_to, $subject, $message, $headers = '') { - // For now I'm using an array based $smtp_vars to hold the smtp server - // info, but it should probably change to $config... - // then the relevant info would be $config['smtp_host'] and - // $config['smtp_port']. global $config; - // // Fix any bare linefeeds in the message to make it RFC821 Compliant. - // $message = preg_replace("/(? 1) + if (sizeof($headers) > 1) { $headers = join("\r\n", $headers); } @@ -357,77 +244,80 @@ function smtpmail($mail_to, $subject, $message, $headers = '') } $headers = chop($headers); - // // Make sure there are no bare linefeeds in the headers - // - $headers = preg_replace("/(?\r\n" ); - server_parse( $socket, "250" ); + fputs($socket, "RCPT TO: <$mail_to_address>\r\n"); + server_parse($socket, "250"); } $to_header .= "<$mail_to_address>, "; } + // Ok now do the CC and BCC fields... - @reset( $bcc ); - while( list( , $bcc_address ) = each( $bcc )) + @reset($bcc); + while(list(, $bcc_address) = each($bcc)) { - // // Add an additional bit of error checking to bcc header... - // - $bcc_address = trim( $bcc_address ); - if ( preg_match('/[^ ]+\@[^ ]+/', $bcc_address) ) + $bcc_address = trim($bcc_address); + if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address)) { - fputs( $socket, "RCPT TO: <$bcc_address>\r\n" ); - server_parse( $socket, "250" ); + fputs($socket, "RCPT TO: <$bcc_address>\r\n"); + server_parse($socket, "250"); } } - @reset( $cc ); - while( list( , $cc_address ) = each( $cc )) + + @reset($cc); + while(list(, $cc_address) = each($cc)) { - // // Add an additional bit of error checking to cc header - // - $cc_address = trim( $cc_address ); - if ( preg_match('/[^ ]+\@[^ ]+/', $cc_address) ) + $cc_address = trim($cc_address); + if (preg_match('#[^ ]+\@[^ ]+#', $cc_address)) { fputs($socket, "RCPT TO: <$cc_address>\r\n"); server_parse($socket, "250"); } } + // Ok now we tell the server we are ready to start sending data fputs($socket, "DATA\r\n");