Pardon hocam ben anlamamışım.buyur.
<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.6.3 - Licence Number xxxxxxxxxx
|| # ---------------------------------------------------------------- # ||
|| # All PHP code in this file is ©2000-2006 Jelsoft Enterprises Ltd. # ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/liceNse.html # ||
|| #################################################################### ||
\*======================================================================*/
define('MAIL_INCLUDED', true);
// Attempt to load XML extension if we don't have the XML functions
// already loaded. It is needed for utf8_encode()
if (!function_exists('xml_set_element_handler'))
{
$extension_dir = ini_get('extension_dir');
if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN'))
{
$extension_file = 'php_xml.dll';
}
else
{
$extension_file = 'xml.so';
}
if ($extension_dir AND file_exists($extension_dir . '/' . $extension_file))
{
ini_set('display_errors', true);
dl($extension_file);
}
}
/**
* Standard Mail Sending Object
*
* This class sends email from vBulletin using the PHP mail() function
*
* @package vBulletin
* @version $Revision: 1.30 $
* @date $Date: 2006/07/26 11:14:36 $
* @copyright http://www.vbulletin.com/license.html
*
*/
class vB_Mail
{
/**
* Destination address
*
* @var string
*/
var $toemail = '';
/**
* Subject
*
* @var string
*/
var $subject = '';
/**
* Message
*
* @var string
*/
var $message = '';
/**
* All headers to be sent with the message
*
* @var string
*/
var $headers = '';
/**
* Sender email
*
* @var string
*/
var $fromemail = '';
/**
* Line delimiter
*
* @var string
*/
var $delimiter = "\r\n";
/**
* Registry object for any options we need
*
* @var vB_Registry
*/
var $registry = null;
/**
* Switch to enable/disable debugging. When enabled, warnings are not suppressed
*
* @var boolean
*/
var $debug = false;
/**
* Message to log if logging is enabled
*
* @var string
*/
var $log = '';
/**
* Constructor
*
* @param vB_Registry vBulletin registry object
*/
function vB_Mail(&$registry)
{
if (is_object($registry))
{
$this->registry =& $registry;
}
else
{
trigger_error('Registry object is not an object', E_USER_ERROR);
}
$sendmail_path = @ini_get('sendmail_path');
if (!$sendmail_path OR $this->registry->options['use_smtp'] OR defined('FORCE_MAIL_CRLF'))
{
// no sendmail, so we're using SMTP or a server that lines CRLF to send mail // the use_smtp part is for the MailQueue extension
$this->delimiter = "\r\n";
}
else
{
$this->delimiter = "\n";
}
}
/**
* Starts the process of sending an email - preps it so it's fully ready to send.
* Call send() to actually send it.
*
* @param string Destination email address
* @param string Email message subject
* @param string Email message body
* @param string Optional name/email to use in 'From' header
* @param string Additional headers
* @param string Username of person sending the email
*
* @param boolean True on success, false on failure
*/
function start($toemail, $subject, $message, $from = '', $uheaders = '', $username = '')
{
$toemail = $this->fetch_first_line($toemail);
if (empty($toemail))
{
return false;
}
$delimiter =& $this->delimiter;
$vbulletin =& $this->registry;
$toemail = unhtmlspecialchars($toemail);
$subject = $this->fetch_first_line($subject);
$message = preg_replace("#(\r\n|\r|\n)#s", $delimiter, trim($message));
global $stylevar;
if ((strtolower($stylevar['charset']) == 'iso-8859-1' OR $stylevar['charset'] == '') AND preg_match('/&[a-z0-9#]+;/i', $message))
{
$message = utf8_encode($message);
$subject = utf8_encode($subject);
$username = utf8_encode($username);
$encoding = 'UTF-8';
$unicode_decode = true;
}
else
{
// we know nothing about the message's encoding in relation to UTF-8,
// so we can't modify the message at all; just set the encoding
$encoding = $stylevar['charset'];
$unicode_decode = false;
}
// theses lines may need to call convert_int_to_utf8 directly
$message = unhtmlspecialchars($message, $unicode_decode);
$subject = $this->encode_email_header(unhtmlspecialchars($subject, $unicode_decode), $encoding, false, false);
$from = $this->fetch_first_line($from);
if (empty($from))
{
global $vbphrase;
if (isset($vbphrase['x_mailer']))
{
$mailfromname = construct_phrase($this->fetch_first_line($vbphrase['x_mailer']), $vbulletin->options['bbtitle']);
}
else
{
$mailfromname = $vbulletin->options['bbtitle'];
}
if ($unicode_decode == true)
{
$mailfromname = utf8_encode($mailfromname);
}
$mailfromname = $this->encode_email_header(unhtmlspecialchars($mailfromname, $unicode_decode), $encoding);
$fromemail = $vbulletin->options['webmasteremail'];
$headers .= "From: $mailfromname <" . $vbulletin->options['webmasteremail'] . '>' . $delimiter;
$headers .= 'Return-Path: ' . $vbulletin->options['webmasteremail'] . $delimiter;
$headers .= 'Auto-Submitted: auto-generated' . $delimiter;
}
else
{
if ($username)
{
$mailfromname = "$username @ " . $vbulletin->options['bbtitle'];
}
else
{
$mailfromname = $from;
}
if ($unicode_decode == true)
{
$mailfromname = utf8_encode($mailfromname);
}
$mailfromname = $this->encode_email_header(unhtmlspecialchars($mailfromname, $unicode_decode), $encoding);
$fromemail = $from;
$headers .= "From: $mailfromname <$from>" . $delimiter;
$headers .= 'Return-Path: ' . $from . $delimiter;
}
if ($_SERVER['HTTP_HOST'] OR $_ENV['HTTP_HOST'])
{
$http_host = iif($_SERVER['HTTP_HOST'], $_SERVER['HTTP_HOST'], $_ENV['HTTP_HOST']);
}
else if ($_SERVER['SERVER_NAME'] OR $_ENV['SERVER_NAME'])
{
$http_host = iif($_SERVER['SERVER_NAME'], $_SERVER['SERVER_NAME'], $_ENV['SERVER_NAME']);
}
$http_host = trim($http_host);
if (!$http_host)
{
$http_host = substr(md5($message), 6, 12) . '.vb_unknown.unknown';
}
$msgid = '<' . gmdate('YmdHs') . '.' . substr(md5($message . microtime()), 0, 6) . vbrand(100000, 999999) . '@' . $http_host . '>';
$headers .= 'Message-ID: ' . $msgid . $delimiter;
$headers .= preg_replace("#(\r\n|\r|\n)#s", $delimiter, $uheaders);
unset($uheaders);
$headers .= 'MIME-Version: 1.0' . $delimiter;
$headers .= 'Content-Type: text/plain' . iif($encoding, "; charset=\"$encoding\"") . $delimiter;
$headers .= 'Content-Transfer-Encoding: 8bit' . $delimiter;
$headers .= 'X-Priority: 3' . $delimiter;
$headers .= 'X-Mailer: vBulletin Mail via PHP' . $delimiter;
($hook = vBulletinHook::fetch_hook('mail_send')) ? eval($hook) : false;
$this->toemail = $toemail;
$this->subject = $subject;
$this->message = $message;
$this->headers = $headers;
$this->fromemail = $fromemail;
return true;
}
/**
* Set all the necessary variables for sending a message.
*
* @param string Destination address
* @param string Subject
* @param string Message
* @param string All headers to be sent with the message
* @param string Sender email
*/
function quick_set($toemail, $subject, $message, $headers, $fromemail)
{
$this->toemail = $toemail;
$this->subject = $subject;
$this->message = $message;
$this->headers = $headers;
$this->fromemail = $fromemail;
}
/**
* Actually send the message.
*
* @return boolean True on success, false on failure
*/
function send()
{
if (!$this->toemail)
{
return false;
}
@ini_set('sendmail_from', $this->fromemail);
if ($this->registry->options['needfromemail'])
{
$result = @mail($this->toemail, $this->subject, $this->message, trim($this->headers), '-f ' . $this->fromemail);
}
else
{
$result = @mail($this->toemail, $this->subject, $this->message, trim($this->headers));
}
$this->log_email($result);
return $result;
}
/**
* Returns the first line of a string -- good to prevent errors when sending emails (above)
*
* @param string String to be trimmed
*
* @return string
*/
function fetch_first_line($text)
{
$text = preg_replace("/(\r\n|\r|\n)/s", "\r\n", trim($text));
$pos = strpos($text, "\r\n");
if ($pos !== false)
{
return substr($text, 0, $pos);
}
return $text;
}
/**
* Encodes a mail header to be RFC 2047 compliant. This allows for support
* of non-ASCII character sets via the quoted-printable encoding.
*
* @param string The text to encode
* @param string The character set of the text
* @param bool Whether to force encoding into quoted-printable even if not necessary
* @param bool Whether to quote the string; applies only if encoding is not done
*
* @return string The encoded header
*/
function encode_email_header($text, $charset = 'utf-8', $force_encode = false, $quoted_string = true)
{
$text = trim($text);
if (!$charset)
{
// don't know how to encode, so we can't
return $text;
}
if ($force_encode == true)
{
$qp_encode = true;
}
else
{
$qp_encode = false;
for ($i = 0; $i < strlen($text); $i++)
{
if (ord($text{$i}) > 127)
{
// we have a non ascii character
$qp_encode = true;
break;
}
}
}
if ($qp_encode == true)
{
// see rfc 2047; not including _ as allowed here, as I'm encoding spaces with it
$outtext = preg_replace('#([^a-zA-Z0-9!*+\-/= ])#e', "'=' . strtoupper(dechex(ord(str_replace('\\\"', '\"', '\\1'))))", $text);
$outtext = str_replace(' ', '_', $outtext);
$outtext = "=?$charset?q?$outtext?=";
return $outtext;
}
else
{
if ($quoted_string)
{
$text = str_replace(array('"', '(', ')'), array('\"', '\(', '\)'), $text);
return "\"$text\"";
}
else
{
return preg_replace('#(\r\n|\n|\r)+#', ' ', $text);
}
}
}
/**
* Sets the debug member
*
* @param boolean
*/
function set_debug($debug)
{
$this->debug = $debug;
}
/**
* Logs email to file
*
*/
function log_email($status = true)
{
if (!empty($this->registry->options['errorlogemail']))
{
$errfile =& $this->registry->options['errorlogemail'];
if ($this->registry->options['errorlogmaxsize'] != 0 AND $filesize = @filesize("$errfile.log") AND $filesize >= $this->registry->options['errorlogmaxsize'])
{
@copy("$errfile.log", $errfile . TIMENOW . '.log');
@unlink("$errfile.log");
}
$timenow = date('r', TIMENOW);
$is_admin = ($this->registry->userinfo['permissions']['adminpermissions'] & $this->registry->bf_ugp_adminpermissions['cancontrolpanel']);
$fp = @fopen("$errfile.log", 'a+b');
if ($fp)
{
if ($status === true)
{
$output = "SUCCESS\r\n";
}
else
{
$output = "FAILED";
if ($status !== false)
{
$output .= ": $status";
}
$output .= "\r\n";
}
if ($this->delimiter == "\n")
{
$append = "$timenow\r\nTo: " . $this->toemail . "\r\nSubject: " . $this->subject . "\r\n" . $this->headers . "\r\n\r\n" . $this->message . "\r\n=====================================================\r\n\r\n";
@fwrite($fp, $output . $append);
}
else
{
$append = preg_replace("#(\r\n|\r|\n)#s", "\r\n", "$timenow\r\nTo: " . $this->toemail . "\r\nSubject: " . $this->subject . "\r\n" . $this->headers . "\r\n\r\n" . $this->message . "\r\n=====================================================\r\n\r\n");
@fwrite($fp, $output . $append);
}
fclose($fp);
}
}
}
}
/**
* SMTP Mail Sending Object
*
* This class sends email from vBulletin using an SMTP wrapper
*
* @package vBulletin
* @version $Revision: 1.30 $
* @date $Date: 2006/07/26 11:14:36 $
* @copyright http://www.vbulletin.com/license.html
*
*/
class vB_SmtpMail extends vB_Mail
{
/**
* SMTP host
*
* @var string
*/
var $smtpHost;
/**
* SMTP port
*
* @var integer
*/
var $smtpPort;
/**
* SMTP username
*
* @var string
*/
var $smtpUser;
/**
* SMTP password
*
* @var string
*/
var $smtpPass;
/**
* Raw SMTP socket
*
* @var resource
*/
var $smtpSocket = null;
/**
* Return code from SMTP server
*
* @var integer
*/
var $smtpReturn = 0;
/**
* Constructor
*
* @param vB_Registry vBulletin registry object
*/
function vB_SmtpMail(&$registry)
{
if (is_object($registry))
{
$this->registry =& $registry;
}
else
{
trigger_error('Registry object is not an object', E_USER_ERROR);
}
$this->smtpHost = (!empty($this->registry->options['smtp_tls']) ? 'tls://' : '') . $this->registry->options['smtp_host'];
$this->smtpPort = (!empty($this->registry->options['smtp_port']) ? intval($this->registry->options['smtp_port']) : 25);
$this->smtpUser =& $this->registry->options['smtp_user'];
$this->smtpPass =& $this->registry->options['smtp_pass'];
$this->delimiter = "\r\n";
}
/**
* Sends instruction to SMTP server
*
* @param string Message to be sent to server
* @param mixed Message code expected to be returned or false if non expected
*
* @return boolean Returns false on error
*/
function sendMessage($msg, $expectedResult = false)
{
if ($msg !== false && !empty($msg))
{
fputs($this->smtpSocket, $msg . "\r\n");
}
if ($expectedResult !== false)
{
$result = '';
while ($line = @fgets($this->smtpSocket, 1024))
{
$result .= $line;
if (preg_match('#^(\d{3}) #', $line, $matches))
{
break;
}
}
$this->smtpReturn = intval($matches[1]);
return ($this->smtpReturn == $expectedResult);
}
return true;
}
/**
* Triggers PHP warning on error
*
* @param string Error message to be shown
*
* @return boolean Always returns false (error)
*/
function errorMessage($msg)
{
if ($this->debug)
{
trigger_error($msg, E_USER_WARNING);
}
$this->log_email($msg);
return false;
}
/**
* Attempts to send email based on parameters passed into start()/quick_set()
*
* @return boolean Returns false on error
*/
function send()
{
if (!$this->toemail)
{
return false;
}
$this->smtpSocket = fsockopen($this->smtpHost, $this->smtpPort, $errno, $errstr, 30);
if ($this->smtpSocket)
{
if (!$this->sendMessage(false, 220))
{
return $this->errorMessage('Unexpected response when connecting to SMTP server');
}
if ($this->smtpUser AND $this->smtpPass)
{
if (!$this->sendMessage('EHLO ' . $this->smtpHost, 250))
{
return $this->errorMessage('Unexpected response from SMTP server during handshake');
}
if ($this->sendMessage('AUTH LOGIN', 334))
{
if (!$this->sendMessage(base64_encode($this->smtpUser), 334) OR !$this->sendMessage(base64_encode($this->smtpPass), 235))
{
return $this->errorMessage('Authorization to the SMTP server failed');
}
}
}
else if (!$this->sendMessage('HELO ' . $this->smtpHost, 250))
{
return $this->errorMessage('Unexpected response from SMTP server during handshake');
}
if (!$this->sendMessage('MAIL FROM:<' . $this->fromemail . '>', 250))
{
return $this->errorMessage('Unexpected response from SMTP server during FROM address transmission');
}
// we could have multiple addresses since a few people might expect this to be the same as PHP
$addresses = explode(',', $this->toemail);
foreach ($addresses AS $address)
{
if (!$this->sendMessage('RCPT TO:<' . trim($address) . '>', 250))
{
return $this->errorMessage('Unexpected response from SMTP server during TO address transmission');
}
}
if ($this->sendMessage('DATA', 354))
{
$this->sendMessage('Date: ' . gmdate('r'), false);
$this->sendMessage('To: ' . $this->toemail, false);
$this->sendMessage(trim($this->headers), false); // trim to prevent double \r\n
$this->sendMessage('Subject: ' . $this->subject, false);
$this->sendMessage("\r\n", false); // this makes a double \r\n
// catch any single dots on their own
$this->message = preg_replace('#^\.' . $this->delimiter . '#m', '..' . $this->delimiter, $this->message);
$this->sendMessage($this->message, false);
}
else
{
return $this->errorMessage('Unexpected response from SMTP server during data transmission');
}
if (!$this->sendMessage('.', 250))
{
return $this->errorMessage('Unexpected response from SMTP server when ending transmission');
}
// Don't check that QUIT returns a valid result as some servers just kill the connection e.g. smtp.gmail.com
$this->sendMessage('QUIT', 221);
fclose($this->smtpSocket);
$this->log_email();
return true;
}
else
{
return $this->errorMessage('Unable to connect to SMTP server');
}
}
}
/**
* Mail queueing class. This class should be accessed as a singleton via fetch_instance()!
* This class does not actually send emails, but rather queues them to be sent later in a batch.
*
* @package vBulletin
* @version $Revision: 1.30 $
* @date $Date: 2006/07/26 11:14:36 $
* @copyright http://www.vbulletin.com/license.html
*
*/
class vB_QueueMail extends vB_Mail
{
/**
* The SQL to insert into the mail queue
*
* @var string
*/
var $mailsql = '';
/**
* The number of mails being inserted into the queue
*
* @var string
*/
var $mailcounter = '';
/**
* Whether to do bulk inserts into the database.
* Never set this option directly!
*
* @var boolean
*/
var $bulk = false;
/**
* Inserts the message into the queue instead of sending it.
*
* @return string True on success, false on failure
*/
function send()
{
if (!$this->toemail)
{
return false;
}
$vbulletin =& $this->registry;
$data = "
(" . TIMENOW . ",
'" . $vbulletin->db->escape_string($this->toemail) . "',
'" . $vbulletin->db->escape_string($this->fromemail) . "',
'" . $vbulletin->db->escape_string($this->subject) . "',
'" . $vbulletin->db->escape_string($this->message) . "',
'" . $vbulletin->db->escape_string($this->headers) . "')
";
if ($this->bulk)
{
if (!empty($this->mailsql))
{
$this->mailsql .= ',';
}
$this->mailsql .= $data;
$this->mailcounter++;
// current insert exceeds half megabyte, insert it and start over
if (strlen($this->mailsql) > 524288)
{
$this->set_bulk(false);
$this->set_bulk(true);
}
}
else
{
/*insert query*/
$vbulletin->db->query_write("
INSERT INTO " . TABLE_PREFIX . "mailqueue
(dateline, toemail, fromemail, subject, message, header)
VALUES
" . $data
);
$vbulletin->db->query_write("
UPDATE " . TABLE_PREFIX . "datastore SET
data = data + 1
WHERE title = 'mailqueue'
");
// if we're using a alternate datastore, we need to give it an integer value
// this may not be atomic
if (method_exists($vbulletin->datastore, 'build'))
{
$mailqueue_db = $vbulletin->db->query_first("
SELECT data
FROM " . TABLE_PREFIX . "datastore
WHERE title = 'mailqueue'
");
$vbulletin->datastore->build('mailqueue', intval($mailqueue_db['data']));
}
}
return true;
}
/**
* Sets the bulk option. If disabling the option, this also flushes
* the cache into the database.
*
* @param boolean
*/
function set_bulk($bulk)
{
if ($bulk)
{
$this->bulk = true;
$this->mailcounter = 0;
$this->mailsql = '';
}
else if ($this->mailcounter AND $this->mailsql)
{
// turning off bulk sending, so save all the mails
$vbulletin =& $this->registry;
/*insert query*/
$vbulletin->db->query_write("
INSERT INTO " . TABLE_PREFIX . "mailqueue
(dateline, toemail, fromemail, subject, message, header)
VALUES
" . $this->mailsql
);
$vbulletin->db->query_write("
UPDATE " . TABLE_PREFIX . "datastore
SET data = data + " . intval($this->mailcounter) . "
WHERE title = 'mailqueue'
");
// if we're using a alternate datastore, we need to give it an integer value
// this may not be atomic
if (method_exists($vbulletin->datastore, 'build'))
{
$mailqueue_db = $vbulletin->db->query_first("
SELECT data
FROM " . TABLE_PREFIX . "datastore
WHERE title = 'mailqueue'
");
$vbulletin->datastore->build('mailqueue', intval($mailqueue_db['data']));
}
}
$this->bulk = true;
$this->mailsql = '';
$this->mailcounter = 0;
}
/**
* Singleton emulator. Fetches the instance if it doesn't exist.
* Be sure to accept a reference if using this function!
*
* @return vB_QueueMail Reference to the instance
*/
function &fetch_instance()
{
static $instance = null;
if ($instance === null)
{
global $vbulletin;
$instance =& new vB_QueueMail($vbulletin);
}
return $instance;
}
/**
* The only part of this class which actually sends an email.
* Sends mail from the queue.
*/
function exec_queue()
{
$vbulletin =& $this->registry;
if ($vbulletin->options['usemailqueue'] == 2)
{
// Lock mailqueue table so that only one process can
// send a batch of emails and then delete them
$vbulletin->db->lock_tables(array('mailqueue' => 'WRITE'));
}
$emails = $vbulletin->db->query_read("
SELECT *
FROM " . TABLE_PREFIX . "mailqueue
ORDER BY mailqueueid
LIMIT " . intval($vbulletin->options['emailsendnum'])
);
$mailqueueids = '';
$newmail = 0;
$emailarray = array();
while ($email = $vbulletin->db->fetch_array($emails))
{
// count up number of mails about to send
$mailqueueids .= ',' . $email['mailqueueid'];
$newmail++;
$emailarray[] = $email;
}
if (!empty($mailqueueids))
{
// remove mails from queue - to stop duplicates being sent
$vbulletin->db->query_write("
DELETE FROM " . TABLE_PREFIX . "mailqueue
WHERE mailqueueid IN (0 $mailqueueids)
");
if ($vbulletin->options['usemailqueue'] == 2)
{
$vbulletin->db->unlock_tables();
}
if ($vbulletin->options['use_smtp'])
{
$prototype =& new vB_SmtpMail($vbulletin);
}
else
{
$prototype =& new vB_Mail($vbulletin);
}
foreach ($emailarray AS $index => $email)
{
// send those mails
$mail = (phpversion() < '5' ? $prototype : clone($prototype)); // avoid ctor overhead
$mail->quick_set($email['toemail'], $email['subject'], $email['message'], $email['header'], $email['fromemail']);
$mail->send();
}
$newmail = 'data - ' . intval($newmail);
}
else
{
if ($vbulletin->options['usemailqueue'] == 2)
{
$vbulletin->db->unlock_tables();
}
$newmail = 0;
}
// update number of mails remaining
$vbulletin->db->query_write("
UPDATE " . TABLE_PREFIX . "datastore SET
data = " . $newmail . ",
data = IF(data < 0, 0, data)
WHERE title = 'mailqueue'
");
// if we're using a alternate datastore, we need to give it an integer value
// this may not be atomic
if (method_exists($vbulletin->datastore, 'build'))
{
$mailqueue_db = $vbulletin->db->query_first("
SELECT data
FROM " . TABLE_PREFIX . "datastore
WHERE title = 'mailqueue'
");
$vbulletin->datastore->build('mailqueue', intval($mailqueue_db['data']));
}
}
}
/*======================================================================*\
|| ####################################################################
|| # Downloaded: 07:39, Thu Nov 9th 2006
|| # CVS: $RCSfile: class_mail.php,v $ - $Revision: 1.30 $
|| ####################################################################
\*======================================================================*/
?>