|
From: FlorinCB <ory...@us...> - 2008-10-07 02:16:56
|
Update of /cvsroot/mxbb/core/includes In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv8749/includes Added Files: mx_functions_emailer.php mx_functions_smtp.php Log Message: mx emailer --- NEW FILE: mx_functions_smtp.php --- <?php /** * * @package Emailer * @version $Id: mx_functions_smtp.php,v 1.1 2008/10/07 00:10:14 orynider Exp $ * @copyright (c) 2002-2008 MX-Publisher Project Team & ( C) 2001 The phpBB Group * @license http://opensource.org/licenses/gpl-license.php GNU General Public License v2 * @link http://www.mx-publisher.com * /** * Modifications: * * */ /** * Emailer * @package MXP3 */ define('SMTP_INCLUDED', 1); // // This function has been modified as provided // by SirSir to allow multiline responses when // using SMTP Extensions // function server_parse($socket, $response, $line = __LINE__) { $server_response = ''; while (substr($server_response, 3, 1) != ' ') { if (!($server_response = fgets($socket, 256))) { mx_message_die(GENERAL_ERROR, "Couldn't get mail server response codes", "", $line, __FILE__); } } if (!(substr($server_response, 0, 3) == $response)) { mx_message_die(GENERAL_ERROR, "Ran into problems sending Mail. Response: $server_response", "", $line, __FILE__); } } // Replacement or substitute for PHP's mail command function smtpmail($mail_to, $subject, $message, $headers = '') { global $board_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 (sizeof($headers) > 1) { $headers = join("\n", $headers); } else { $headers = $headers[0]; } } $headers = chop($headers); // Make sure there are no bare linefeeds in the 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)) { if (preg_match('#^cc:#si', $header)) { $cc = preg_replace('#^cc:(.*)#si', '\1', $header); } else if (preg_match('#^bcc:#si', $header)) { $bcc = preg_replace('#^bcc:(.*)#si', '\1', $header); $header = ''; } $headers .= ($header != '') ? $header . "\r\n" : ''; } $headers = chop($headers); $cc = explode(', ', $cc); $bcc = explode(', ', $bcc); } if (trim($subject) == '') { mx_message_die(GENERAL_ERROR, "No email Subject specified", "", __LINE__, __FILE__); } if (trim($message) == '') { mx_message_die(GENERAL_ERROR, "Email message was blank", "", __LINE__, __FILE__); } // Ok we have error checked as much as we can to this point let's get on // it already. if( !$socket = @fsockopen($board_config['smtp_host'], 25, $errno, $errstr, 20) ) { mx_message_die(GENERAL_ERROR, "Could not connect to smtp host : $errno : $errstr", "", __LINE__, __FILE__); } // Wait for reply server_parse($socket, "220", __LINE__); // Do we want to use AUTH?, send RFC2554 EHLO, else send RFC821 HELO // This improved as provided by SirSir to accomodate if( !empty($board_config['smtp_username']) && !empty($board_config['smtp_password']) ) { fputs($socket, "EHLO " . $board_config['smtp_host'] . "\r\n"); server_parse($socket, "250", __LINE__); fputs($socket, "AUTH LOGIN\r\n"); server_parse($socket, "334", __LINE__); fputs($socket, base64_encode($board_config['smtp_username']) . "\r\n"); server_parse($socket, "334", __LINE__); fputs($socket, base64_encode($board_config['smtp_password']) . "\r\n"); server_parse($socket, "235", __LINE__); } else { fputs($socket, "HELO " . $board_config['smtp_host'] . "\r\n"); server_parse($socket, "250", __LINE__); } // From this point onward most server response codes should be 250 // Specify who the mail is from.... fputs($socket, "MAIL FROM: <" . $board_config['board_email'] . ">\r\n"); server_parse($socket, "250", __LINE__); // Specify each user to send to and build to header. $to_header = ''; // Add an additional bit of error checking to the To field. $mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to); if (preg_match('#[^ ]+\@[^ ]+#', $mail_to)) { fputs($socket, "RCPT TO: <$mail_to>\r\n"); server_parse($socket, "250", __LINE__); } // Ok now do the CC and BCC fields... @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)) { fputs($socket, "RCPT TO: <$bcc_address>\r\n"); server_parse($socket, "250", __LINE__); } } @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)) { fputs($socket, "RCPT TO: <$cc_address>\r\n"); server_parse($socket, "250", __LINE__); } } // Ok now we tell the server we are ready to start sending data fputs($socket, "DATA\r\n"); // This is the last response code we look for until the end of the message. server_parse($socket, "354", __LINE__); // Send the Subject Line... fputs($socket, "Subject: $subject\r\n"); // Now the To Header. fputs($socket, "To: $mail_to\r\n"); // Now any custom headers.... fputs($socket, "$headers\r\n\r\n"); // Ok now we are ready for the message... fputs($socket, "$message\r\n"); // Ok the all the ingredients are mixed in let's cook this puppy... fputs($socket, ".\r\n"); server_parse($socket, "250", __LINE__); // Now tell the server we are done and close the socket... fputs($socket, "QUIT\r\n"); fclose($socket); return TRUE; } ?> --- NEW FILE: mx_functions_emailer.php --- <?php /** * * @package Emailer * @version $Id: mx_functions_emailer.php,v 1.1 2008/10/07 00:10:14 orynider Exp $ * @copyright (c) 2002-2008 MX-Publisher Project Team & ( C) 2001 The phpBB Group * @license http://opensource.org/licenses/gpl-license.php GNU General Public License v2 * @link http://www.mx-publisher.com * /** * Modifications: * Added $emailer->use_html method by OryNider * */ /** * Emailer * @package MXP3 */ class mx_emailer { var $msg, $subject, $extra_headers; var $addresses, $reply_to, $from; var $use_smtp; var $tpl_msg = array(); var $use_html = false; function emailer($use_smtp) { $this->reset(); $this->use_smtp = $use_smtp; $this->use_html = false; $this->reply_to = $this->from = ''; } // Resets all the data (address, template file, etc etc to default function reset() { $this->addresses = array(); $this->vars = $this->msg = $this->extra_headers = ''; } // Sets an email address to send to function email_address($address) { $this->addresses['to'] = trim($address); } function cc($address) { $this->addresses['cc'][] = trim($address); } function bcc($address) { $this->addresses['bcc'][] = trim($address); } function replyto($address) { $this->reply_to = trim($address); } function from($address) { $this->from = trim($address); } // set up subject for mail function set_subject($subject = '') { $this->subject = trim(preg_replace('#[\n\r]+#s', '', $subject)); } // set up extra mail headers function extra_headers($headers) { $this->extra_headers .= trim($headers) . "\n"; } function set_mail_priority($priority = MAIL_NORMAL_PRIORITY) { $this->mail_priority = $priority; } /** * Set the email html */ function set_mail_html($html = false) { $this->use_html = $html; } function use_template($template_file, $template_lang = '') { global $board_config, $phpbb_root_path, $mx_root_path, $mx_root_path; if (trim($template_file) == '') { mx_message_die(GENERAL_ERROR, 'No template file set', '', __LINE__, __FILE__); } if (trim($template_lang) == '') { $template_lang = $board_config['default_lang']; } if (empty($this->tpl_msg[$template_lang . $template_file])) { $tpl_file = $mx_root_path . 'language/lang_' . $template_lang . '/email/' . $template_file . '.tpl'; if (!file_exists(realpath($tpl_file))) { $tpl_file = $mx_root_path . 'language/lang_' . $board_config['default_lang'] . '/email/' . $template_file . '.tpl'; if (!file_exists(realpath($tpl_file))) { mx_message_die(GENERAL_ERROR, 'Could not find email template file :: ' . $template_file . ' @:' . $tpl_file, '', __LINE__, __FILE__); } } if (!($fd = @fopen($tpl_file, 'r'))) { mx_message_die(GENERAL_ERROR, 'Failed opening template file :: ' . $template_file . ' @:' . $tpl_file, '', __LINE__, __FILE__); } $this->tpl_msg[$template_lang . $template_file] = fread($fd, filesize($tpl_file)); fclose($fd); } $this->msg = $this->tpl_msg[$template_lang . $template_file]; return true; } // assign variables function assign_vars($vars) { $this->vars = (empty($this->vars)) ? $vars : $this->vars . $vars; } // Send the mail out to the recipients set previously in var $this->address function send() { global $board_config, $lang, $phpEx, $phpbb_root_path, $db, $mx_root_path; // Escape all quotes, else the eval will fail. $this->msg = str_replace ("'", "\'", $this->msg); $this->msg = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "' . $\\1 . '", $this->msg); // Set vars reset ($this->vars); while (list($key, $val) = each($this->vars)) { $$key = $val; } eval("\$this->msg = '$this->msg';"); // Clear vars reset ($this->vars); while (list($key, $val) = each($this->vars)) { unset($$key); } // 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(); 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'); } 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)); } $to = $this->addresses['to']; $cc = (count($this->addresses['cc'])) ? implode(', ', $this->addresses['cc']) : ''; $bcc = (count($this->addresses['bcc'])) ? implode(', ', $this->addresses['bcc']) : ''; // Build header if ($this->use_html) { $this->extra_headers = (($this->reply_to != '') ? "Reply-to: $this->reply_to\n" : '') . (($this->from != '') ? "From: $this->from\n" : "From: " . $board_config['board_email'] . "\n") . "Return-Path: " . $board_config['board_email'] . "\nMessage-ID: <" . md5(uniqid(time())) . "@" . $board_config['server_name'] . ">\nMIME-Version: 1.0\nContent-type: text/html; charset=" . $this->encoding . "\nContent-transfer-encoding: 8bit\nDate: " . date('r', time()) . "\nX-Priority: 3\nX-MSMail-Priority: Normal\nX-Mailer: PHP\nX-MimeOLE: Produced By Mx-Publisher\n" . $this->extra_headers . (($cc != '') ? "Cc: $cc\n" : '') . (($bcc != '') ? "Bcc: $bcc\n" : ''); } else { $this->extra_headers = (($this->reply_to != '') ? "Reply-to: $this->reply_to\n" : '') . (($this->from != '') ? "From: $this->from\n" : "From: " . $board_config['board_email'] . "\n") . "Return-Path: " . $board_config['board_email'] . "\nMessage-ID: <" . md5(uniqid(time())) . "@" . $board_config['server_name'] . ">\nMIME-Version: 1.0\nContent-type: text/plain; charset=" . $this->encoding . "\nContent-transfer-encoding: 8bit\nDate: " . date('r', time()) . "\nX-Priority: 3\nX-MSMail-Priority: Normal\nX-Mailer: PHP\nX-MimeOLE: Produced By Mx-Publisher\n" . $this->extra_headers . (($cc != '') ? "Cc: $cc\n" : '') . (($bcc != '') ? "Bcc: $bcc\n" : ''); } // Send message ... removed $this->encode() from subject for time being if ( $this->use_smtp ) { if (!defined('SMTP_INCLUDED')) { include($mx_root_path . 'includes/shared/phpbb2/includes/smtp.' . $phpEx); } $result = smtpmail($to, $this->subject, $this->msg, $this->extra_headers); } else { $empty_to_header = ($to == '') ? TRUE : FALSE; $to = ($to == '') ? (($board_config['sendmail_fix']) ? ' ' : 'Undisclosed-recipients:;') : $to; $result = mail($to, $this->subject, preg_replace("#(?<!\r)\n#s", "\n", $this->msg), $this->extra_headers); if (!$result && !$board_config['sendmail_fix'] && $empty_to_header) { $to = ' '; switch (PORTAL_BACKEND) { case 'phpbb2': $sql = "UPDATE " . CONFIG_TABLE . " SET config_value = '1' WHERE config_name = 'sendmail_fix'"; if (!$db->sql_query($sql)) { mx_message_die(GENERAL_ERROR, 'Unable to update config table', '', __LINE__, __FILE__, $sql); } break; case 'internal': case 'phpbb3': if (!$board_config['board_email']) { mx_message_die(GENERAL_ERROR, 'The is no default email adress configured were to notify the admin.', '', __LINE__, __FILE__, ''); } break; } $board_config['sendmail_fix'] = 1; $result = mail($to, $this->subject, preg_replace("#(?<!\r)\n#s", "\n", $this->msg), $this->extra_headers); } } // Did it work? if (!$result) { mx_message_die(GENERAL_ERROR, 'Failed sending email :: ' . (($this->use_smtp) ? 'SMTP' : 'PHP') . ' :: ' . $result, '', __LINE__, __FILE__); } return true; } // Encodes the given string for proper display for this encoding ... nabbed // from php.net and modified. There is an alternative encoding method which // may produce lesd output but it's questionable as to its worth in this // scenario IMO function encode($str) { if ($this->encoding == '') { return $str; } // define start delimimter, end delimiter and spacer $end = "?="; $start = "=?$this->encoding?B?"; $spacer = "$end\r\n $start"; // determine length of encoded text within chunks and ensure length is even $length = 75 - strlen($start) - strlen($end); $length = floor($length / 2) * 2; // encode the string and split it into chunks with spacers after each chunk $str = chunk_split(base64_encode($str), $length, $spacer); // remove trailing spacer and add start and end delimiters $str = preg_replace('#' . preg_quote($spacer, '#') . '$#', '', $str); return $start . $str . $end; } // // Attach files via MIME. // function attachFile($filename, $mimetype = "application/octet-stream", $szFromAddress, $szFilenameToDisplay) { global $lang; $mime_boundary = "--==================_846811060==_"; $this->msg = '--' . $mime_boundary . "\nContent-Type: text/plain;\n\tcharset=\"" . $lang['ENCODING'] . "\"\n\n" . $this->msg; 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(realpath($sourcefile))) { $fd = fopen($sourcefile, "r"); $contents = fread($fd, filesize($sourcefile)); $encoded = $this->myChunkSplit(base64_encode($contents)); fclose($fd); } return $encoded; } } // class emailer ?> |