diff options
| author | Paul S. Owen <psotfx@users.sourceforge.net> | 2003-03-09 16:14:14 +0000 |
|---|---|---|
| committer | Paul S. Owen <psotfx@users.sourceforge.net> | 2003-03-09 16:14:14 +0000 |
| commit | 58e755b906e3e3a0509428a24cfe5fb1f63ae4dd (patch) | |
| tree | b79e4f399fb7ef9a08655509eb46fdc9d4da100d | |
| parent | 5cdf2b0b5902ad6073fb098a430cbb82dd91e3ad (diff) | |
| download | forums-58e755b906e3e3a0509428a24cfe5fb1f63ae4dd.tar forums-58e755b906e3e3a0509428a24cfe5fb1f63ae4dd.tar.gz forums-58e755b906e3e3a0509428a24cfe5fb1f63ae4dd.tar.bz2 forums-58e755b906e3e3a0509428a24cfe5fb1f63ae4dd.tar.xz forums-58e755b906e3e3a0509428a24cfe5fb1f63ae4dd.zip | |
Various cleanups ... no doubt breaking stuff in the process
git-svn-id: file:///svn/phpbb/trunk@3624 89ea8834-ac86-4346-8a33-228a782c2dd0
| -rwxr-xr-x | phpBB/includes/emailer.php | 295 |
1 files changed, 91 insertions, 204 deletions
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); - - $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'; - - 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 (preg_match('#^(Subject:(.*?))$#m', $this->msg, $match)) { - trigger_error('No email address set'); + $this->subject = (trim($match[2]) != '') ? trim($match[2]) : (($this->subject != '') ? $this->subject : 'No Subject'); + $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#'); } - - if ( !$this->parse_email() ) + else { - return false; + $this->subject = (($this->subject != '') ? $this->subject : 'No Subject'); } - // - // 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; - - $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 (preg_match('#^(Charset:(.*?))$#m', $this->msg, $match)) { - trigger_error('Failed sending email'); + $this->encoding = (trim($match[2]) != '') ? trim($match[2]) : trim($lang['ENCODING']); + $drop_header .= '[\r\n]*?' . preg_quote($match[1], '#'); } - - 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) + else { - $filename = $mime_filename; - $encoded = $this->encode_file($filename); + $this->encoding = trim($lang['ENCODING']); } - $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" ) + if ($drop_header != '') { - $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->msg = trim(preg_replace('#' . $drop_header . '#s', '', $this->msg)); } - $this->mimeOut .= $contents."\n"; - $this->mimeOut .= "--" . $mime_boundary . "--" . "\n"; + // Split up message into 76 chars as per RFC2045 + // $this->msg = chunk_split($this->msg); - return $out; - // added -- to notify email client attachment is done + return true; } - function getMimeHeaders($filename, $mime_filename="") + // Send the mail out to the recipients set previously in var $this->address + function send() { - $mime_boundary = "--==================_846811060==_"; + global $phpEx, $phpbb_root_path; - if ($mime_filename) + if ($this->address == NULL) { - $filename = $mime_filename; + trigger_error('No email address set'); } - $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 (!$this->parse_email()) { - 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 false; } - return $out; - } - // - // Split the specified file up into a string and return it - // - function encode_file($sourcefile) - { - if (is_readable($sourcefile)) + $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); + + if (!$result) { - $fd = fopen($sourcefile, "r"); - $contents = fread($fd, filesize($sourcefile)); - $encoded = $this->myChunkSplit(base64_encode($contents)); - fclose($fd); + trigger_error('Failed sending email :: ' . $result); } - - return $encoded; + + return true; } - } // 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("/(?<!\r)\n/si", "\r\n", $message); if ($headers != '') { - if(is_array($headers)) + if (is_array($headers)) { - if(sizeof($headers) > 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/si", "\r\n", $headers); - // + $headers = preg_replace("#(?<!\r)\n#si", "\r\n", $headers); + // Ok this is rather confusing all things considered, // but we have to grab bcc and cc headers and treat them differently // Something we really didn't take into consideration originally - // $header_array = explode("\r\n", $headers); @reset($header_array); + $headers = ""; - while( list(, $header) = each($header_array) ) + while(list(, $header) = each($header_array)) { - if( preg_match("/^cc:/si", $header) ) + if (preg_match("#^cc:#si", $header)) { - $cc = preg_replace("/^cc:(.*)/si", "\\1", $header); + $cc = preg_replace("#^cc:(.*)#si", "\\1", $header); } - else if( preg_match("/^bcc:/si", $header )) + else if (preg_match("#^bcc:/si", $header)) { - $bcc = preg_replace("/^bcc:(.*)/si", "\\1", $header); + $bcc = preg_replace("#^bcc:(.*)#si", "\\1", $header); $header = ""; } $headers .= $header . "\r\n"; } + $headers = chop($headers); - $cc = explode(",", $cc); - $bcc = explode(",", $bcc); + $cc = explode(',', $cc); + $bcc = explode(',', $bcc); } - if(trim($mail_to) == '') + + if (trim($mail_to) == '') { trigger_error('No email address specified'); } - if(trim($subject) == '') + + if (trim($subject) == '') { trigger_error('No email Subject specified'); } - if(trim($message) == '') + + if (trim($message) == '') { trigger_error('Email message was blank'); } - $mail_to_array = explode(",", $mail_to); - // + $mail_to_array = explode(',', $mail_to); + // Ok we have error checked as much as we can to this point let's get on // it already. - // - if( !$socket = fsockopen($config['smtp_host'], 25, $errno, $errstr, 20) ) + if (!$socket = fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 20)) { trigger_error("Could not connect to smtp host : $errno : $errstr"); } + + // Wait for reply server_parse($socket, "220"); - if( !empty($config['smtp_username']) && !empty($config['smtp_password']) ) + // Do we want to use AUTH?, send RFC2554 EHLO, else send RFC821 HELO + // This improved as provided by SirSir to accomodate + if (!empty($config['smtp_username']) && !empty($config['smtp_password'])) { - // Send the RFC2554 specified EHLO. - // This improved as provided by SirSir to accomodate - // both SMTP AND ESMTP capable servers fputs($socket, "EHLO " . $config['smtp_host'] . "\r\n"); server_parse($socket, "250"); fputs($socket, "AUTH LOGIN\r\n"); server_parse($socket, "334"); + fputs($socket, base64_encode($config['smtp_username']) . "\r\n"); server_parse($socket, "334"); + fputs($socket, base64_encode($config['smtp_password']) . "\r\n"); server_parse($socket, "235"); } else { - // Send the RFC821 specified HELO. fputs($socket, "HELO " . $config['smtp_host'] . "\r\n"); server_parse($socket, "250"); } @@ -439,47 +329,44 @@ function smtpmail($mail_to, $subject, $message, $headers = '') // Specify each user to send to and build to header. $to_header = "To: "; - @reset( $mail_to_array ); - while( list( , $mail_to_address ) = each( $mail_to_array )) + @reset($mail_to_array); + while(list(, $mail_to_address) = each($mail_to_array)) { - // // Add an additional bit of error checking to the To field. - // $mail_to_address = trim($mail_to_address); - if ( preg_match('/[^ ]+\@[^ ]+/', $mail_to_address) ) + if (preg_match('#[^ ]+\@[^ ]+#', $mail_to_address)) { - fputs( $socket, "RCPT TO: <$mail_to_address>\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"); |
