Version 3.2.3

This commit is contained in:
Neo committed 2025-12-19 00:34:03 -08:00
1 parent ae5c01cc78
commit 78706903a2
2641 files changed
+228363 -201264

No files matched your search

+365 -70
View File
@@ -2,17 +2,17 @@
/**
* <pre>
* Invision Power Services
* IP.Board v3.1.4
* IP.Board v3.2.3
* API: Core
* Last Updated: $Date: 2010-11-12 13:07:33 -0500 (Fri, 12 Nov 2010) $
* Last Updated: $Date: 2011-10-03 11:31:57 -0400 (Mon, 03 Oct 2011) $
* </pre>
*
* @author $Author: ips_terabyte $
* @author $Author: mark $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/community/board/license.html
* @license This is NULLED!
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 7174 $
* @link http://hatynka.in
* @version $Rev: 9573 $
*/
if ( ! defined( 'IN_IPB' ) )
@@ -58,6 +58,13 @@ class hanEmail
*/
public $to;
/**
* Email cc's
*
* @var array
*/
public $cc = array();
/**
* Email bcc's
*
@@ -79,21 +86,33 @@ class hanEmail
*/
public $message;
/**
* HTML Mode
*
* @var bool
*/
public $html_email = FALSE;
/**
* Temp word swapping array
*
* @var array
*/
private $_words;
protected $_words;
/**
* Headers to pass to email lib
*
* @var array
*/
private $temp_headers = array();
protected $temp_headers = array();
private $_attachments = array();
protected $_attachments = array();
protected $editor;
protected $plainTextTemplate = '';
protected $htmlTemplate = '';
protected $htmlWrapper = '';
protected $_loadedHtmlTemplateClass = '';
/**#@+
* Registry Object Shortcuts
@@ -113,7 +132,7 @@ class hanEmail
* Construct
*
* @param object ipsRegistry reference
* @return void
* @return @e void
*/
public function __construct( ipsRegistry $registry )
{
@@ -125,42 +144,55 @@ class hanEmail
$this->lang = $this->registry->getClass('class_localization');
$this->member = $this->registry->member();
$this->memberData =& $this->registry->member()->fetchMemberData();
/* Set up default handler */
$this->setHtmlEmail( $this->settings['email_use_html'] );
}
/**
* Sets whether or not this is a HTML email
* @param boolean duh $boolean
*/
public function setHtmlEmail( $boolean=null )
{
$this->html_email = ( $boolean ) ? true : false;
if ( is_object( $this->emailer ) )
{
$this->emailer->setHtmlEmail( $boolean );
}
}
/**
* Init method (setup stuff)
*
* @return void
* @return @e void
*/
public function init()
{
$this->header = $this->settings['email_header'] ? $this->settings['email_header'] : '';
$this->footer = $this->settings['email_footer'] ? $this->settings['email_footer'] : '';
$classToLoad = IPSLib::loadLibrary( IPS_KERNEL_PATH . 'classEmail.php', 'classEmail' );
$this->emailer = new $classToLoad(
array(
'debug' => $this->settings['fake_mail'] ? $this->settings['fake_mail'] : '0',
'debug_path' => DOC_IPS_ROOT_PATH . '_mail',
'smtp_host' => $this->settings['smtp_host'] ? $this->settings['smtp_host'] : 'localhost',
'smtp_port' => intval($this->settings['smtp_port']) ? intval($this->settings['smtp_port']) : 25,
'smtp_user' => $this->settings['smtp_user'],
'smtp_pass' => $this->settings['smtp_pass'],
'smtp_helo' => $this->settings['smtp_helo'],
'method' => $this->settings['mail_method'],
'wrap_brackets' => $this->settings['mail_wrap_brackets'],
'extra_opts' => $this->settings['php_mail_extra'],
'charset' => IPS_DOC_CHAR_SET,
'html' => intval($this->settings['html_email']),
)
);
$this->emailer = new $classToLoad( array( 'debug' => $this->settings['fake_mail'] ? $this->settings['fake_mail'] : '0',
'debug_path' => DOC_IPS_ROOT_PATH . '_mail',
'smtp_host' => $this->settings['smtp_host'] ? $this->settings['smtp_host'] : 'localhost',
'smtp_port' => intval($this->settings['smtp_port']) ? intval($this->settings['smtp_port']) : 25,
'smtp_user' => $this->settings['smtp_user'],
'smtp_pass' => $this->settings['smtp_pass'],
'smtp_helo' => $this->settings['smtp_helo'],
'method' => $this->settings['mail_method'],
'wrap_brackets' => $this->settings['mail_wrap_brackets'],
'extra_opts' => $this->settings['php_mail_extra'],
'charset' => IPS_DOC_CHAR_SET,
'html' => $this->html_email ) );
}
/**
* Clear out any temporary headers
*
* @return void
* @return @e void
*/
public function clearHeaders()
{
@@ -172,7 +204,7 @@ class hanEmail
*
* @param string Header key
* @param string Header value
* @return void
* @return @e void
*/
public function setHeader( $key, $value )
{
@@ -185,11 +217,14 @@ class hanEmail
* @return boolean Email sent successfully
*/
public function sendMail()
{
//$this->emailer->clearEmail();
//$this->emailer->clearError();
{
$this->init();
if( $this->emailer->error )
{
return $this->fatalError( $this->emailer->error_msg, $this->emailer->error_help );
}
/* Add attachments if any */
if ( count( $this->_attachments ) )
{
@@ -204,6 +239,10 @@ class hanEmail
$this->emailer->setFrom( $this->from ? $this->from : $this->settings['email_out'], $this->settings['board_name'] );
$this->emailer->setTo( $this->to );
foreach( $this->cc as $cc )
{
$this->emailer->addCC( $cc );
}
foreach( $this->bcc as $bcc )
{
$this->emailer->addBCC( $bcc );
@@ -224,9 +263,33 @@ class hanEmail
//-----------------------------------------
$this->emailer->setSubject( $this->_cleanSubject($this->subject) );
$this->emailer->setBody( $this->message );
/* If we're sending a HTML email, we need to manually send the plain text and HTML versions */
if ( $this->html_email )
{
/* Dynamically replace subject in template */
$this->htmlTemplate = str_ireplace( array('<#subject#>'), IPSText::utf8ToEntities( $this->_cleanSubject($this->subject) ), $this->htmlTemplate );
$this->emailer->setPlainTextContent( $this->plainTextTemplate );
$this->emailer->setHtmlContent( $this->htmlTemplate );
}
else if ( $this->message && ! $this->plainTextTemplate )
{
/* Older methods pass message directly */
$this->emailer->setBody( $this->message );
}
else
{
$this->emailer->setBody( $this->plainTextTemplate );
}
$this->emailer->sendMail();
/* Clear out stuffs */
$this->clearContent();
// Unset HTML setting to remain backwards compatibility
//$this->html_email = FALSE;
if( $this->emailer->error )
{
return $this->fatalError( $this->emailer->error_msg, $this->emailer->error_help );
@@ -234,7 +297,69 @@ class hanEmail
return true;
}
/**
* Set the plain text template
* @param string $string
*/
public function setPlainTextTemplate( $string )
{
/* Reset message too */
$this->message = '';
$this->plainTextTemplate = $string;
}
/**
* Set the HTML template
* @param string $string
*/
public function setHtmlTemplate( $string )
{
/* Reset message too */
$this->message = '';
$this->htmlTemplate = $string;
}
/**
* Return plain text content
* @return string
*/
public function getPlainTextContent()
{
return $this->plainTextTemplate;
}
/**
* Return HTML content
* @return string
*/
public function getHtmlContent()
{
return $this->htmlTemplate;
}
/**
* Removes all current stored messages, templates, etc.
*/
public function clearContent()
{
$this->setHtmlTemplate('');
$this->setPlainTextTemplate('');
$this->message = '';
$this->template = '';
}
/**
* Send custom html wrapper - HTML wrapper with <#content#> tag where content will be
* @param string $string
*/
public function setHtmlWrapper( $string )
{
$this->htmlWrapper = $string;
}
/**
* Retrieve an email template
*
@@ -242,10 +367,13 @@ class hanEmail
* @param string Language to use
* @param string Language file to load
* @param string Application of language file
* @return void
* @return @e void
*/
public function getTemplate( $name, $language="", $lang_file='public_email_content', $app='core' )
{
/* Reset $this->message as legacy methods use $this->message when sending notifications, etc */
$this->clearContent();
//-----------------------------------------
// Check..
//-----------------------------------------
@@ -305,7 +433,10 @@ class hanEmail
// Return
//-----------------------------------------
$this->template = stripslashes($this->lang->words['email_header']) . stripslashes($this->lang->words[ $name ]) . stripslashes($this->lang->words['email_footer']);
$this->template = stripslashes($this->lang->words[ $name ]) . stripslashes($this->lang->words['email_footer']);
/* Returns it if called via setPlainTextTemplate */
return $this->template;
}
/**
@@ -313,51 +444,180 @@ class hanEmail
*
* @param array Replacement keys to values
* @param bool Do not "clean"
* @return void
* @return @e void
*/
public function buildMessage( $words, $noClean=false )
public function buildMessage( $words, $noClean=false, $rawHtml=FALSE )
{
if( $this->template == "" )
/* Init */
$ptWords = array();
$htmlWords = array();
/* Try this first */
if ( ! $this->plainTextTemplate && ! $this->htmlTemplate && $this->message )
{
$this->setPlainTextTemplate( $this->message );
}
/* need to converge some stuff here */
if ( ! $this->plainTextTemplate )
{
/* Sniff, sniff */
if ( stristr( $this->template, '<br' ) )
{
$this->setHtmlTemplate( $this->template );
}
else
{
$this->setPlainTextTemplate( $this->template );
}
}
/* HTML enabled but no specific template: Auto convert */
if ( $this->html_email && ! $this->htmlTemplate )
{
/* It will be dynamically updated at the end */
$this->setHtmlTemplate( $this->plainTextTemplate );
}
/* HTML email with HTML template but no plain text version */
if ( $this->htmlTemplate && ! $this->plainTextTemplate )
{
$msg = $this->htmlTemplate;
$msg = preg_replace( '/<#(.+?)#>/', '{{{-\1-}}}', $msg );
$msg = str_replace( "<br />", "\n", $msg );
$msg = str_replace( "<br>" , "\n", $msg );
$msg = strip_tags( $msg );
$msg = html_entity_decode( $msg, ENT_QUOTES );
$msg = str_replace( '&#092;', '\\', $msg );
$msg = str_replace( '&#036;', '$', $msg );
$msg = preg_replace( '/\{\{\{(.+?)\}\}\}/', '<#\1#>', $msg );
$this->setPlainTextTemplate( $msg );
}
if ( $this->plainTextTemplate && ! $this->template && ! $this->htmlTemplate )
{
$this->error++;
$this->fatalError( "Could not build the email message, no template assigned", "Make sure a template is assigned first." );
}
$this->message = $this->template;
if( $noClean )
{
$this->message = str_replace( "\n", "<br />", str_replace( "\r", "", $this->message ) );
}
//-----------------------------------------
// Add some default words
//-----------------------------------------
/* Bit more clean up */
$this->plainTextTemplate = str_replace( array( "\r\n", "\r", "\n" ), "\n", $this->plainTextTemplate );
$this->htmlTemplate = str_replace( array( "\r\n", "\r", "\n" ), "\n", $this->htmlTemplate );
/* Add some default words */
$words['BOARD_ADDRESS'] = $this->settings['board_url'] . '/index.' . $this->settings['php_ext'];
$words['WEB_ADDRESS'] = $this->settings['home_url'];
$words['BOARD_NAME'] = $this->settings['board_name'];
$words['SIGNATURE'] = $this->settings['signature'] ? $this->settings['signature'] : '';
//-----------------------------------------
// Swap the words
// 10.7.08 - Added replacements in subject
//-----------------------------------------
if( !$noClean )
/* Swap the words: 10.7.08 - Added replacements in subject */
foreach( $words as $k => $v )
{
foreach( $words as $k => $v )
if ( ! $noClean )
{
$words[ $k ] = $this->cleanMessage( $v );
$ptWords[ $k ] = $this->cleanMessage( $v );
}
$htmlWords[ $k ] = $v;
}
$this->_words = $words;
$this->_words = $ptWords;
$this->plainTextTemplate = preg_replace_callback( "/<#(.+?)#>/", array( &$this, '_swapWords' ), $this->plainTextTemplate );
$this->message = preg_replace_callback( "/<#(.+?)#>/", array( &$this, '_swapWords' ), $this->message );
$this->subject = preg_replace_callback( "/<#(.+?)#>/", array( &$this, '_swapWords' ), $this->subject );
$this->_words = $htmlWords;
$this->htmlTemplate = preg_replace_callback( "/<#(.+?)#>/", array( &$this, '_swapWords' ), str_replace( array( '&lt;#', '#&gt;' ), array( '<#', '#>' ), $this->htmlTemplate ) );
$this->_words = array();
$this->subject = preg_replace_callback( "/<#(.+?)#>/", array( &$this, '_swapWords' ), $this->subject );
$this->_words = array();
/* Final touches */
$this->htmlTemplate = $this->applyHtmlWrapper( $this->subject, ( $rawHtml ? $this->htmlTemplate : $this->convertTextEmailToHtmlEmail( $this->htmlTemplate ) ) );
$this->htmlTemplate = preg_replace( '#<!--hook\.([^\>]+?)-->#', '', $this->htmlTemplate );
$this->htmlTemplate = $this->registry->getClass('output')->parseIPSTags( $this->htmlTemplate );
$this->plainTextTemplate = stripslashes($this->lang->words['email_header']) . $this->plainTextTemplate . stripslashes($this->lang->words['email_footer']);
/* Some older apps use $this->message, so give them plaintext */
$this->message = $this->plainTextTemplate;
}
/**
* Convert text email to HTML
* Pretty nifty method name too.
*
* @param string Plain text email ready to go
* @return string We're all HTML'd up in here.
*/
public function convertTextEmailToHtmlEmail( $content )
{
if ( strstr( $content, '[' ) OR strstr( $content, "\n" ) )
{
/* It's probably HITMAL! */
if ( ! is_object( $this->editor ) )
{
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' );
$this->editor = new $classToLoad();
/* Reset HTML flags */
$this->editor->setAllowHtml(false);
}
IPSText::getTextClass('bbcode')->parse_html = 0;
$content = IPSText::getTextClass('bbcode')->preDisplayParse( $this->editor->switchContent( $content, false ) );
/* Switch content makes & &amp; so we need to switch this back */
$content = str_replace( '&amp;', '&', $content );
/* Other stuffs */
$content = preg_replace( '#(\-{10,120})#', '<hr>', $content );
}
return $content;
}
/**
* Add <html> tags and such if it doesn't have any already
*
* @param string HTML email
* @return string VERY HTML email
*/
public function applyHtmlWrapper( $subject, $content )
{
/* Due to some legacy methods with mail queue, buildMessage can be called twice
* for good reason, but it can then re-apply the wrapper. So we add a unique comment
* and then check for this.
*/
if ( ! stristr( $content, '<!--::ipb.wrapper.added::-->' ) )
{
$content = '<!--::ipb.wrapper.added::-->' . IPSText::getTextClass('bbcode')->xssHtmlClean( $content );
/* Inline wrapper */
if ( $this->htmlWrapper )
{
return str_ireplace( '<#content#>', $content, $this->htmlWrapper );
}
/* Attempt to load external wrapper */
if ( file_exists( IPS_CACHE_PATH . 'cache/skin_cache/emailWrapper.php' ) )
{
if ( ! is_object( $this->_loadedHtmlTemplateClass ) )
{
$classToLoad = IPSLib::loadLibrary( IPS_CACHE_PATH . 'cache/skin_cache/emailWrapper.php', 'ipsEmailWrapper' );
$this->_loadedHtmlTemplateClass = new $classToLoad();
}
return $this->_loadedHtmlTemplateClass->getTemplate( $content );
}
/* Still here? Fail safe */
return $this->parseWithDefaultHtmlWrapper( $content );
}
return $content;
}
/**
@@ -366,7 +626,7 @@ class hanEmail
* @param string Key
* @return string Replaced variable
*/
private function _swapWords( $matches )
protected function _swapWords( $matches )
{
return $this->_words[ $matches[1] ];
}
@@ -377,7 +637,7 @@ class hanEmail
* @param string In text
* @return string Out text
*/
private function _cleanSubject( $subject )
protected function _cleanSubject( $subject )
{
$subject = strip_tags( $subject );
@@ -392,6 +652,7 @@ class hanEmail
$subject = str_replace( "&#93;" , "]" , $subject );
$subject = str_replace( "&#064;", '@' , $subject );
$subject = str_replace( "&nbsp;" , ' ', $subject );
$subject = str_replace( "&amp;" , '&', $subject );
return $subject;
}
@@ -404,7 +665,7 @@ class hanEmail
*/
public function cleanMessage( $message = "" )
{
$message = preg_replace( '#\[quote.*\](.+?)\[/quote\]#s', "<br /><br />------------ QUOTE ----------<br />\\1<br />-----------------------------<br /><br />" , $message );
$message = preg_replace( '#\[quote(?:[^\]]+?)?\](.+?)\[/quote\]#s', "<br /><br />------------ QUOTE ----------<br />\\1<br />-----------------------------<br /><br />" , $message );
$message = preg_replace_callback( '#\[url=(.+?)\](.+?)\[/url\]#', array( $this, "_formatUrl" ), $message );
@@ -412,7 +673,7 @@ class hanEmail
// Unconvert smilies 'cos at this point they are img tags
//-----------------------------------------
$message = IPSText::getTextClass('bbcode')->unconvertSmilies( $message );
$message = IPSText::unconvertSmilies( $message );
//-----------------------------------------
// We may want to adjust this later, but for
@@ -424,9 +685,8 @@ class hanEmail
IPSText::getTextClass( 'bbcode' )->parse_html = 0;
IPSText::getTextClass( 'bbcode' )->parse_nl2br = 1;
IPSText::getTextClass( 'bbcode' )->parse_bbcode = 0;
IPSText::getTextClass( 'bbcode' )->parse_wordwrap = -1;
$message = IPSText::getTextClass('bbcode')->stripAllTags( $message, true, false );
$message = IPSText::getTextClass('bbcode')->stripAllTags( $message, true );
//-----------------------------------------
// Bear with me...
@@ -481,7 +741,7 @@ class hanEmail
* @param string File data
* @param string File name
* @param string File type (MIME)
* @return void
* @return @e void
*/
public function addAttachment( $data="", $name="", $ctype='application/octet-stream' )
{
@@ -495,7 +755,7 @@ class hanEmail
* @param string Help key (deprecated)
* @return bool
*/
private function fatalError( $msg, $help="" )
protected function fatalError( $msg, $help="" )
{
$this->DB->insert( 'mail_error_logs',
array(
@@ -511,5 +771,40 @@ class hanEmail
);
return false;
}
}
/**
* Default wrapper for HTML emails - edit the one in skin_global_other
*
* @param string HTML content
* @return string HTML email done
*/
protected function parseWithDefaultHtmlWrapper( $content )
{
$doc =IPS_DOC_CHAR_SET;
$email = <<<HTML
<html>
<head>
<meta content="text/html; charset={$doc}" http-equiv="Content-Type">
<title><#subject#></title>
<style type="text/css">
* {
font-family: Arial;
font-size: 14px;
color: #000;
background: #fff;
line-height: 140%;
}
</style>
</head>
<body>
{$content}
</body>
</head>
</html>
HTML;
return $email;
}
}