$Date: 2006-09-22 05:28:54 -0500 (Fri, 22 Sep 2006) $
| > $Revision: 567 $
| > $Author: matt $
+---------------------------------------------------------------------------
|
| > Sending email module
| > Module written by Matt Mecham
| > Date started: 26th February 2002
|
| > Module Version Number: 1.0.0
| > DBA Checked: Wed 19 May 2004
+--------------------------------------------------------------------------
|
| QUOTE OF THE MODULE: (Taken from "Shrek" (c) Dreamworks Pictures)
| --------------------
| DONKEY: We can stay up late, swap manly stories and in the morning,
| I'm making waffles!
|
+--------------------------------------------------------------------------
*/
// This module is fairly basic, more functionality is expected in future
// versions (such as MIME attachments, SMTP stuff, etc)
if ( ! defined( 'IN_IPB' ) )
{
print "
Некорректный адрес
Вы не имеете доступа к этому файлу напрямую. Если вы недавно обновляли форум, вы должны обновить все соответствующие файлы.";
exit();
}
class emailer {
# global
var $ipsclass;
var $from = "";
var $to = "";
var $subject = "";
var $lang_subject = "";
var $message = "";
var $header = "";
var $footer = "";
var $template = "";
var $error = "";
var $parts = array();
var $bcc = array();
var $mail_headers = array();
var $rfc_headers = "";
var $multipart = "";
var $boundry = "";
var $extra_opts = "";
var $html_email = 0;
var $char_set = 'windows-1251';
// RFC specifies \r\n as eol HOWEVER it fails on many mail servers/clients
// whereas \n seems to work in 99% of cases, so we'll stick with that
var $header_eol = "\n";
var $smtp_fp = FALSE;
var $smtp_msg = "";
var $smtp_port = "";
var $smtp_host = "localhost";
var $smtp_user = "";
var $smtp_pass = "";
var $smtp_code = "";
var $wrap_brackets = 0;
var $mail_method = 'mail';
var $temp_dump = 0;
var $root_path = './';
/*-------------------------------------------------------------------------*/
// CONSTRUCTOR
/*-------------------------------------------------------------------------*/
function emailer($ROOT_PATH="")
{
if ( $ROOT_PATH )
{
$this->root_path = $ROOT_PATH;
}
if ( ! defined( 'ROOT_PATH') )
{
define( 'ROOT_PATH', $this->root_path );
}
}
/*-------------------------------------------------------------------------*/
// Email init
/*-------------------------------------------------------------------------*/
function email_init()
{
//-----------------------------------------
// Set up SMTP if we're using it
//-----------------------------------------
if ( $this->ipsclass->vars['mail_method'] == 'smtp' )
{
$this->mail_method = 'smtp';
$this->smtp_port = ( intval($this->ipsclass->vars['smtp_port']) != "" ) ? intval($this->ipsclass->vars['smtp_port']) : 25;
$this->smtp_host = ( $this->ipsclass->vars['smtp_host'] != "" ) ? $this->ipsclass->vars['smtp_host'] : 'localhost';
$this->smtp_user = $this->ipsclass->vars['smtp_user'];
$this->smtp_pass = $this->ipsclass->vars['smtp_pass'];
}
//-----------------------------------------
// Assign $from as the admin out email address, this can be
// over-riden at any time.
//-----------------------------------------
$this->from = $this->ipsclass->vars['email_out'];
$this->temp_dump = isset($this->ipsclass->vars['fake_mail']) ? $this->ipsclass->vars['fake_mail'] : '';
$this->wrap_brackets = $this->ipsclass->vars['mail_wrap_brackets'];
$this->extra_opts = $this->ipsclass->vars['php_mail_extra'];
//-----------------------------------------
// Temporarily assign $header and $footer, this can be over-riden
// also
//-----------------------------------------
$this->header = isset($this->ipsclass->vars['email_header']) ? $this->ipsclass->vars['email_header'] : '';
$this->footer = isset($this->ipsclass->vars['email_footer']) ? $this->ipsclass->vars['email_footer'] : '';
$this->boundry = "----=_NextPart_000_0022_01C1BD6C.D0C0F9F0"; //"b".md5(uniqid(time()));
$this->char_set = $this->ipsclass->vars['gb_char_set'];
$this->ipsclass->vars['board_name'] = $this->clean_message($this->ipsclass->vars['board_name']);
}
/*-------------------------------------------------------------------------*/
// ADD ATTACHMENT
/*-------------------------------------------------------------------------*/
function add_attachment($data = "", $name = "", $ctype='application/octet-stream')
{
$this->parts[] = array( 'ctype' => $ctype,
'data' => $data,
'encode' => 'base64',
'name' => $name
);
}
/*-------------------------------------------------------------------------*/
// BUILD HEADERS
/*-------------------------------------------------------------------------*/
function build_headers()
{
$extra_headers = array();
$extra_header_rfc = "";
//-----------------------------------------
// Start mail headers
//-----------------------------------------
$this->mail_headers['MIME-Version'] = "1.0";
$this->mail_headers['From'] = '"'.$this->ipsclass->vars['board_name'].'" <'.$this->from.'>';
if ( $this->mail_method != 'smtp' )
{
if ( count( $this->bcc ) > 1 )
{
$this->mail_headers['Bcc'] = implode( "," , $this->bcc );
}
}
else
{
if ( $this->to )
{
$this->mail_headers['To'] = $this->to;
}
$this->mail_headers['Subject'] = $this->subject;
}
//-----------------------------------------
// we're not spam, really!
//-----------------------------------------
$this->mail_headers['Return-Path'] = $this->from;
$this->mail_headers['X-Priority'] = "3";
$this->mail_headers['X-Mailer'] = "IPB PHP Mailer";
$this->mail_headers['X-Unique-ID'] = "e3790216_29e5a2aa_37070b32_37f06";
//-----------------------------------------
// Count.. oh you get the idea
//-----------------------------------------
if ( count ($this->parts) > 0 )
{
if ( ! $this->html )
{
$extra_headers[0]['Content-Type'] = "multipart/mixed;\n\tboundary=\"".$this->boundry."\"";
$extra_headers[0]['notencode'] = "\n\nThis is a MIME encoded message.\n\n--".$this->boundry."\n";
$extra_headers[1]['Content-Type'] = "text/plain;\n\tcharset=\"".$this->char_set."\"";
$extra_headers[1]['Content-Transfer-Encoding'] = "quoted-printable";
$extra_headers[1]['notencode'] = "\n\n".$this->message."\n\n--".$this->boundry;
}
else
{
$extra_headers[0]['Content-Type'] = "multipart/mixed;\n\tboundary=\"".$this->boundry."\"";
$extra_headers[0]['notencode'] = "\n\nThis is a MIME encoded message.\n\n--".$this->boundry."\n";
$extra_headers[1]['Content-Type'] = "text/html; charset=\"".$this->char_set."\"";
$extra_headers[1]['Content-Transfer-Encoding'] = "quoted-printable";
$extra_headers[1]['notencode'] = "\n\n".$this->message."\n\n--".$this->boundry;
}
$extra_headers[2]['notencode'] = $this->build_multipart();
reset($extra_headers);
foreach( $extra_headers as $subset => $the_header )
{
foreach( $the_header as $k => $v )
{
if( $k == 'notencode' )
{
$extra_headers_rfc .= $v;
}
else
{
$v = $this->encode_headers( array( 'v' => $v ) );
$extra_headers_rfc .= $k.': '.$v['v'].$this->header_eol;
}
}
}
$this->message = "";
}
else
{
//-----------------------------------------
// HTML (hitmuhl) ?
//-----------------------------------------
if ( $this->html_email )
{
$this->mail_headers['Content-type'] = 'text/html; charset="'.$this->char_set.'"';
}
else
{
$this->mail_headers['Content-type'] = 'text/plain; charset="'.$this->char_set.'"';
}
}
$this->encode_headers();
foreach( $this->mail_headers as $k => $v )
{
$this->rfc_headers .= $k.": ".$v.$this->header_eol;
}
//-----------------------------------------
// Attachments extra?
//-----------------------------------------
if( $extra_headers_rfc )
{
$this->rfc_headers .= $extra_headers_rfc;
}
}
/*-------------------------------------------------------------------------*/
// ENCODE ATTACHMENT
/*-------------------------------------------------------------------------*/
function encode_attachment($part)
{
$msg = chunk_split(base64_encode($part['data']));
$headers = array();
$header_str = "";
$headers['Content-Type'] = $part['ctype']. ($part['name'] ? "; name =\"".$part['name']."\"" : "");
$headers['Content-Transfer-Encoding'] = $part['encode'];
$headers['Content-Disposition'] = "attachment; filename=\"".$part['name']."\"";
$headers = $this->encode_headers( $headers );
foreach( $headers as $k => $v )
{
$header_str .= $k.': '.$v.$this->header_eol;
}
$header_str .= "\n\n".$msg."\n";
return $header_str;
}
/*-------------------------------------------------------------------------*/
// ENCODE HEADERS - RFC2047
/*-------------------------------------------------------------------------*/
function encode_headers( $headers = array() )
{
$enc_headers = count($headers) ? $headers : $this->mail_headers;
foreach( $enc_headers as $header => $value)
{
if( $header == 'From' )
{
// Either sendmail or the email servers don't like 'From' encoded...let's remove the board name
// and just move along, as email address cannot contain nasty characters themselves
$this->mail_headers['From'] = $this->from;
$enc_headers['From'] = $this->from;
continue;
}
if (preg_match('/(\w*[\x80-\xFF]+\w*)/', $value))
{
if ( function_exists('mb_encode_mimeheader') )
{
mb_internal_encoding($this->char_set);
$value = mb_encode_mimeheader($value, $this->char_set, 'Q');
}
else
{
$replacement = preg_replace('/(\?|=|\s|[\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))',$value);
$value = '=?' .$this->char_set . '?Q?';
if ( strlen( $value . $replacement . '?=') > 76 )
{
$tokens = explode('=', $replacement);
$encoded_text_parts = array();
for ($i=1; $i < count( $tokens ); $i++)
{
$token_len = strlen( $tokens[$i] ) + 1;
if ( (strlen( $value ) + $token_len + 2) < 76 )
{
$value .= '=' . $tokens[$i];
}
else
{
$encoded_text_parts[] = $value . '?=';
$value = '=?' . $this->char_set . '?Q?=' . $tokens[$i];
}
}
if ( $value )
{
$encoded_text_parts[] = $value . '?=';
}
$value = implode($this->header_eol, $encoded_text_parts);
}
else
{
$value = $value . $replacement . '?=';
}
}
}
if( !count($headers) )
{
$this->mail_headers[ $header ] = $value;
}
else
{
$enc_headers[ $header ] = $value;
}
}
return $enc_headers;
}
/*-------------------------------------------------------------------------*/
// BUILD MULTIPART
/*-------------------------------------------------------------------------*/
function build_multipart()
{
$multipart = "";
for ($i = sizeof($this->parts) - 1 ; $i >= 0 ; $i--)
{
$multipart .= $this->header_eol.$this->encode_attachment($this->parts[$i]) . "--".$this->boundry;
}
return $multipart . "--\n";
}
/*-------------------------------------------------------------------------*/
// send_mail:
// Physically sends the email
/*-------------------------------------------------------------------------*/
function send_mail()
{
//-----------------------------------------
// Wipe ya face
//-----------------------------------------
$this->to = preg_replace( "/[ \t]+/" , "" , $this->to );
$this->from = preg_replace( "/[ \t]+/" , "" , $this->from );
$this->to = preg_replace( "/,,/" , "," , $this->to );
$this->from = preg_replace( "/,,/" , "," , $this->from );
$this->to = preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->to );
$this->from = preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->from);
$this->subject = ( trim($this->lang_subject) != "" ) ? $this->lang_subject : $this->subject;
$this->subject = $this->clean_message($this->subject);
if ( $this->subject )
{
$this->subject .= " ( ".$this->ipsclass->vars['board_name']." )";
}
//-----------------------------------------
// Build headers
//-----------------------------------------
$this->build_headers();
if( $this->mail_method != 'smtp' )
{
$subject = $this->encode_headers( array( 'Subject' => $this->subject ) );
$this->subject = $subject['Subject'];
}
//-----------------------------------------
// Lets go..
//-----------------------------------------
if ( ($this->from) and ($this->subject) )
{
//-----------------------------------------
// Tmp dump? (Testing)
//-----------------------------------------
if ($this->temp_dump == 1)
{
$blah = $this->subject."\n------------\n".$this->rfc_headers."\n\n".$this->message;
$pathy = $this->root_path.'_mail/'.date("M-j-Y,hi-A").str_replace( '@', '+', $this->to ).".txt";
$fh = fopen ($pathy, 'w');
fputs ($fh, $blah, strlen($blah) );
fclose($fh);
}
else
{
//-----------------------------------------
// PHP MAIL()
//-----------------------------------------
if ($this->mail_method != 'smtp')
{
if ( ! @mail( $this->to, $this->subject, $this->message, $this->rfc_headers, $this->extra_opts ) )
{
# Try without args for safe mode peeps
if ( ! @mail( $this->to, $this->subject, $this->message, $this->rfc_headers ) )
{
$this->fatal_error("Не возможно отправить сообщение", "Проблема при вызове 'mail' функции");
}
}
}
//-----------------------------------------
// SMTP
//-----------------------------------------
else
{
$this->smtp_send_mail();
}
}
}
else
{
$this->fatal_error("Поля От: или Тема: пустые");
return FALSE;
}
$this->to = "";
$this->from = "";
$this->message = "";
$this->subject = "";
$this->mail_headers = array();
$this->rfc_headers = "";
$this->email_init();
}
/*-------------------------------------------------------------------------*/
// get_template:
// Queries the database, and stores the template we wish to use in memory
/*-------------------------------------------------------------------------*/
function get_template($name="", $language="")
{
global $lang;
//-----------------------------------------
// Check..
//-----------------------------------------
if ($name == "")
{
$this->error++;
$this->fatal_error("Обработчик не получил уникальный идентификатор шаблона письма", "");
}
//-----------------------------------------
// Default?
//-----------------------------------------
if ( $this->ipsclass->vars['default_language'] == "")
{
$this->ipsclass->vars['default_language'] = 'ru';
}
if ($language == "")
{
$language = $this->ipsclass->vars['default_language'];
}
//-----------------------------------------
// Check and get
//-----------------------------------------
if ( ! file_exists($this->root_path."cache/lang_cache/$language/lang_email_content.php") )
{
if ( ! is_array( $lang ) )
{
$lang = array();
}
require_once( $this->root_path."cache/lang_cache/".$this->ipsclass->vars['default_language']."/lang_email_content.php" );
}
else
{
if ( ! is_array( $lang ) )
{
$lang = array();
}
require_once( $this->root_path."cache/lang_cache/$language/lang_email_content.php" );
}
//-----------------------------------------
// Stored KEY?
//-----------------------------------------
if ( ! isset($lang[ $name ]) )
{
if ( $language == $this->ipsclass->vars['default_language'] )
{
$this->fatal_error("Шаблон письма с указанным идентификатором ($name) не найден в системе", "");
}
else
{
require_once( $this->root_path."cache/lang_cache/".$this->ipsclass->vars['default_language']."/lang_email_content.php" );
if ( ! isset($lang[ $name ]) )
{
$this->fatal_error("Шаблон письма с указанным идентификатором ($name) не найден в системе", "");
}
}
}
//-----------------------------------------
// Subject?
//-----------------------------------------
if ( isset( $lang[ 'subject__'. $name ] ) )
{
$this->lang_subject = stripslashes($lang[ 'subject__'. $name ]);
}
//-----------------------------------------
// Return
//-----------------------------------------
$this->template = stripslashes($lang['header']) . stripslashes($lang[ $name ]) . stripslashes($lang['footer']);
}
/*-------------------------------------------------------------------------*/
// build_message:
// Swops template tags into the corresponding string held in $words array.
// Also joins header and footer to message and cleans the message for sending
/*-------------------------------------------------------------------------*/
function build_message( $words )
{
if ( $this->template == "" )
{
$this->error++;
$this->fatal_error("Не возможно создать сообщение, так как не указан шаблон письма", "Проверьте что шаблон письма указан");
}
$this->message = $this->template;
//-----------------------------------------
// Add some default words
//-----------------------------------------
$words['BOARD_ADDRESS'] = $this->ipsclass->vars['board_url'] . '/index.' . $this->ipsclass->vars['php_ext'];
$words['WEB_ADDRESS'] = $this->ipsclass->vars['home_url'];
$words['BOARD_NAME'] = $this->ipsclass->vars['board_name'];
$words['SIGNATURE'] = isset($this->ipsclass->vars['signature']) ? $this->ipsclass->vars['signature'] : '';
//-----------------------------------------
// Swap the words
//-----------------------------------------
$this->_words = $words;
$this->message = preg_replace_callback( "/<#(.+?)#>/", array( $this, '_swap_words' ), $this->message );
$this->_words = array();
$this->message = $this->clean_message( $this->message );
}
/*-------------------------------------------------------------------------*/
// Swap words.
/*-------------------------------------------------------------------------*/
function _swap_words( $matches )
{
return $this->_words[ $matches[1] ];
}
/*-------------------------------------------------------------------------*/
// clean_message: (Mainly used internally)
// Ensures that \n and
are converted into CRLF (\r\n)
// Also unconverts some BBCode
/*-------------------------------------------------------------------------*/
function clean_message($message = "" ) {
$message = preg_replace( "/^(\r|\n)+?(.*)$/", "\\2", $message );
$message = preg_replace( "#(.+?)#" , "\\1", $message );
$message = preg_replace( "#(.+?)#" , "\\1", $message );
$message = preg_replace( "#(.+?)#" , "--\\1--", $message );
$message = preg_replace( "#(.+?)#" , "-\\1-" , $message );
$message = preg_replace( "#.+?#", "\\1" , $message );
$message = preg_replace( "##is", "\\1" , $message );
$message = preg_replace( "#(.+?)#", "\n\n------------ CODE SAMPLE ----------\n" , $message );
$message = preg_replace( "#(.+?)#", "\n-----------------------------------\n\n" , $message );
$message = preg_replace( "#(.+?)#" , "\n\n------------ QUOTE ----------\n" , $message );
$message = preg_replace( "#(.+?)#" , "\n\n------------ QUOTE ----------\n" , $message );
$message = preg_replace( "#(.+?)#" , "\n-----------------------------\n\n" , $message );
$message = preg_replace( "#.+?#" , "(FLASH MOVIE)" , $message );
$message = preg_replace( "#
#" , "(IMAGE: \\1)" , $message );
$message = preg_replace( "#(.+?)#" , "\\1://\\2" , $message );
$message = preg_replace( "#(.+?)#" , "(EMAIL: \\2)" , $message );
$message = preg_replace( "#(.+?)(.+?)(.+?)#i" , "\n\n--------------- SQL -----------\n\\2\n----------------\n\n", $message);
$message = preg_replace( "#(.+?)(.+?)(.+?)#i", "\n\n-------------- HTML -----------\n\\2\n----------------\n\n", $message);
$message = preg_replace( "##" , "" , $message );
//-----------------------------------------
// Bear with me...
//-----------------------------------------
$message = str_replace( "\n" , "
", $message );
$message = str_replace( "\r" , "" , $message );
$message = str_replace( "
" , "\r\n", $message );
$message = str_replace( "
" , "\r\n", $message );
$message = preg_replace( "#<.+?".">#" , "" , $message );
$message = str_replace( """, "\"", $message );
$message = str_replace( "\", "\\", $message );
$message = str_replace( "$", "\$", $message );
$message = str_replace( "!" , "!" , $message );
$message = str_replace( """ , '"' , $message );
$message = str_replace( "'" , "'" , $message );
$message = str_replace( "(" , "(" , $message );
$message = str_replace( ")" , ")" , $message );
$message = str_replace( "<" , "<" , $message );
$message = str_replace( ">" , ">" , $message );
$message = str_replace( "|", '|' , $message );
$message = str_replace( "&" , "&" , $message );
$message = str_replace( ":" , ":" , $message );
$message = str_replace( "[" , "[" , $message );
$message = str_replace( "]" , "]" , $message );
$message = str_replace( "@", '@' , $message );
$message = str_replace( "<" , '<' , $message );
$message = str_replace( ">" , '>' , $message );
$message = str_replace( " " , ' ' , $message );
return $message;
}
/*-------------------------------------------------------------------------*/
// FATAL ERROR : LOG AND RETURN
/*-------------------------------------------------------------------------*/
function fatal_error($msg, $help="")
{
$this->ipsclass->DB->do_insert( 'mail_error_logs',
array(
'mlog_date' => time(),
'mlog_to' => $this->to,
'mlog_from' => $this->from,
'mlog_subject' => $this->subject,
'mlog_content' => substr( $this->message, 0, 200 ),
'mlog_msg' => $msg,
'mlog_code' => $this->smtp_code,
'mlog_smtp_msg' => $this->smtp_msg
)
);
return;
}
/*-------------------------------------------------------------------------*/
//
// SMTP methods
//
/*-------------------------------------------------------------------------*/
//-----------------------------------------
//| get_line()
//|
//| Reads a line from the socket and returns
//| CODE and message from SMTP server
//|
//-----------------------------------------
function smtp_get_line()
{
$this->smtp_msg = "";
while ( $line = fgets( $this->smtp_fp, 515 ) )
{
$this->smtp_msg .= $line;
if ( substr($line, 3, 1) == " " )
{
break;
}
}
}
//-----------------------------------------
//| send_cmd()
//|
//| Sends a command to the SMTP server
//| Returns TRUE if response, FALSE if not
//|
//-----------------------------------------
function smtp_send_cmd($cmd)
{
$this->smtp_msg = "";
$this->smtp_code = "";
fputs( $this->smtp_fp, $cmd."\r\n" );
$this->smtp_get_line();
$this->smtp_code = substr( $this->smtp_msg, 0, 3 );
return $this->smtp_code == "" ? FALSE : TRUE;
}
//-----------------------------------------
//| error()
//|
//| Returns SMTP error to our global
//| handler
//|
//-----------------------------------------
function smtp_error($err = "")
{
$this->smtp_msg = $err;
$this->fatal_error( $err );
return;
}
//-----------------------------------------
//| crlf_encode()
//|
//| RFC 788 specifies line endings in
//| \r\n format with no periods on a
//| new line
//-----------------------------------------
function smtp_crlf_encode($data)
{
$data .= "\n";
$data = str_replace( "\n", "\r\n", str_replace( "\r", "", $data ) );
$data = str_replace( "\n.\r\n" , "\n. \r\n", $data );
return $data;
}
//-----------------------------------------
//| send_mail
//|
//| Does the bulk of the email sending
//-----------------------------------------
//$this->to, $this->subject, $this->message, $this->mail_headers
function smtp_send_mail()
{
$this->smtp_fp = @fsockopen( $this->smtp_host, intval($this->smtp_port), $errno, $errstr, 30 );
if ( ! $this->smtp_fp )
{
$this->smtp_error("Не возможно установить связь с SMTP сервером");
return;
}
$this->smtp_get_line();
$this->smtp_code = substr( $this->smtp_msg, 0, 3 );
if ( $this->smtp_code == 220 )
{
$data = $this->smtp_crlf_encode( $this->rfc_headers."\n" . $this->message);
//-----------------------------------------
// HELO!, er... HELLO!
//-----------------------------------------
$this->smtp_send_cmd("HELO ".$this->smtp_host);
if ( $this->smtp_code != 250 )
{
$this->smtp_error("HELO");
return;
}
//-----------------------------------------
// Do you like my user!
//-----------------------------------------
if ($this->smtp_user and $this->smtp_pass)
{
$this->smtp_send_cmd("AUTH LOGIN");
if ( $this->smtp_code == 334 )
{
$this->smtp_send_cmd( base64_encode($this->smtp_user) );
if ( $this->smtp_code != 334 )
{
$this->smtp_error("Сервер сообщает об отсутсвии пользователя с указанным именем");
return;
}
$this->smtp_send_cmd( base64_encode($this->smtp_pass) );
if ( $this->smtp_code != 235 )
{
$this->smtp_error("Сервер сообщает о несовпадении указанного пароля с паролем пользователя");
return;
}
}
else
{
$this->smtp_error("Сервер не поддерживает аутентификации");
return;
}
}
//-----------------------------------------
// We're from MARS!
//-----------------------------------------
if ( $this->wrap_brackets )
{
if ( ! preg_match( "/^", $this->from ) )
{
$this->from = "<".$this->from.">";
}
}
$this->smtp_send_cmd("MAIL FROM:".$this->from);
if ( $this->smtp_code != 250 )
{
$this->smtp_error();
return;
}
$to_arry = array( $this->to );
if ( count( $this->bcc ) > 0 )
{
foreach ($this->bcc as $bcc)
{
if ( preg_match( "/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)$/", str_replace( " ", "", $bcc ) ) )
{
$to_arry[] = $bcc;
}
}
}
//-----------------------------------------
// You are from VENUS!
//-----------------------------------------
foreach( $to_arry as $to_email )
{
if ( $this->wrap_brackets )
{
$this->smtp_send_cmd("RCPT TO:<".$to_email.">");
}
else
{
$this->smtp_send_cmd("RCPT TO:".$to_email);
}
if ( $this->smtp_code != 250 )
{
$this->smtp_error("Недопустимый e-mail адрес: $to_email");
return;
break;
}
}
//-----------------------------------------
// SEND MAIL!
//-----------------------------------------
$this->smtp_send_cmd("DATA");
if ( $this->smtp_code == 354 )
{
//$this->smtp_send_cmd( $data );
fputs( $this->smtp_fp, $data."\r\n" );
}
else
{
$this->smtp_error("Ошибка при отправке комманды SMTP серверу");
return;
}
//-----------------------------------------
// GO ON, NAFF OFF!
//-----------------------------------------
$this->smtp_send_cmd(".");
if ( $this->smtp_code != 250 )
{
$this->smtp_error();
return;
}
$this->smtp_send_cmd("quit");
if ( $this->smtp_code != 221 )
{
$this->smtp_error();
return;
}
//-----------------------------------------
// Tubby-bye-bye!
//-----------------------------------------
@fclose( $this->smtp_fp );
}
else
{
$this->smtp_error();
return;
}
}
}
?>