| Current Path : /var/www/cesa.co.za/Mailer/includes/ |
| Current File : /var/www/cesa.co.za/Mailer/includes/XPertMailer.php |
<?php
/* * *************************************************************************************
* XPertMailer Version 1.4.4 Stable - 3/10/2006 5:47 PM *
* *
* This file is part of the XPertMailer package (http://xpertmailer.sourceforge.net/) *
* *
* XPertMailer is free software; you can redistribute it and/or modify it under the *
* terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later version. *
* *
* XPertMailer is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* XPertMailer; if not, write to the Free Software Foundation, Inc., 51 Franklin St, *
* Fifth Floor, Boston, MA 02110-1301 USA *
* *
* XPertMailer php functions class. Sends e-mail message in MIME type format. *
* Copyright (C) 2006 Tanase Laurentiu Iulian *
* *
* ************************************************************************************* */
if (!defined('PRINT_ERROR'))
define('PRINT_ERROR', true);
if (isset($_CONSTS_NAME) && PRINT_ERROR)
trigger_error("Variable '\$_CONSTS_NAME' it is already defined", 256);
if (isset($_NAME_CONSTS) && PRINT_ERROR)
trigger_error("Variable '\$_NAME_CONSTS' it is already defined", 256);
if (isset($_VALUE_CONST) && PRINT_ERROR)
trigger_error("Variable '\$_VALUE_CONST' it is already defined", 256);
$_CONSTS_NAME = array(
'SMTP_LOCAL' => 1,
'SMTP_CLIENT' => 2,
'SMTP_LOCAL_CLIENT' => 3,
'SMTP_CLIENT_LOCAL' => 4,
'SMTP_RELAY' => 5,
'SMTP_RELAY_CLIENT' => 6,
'SMTP_CLIENT_RELAY' => 7,
'AUTH_DETECT' => 1,
'AUTH_LOGIN' => 2,
'AUTH_PLAIN' => 3,
'MX_FALSE' => false,
'MX_TRUE' => true,
'ATTACH_HTML_IMG' => 1,
'ATTACH_FILE' => 2,
'P_LOW' => 1,
'P_NORMAL' => 2,
'P_HIGH' => 3,
'SSL_FALSE' => false,
'SSL_TRUE' => true,
'CRLF' => "\r\n",
'IS_WIN' => (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
);
foreach ($_CONSTS_NAME as $_NAME_CONSTS => $_VALUE_CONST) {
if (defined($_NAME_CONSTS)) {
if (PRINT_ERROR)
trigger_error("The constant '" . $_NAME_CONSTS . "' it is already defined", 256);
} else
define($_NAME_CONSTS, $_VALUE_CONST);
}
class XPertMailer {
var $_setsmtp = 3;
var $_pnumber = 25;
var $_porelay = 25;
var $_timeout = 30;
var $_setarrh;
var $_attc1st;
var $_attc2nd;
var $_subject;
var $_fromadr;
var $_sslconn = false;
var $_fromail = false;
var $_fromnam = false;
var $_partmix;
var $_part1st;
var $_part2nd;
var $_wheaders;
var $_wmessage;
var $_wattachs;
var $_msgsplit;
var $_authuser;
var $_authpass;
var $_relayset;
var $_authsets = false;
var $_priority = false;
var $_charset = "ISO-8859-1";
var $response = "unknow";
function XPertMailer($smtp = 3, $relay = false) {
if (is_int($smtp) && $smtp >= 1 && $smtp <= 7) {
if ($smtp >= 5) {
if (!$relay) {
if (PRINT_ERROR)
trigger_error("The relay host name or ip address is not set on class XPertMailer->constructor", 512);
} else {
if (is_string($relay) && trim($relay) != "") {
$this->_setsmtp = $smtp;
$this->_relayset = $relay;
} elseif (PRINT_ERROR)
trigger_error("Invalid relay host name or ip address on class XPertMailer->constructor", 512);
}
} else
$this->_setsmtp = $smtp;
} elseif (PRINT_ERROR)
trigger_error("Invalid SMTP connection preference value on class XPertMailer->constructor", 512);
$this->_setarrh = $this->_attc1st = $this->_attc2nd = $this->_msgsplit = array();
}
function timeout($tmout) {
if (is_int($tmout))
$this->_timeout = $tmout;
elseif (PRINT_ERROR)
trigger_error("Invalid parameter type on class XPertMailer->timeout()", 512);
}
function auth($user, $pass, $type = 1, $vssl = false, $prelay = 25) {
if (is_string($user) && is_string($pass) && !empty($user) && !empty($pass)) {
$this->_authuser = $user;
$this->_authpass = $pass;
if (is_int($type) && ($type == 1 || $type == 2 || $type == 3))
$this->_authsets = $type;
else {
$this->_authsets = 1;
if (PRINT_ERROR)
trigger_error("Invalid 3'rd auth parameter type on class XPertMailer->auth()", 512);
}
if (is_bool($vssl)) {
if ($vssl) {
if (extension_loaded('openssl')) {
$this->_sslconn = true;
if (is_int($prelay))
$this->_porelay = $prelay;
elseif (PRINT_ERROR)
trigger_error("Invalid TSL/SSL port number value on class XPertMailer->auth()", 512);
} elseif (PRINT_ERROR)
trigger_error("Your PHP don't have SSL support on class XPertMailer->auth()", 512);
}
} elseif (PRINT_ERROR)
trigger_error("Invalid SSL value on class XPertMailer->auth()", 512);
} elseif (PRINT_ERROR)
trigger_error("Invalid parameter(s) on class XPertMailer->auth()", 512);
}
function headers($arrh) {
if (is_array($arrh) && count($arrh) > 0) {
$rebh = array();
foreach ($arrh as $numh => $valh) {
if (is_string($numh) && is_string($valh) && !empty($numh) && !empty($valh)) {
if (isset($rebh[$numh]) && PRINT_ERROR)
trigger_error("Duplicate array key on class XPertMailer->headers()", 1024);
$rebh[$numh] = $valh;
} elseif (PRINT_ERROR)
trigger_error("Invalid array parameter type on class XPertMailer->headers()", 1024);
}
$this->_setarrh = $rebh;
} elseif (PRINT_ERROR)
trigger_error("Invalid parameter type on class XPertMailer->headers()", 512);
}
function _attach_file($attc, $typeatt) {
if (is_array($attc) && count($attc) > 0) {
$reb1st = $reb2nd = array();
$lst1st = $this->_attc1st;
$lst2nd = $this->_attc2nd;
foreach ($attc as $numa => $vala) {
if (is_string($vala) && !empty($vala)) {
if (is_file($vala)) {
if (is_readable($vala)) {
$nmfile = (is_string($numa) && !empty($numa)) ? $numa : basename($vala);
if (isset($reb1st[$nmfile]) || isset($reb2nd[$nmfile]) || isset($lst1st[$nmfile]) || isset($lst2nd[$nmfile])) {
if (PRINT_ERROR)
trigger_error("Duplicate array key on class XPertMailer->_attach_file()", 1024);
}
if (strstr($nmfile, '/')) {
if (PRINT_ERROR)
trigger_error("Do not include path value in the name of the file " . $nmfile . " on class XPertMailer->_attach_file()", 1024);
$nmfile = basename($nmfile);
}
if (!strstr($nmfile, '.')) {
if (PRINT_ERROR)
trigger_error("File name: " . $nmfile . " doesn't have an extension defined on class XPertMailer->_attach_file()", 1024);
} else {
$expext = explode(".", $nmfile);
if ($expext[count($expext) - 1] != "") {
if ($typeatt == 1)
$reb1st[$nmfile] = $vala;
elseif ($typeatt == 2)
$reb2nd[$nmfile] = $vala;
} else {
if (PRINT_ERROR)
trigger_error("File name: " . $nmfile . " doesn't have an extension defined on class XPertMailer->_attach_file()", 1024);
}
}
} elseif (PRINT_ERROR)
trigger_error("Can't read file: " . $vala . " on class XPertMailer->_attach_file()", 1024);
} elseif (PRINT_ERROR)
trigger_error("File: " . $vala . " doesn't exists on class XPertMailer->_attach_file()", 1024);
} elseif (PRINT_ERROR)
trigger_error("Invalid array parameter type on class XPertMailer->_attach_file()", 1024);
}
$this->_attc1st = array_merge($lst1st, $reb1st);
$this->_attc2nd = array_merge($lst2nd, $reb2nd);
} elseif (PRINT_ERROR)
trigger_error("Invalid first parameter type on class XPertMailer->_attach_file()", 512);
}
function attach($arratt, $attype = 2) {
if ($attype == 1 || $attype == 2)
$this->_attach_file($arratt, $attype);
elseif (PRINT_ERROR)
trigger_error("Invalid secound parameter type on class XPertMailer->attach()", 512);
}
function is_mail($addr, $vermx = false) {
$ism = false;
if (is_string($addr)) {
$exp = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$";
if (eregi($exp, $addr)) {
if ($vermx) {
$ret = explode("@", $addr);
$mxr = IS_WIN ? $this->_getmxrr_win($ret[1], $mxh) : getmxrr($ret[1], $mxh);
if (count($mxh) > 0) {
foreach ($mxh as $mxv) {
if ($mxv != gethostbyname($mxv)) {
$ism = true;
break;
}
}
}
} else
$ism = true;
}
} elseif (PRINT_ERROR)
trigger_error("Invalid first parameter type on class XPertMailer->is_mail()", 512);
return $ism;
}
function _is_connection($connection) {
$ret = false;
if ($connection && is_resource($connection)) {
$status = stream_get_meta_data($connection);
if (!$status['timed_out'])
$ret = true;
}
return $ret;
}
function _sendtoip($ip, $toarr, $relay = false) {
$set = true;
$pnm = $this->_pnumber;
$ssl = "";
if ($relay) {
$ssl = $this->_sslconn ? "tls://" : "";
$pnm = $this->_porelay;
}
if ($connect = fsockopen($ssl . $ip, $pnm, $err_num, $err_msg, $this->_timeout)) {
$loop = 0;
stream_set_timeout($connect, $this->_timeout);
while (!feof($connect)) {
$loop++;
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 4) != "220-" || $loop === 99)
break;
}
if (substr($rcv, 0, 3) != "220") {
$this->response = "Response 2 error: " . $rcv;
$set = false;
}
if ($set) {
$relayh = "";
if ($relay && $this->_authsets) {
if ($this->_is_connection($connect)) {
fputs($connect, "EHLO " . $this->_fromadr . CRLF);
$getinfo = "";
$loop = 0;
while (!feof($connect)) {
$loop++;
$rcv = fgets($connect, 1024);
$getinfo .= $rcv;
if (substr($rcv, 0, 4) != "250-" || $loop === 99)
break;
}
if (substr($rcv, 0, 3) != "250") {
$this->response = "Response 30 error: " . $rcv;
$set = false;
}
$authreq = false;
if ($this->_authsets == 1) {
if (strstr($getinfo, 'LOGIN'))
$authreq = "login";
elseif (strstr($getinfo, 'PLAIN'))
$authreq = "plain";
} elseif ($this->_authsets == 2)
$authreq = "login";
elseif ($this->_authsets == 3)
$authreq = "plain";
} else {
$this->response = "Response C0 error: Invalid resource connection";
$set = false;
}
if (!$authreq || $authreq == "login") {
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, "AUTH LOGIN" . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "334") {
$this->response = "Response 32 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C1 error: Invalid resource connection";
$set = false;
}
}
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, base64_encode($this->_authuser) . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "334") {
$this->response = "Response 33 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C2 error: Invalid resource connection";
$set = false;
}
}
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, base64_encode($this->_authpass) . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "235") {
$this->response = "Response 34 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C3 error: Invalid resource connection";
$set = false;
}
}
} elseif ($authreq == "plain") {
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, "AUTH PLAIN " . base64_encode($this->_authuser . chr(0) . $this->_authuser . chr(0) . $this->_authpass) . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "235") {
$this->response = "Response 35 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C4 error: Invalid resource connection";
$set = false;
}
}
}
$relayh = "@" . $this->_relayset . ":";
} else {
if ($this->_is_connection($connect)) {
fputs($connect, "HELO " . $this->_fromadr . CRLF);
$loop = 0;
while (!feof($connect)) {
$loop++;
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 4) != "250-" || $loop === 99)
break;
}
if (substr($rcv, 0, 3) != "250") {
$this->response = "Response 31 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C5 error: Invalid resource connection";
$set = false;
}
}
}
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, "MAIL FROM:<" . $this->_fromail . ">" . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "250") {
$this->response = "Response 4 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C6 error: Invalid resource connection";
$set = false;
}
}
if ($set) {
foreach ($toarr as $arrval) {
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, "RCPT TO:<" . $relayh . $arrval . ">" . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "250") {
$this->response = "Response 5 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C7 error: Invalid resource connection";
$set = false;
}
} else
break;
}
}
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, "DATA" . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "354") {
$this->response = "Response 6 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C8 error: Invalid resource connection";
$set = false;
}
}
if ($set) {
foreach ($this->_msgsplit as $partmsg) {
if ($this->_is_connection($connect))
fputs($connect, $partmsg);
else {
$this->response = "Response C9 error: Invalid resource connection";
$set = false;
break;
}
}
if ($set) {
if ($this->_is_connection($connect)) {
fputs($connect, "." . CRLF);
$rcv = fgets($connect, 1024);
if (substr($rcv, 0, 3) != "250") {
$this->response = "Response 7 error: " . $rcv;
$set = false;
}
} else {
$this->response = "Response C10 error: Invalid resource connection";
$set = false;
}
}
if ($set) {
fputs($connect, "QUIT" . CRLF);
if ($rcvs = @fgets($connect, 1024))
$rcv = $rcvs;
}
}
if ($set)
$this->response = "Response 8 success: " . $rcv;
if ($this->_is_connection($connect))
fclose($connect);
} else {
$this->response = "Response 1 error: " . $err_msg;
$set = false;
}
return $set;
}
function _is_ip($ipval) {
$retip = false;
if (is_string($ipval) && !empty($ipval)) {
$expips = explode(".", $ipval);
if (count($expips) == 4) {
$each = true;
foreach ($expips as $number) {
$partno = intval($number);
if (!($number === strval($partno) && $partno >= 0 && $partno <= 255)) {
$each = false;
break;
}
}
$retip = $each;
}
}
return $retip;
}
function _sendtohost($host, $detarr, $toaddh, $hccstr, $hbccstr, $dtmsg, $tpmime, $hrelay = false) {
$headstr2 = $this->_header($toaddh, $hccstr, $hbccstr, $this->_subject, $tpmime, true);
$this->_msgsplit = $this->_splitmsg($headstr2 . CRLF . CRLF . $dtmsg);
if (strtolower($host) == "localhost") {
$headstr1 = $this->_header($toaddh, $hccstr, $hbccstr, $this->_subject, $tpmime, false);
return mail($toaddh, $this->_subject, $dtmsg, $headstr1) ? true : $this->_sendtoip("127.0.0.1", $detarr);
} else {
if ($this->_is_ip($host))
return $this->_sendtoip($host, $detarr, $hrelay);
else {
$retrn = false;
$resmx = IS_WIN ? $this->_getmxrr_win($host, $mxhost) : getmxrr($host, $mxhost);
$iparr = array();
if ($resmx) {
foreach ($mxhost as $hostname) {
$iphost = gethostbyname($hostname);
if ($hostname != $iphost && $hostname != $host && $this->_is_ip($iphost))
$iparr[] = $iphost;
}
} else {
$iphost = gethostbyname($host);
if ($this->_is_ip($iphost))
$iparr[] = $iphost;
}
if (count($iparr) > 0) {
foreach ($iparr as $ipaddr)
if ($retrn = $this->_sendtoip($ipaddr, $detarr, $hrelay))
break;
} else
$this->response = "Hostname '" . $host . "' doesn't have an IP address !";
return $retrn;
}
}
}
function _encstring($len = 9) {
$encwrd = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$enclen = strlen($encwrd) - 1;
$encids = "";
for ($i = 0; $i < $len; $i++)
$encids .= substr($encwrd, rand(0, $enclen));
return $encids;
}
function _header($tom, $hcc, $hbcc, $subjct, $content, $cntx) {
$arr_headers = array();
$fromaddr = $toaddr = false;
if (count($this->_setarrh) > 0) {
foreach ($this->_setarrh as $hnam => $hval) {
if (is_string($hnam) && is_string($hval) && trim($hnam) != "" && trim($hval) != "") {
$hnam = str_replace(array("\r\n", "\r", "\n", "\t"), " ", $hnam);
$hval = str_replace(array("\r\n", "\r", "\n", "\t"), " ", $hval);
$hnam = trim($hnam);
$hval = trim($hval);
if (strtolower($hnam) == "from") {
$expf = explode(" ", $hval);
$mfrm = str_replace(array('<', '>', '"'), '', $expf[count($expf) - 1]);
if ($this->is_mail($mfrm)) {
$fromaddr = $mfrm;
$arr_headers['From'] = $hval;
}
} else {
if (!(strtolower($hnam) == "to" || strtolower($hnam) == "subject" || strtolower($hnam) == "cc" || strtolower($hnam) == "bcc"))
$arr_headers[$hnam] = $hval;
}
} elseif (PRINT_ERROR)
trigger_error("Invalid header format on class XPertMailer->_setheaders()", 512);
}
}
if (!($fromaddr && $this->_fromail)) {
$fromaddr = ini_get('sendmail_from');
if (empty($fromaddr)) {
if (isset($_SERVER['SERVER_ADMIN']) && $this->is_mail($_SERVER['SERVER_ADMIN']))
$fromaddr = $_SERVER['SERVER_ADMIN'];
elseif (isset($_SERVER['SERVER_NAME']))
$fromaddr = "postmaster@" . $_SERVER['SERVER_NAME'];
elseif (isset($_SERVER['HTTP_HOST']))
$fromaddr = "postmaster@" . $_SERVER['HTTP_HOST'];
elseif (isset($_SERVER['REMOTE_ADDR']))
$fromaddr = "postmaster@" . $_SERVER['REMOTE_ADDR'];
elseif (isset($_SERVER['SERVER_ADDR']))
$fromaddr = "postmaster@" . $_SERVER['SERVER_ADDR'];
else
$fromaddr = "postmaster@localhost";
}
}
if (!$this->_fromail)
$this->_fromail = $fromaddr;
else
$fromaddr = $this->_fromail;
$expfrom = explode("@", $fromaddr);
$this->_fromadr = $expfrom[1];
if (!isset($arr_headers['From'])) {
if (IS_WIN && !$cntx) {
$inifrom = ini_get('sendmail_from');
if (empty($inifrom))
$arr_headers['From'] = '"' . $fromaddr . '"';
elseif (PRINT_ERROR)
trigger_error("From e-mail address can not be set because it is already defined 'sendmail_from' value in php.ini on class XPertMailer->_setheaders()", 512);
} else
$arr_headers['From'] = ($this->_fromnam ? '"' . $this->_fromnam . '" ' : '') . '<' . $fromaddr . '>';
}
if ($cntx)
$arr_headers['To'] = $tom;
if ($cntx)
$arr_headers['Subject'] = $subjct;
if (!empty($hcc))
$arr_headers['Cc'] = $hcc;
if (!empty($hbcc) && !$cntx)
$arr_headers['Bcc'] = $hbcc;
$arr_headers['Date'] = date("r");
$arr_headers['MIME-Version'] = '1.0';
if ($content == "text/plain") {
$arr_headers['Content-Type'] = 'text/plain; charset="' . $this->_charset . '"';
$arr_headers['Content-Transfer-Encoding'] = '7bit';
} elseif ($content == "multipart/alternative")
$arr_headers['Content-Type'] = 'multipart/alternative; boundary="' . $this->_partmix . '"';
elseif ($content == "multipart/related")
$arr_headers['Content-Type'] = 'multipart/related; boundary="' . $this->_partmix . '"';
elseif ($content == "multipart/mixed")
$arr_headers['Content-Type'] = 'multipart/mixed; boundary="' . $this->_partmix . '"';
$arr_headers['Message-ID'] = "<XPertMailer14." . uniqid(time()) . "@" . $expfrom[1] . ">";
if ($this->_priority) {
$arr_headers['X-Priority'] = $this->_priority[1];
$arr_headers['X-MSMail-Priority'] = $this->_priority[0];
} else {
if (!isset($arr_headers['X-Priority']))
$arr_headers['X-Priority'] = "3";
if (!isset($arr_headers['X-MSMail-Priority']))
$arr_headers['X-MSMail-Priority'] = "Normal";
}
$arr_headers['X-Mailer'] = base64_decode("WFBlcnRNYWlsZXIgMS40IDxodHRwOi8vd3d3LnhwZXJ0bWFpbGVyLmNvbS8+");
$arr_headers['X-MimeOLE'] = base64_decode("UHJvZHVjZWQgQnkgWFBlcnRNYWlsZXIgVjEuNA==");
$retheaders = "";
foreach ($arr_headers as $hname => $hvalue)
$retheaders .= $hname . ": " . $hvalue . CRLF;
return substr($retheaders, 0, -1 * strlen(CRLF));
}
function _to_quoted($input, $arrids = array(), $linemax = 76) {
if (count($arrids) > 0) {
$find1 = $repl1 = array();
foreach ($arrids as $namefl => $codevl) {
$find1[] = "=\"" . $namefl;
$repl1[] = "=\"cid:" . $codevl;
$find2[] = "=" . $namefl;
$repl2[] = "=cid:" . $codevl;
}
$input = str_replace($find1, $repl1, $input);
$input = str_replace($find2, $repl2, $input);
}
$lines = preg_split("/\r?\n/", $input);
$genre = "";
while (list(, $line) = each($lines)) {
$linelen = strlen($line);
$newline = "";
for ($i = 0; $i < $linelen; $i++) {
$char = substr($line, $i, 1);
$decd = ord($char);
if ($decd == 32 && $i == ($linelen - 1))
$char = "=20";
elseif ($decd == 61 || $decd < 32 || $decd > 126)
$char = "=" . strtoupper(sprintf('%02s', dechex($decd)));
if ((strlen($newline) + strlen($char)) >= $linemax) {
$genre .= $newline . "=" . CRLF;
$newline = "";
}
$newline .= $char;
}
$genre .= $newline . CRLF;
}
return substr($genre, 0, -1 * strlen(CRLF));
}
function _splitmsg($longmsg, $approx = 900) {
$longmsg = str_replace(array(".\r\n", ".\n", ".\r"), ". " . CRLF, $longmsg);
$msgarr = explode(CRLF, $longmsg);
$addmsg = "";
$arrmsg = array();
foreach ($msgarr as $inline) {
$addmsg .= $inline . CRLF;
if (strlen($addmsg) >= $approx) {
$arrmsg[] = $addmsg;
$addmsg = "";
}
}
if (count($arrmsg) == 0)
$arrmsg[] = $longmsg;
else
$arrmsg[] = $addmsg;
return $arrmsg;
}
function send($to, $subj, $textmsg, $htmlmsg = false, $charset = false) {
$retval = $iserrs = false;
$to = str_replace(array("\r\n", "\r", "\n", "\t"), " ", trim($to));
$toexpl = explode(", ", $to);
$alldm = $grpto = $verad = $arrvl = array();
foreach ($toexpl as $valto) {
$valto = trim($valto);
$expadd = explode(" ", $valto);
$addsto = str_replace(array("<", ">"), "", $expadd[count($expadd) - 1]);
if ($this->is_mail($addsto)) {
if (!isset($verad[$addsto])) {
$expat = explode("@", $addsto);
$verad[$addsto] = true;
$grpto[$expat[1]][] = $addsto;
$alldm[] = $addsto;
$arrvl[] = $valto;
} elseif (PRINT_ERROR)
trigger_error("Duplicate to e-mail address '" . $addsto . "' on class XPertMailer->send()", 512);
} elseif (PRINT_ERROR)
trigger_error("Invalid to e-mail address format '" . $addsto . "' on class XPertMailer->send()", 512);
}
if (!(count($alldm) > 0)) {
$iserrs = true;
if (PRINT_ERROR)
trigger_error("Can not find any valid to e-mail address on class XPertMailer->send()", 512);
}
if (!is_string($subj)) {
$iserrs = true;
if (PRINT_ERROR)
trigger_error("Invalid subject format on class XPertMailer->send()", 512);
}
if (!is_string($textmsg)) {
$iserrs = true;
if (PRINT_ERROR)
trigger_error("Invalid text/plain message format on class XPertMailer->send()", 512);
}
if (!$iserrs) { // 1
$arrcc = $arrbcc = array();
if (count($this->_setarrh) > 0) {
foreach ($this->_setarrh as $numhd => $valhd) {
$numhd = trim($numhd);
$valhd = trim($valhd);
if (strtolower($numhd) == "cc") {
$expcc = explode(", ", $valhd);
foreach ($expcc as $ccadd) {
$ccadd = trim($ccadd);
$expcvl = explode(" ", $ccadd);
$addrcc = str_replace(array("<", ">"), "", $expcvl[count($expcvl) - 1]);
if ($this->is_mail($addrcc)) {
if (!isset($vercc[$addrcc])) {
$vercc[$addrcc] = true;
$arrcc[] = array($addrcc, $ccadd);
} elseif (PRINT_ERROR)
trigger_error("Duplicate Cc e-mail address '" . $addrcc . "' on class XPertMailer->send()", 512);
} elseif (PRINT_ERROR)
trigger_error("Invalid Cc e-mail address format '" . $addrcc . "' on class XPertMailer->send()", 512);
}
} elseif (strtolower($numhd) == "bcc") {
$expbcc = explode(", ", $valhd);
foreach ($expbcc as $bccadd) {
$bccadd = trim($bccadd);
$expbvl = explode(" ", $bccadd);
$addbcc = str_replace(array("<", ">"), "", $expbvl[count($expbvl) - 1]);
if ($this->is_mail($addbcc)) {
if (!isset($verbcc[$addbcc])) {
$verbcc[$addbcc] = true;
$arrbcc[] = array($addbcc, $bccadd);
} elseif (PRINT_ERROR)
trigger_error("Duplicate Bcc e-mail address '" . $addbcc . "' on class XPertMailer->send()", 512);
} elseif (PRINT_ERROR)
trigger_error("Invalid Bcc e-mail address format '" . $addbcc . "' on class XPertMailer->send()", 512);
}
}
}
}
$repcc = $repbcc = array();
if (count($arrcc) > 0) {
$repcc = array();
foreach ($arrcc as $arrccdat) {
$samecc = false;
foreach ($alldm as $tovaladd) {
if ($arrccdat[0] == $tovaladd) {
$samecc = true;
if (PRINT_ERROR)
trigger_error("The e-mail address '" . $tovaladd . "' appear in 'To' and 'Cc' on class XPertMailer->send()", 512);
break;
}
}
if (!$samecc)
$repcc[] = $arrccdat;
}
}
if (count($arrbcc) > 0) {
$repbcc = array();
foreach ($arrbcc as $arrbccdat) {
$samebcc = false;
foreach ($alldm as $tovaladd) {
if ($arrbccdat[0] == $tovaladd) {
$samebcc = true;
if (PRINT_ERROR)
trigger_error("The e-mail address '" . $tovaladd . "' appear in 'To' and 'Bcc' on class XPertMailer->send()", 512);
break;
}
}
if (!$samebcc && count($repcc) > 0) {
foreach ($repcc as $toarrcc) {
if ($arrbccdat[0] == $toarrcc[0]) {
$samebcc = true;
if (PRINT_ERROR)
trigger_error("The e-mail address '" . $toarrcc[0] . "' appear in 'Cc' and 'Bcc' on class XPertMailer->send()", 512);
break;
}
}
}
if (!$samebcc)
$repbcc[] = $arrbccdat;
}
}
$tostr = $ccstr = $bccstr = "";
foreach ($arrvl as $line)
$tostr .= $line . ", ";
if (count($repcc) > 0) {
foreach ($repcc as $ccline) {
$ccstr .= $ccline[1] . ", ";
$expcc = explode("@", $ccline[0]);
$grpto[$expcc[1]][] = $ccline[0];
$alldm[] = $ccline[0];
}
}
if (count($repbcc) > 0) {
foreach ($repbcc as $bccline) {
$bccstr .= $bccline[1] . ", ";
$expbcc = explode("@", $bccline[0]);
$grpto[$expbcc[1]][] = $bccline[0];
$alldm[] = $bccline[0];
}
}
$tostr = substr($tostr, 0, -2);
if (!empty($ccstr))
$ccstr = substr($ccstr, 0, -2);
if (!empty($bccstr))
$bccstr = substr($bccstr, 0, -2);
$reptxt = $rephtm = "";
$arrtxt = explode(CRLF, $textmsg);
if (count($arrtxt) > 0) {
foreach ($arrtxt as $txtval)
$reptxt .= str_replace(array("\r", "\n"), CRLF, $txtval) . CRLF;
$reptxt = substr($reptxt, 0, -2);
} else
$reptxt = str_replace(array("\r", "\n"), CRLF, $textmsg);
if ($htmlmsg) {
if (is_string($htmlmsg)) {
$arrhtm = explode(CRLF, $htmlmsg);
if (count($arrhtm) > 0) {
foreach ($arrhtm as $htmval)
$rephtm .= str_replace(array("\r", "\n"), CRLF, $htmval) . CRLF;
$rephtm = substr($rephtm, 0, -2);
} else
$rephtm = str_replace(array("\r", "\n"), CRLF, $htmlmsg);
} else {
$htmlmsg = false;
if (PRINT_ERROR)
trigger_error("Invalid HTML message format on class XPertMailer->send()", 512);
}
}
$this->_subject = str_replace(array("\r\n", "\r", "\n", "\t"), " ", $subj);
if ($charset) {
if (is_string($charset) && !empty($charset))
$this->_charset = str_replace(array("\r\n", "\r", "\n", "\t"), " ", $charset);
else {
if (PRINT_ERROR)
trigger_error("Invalid charset format on class XPertMailer->send()", 512);
$charset = $this->_charset;
}
} else
$charset = $this->_charset;
$cnt1st = count($this->_attc1st);
$cnt2nd = count($this->_attc2nd);
$this->_partmix = "=_0XPertMailer14" . $this->_encstring();
$this->_part1st = "=_1XPertMailer14" . $this->_encstring();
$this->_part2nd = "=_2XPertMailer14" . $this->_encstring();
$sendmsg = "";
if (!$htmlmsg) {
if ($cnt2nd > 0) {
$typmime = "multipart/mixed";
$sendmsg = CRLF .
"--" . $this->_partmix . CRLF .
"Content-Type: text/plain; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: 7bit" . CRLF . CRLF . $reptxt . CRLF;
foreach ($this->_attc2nd as $attname => $attfile) {
$content = file_get_contents($attfile);
$sendmsg .= "--" . $this->_partmix . CRLF .
"Content-Type: " . $this->mimetype($attname) . CRLF .
"Content-Transfer-Encoding: base64" . CRLF .
"Content-Disposition: attachment; filename=\"" . $attname . "\"" . CRLF . CRLF .
chunk_split(base64_encode($content));
}
$sendmsg .= "--" . $this->_partmix . "--" . CRLF;
} else {
$typmime = "text/plain";
$sendmsg = CRLF . $reptxt . CRLF;
}
} else {
if ($cnt1st > 0 && $cnt2nd > 0) {
$idsarrs = array();
foreach ($this->_attc1st as $attnamex => $attfilex)
$idsarrs[$attnamex] = "CXPertMailer14" . $this->_encstring();
$typmime = "multipart/mixed";
$sendmsg = CRLF .
"--" . $this->_partmix . CRLF .
"Content-Type: multipart/related; boundary=\"" . $this->_part1st . "\"" . CRLF . CRLF .
"--" . $this->_part1st . CRLF .
"Content-Type: multipart/alternative; boundary=\"" . $this->_part2nd . "\"" . CRLF . CRLF .
"--" . $this->_part2nd . CRLF .
"Content-Type: text/plain; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: 7bit" . CRLF . CRLF . $reptxt . CRLF .
"--" . $this->_part2nd . CRLF .
"Content-Type: text/html; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: quoted-printable" . CRLF . CRLF . $this->_to_quoted($rephtm, $idsarrs) . CRLF .
"--" . $this->_part2nd . "--" . CRLF;
foreach ($this->_attc1st as $attname1 => $attfile1) {
$content1 = file_get_contents($attfile1);
$sendmsg .= "--" . $this->_part1st . CRLF .
"Content-Type: " . $this->mimetype($attname1) . CRLF .
"Content-Transfer-Encoding: base64" . CRLF .
"Content-Disposition: inline; filename=\"" . $attname1 . "\"" . CRLF .
"Content-ID: <" . $idsarrs[$attname1] . ">" . CRLF . CRLF .
chunk_split(base64_encode($content1));
}
$sendmsg .= "--" . $this->_part1st . "--" . CRLF;
foreach ($this->_attc2nd as $attname2 => $attfile2) {
$content2 = file_get_contents($attfile2);
$sendmsg .= "--" . $this->_partmix . CRLF .
"Content-Type: " . $this->mimetype($attname2) . CRLF .
"Content-Transfer-Encoding: base64" . CRLF .
"Content-Disposition: attachment; filename=\"" . $attname2 . "\"" . CRLF . CRLF .
chunk_split(base64_encode($content2));
}
$sendmsg .= "--" . $this->_partmix . "--" . CRLF;
} elseif ($cnt1st > 0) {
$idsarrs = array();
foreach ($this->_attc1st as $attnamex => $attfilex)
$idsarrs[$attnamex] = "CXPertMailer14" . $this->_encstring();
$typmime = "multipart/related";
$sendmsg = CRLF .
"--" . $this->_partmix . CRLF .
"Content-Type: multipart/alternative; boundary=\"" . $this->_part1st . "\"" . CRLF . CRLF .
"--" . $this->_part1st . CRLF .
"Content-Type: text/plain; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: 7bit" . CRLF . CRLF . $reptxt . CRLF .
"--" . $this->_part1st . CRLF .
"Content-Type: text/html; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: quoted-printable" . CRLF . CRLF . $this->_to_quoted($rephtm, $idsarrs) . CRLF .
"--" . $this->_part1st . "--" . CRLF;
foreach ($this->_attc1st as $attname => $attfile) {
$content = file_get_contents($attfile);
$sendmsg .= "--" . $this->_partmix . CRLF .
"Content-Type: " . $this->mimetype($attname) . CRLF .
"Content-Transfer-Encoding: base64" . CRLF .
"Content-Disposition: inline; filename=\"" . $attname . "\"" . CRLF .
"Content-ID: <" . $idsarrs[$attname] . ">" . CRLF . CRLF .
chunk_split(base64_encode($content));
}
$sendmsg .= "--" . $this->_partmix . "--" . CRLF;
} elseif ($cnt2nd > 0) {
$typmime = "multipart/mixed";
$sendmsg = CRLF .
"--" . $this->_partmix . CRLF .
"Content-Type: multipart/alternative; boundary=\"" . $this->_part1st . "\"" . CRLF . CRLF .
"--" . $this->_part1st . CRLF .
"Content-Type: text/plain; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: 7bit" . CRLF . CRLF . $reptxt . CRLF .
"--" . $this->_part1st . CRLF .
"Content-Type: text/html; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: quoted-printable" . CRLF . CRLF . $this->_to_quoted($rephtm) . CRLF .
"--" . $this->_part1st . "--" . CRLF;
foreach ($this->_attc2nd as $attname => $attfile) {
$content = file_get_contents($attfile);
$sendmsg .= "--" . $this->_partmix . CRLF .
"Content-Type: " . $this->mimetype($attname) . CRLF .
"Content-Transfer-Encoding: base64" . CRLF .
"Content-Disposition: attachment; filename=\"" . $attname . "\"" . CRLF . CRLF .
chunk_split(base64_encode($content));
}
$sendmsg .= "--" . $this->_partmix . "--" . CRLF;
} else {
$typmime = "multipart/alternative";
$sendmsg = CRLF .
"--" . $this->_partmix . CRLF .
"Content-Type: text/plain; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: 7bit" . CRLF . CRLF . $reptxt . CRLF .
"--" . $this->_partmix . CRLF .
"Content-Type: text/html; charset=\"" . $charset . "\"" . CRLF .
"Content-Transfer-Encoding: quoted-printable" . CRLF . CRLF . $this->_to_quoted($rephtm) . CRLF .
"--" . $this->_partmix . "--" . CRLF;
}
}
$tempStr = $tostr;
$tostr = $bccstr;
$bccstr = $tempStr;
if (!empty($sendmsg)) {
if ($this->_setsmtp == 1)
$retval = $this->_sendtohost("localhost", $alldm, $tostr, $ccstr, $bccstr, $sendmsg, $typmime);
elseif ($this->_setsmtp == 5)
$retval = $this->_sendtohost($this->_relayset, $alldm, $tostr, $ccstr, $bccstr, $sendmsg, $typmime, true);
elseif ($this->_setsmtp == 2) {
foreach ($grpto as $namdom => $arrdom) {
$retval = $this->_sendtohost($namdom, $arrdom, $tostr, $ccstr, $bccstr, $sendmsg, $typmime);
}
} elseif ($this->_setsmtp == 3) {
if (!$retval = $this->_sendtohost("localhost", $alldm, $tostr, $ccstr, $bccstr, $sendmsg, $typmime)) {
foreach ($grpto as $namdom => $arrdom) {
$retval = $this->_sendtohost($namdom, $arrdom, $tostr, $ccstr, $bccstr, $sendmsg, $typmime);
}
}
} elseif ($this->_setsmtp == 4) {
foreach ($grpto as $namdom => $arrdom) {
$retval = $this->_sendtohost($namdom, $arrdom, $tostr, $ccstr, $bccstr, $sendmsg, $typmime);
}
if (!$retval)
$retval = $this->_sendtohost("localhost", $alldm, $tostr, $ccstr, $bccstr, $sendmsg, $typmime);
} elseif ($this->_setsmtp == 6) {
if (!$retval = $this->_sendtohost($this->_relayset, $alldm, $tostr, $ccstr, $bccstr, $sendmsg, $typmime, true)) {
foreach ($grpto as $namdom => $arrdom) {
$retval = $this->_sendtohost($namdom, $arrdom, $tostr, $ccstr, $bccstr, $sendmsg, $typmime);
}
}
} elseif ($this->_setsmtp == 7) {
foreach ($grpto as $namdom => $arrdom) {
$retval = $this->_sendtohost($namdom, $arrdom, $tostr, $ccstr, $bccstr, $sendmsg, $typmime);
}
if (!$retval)
$retval = $this->_sendtohost($this->_relayset, $alldm, $tostr, $ccstr, $bccstr, $sendmsg, $typmime, true);
}
} elseif (PRINT_ERROR)
trigger_error("Unknow message type on class XPertMailer->send()", 512);
} // 1
return $retval;
}
function priority($setpr) {
if (!(is_int($setpr) && ($setpr == 1 || $setpr == 2 || $setpr == 3))) {
if (PRINT_ERROR)
trigger_error("Invalid priority value on class XPertMailer->priority()", 512);
} else {
if ($setpr == 1)
$this->_priority = array("Low", "5");
elseif ($setpr == 2)
$this->_priority = array("Normal", "3");
elseif ($setpr == 3)
$this->_priority = array("High", "1");
}
}
function port($pno) {
if (is_int($pno))
$this->_pnumber = $pno;
elseif (PRINT_ERROR)
trigger_error("Invalid port number value on class XPertMailer->port()", 512);
}
function from($fromusr, $fromnme = false) {
if (is_string($fromusr) && $this->is_mail($fromusr)) {
$this->_fromail = $fromusr;
if ($fromnme) {
if (is_string($fromnme) && !empty($fromnme))
$this->_fromnam = $fromnme;
elseif (PRINT_ERROR)
trigger_error("Invalid from name format on class XPertMailer->from()", 512);
}
} elseif (PRINT_ERROR)
trigger_error("Invalid from mail address format on class XPertMailer->from()", 512);
}
function response() {
return $this->response;
}
function _getmxrr_win($hostname, &$mxhosts) {
$mxhosts = array();
if (is_string($hostname)) {
$retstr = exec('nslookup -type=mx ' . $hostname, $retarr);
if ($retstr && count($retarr) > 0) {
foreach ($retarr as $line)
if (preg_match("/.*mail exchanger = (.*)/", $line, $matches))
$mxhosts[] = $matches[1];
}
} elseif (PRINT_ERROR)
trigger_error("Invalid parameter type on class XPertMailer->_getmxrr_win()", 512);
return (count($mxhosts) > 0);
}
function mimetype($filename) {
$retm = "application/octet-stream";
$mime = array(
'z' => "application/x-compress",
'xls' => "application/x-excel",
'gtar' => "application/x-gtar",
'gz' => "application/x-gzip",
'cgi' => "application/x-httpd-cgi",
'php' => "application/x-httpd-php",
'js' => "application/x-javascript",
'swf' => "application/x-shockwave-flash",
'tar' => "application/x-tar",
'tgz' => "application/x-tar",
'tcl' => "application/x-tcl",
'src' => "application/x-wais-source",
'zip' => "application/zip",
'kar' => "audio/midi",
'mid' => "audio/midi",
'midi' => "audio/midi",
'mp2' => "audio/mpeg",
'mp3' => "audio/mpeg",
'mpga' => "audio/mpeg",
'ram' => "audio/x-pn-realaudio",
'rm' => "audio/x-pn-realaudio",
'rpm' => "audio/x-pn-realaudio-plugin",
'wav' => "audio/x-wav",
'bmp' => "image/bmp",
'fif' => "image/fif",
'gif' => "image/gif",
'ief' => "image/ief",
'jpe' => "image/jpeg",
'jpeg' => "image/jpeg",
'jpg' => "image/jpeg",
'png' => "image/png",
'tif' => "image/tiff",
'tiff' => "image/tiff",
'css' => "text/css",
'htm' => "text/html",
'html' => "text/html",
'txt' => "text/plain",
'rtx' => "text/richtext",
'vcf' => "text/x-vcard",
'xml' => "text/xml",
'xsl' => "text/xsl",
'mpe' => "video/mpeg",
'mpeg' => "video/mpeg",
'mpg' => "video/mpeg",
'mov' => "video/quicktime",
'qt' => "video/quicktime",
'rv' => "video/vnd.rn-realvideo",
'asf' => "video/x-ms-asf",
'asx' => "video/x-ms-asf",
'avi' => "video/x-msvideo",
'vrml' => "x-world/x-vrml",
'wrl' => "x-world/x-vrml"
);
$expext = explode(".", $filename);
if (count($expext) >= 2) {
$extnam = strtolower($expext[count($expext) - 1]);
if (isset($mime[$extnam]))
$retm = $mime[$extnam];
}
return $retm;
}
}