Need assistance using sendmail or mail()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi everyone,

I need assistance using sendmail or mail() as my web hosting service
does not allow opening sockets.

This is the code I use:

clsMailer.php
/*
  Author:       Macdonald Robinson

  Date:         April 2007

  Class Name:   clsMailer

  Dependencies:
                PHP 4.0+
  Description:
                This is a wrapper class for the XPertMailer library
which is included in this distribution

  Functions Exposed:

sendMail($subject,$toAddress,$plainMessage,$htmlMessage='',$fromAddress
= '',$fromName = '',$toName='')
                  Arguments:
                    $subject = The subject of the email
                    $fromAddress = The from email address
                    $fromName = The from name
                    $toAddress = The to email address
                    $toName = The to name
                    $plainMessage = This is the message that will be
displayed when the email client
                                    does not support HTML format emails
                    $htmlMessage = This is the HTML formatted email

*/
include 'smtp.php';
class clsMailer
{
  var $mailer;
  function clsMailer()
  {
    $this->mailer = new SMTP();
    return $this->mailer;
  }

  function sendMail($subject, $fromAddress, $fromName='',
$replyToAddress='',$method = 'client')
  {
    $this->mailer->Delivery($method);
    $this->mailer->From($fromAddress,$fromName);
    $this->mailer->FromHost($_SERVER['HTTP_HOST'], $havemx);
    if($replyToAddress != '')
      $this->mailer->AddHeader('Reply-To',$replyToAddress);
    $this->mailer->send($subject);
    return $this->mailer->result;
  }

  function setTo($addressNamePair)
  {
    foreach ($addressNamePair as $key=>$value)
    {
      $this->mailer->AddTo($key,$value);
    }
  }

  function setMessage($plainTextMessage, $htmlMessage = '')
  {
    $this->mailer->Text($plainTextMessage);
    if($htmlMessage != '')
      $this->mailer->Html($htmlMessage);
  }
  function setCC($addressNamePair)
  {
    foreach ($toAddresses as $key=>$value)
    {
      $this->mailer->AddCc($key,$value);
    }
  }
  function setBCC($addresses)
  {
    foreach ($addresses as $key=>$value)
    {
      $this->mailer->AddBcc($value);
    }
  }

  function attachFiles($addressNamePair)
  {
    $msgs = array();
    foreach ($addressNamePair as $index=>$path)
    {
        $msgs[$path] = $this->mailer->AttachFile($path);
    }
    return $msgs;
  }

}

email-sender.php
  $mailer=new clsMailer();
  $toAddresses = array('john@xxxxxx'=>'john doe'
                      ,'joe@bloe'=>'joe bloe');
  $mailer->setTo($toAddresses);
 /* $plainTextMessage = $_POST['comments'];*/
  $htmlMessage = 'Title: '.$_POST['title'].'<BR> First Name:
'.$_POST['first-name'].'<BR> Last Name: '.$_POST['last-name'].
'<BR> Address: '.$_POST['address'].
'<BR> Postal Code: '.$_POST['postal'].
'<BR> Email Address: '.$_POST['email'].
'<BR> Occupation: '.$_POST['occupation'].
'<BR> Cell Phone: '.$_POST['cell-phone'].
'<BR> Home Phone Number: '.$_POST['home-phone'].
'<BR> Lawn Sign: '.$_POST['lawn-sign2'].
'<BR> Help In The Office: '.$_POST['lawn-sign3'].
'<BR> Lawn Sign Crew: '.$_POST['lawn-sign4'].
'<BR> Election Day Scrutineering: '.$_POST['lawn-sign5'].
'<BR> Comment: '.$_POST['comments'];

  $mailer->setMessage($plianTextMessage,$htmlMessage);

  $subject = 'Jilian Saweczko Contact Request';
  $fromAddress = $_POST['email'];
  $fromName = $_POST['first-name'].' '.$_POST['last-name'];
  $replyToAddress = $_POST['email'];

  echo $mailer->sendMail($subject, $fromAddress, $fromName,
$replyToAddress);

smtp.php
/***************************************************************************************
 *

*
 * 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 SMTP & POP3 PHP Mail Client. Can send and read messages
in MIME Format. *
 * Copyright (C) 2006  Tanase Laurentiu
Iulian                                         *
 *

*
 ***************************************************************************************/

require_once 'func.php';
require_once 'mime.php';

class SMTP extends MIME {

    var $_smtpconn;
    var $_subject;
    var $_content;
    var $_arrcon;
    var $_arrenc;

    var $_port = 25;
    var $_unique = 0;
    var $_timeout = 30;

    var $max_cl = 99;
    var $max_sl = 1024;
    var $result = 'unknown';

    var $_header = false;
    var $_attach = false;

    var $_toaddrs = false;
    var $_ccaddrs = false;
    var $_bccaddrs = false;
    var $_fromaddr = false;
    var $_fromhost = false;

    var $_relay = false;
    var $_chunk = false;
    var $_atext = false;
    var $_ahtml = false;

    function SMTP(){
        //parent::MIME();
        $this->_smtpconn = array('local');
        $this->_arrcon = array('local' => '', 'client' => '', 'relay' =>
'');
        $this->_arrenc = array('7bit' => '', '8bit' => '',
'quoted-printable' => '', 'base64' => '');
    }

    function delivery($conn){

        $ret = false;
        if(is_string($conn)){
            $conn = trim($conn);
            if(FUNC::is_alpha($conn, false, '-')){
                $exp = explode('-', $conn);
                $rep = array();
                foreach($exp as $val){
                    $val = strtolower($val);
                    if(isset($this->_arrcon[$val])) $rep[] = $val;
                    else trigger_error('Invalid connection type value
"'.$val.'", on class SMTP::delivery()', 512);
                }
                if(count($rep) > 0){
                    $this->_smtpconn = $rep;
                    $ret = true;
                }
            }else trigger_error('Invalid parameter value, on class
SMTP::delivery()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::delivery()', 512);
        return $ret;

    }

    function port($num){

        $ret = false;
        if(is_int($num)){
            $this->_port = $num;
            $ret = true;
        }else trigger_error('Invalid parameter type value, on class
SMTP::port()', 512);
        return $ret;

    }

    function timeout($num){

        $ret = false;
        if(is_int($num)){
            $this->_timeout = $num;
            $ret = true;
        }else trigger_error('Invalid parameter type value, on class
SMTP::timeout()', 512);
        return $ret;

    }

    function relay($raddr, $ruser = false, $rpass = false, $rport = 25,
$rauth = 'autodetect', $rvssl = false){

        $ret = false;
        if(is_string($raddr)){
            $raddr = FUNC::str_clear($raddr, array(' '));
            $raddr = trim(strtolower($raddr));
            if($raddr != ""){
                $ret = true;
                if(FUNC::is_ipv4($raddr)) $rvip = $raddr;
                else{
                    $rvip = gethostbyname($raddr);
                    if($rvip == $raddr){
                        $ret = false;
                        trigger_error('Invalid hostname value
"'.$raddr.'", on class SMTP::relay()', 512);
                    }
                }
            }else trigger_error('Invalid hostname/ip value, on class
SMTP::relay()', 512);
        }else trigger_error('Invalid hostname/ip type value, on class
SMTP::relay()', 512);
        if($ret){
            if(is_bool($ruser)){
                if(!$ruser) $ruser = '';
                else trigger_error('Invalid username 1 type value, on
class SMTP::relay()', 512);
            }elseif(is_string($ruser)){
                $ruser = FUNC::str_clear($ruser);
                $ruser = trim($ruser);
            }else{
                $ruser = '';
                trigger_error('Invalid username 2 type value, on class
SMTP::relay()', 512);
            }
            if(is_bool($rpass)){
                if(!$rpass) $rpass = '';
                else trigger_error('Invalid password 1 type value, on
class SMTP::relay()', 512);
            }elseif(is_string($rpass)){
                $rpass = FUNC::str_clear($rpass);
                $rpass = trim($rpass);
            }else{
                $rpass = '';
                trigger_error('Invalid password type value, on class
SMTP::relay()', 512);
            }
            if(($ruser != "" && $rpass == "") || ($ruser == "" && $rpass
!= "")){
                $ruser = $rpass = '';
                trigger_error('Invalid username and password combination
value, on class SMTP::relay()', 512);
            }
            if(!is_int($rport)){
                $rport = 25;
                trigger_error('Invalid port type value, on class
SMTP::relay()', 512);
            }
            if(is_string($rauth)){
                $rauth = trim(strtolower($rauth));
                if(!($rauth == "autodetect" || $rauth == "login" ||
$rauth == "plain")){
                    $rauth = 'autodetect';
                    trigger_error('Invalid auth value, on class
SMTP::relay()', 512);
                }
            }else{
                $rauth = 'autodetect';
                trigger_error('Invalid auth type value, on class
SMTP::relay()', 512);
            }
            if(is_string($rvssl)){
                $rvssl = FUNC::str_clear($rvssl);
                $rvssl = trim(strtolower($rvssl));
                if(!($rvssl == "tls" || $rvssl == "ssl")){
                    $rvssl = false;
                    trigger_error('Invalid TLS/SSL value, on class
SMTP::relay()', 512);
                }
            }else{
                if(is_bool($rvssl)){
                    $rvssl = $rvssl ? 'tls' : false;
                }else{
                    $rvssl = false;
                    trigger_error('Invalid TLS/SSL type value, on class
SMTP::relay()', 512);
                }
            }
            $this->_relay = array('host' => $raddr, 'ip' => $rvip,
'user' => $ruser, 'pass' => $rpass, 'port' => $rport, 'auth' => $rauth,
'ssl' => $rvssl);
        }
        return $ret;

    }

    function addheader($hname, $hvalue, $charset = 'utf-8', $encoding =
'quoted-printable'){

        $ret = false;
        if(is_string($charset)){
            $charset = FUNC::str_clear($charset, array(' '));
            $charset = trim($charset);
            $charlen = strlen($charset);
            if(!($charlen > 1 && $charlen < 60)){
                $charset = 'utf-8';
                trigger_error('Invalid charset value, on class
SMTP::addheader()', 512);
            }
        }else{
            $charset = 'utf-8';
            trigger_error('Invalid charset type value, on class
SMTP::addheader()', 512);
        }
        if(is_string($encoding)){
            $encoding = FUNC::str_clear($encoding, array(' '));
            $encoding = trim(strtolower($encoding));
            if(!($encoding != 'quoted-printable' || $encoding != 'base64')){
                $encoding = 'quoted-printable';
                trigger_error('Invalid encoding value, on class
SMTP::addheader()', 512);
            }
        }else{
            $encoding = 'quoted-printable';
            trigger_error('Invalid encoding type value, on class
SMTP::addheader()', 512);
        }
        if(is_string($hname)){
            $hname = FUNC::str_clear($hname, array(' '));
            $hname = trim($hname);
            if($hname != ""){
                if(is_string($hvalue)){
                    $hvalue = str_replace("\r\n\t", " ", $hvalue);
                    $hvalue = FUNC::str_clear($hvalue);
                    $hvalue = trim($hvalue);
                    if($hvalue != ""){
                        $vname = strtolower($hname);
                        if($vname == "subject") trigger_error('Can not
set "Subject" header value, for this, use function "Send()", on class
SMTP::addheader()', 512);
                        elseif($vname == "from") trigger_error('Can not
set "From" header value, for this, use function "From()", on class
SMTP::addheader()', 512);
                        elseif($vname == "to") trigger_error('Can not
set "To" header value, for this, use function "AddTo()", on class
SMTP::addheader()', 512);
                        elseif($vname == "cc") trigger_error('Can not
set "Cc" header value, for this, use function "AddCc()", on class
SMTP::addheader()', 512);
                        elseif($vname == "bcc") trigger_error('Can not
set "Bcc" header value, for this, use function "AddBcc()", on class
SMTP::addheader()', 512);
                        elseif($vname == "date") trigger_error('Can not
set "Date" header value, this value is automaticaly set, on class
SMTP::addheader()', 512);
                        elseif($vname == "x-mailer") trigger_error('Can
not set "X-Mailer" header value, this value is automaticaly set, on
class SMTP::addheader()', 512);
                        elseif($vname == "content-type")
trigger_error('Can not set "Content-Type" header value, this value is
automaticaly set, on class SMTP::addheader()', 512);
                        elseif($vname == "content-transfer-encoding")
trigger_error('Can not set "Content-Transfer-Encoding" header value,
this value is automaticaly set, on class SMTP::addheader()', 512);
                        elseif($vname == "content-disposition")
trigger_error('Can not set "Content-Disposition" header value, this
value is automaticaly set, on class SMTP::addheader()', 512);
                        elseif($vname == "x-priority")
trigger_error('Can not set "X-Priority" header value, for this, use
function "Priority()", on class SMTP::addheader()', 512);
                        elseif($vname == "x-msmail-priority")
trigger_error('Can not set "X-MSMail-Priority" header value, for this,
use function "Priority()", on class SMTP::addheader()', 512);
                        elseif($vname == "mime-version")
trigger_error('Can not set "MIME-Version" header value, this value is
automaticaly set, on class SMTP::addheader()', 512);
                        else{
                            $ret = true;
                            $this->_header[] = array('name' =>
ucfirst($hname), 'value' => $this->enc_header($hvalue, $charset,
$encoding));
                        }
                    }else trigger_error('Invalid 2\'nd parameter value,
on class SMTP::addheader()', 512);
                }else trigger_error('Invalid 2\'nd parameter type value,
on class SMTP::addheader()', 512);
            }else trigger_error('Invalid 1\'st parameter value, on class
SMTP::addheader()', 512);
        }else trigger_error('Invalid 1\'st parameter type value, on
class SMTP::addheader()', 512);
        return $ret;

    }

    function delheader($hname){

        $ret = false;
        if(is_string($hname)){
            $hname = FUNC::str_clear($hname, array(' '));
            $hname = trim($hname);
            if($hname != ""){
                if($this->_header && count($this->_header) > 0){
                    $reparr = array();
                    foreach($this->_header as $harr){
                        if(strtolower($harr['name']) !=
strtolower($hname)) $reparr[] = $harr;
                        else $ret = true;
                    }
                    $this->_header = $reparr;
                }
            }else trigger_error('Invalid parameter value, on class
SMTP::delheader()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::delheader()', 512);
        return $ret;

    }

    function addto($adrr, $name = ''){

        $ret = false;
        if(is_string($adrr)){
            $adrr = FUNC::str_clear($adrr, array(' '));
            $adrr = strtolower(trim($adrr));
            if($adrr != "" && FUNC::is_mail($adrr)){
                if(!isset($this->_toaddrs[$adrr])){
                    $this->_toaddrs[$adrr] = '';
                    $ret = true;
                    if(is_string($name)){
                        $name = FUNC::str_clear($name);
                        $name = trim($name);
                        if($name != "") $this->_toaddrs[$adrr] = $name;
                    }else trigger_error('Invalid 2\'nd parameter type
value, on class SMTP::addto()', 512);
                }else trigger_error('Already exists, on class
SMTP::addto()', 512);
            }else trigger_error('Invalid 1\'st parameter value, on class
SMTP::addto()', 512);
        }else trigger_error('Invalid 1\'st parameter type value, on
class SMTP::addto()', 512);
        return $ret;

    }

    function delto($adrr = 'all'){

        $ret = false;
        if(is_string($adrr)){
            $adrr = FUNC::str_clear($adrr, array(' '));
            $adrr = strtolower(trim($adrr));
            if($adrr != ""){
                if($adrr == "all"){
                    $this->_toaddrs = false;
                    $ret = true;
                }elseif(FUNC::is_mail($adrr)){
                    if(is_array($this->_toaddrs) &&
count($this->_toaddrs) > 0){
                        $reb = array();
                        foreach($this->_toaddrs as $num => $val){
                            if($num != $adrr) $reb[$num] = $val;
                            else $ret = true;
                        }
                        $this->_toaddrs = $reb;
                    }
                }else trigger_error('Invalid 2 parameter value, on class
SMTP::delto()', 512);
            }else trigger_error('Invalid 1 parameter value, on class
SMTP::delto()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::delto()', 512);
        return $ret;

    }

    function addcc($adrr, $name = ''){

        $ret = false;
        if(is_string($adrr)){
            $adrr = FUNC::str_clear($adrr, array(' '));
            $adrr = strtolower(trim($adrr));
            if($adrr != "" && FUNC::is_mail($adrr)){
                if(!isset($this->_ccaddrs[$adrr])){
                    $this->_ccaddrs[$adrr] = '';
                    $ret = true;
                    if(is_string($name)){
                        $name = FUNC::str_clear($name);
                        $name = trim($name);
                        if($name != "") $this->_ccaddrs[$adrr] = $name;
                    }else trigger_error('Invalid 2\'nd parameter type
value, on class SMTP::addcc()', 512);
                }else trigger_error('Already exists, on class
SMTP::addcc()', 512);
            }else trigger_error('Invalid 1\'st parameter value, on class
SMTP::addcc()', 512);
        }else trigger_error('Invalid 1\'st parameter type value, on
class SMTP::addcc()', 512);
        return $ret;

    }

    function delcc($adrr = 'all'){

        $ret = false;
        if(is_string($adrr)){
            $adrr = FUNC::str_clear($adrr, array(' '));
            $adrr = strtolower(trim($adrr));
            if($adrr != ""){
                if($adrr == "all"){
                    $this->_ccaddrs = false;
                    $ret = true;
                }elseif(FUNC::is_mail($adrr)){
                    if(is_array($this->_ccaddrs) &&
count($this->_ccaddrs) > 0){
                        $reb = array();
                        foreach($this->_ccaddrs as $num => $val){
                            if($num != $adrr) $reb[$num] = $val;
                            else $ret = true;
                        }
                        $this->_ccaddrs = $reb;
                    }
                }else trigger_error('Invalid 2 parameter value, on class
SMTP::delcc()', 512);
            }else trigger_error('Invalid 1 parameter value, on class
SMTP::delcc()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::delcc()', 512);
        return $ret;

    }

    function addbcc($adrr){

        $ret = false;
        if(is_string($adrr)){
            $adrr = FUNC::str_clear($adrr, array(' '));
            $adrr = strtolower(trim($adrr));
            if($adrr != "" && FUNC::is_mail($adrr)){
                if(!isset($this->_bccaddrs[$adrr])){
                    $this->_bccaddrs[$adrr] = '';
                    $ret = true;
                }else trigger_error('Already exists, on class
SMTP::addbcc()', 512);
            }else trigger_error('Invalid parameter value, on class
SMTP::addbcc()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::addbcc()', 512);
        return $ret;

    }

    function delbcc($adrr = 'all'){

        $ret = false;
        if(is_string($adrr)){
            $adrr = FUNC::str_clear($adrr, array(' '));
            $adrr = strtolower(trim($adrr));
            if($adrr != ""){
                if($adrr == "all"){
                    $this->_bccaddrs = false;
                    $ret = true;
                }elseif(FUNC::is_mail($adrr)){
                    if(is_array($this->_bccaddrs) &&
count($this->_bccaddrs) > 0){
                        $reb = array();
                        foreach($this->_bccaddrs as $num => $val){
                            if($num != $adrr) $reb[$num] = $val;
                            else $ret = true;
                        }
                        $this->_bccaddrs = $reb;
                    }
                }else trigger_error('Invalid 2 parameter value, on class
SMTP::delbcc()', 512);
            }else trigger_error('Invalid 1 parameter value, on class
SMTP::delbcc()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::delbcc()', 512);
        return $ret;

    }

    function from($adrr, $name = ''){

        $this->_fromaddr = $ret = false;
        if(is_string($adrr)){
            $adrr = FUNC::str_clear($adrr, array(' '));
            $adrr = strtolower(trim($adrr));
            if($adrr != "" && FUNC::is_mail($adrr)){
                $ret = true;
                $this->_fromaddr = array('address' => $adrr, 'name' => '');
                if(is_string($name)){
                    $name = FUNC::str_clear($name);
                    $name = trim($name);
                    if($name != "") $this->_fromaddr = array('address'
=> $adrr, 'name' => $name);
                }else trigger_error('Invalid 2\'nd parameter type value,
on class SMTP::from()', 512);
            }else trigger_error('Invalid mail address format, on class
SMTP::from()', 512);
        }else trigger_error('Invalid first parameter type value, on
class SMTP::from()', 512);
        return $ret;

    }

    function fromhost($server, &$havemx){

        $this->_fromhost = $ret = $havemx = false;
        if(is_string($server)){
            $server = FUNC::str_clear($server, array(' '));
            $server = strtolower(trim($server));
            if($server != ""){
                $ret = true;
                $this->_fromhost = $server;
                if(FUNC::is_hostname($server)){
                    $havemx = FUNC::is_win() ?
FUNC::getmxrr_win($server, $mxhost) : getmxrr($server, $mxhost);
                }
            }else trigger_error('Invalid parameter value, on class
SMTP::fromhost()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::fromhost()', 512);
        return $ret;

    }

    function text($text, $charset = 'us-ascii', $encoding =
'quoted-printable', $disposition = 'inline'){

        $this->_atext = $ret = false;
        if(is_string($charset)){
            $charset = FUNC::str_clear($charset, array(' '));
            $charset = trim($charset);
            $charlen = strlen($charset);
            if(!($charlen > 1 && $charlen < 60)){
                $charset = 'us-ascii';
                trigger_error('Invalid charset value, on class
SMTP::text()', 512);
            }
        }else{
            $charset = 'us-ascii';
            trigger_error('Invalid charset type value, on class
SMTP::text()', 512);
        }
        if(is_string($encoding)){
            $encoding = FUNC::str_clear($encoding, array(' '));
            $encoding = trim(strtolower($encoding));
            if(!($encoding != "" && isset($this->_arrenc[$encoding]))){
                $encoding = 'quoted-printable';
                trigger_error('Invalid encoding value, on class
SMTP::text()', 512);
            }
        }else{
            $encoding = 'quoted-printable';
            trigger_error('Invalid encoding type value, on class
SMTP::text()', 512);
        }
        if(is_string($disposition)){
            $disposition = FUNC::str_clear($disposition, array(' '));
            $disposition = trim(strtolower($disposition));
            if(!($disposition == "attachment" || $disposition == "inline")){
                $disposition = 'inline';
                trigger_error('Invalid disposition value, on class
SMTP::text()', 512);
            }
        }else{
            $disposition = 'inline';
            trigger_error('Invalid disposition type value, on class
SMTP::text()', 512);
        }
        if(is_string($text)){
            $text = trim($text);
            if($text != ""){
                $htext = 'Content-Type:
text/plain;'.$this->_crlf."\t".'charset="'.$charset.'"'.$this->_crlf.
                    'Content-Transfer-Encoding: '.$encoding.$this->_crlf.
                    'Content-Disposition: '.$disposition;
                $this->_atext = array($htext, $encoding, $text);
                $ret = true;
            }else trigger_error('Invalid text/plain value, on class
SMTP::text()', 512);
        }else trigger_error('Invalid text/plain type value, on class
SMTP::text()', 512);
        return $ret;

    }

    function html($html, $charset = 'us-ascii', $encoding =
'quoted-printable', $disposition = 'inline'){

        $this->_ahtml = $ret = false;
        if(is_string($charset)){
            $charset = FUNC::str_clear($charset, array(' '));
            $charset = trim($charset);
            $charlen = strlen($charset);
            if(!($charlen > 1 && $charlen < 60)){
                $charset = 'us-ascii';
                trigger_error('Invalid charset value, on class
SMTP::html()', 512);
            }
        }else{
            $charset = 'us-ascii';
            trigger_error('Invalid charset type value, on class
SMTP::html()', 512);
        }
        if(is_string($encoding)){
            $encoding = FUNC::str_clear($encoding, array(' '));
            $encoding = trim(strtolower($encoding));
            if(!($encoding != "" && isset($this->_arrenc[$encoding]))){
                $encoding = 'quoted-printable';
                trigger_error('Invalid encoding value, on class
SMTP::html()', 512);
            }
        }else{
            $encoding = 'quoted-printable';
            trigger_error('Invalid encoding type value, on class
SMTP::html()', 512);
        }
        if(is_string($disposition)){
            $disposition = FUNC::str_clear($disposition, array(' '));
            $disposition = trim(strtolower($disposition));
            if(!($disposition == "attachment" || $disposition == "inline")){
                $disposition = 'inline';
                trigger_error('Invalid disposition value, on class
SMTP::html()', 512);
            }
        }else{
            $disposition = 'inline';
            trigger_error('Invalid disposition type value, on class
SMTP::html()', 512);
        }
        if(is_string($html)){
            $html = trim($html);
            if($html != ""){
                $hhtml = 'Content-Type:
text/html;'.$this->_crlf."\t".'charset="'.$charset.'"'.$this->_crlf.
                    'Content-Transfer-Encoding: '.$encoding.$this->_crlf.
                    'Content-Disposition: '.$disposition;
                $this->_ahtml = array($hhtml, $encoding, $html);
                $ret = true;
            }else trigger_error('Invalid text/html value, on class
SMTP::html()', 512);
        }else trigger_error('Invalid text/html type value, on class
SMTP::html()', 512);
        return $ret;

    }

    function attachsource($source, $name, $mimetype = 'autodetect',
$disposition = 'attachment', $encoding = 'base64'){

        $ret = false;
        if(is_string($source) && $source != ""){
            if(is_string($name)){
                $name = FUNC::str_clear($name);
                $name = trim($name);
                if($name != ""){
                    $ret = true;
                    $mime = 'application/octet-stream';
                    if(is_string($mimetype)){
                        $mimetype = FUNC::str_clear($mimetype, array(' '));
                        $mimetype = trim(strtolower($mimetype));
                        $mime = ($mimetype == "autodetect" || $mimetype
== "") ? FUNC::mimetype($name) : $mimetype;
                    }
                    $disp = 'attachment';
                    if(is_string($disposition)){
                        $disposition = FUNC::str_clear($disposition,
array(' '));
                        $disposition = trim(strtolower($disposition));
                        if($disposition == "attachment" || $disposition
== "inline") $disp = $disposition;
                        else trigger_error('Invalid disposition value,
on class SMTP::attachsource()', 512);
                    }else trigger_error('Invalid disposition type value,
on class SMTP::attachsource()', 512);
                    $encode = 'base64';
                    if(is_string($encoding)){
                        $encoding = FUNC::str_clear($encoding, array(' '));
                        $encoding = trim(strtolower($encoding));
                        if($encoding != "" &&
isset($this->_arrenc[$encoding])) $encode = $encoding;
                        else trigger_error('Invalid encoding value, on
class SMTP::attachsource()', 512);
                    }else trigger_error('Invalid encoding type value, on
class SMTP::attachsource()', 512);
                    $this->_attach[] = array('name' => $name, 'mime' =>
$mime, 'disp' => $disp, 'encode' => $encode, 'source' => $source);
                }else trigger_error('Invalid name value, on class
SMTP::attachsource()', 512);
            }else trigger_error('Invalid name type value, on class
SMTP::attachsource()', 512);
        }else trigger_error('Invalid source value, on class
SMTP::attachsource()', 512);
        return $ret;

    }

    function attachfile($file, $name = false, $mimetype = 'autodetect',
$disposition = 'attachment', $encoding = 'base64'){

        $ret = false;
        if(is_string($file)){
            $file = FUNC::str_clear($file);
            $file = trim($file);
            if($file != "" && is_file($file) && is_readable($file)){
                if((is_bool($name) && !$name) || (is_string($name) &&
$name == '')){
                    $exp1 = explode("/", $file);
                    $name = $exp1[count($exp1)-1];
                    $exp2 = explode("\\", $name);
                    $name = $exp2[count($exp2)-1];
                }
                $ret = $this->attachsource(file_get_contents($file),
$name, $mimetype, $disposition, $encoding);
            }else trigger_error('Invalid file source, on class
SMTP::attachfile()', 512);
        }else trigger_error('Invalid file type value, on class
SMTP::attachfile()', 512);
        return $ret;

    }

    function delattach($name = true){

        $ret = false;
        if(is_bool($name)){
            if($name){
                $this->_attach = false;
                $ret = true;
            }else trigger_error('Invalid 2 file name type value, on
class SMTP::delattach()', 512);
        }elseif(is_string($name)){
            $name = trim($name);
            if($name != ""){
                if($this->_attach && count($this->_attach) > 0){
                    $rebatt = array();
                    foreach($this->_attach as $attarr){
                        if($attarr['name'] != $name) $rebatt[] = $attarr;
                        else $ret = true;
                    }
                    if($ret) $this->_attach = $rebatt;
                }
            }else trigger_error('Invalid file name value, on class
SMTP::delattach()', 512);
        }else trigger_error('Invalid file name type value, on class
SMTP::delattach()', 512);
        return $ret;

    }

    function priority($level = 3){

        $ret = $set = false;
        if(is_int($level)){
            if($level == 1) $set = array('1', 'High');
            elseif($level == 3) $set = array('3', 'Normal');
            elseif($level == 5) $set = array('5', 'Low');
            else trigger_error('Invalid 1 parameter value, on class
SMTP::priority()', 512);
        }elseif(is_string($level)){
            $level = FUNC::str_clear($level, array(' '));
            $level = trim(strtolower($level));
            if($level == "high") $set = array('1', 'High');
            elseif($level == "normal") $set = array('3', 'Normal');
            elseif($level == "low") $set = array('5', 'Low');
            else trigger_error('Invalid 2 parameter value, on class
SMTP::priority()', 512);
        }else trigger_error('Invalid parameter type value, on class
SMTP::priority()', 512);
        if($set){
            $this->delheader('X-Priority');
            $this->delheader('X-MSMail-Priority');
            $this->_header[] = array('name' => 'X-Priority', 'value' =>
$set[0]);
            $this->_header[] = array('name' => 'X-MSMail-Priority',
'value' => $set[1]);
            $ret = true;
        }
        return $ret;

    }

    function _sendtoip($ip, $arrto, $isrelay){

        $ssl = '';
        $pnm = $this->_port;
        if($isrelay){
            $ssl = $this->_relay['ssl'] ? $this->_relay['ssl'].'://' : '';
            $pnm = $this->_relay['port'];
        }
        if(!$sock = fsockopen($ssl.$ip, $pnm, $errnum, $errmsg,
$this->_timeout)){
            $this->result = 'Error 10: '.$errmsg;
            return false;
        }
        stream_set_timeout($sock, $this->_timeout);
        $loop = $rcv = 0;
        while(!feof($sock)){
            $loop++;
            if($rcv = fgets($sock, $this->max_sl)){
                if($loop == $this->max_cl || substr($rcv, 0, 4) !=
"220-") break;
            }else break;
        }
        if(!$rcv){
            $this->result = 'Error 11: can\'t read';
            return false;
        }
        if(substr($rcv, 0, 4) != "220 "){
            $this->result = 'Error 12: '.$rcv;
            return false;
        }
        if(!FUNC::is_connection($sock)){
            $this->result = 'Error 13: invalid resource connection';
            return false;
        }
        if($isrelay && $this->_relay['user'] != "" &&
$this->_relay['pass'] != ""){
            if(!fputs($sock, 'EHLO '.$this->_fromhost.$this->_crlf)){
                $this->result = 'Error 20: can\'t write';
                return false;
            }
            $loop = $rcv = 0;
            $getinfo = '';
            while(!feof($sock)){
                $loop++;
                if($rcv = fgets($sock, $this->max_sl)){
                    $getinfo .= $rcv;
                    if($loop == $this->max_cl || substr($rcv, 0, 4) !=
"250-") break;
                }else break;
            }
            if(!$rcv){
                $this->result = 'Error 21: can\'t read';
                return false;
            }
            if(substr($rcv, 0, 4) != "250 "){
                if(!FUNC::is_connection($sock)){
                    $this->result = 'Error 22: invalid resource connection';
                    return false;
                }
                if(!fputs($sock, 'HELO '.$this->_fromhost.$this->_crlf)){
                    $this->result = 'Error 23: can\'t write';
                    return false;
                }
                $loop = $rcv = 0;
                $getinfo = '';
                while(!feof($sock)){
                    $loop++;
                    if($rcv = fgets($sock, $this->max_sl)){
                        $getinfo .= $rcv;
                        if($loop == $this->max_cl || substr($rcv, 0, 4)
!= "250-") break;
                    }else break;
                }
                if(!$rcv){
                    $this->result = 'Error 24: can\'t read';
                    return false;
                }
                if(substr($rcv, 0, 4) != "250 "){
                    $this->result = 'Error 25: '.$rcv;
                    return false;
                }
            }
            $authlogin = strstr($getinfo, 'LOGIN');
            $authplain = strstr($getinfo, 'PLAIN');
            $authtype = 'login';
            if($this->_relay['auth'] == "autodetect" ||
$this->_relay['auth'] == "login"){
                if(!$authlogin){
                    if($authplain) $authtype = 'plain';
                }
            }elseif($this->_relay['auth'] == "plain"){
                if($authplain) $authtype = 'plain';
            }
            if(!FUNC::is_connection($sock)){
                $this->result = 'Error 26: invalid resource connection';
                return false;
            }
            if($authtype == "login"){
                if(!fputs($sock, 'AUTH LOGIN'.$this->_crlf)){
                    $this->result = 'Error 270: can\'t write';
                    return false;
                }
                if(!$rcv = fgets($sock, $this->max_sl)){
                    $this->result = 'Error 271: can\'t read';
                    return false;
                }
                if(substr($rcv, 0, 4) != "334 "){
                    $this->result = 'Error 272: '.$rcv;
                    return false;
                }
                if(!FUNC::is_connection($sock)){
                    $this->result = 'Error 273: invalid resource
connection';
                    return false;
                }
                if(!fputs($sock,
base64_encode($this->_relay['user']).$this->_crlf)){
                    $this->result = 'Error 274: can\'t write';
                    return false;
                }
                if(!$rcv = fgets($sock, $this->max_sl)){
                    $this->result = 'Error 275: can\'t read';
                    return false;
                }
                if(substr($rcv, 0, 4) != "334 "){
                    $this->result = 'Error 276: '.$rcv;
                    return false;
                }
                if(!FUNC::is_connection($sock)){
                    $this->result = 'Error 277: invalid resource
connection';
                    return false;
                }
                if(!fputs($sock,
base64_encode($this->_relay['pass']).$this->_crlf)){
                    $this->result = 'Error 278: can\'t write';
                    return false;
                }
                if(!$rcv = fgets($sock, $this->max_sl)){
                    $this->result = 'Error 279: can\'t read';
                    return false;
                }
                if(substr($rcv, 0, 4) != "235 "){
                    $this->result = 'Error 280: '.$rcv;
                    return false;
                }
            }elseif($authtype == "plain"){
                if(!FUNC::is_connection($sock)){
                    $this->result = 'Error 281: invalid resource
connection';
                    return false;
                }
                if(!fputs($sock, 'AUTH PLAIN
'.base64_encode($this->_relay['user'].chr(0).$this->_relay['user'].chr(0).$this->_relay['pass']).$this->_crlf)){
                    $this->result = 'Error 282: can\'t write';
                    return false;
                }
                if(!$rcv = fgets($sock, $this->max_sl)){
                    $this->result = 'Error 283: can\'t read';
                    return false;
                }
                if(substr($rcv, 0, 4) != "235 "){
                    $this->result = 'Error 284: '.$rcv;
                    return false;
                }
            }
        }else{
            if(!fputs($sock, 'HELO '.$this->_fromhost.$this->_crlf)){
                $this->result = 'Error 30: can\'t write';
                return false;
            }
            $loop = $rcv = 0;
            while(!feof($sock)){
                $loop++;
                if(!$rcv = fgets($sock, $this->max_sl)){
                    if($loop == $this->max_cl || substr($rcv, 0, 4) !=
"250-") break;
                }else break;
            }
            if(!$rcv){
                $this->result = 'Error 31: can\'t read';
                return false;
            }
            if(substr($rcv, 0, 4) != "250 "){
                if(!FUNC::is_connection($sock)){
                    $this->result = 'Error 32: invalid resource connection';
                    return false;
                }
                if(!fputs($sock, 'EHLO '.$this->_fromhost.$this->_crlf)){
                    $this->result = 'Error 33: can\'t write';
                    return false;
                }
                $loop = $rcv = 0;
                while(!feof($sock)){
                    $loop++;
                    if(!$rcv = fgets($sock, $this->max_sl)){
                        if($loop == $this->max_cl || substr($rcv, 0, 4)
!= "250-") break;
                    }else break;
                }
                if(!$rcv){
                    $this->result = 'Error 34: can\'t read';
                    return false;
                }
                if(substr($rcv, 0, 4) != "250 "){
                    $this->result = 'Error 35: '.$rcv;
                    return false;
                }
            }
        }
        if(!FUNC::is_connection($sock)){
            $this->result = 'Error 40: invalid resource connection';
            return false;
        }
        if(!fputs($sock, 'MAIL
FROM:<'.$this->_fromaddr['address'].'>'.$this->_crlf)){
            $this->result = 'Error 41: can\'t write';
            return false;
        }
        if(!$rcv = fgets($sock, $this->max_sl)){
            $this->result = 'Error 42: can\'t read';
            return false;
        }
        if(substr($rcv, 0, 4) != "250 "){
            $this->result = 'Error 43: '.$rcv;
            return false;
        }
        $relayh = $isrelay ? '@'.$this->_relay['host'].':' : '';
        $setver = true;
        foreach($arrto as $arrval){
            if(!FUNC::is_connection($sock)){
                $this->result = 'Error 50: invalid resource connection';
                $setver = false;
                break;
            }
            if(!fputs($sock, 'RCPT TO:<'.$relayh.$arrval.'>'.$this->_crlf)){
                $this->result = 'Error 51: can\'t write';
                $setver = false;
                break;
            }
            if(!$rcv = fgets($sock, $this->max_sl)){
                $this->result = 'Error 52: can\'t read';
                $setver = false;
                break;
            }
            $submsg = substr($rcv, 0, 4);
            if(!($submsg == "250 " || $submsg == "251 ")){
                $this->result = 'Error 53: '.$rcv;
                $setver = false;
                break;
            }
        }
        if(!$setver) return false;
        if(!FUNC::is_connection($sock)){
            $this->result = 'Error 60: invalid resource connection';
            return false;
        }
        if(!fputs($sock, 'DATA'.$this->_crlf)){
            $this->result = 'Error 61: can\'t write';
            return false;
        }
        if(!$rcv = fgets($sock, $this->max_sl)){
            $this->result = 'Error 62: can\'t read';
            return false;
        }
        if(substr($rcv, 0, 4) != "354 "){
            $this->result = 'Error 63: '.$rcv;
            return false;
        }
        if(!FUNC::is_connection($sock)){
            $this->result = 'Error 70: invalid resource connection';
            return false;
        }
        if(!fputs($sock, $this->_content['header']['client'])){
            $this->result = 'Error 71: can\'t write';
            return false;
        }
        $setver = true;
        foreach($this->_content['body'] as $partmsg){
            if(!FUNC::is_connection($sock)){
                $this->result = 'Error 72: invalid resource connection';
                $setver = false;
                break;
            }
            if(!fputs($sock, $partmsg)){
                $this->result = 'Error 73: can\'t write';
                $setver = false;
                break;
            }
        }
        if(!$setver) return false;
        if(!FUNC::is_connection($sock)){
            $this->result = 'Error 80: invalid resource connection';
            return false;
        }
        if(!fputs($sock, $this->_crlf.'.'.$this->_crlf)){
            $this->result = 'Error 81: can\'t write';
            return false;
        }
        if(!$rcv = fgets($sock, $this->max_sl)){
            $this->result = 'Error 82: can\'t read';
            return false;
        }
        if(substr($rcv, 0, 4) != "250 "){
            $this->result = 'Error 83: '.$rcv;
            return false;
        }
        if(FUNC::is_connection($sock)){
            if(fputs($sock, 'RSET'.$this->_crlf)){
                if(FUNC::is_connection($sock)){
                    if($rcvr = @fgets($sock, $this->max_sl)){
                        if(substr($rcvr, 0, 3) == "250"){
                            if(fputs($sock, 'QUIT'.$this->_crlf)){
                                if(FUNC::is_connection($sock)){
                                    if($rcvq = @fgets($sock,
$this->max_sl)) $rcv = $rcvq;
                                    FUNC::close($sock);
                                }
                            }
                        }
                    }
                }
            }
        }
        $this->result = 'Success: '.$rcv;
        return true;

    }

    function _sendtohost($hname, $arrto, $isrelay){

        $ret = false;
        if($hname == "localhost"){
            $ret = mail($this->_content['header']['to'],
$this->_subject, implode('', $this->_content['body']),
$this->_content['header']['local']);
            if(!$ret) $ret = $this->_sendtoip('127.0.0.1', $arrto,
$isrelay);
        }else{
            if($isrelay) $ret = $this->_sendtoip($hname, $arrto, $isrelay);
            else{
                if(FUNC::is_ipv4($hname)) $ret =
$this->_sendtoip($hname, $arrto, $isrelay);
                else{
                    $resmx = FUNC::is_win() ? FUNC::getmxrr_win($hname,
$mxhost) : getmxrr($hname, $mxhost);
                    $iparr = array();
                    if($resmx){
                        foreach($mxhost as $hostname){
                            $iphost = gethostbyname($hostname);
                            if($iphost != $hname &&
FUNC::is_ipv4($iphost) && !isset($iparr[$iphost])) $iparr[$iphost] =
$iphost;
                        }
                    }else{
                        $iphost = gethostbyname($hname);
                        if($iphost != $hname && FUNC::is_ipv4($iphost))
$iparr[$iphost] = $iphost;
                    }
                    if(count($iparr) > 0){
                        foreach($iparr as $ipaddr) if($ret =
$this->_sendtoip($ipaddr, $arrto, $isrelay)) break;
                    }else trigger_error('Can not find any valid ip
address for hostname "'.$hname.'", on class SMTP::_sendtohost()', 512);
                }
            }
        }
        return $ret;

    }

    function _splitmsg($longmsg, $approx = 10240){

        $longmsg = str_replace(array(".\r\n", ".\n", ".\r"), ".
".$this->_crlf, $longmsg);
        $msgarr  = explode($this->_crlf, $longmsg);
        $addmsg  = "";
        $arrmsg  = array();
        foreach($msgarr as $inline){
            $addmsg .= $inline.$this->_crlf;
            if(strlen($addmsg) >= $approx){
                $arrmsg[] = $addmsg;
                $addmsg = "";
            }
        }
        if(count($arrmsg) > 0 && $addmsg != "") $arrmsg[] = $addmsg;
        else $arrmsg[] = $longmsg;
        return $arrmsg;

    }

    function _getunique(){
        return md5(microtime(1).$this->_unique++);
    }

    function _putcid($str, $ids){

        $find1 = $repl1 = array();
        foreach($ids as $name => $code){
            $find1[] = "=\"".$name;
            $repl1[] = "=\"cid:".$code;
            $find2[] = "=".$name;
            $repl2[] = "=cid:".$code;
        }
        $res = str_replace($find1, $repl1, $str);
        $res = str_replace($find2, $repl2, $res);
        return $res;

    }

    function _encodemsg($src, $enc){
        $res = '';
        if($enc == "7bit" || $enc == "8bit") $res .= chunk_split($src,
$this->_chunklen, $this->_crlf);
        elseif($enc == "base64") $res .=
chunk_split(base64_encode($src), $this->_chunklen, $this->_crlf);
        elseif($enc == "quoted-printable") $res .= $this->qpencode($src,
$this->_chunklen, $this->_crlf);
        return $res;
    }

    function _writemsg(){

        if(!$this->_fromaddr){
            $fromaddr = ini_get('sendmail_from');
            if($fromaddr == ""){
                if(isset($_SERVER['SERVER_ADMIN']) &&
FUNC::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';
            }
            $this->_fromaddr = array('address' => $fromaddr, 'name' => '');
        }
        if(!$this->_fromhost){
            if(isset($_SERVER['SERVER_NAME']))     $this->_fromhost =
$_SERVER['SERVER_NAME'];
            elseif(isset($_SERVER['HTTP_HOST']))   $this->_fromhost =
$_SERVER['HTTP_HOST'];
            elseif(isset($_SERVER['REMOTE_ADDR'])) $this->_fromhost =
$_SERVER['REMOTE_ADDR'];
            elseif(isset($_SERVER['SERVER_ADDR'])) $this->_fromhost =
$_SERVER['SERVER_ADDR'];
            else{
                $fexp = explode('@', $this->_fromaddr['address']);
                $this->_fromhost = $fexp[1];
            }
        }
        $tostr = $ccstr = $bccstr = '';
        foreach($this->_toaddrs as $taddr => $tname){
            if($tname == "") $tostr .= $taddr.', ';
            else $tostr .= '"'.str_replace('"', '\\"', $tname).'"
<'.$taddr.'>, ';
        }
        $tostr = $hto = substr($tostr, 0, -2);
        if($this->_ccaddrs && count($this->_ccaddrs) > 0){
            foreach($this->_ccaddrs as $caddr => $cname){
                if($cname == "") $ccstr .= $caddr.', ';
                else $ccstr .= '"'.str_replace('"', '\\"', $cname).'"
<'.$caddr.'>, ';
            }
            $ccstr = substr($ccstr, 0, -2);
        }
        if($this->_bccaddrs && count($this->_bccaddrs) > 0){
            foreach($this->_bccaddrs as $baddr => $bname) $bccstr .=
$baddr.', ';
            $bccstr = substr($bccstr, 0, -2);
        }
        if($this->_fromaddr['name'] == "") $fromstr =
$this->_fromaddr['address'];
        else $fromstr = '"'.str_replace('"', '\\"',
$this->_fromaddr['name']).'" <'.$this->_fromaddr['address'].'>';
        $arrval1 = $arrval2 = array();
        $arrval1[] = array('name' => 'From', 'value' => $fromstr);
        $arrval2[] = array('name' => 'From', 'value' => $fromstr);
        $arrval2[] = array('name' => 'To', 'value' => $tostr);
        $arrval2[] = array('name' => 'Subject', 'value' => $this->_subject);
        if($ccstr != ""){
            $arrval1[] = array('name' => 'Cc', 'value' => $ccstr);
            $arrval2[] = array('name' => 'Cc', 'value' => $ccstr);
        }
        if($bccstr != "") $arrval1[] = array('name' => 'Bcc', 'value' =>
$bccstr);
        $arrval2[] = array('name' => 'Date', 'value' => date('r'));
        if($this->_header && count($this->_header) > 0){
            foreach($this->_header as $hvarr){
                $arrval1[] = $hvarr;
                $arrval2[] = $hvarr;
            }
        }
        $xmail = array('name' => base64_decode('WC1NYWlsZXI='), 'value'
=> base64_decode('WFBNMiB2LjAuMiA8d3d3LnhwZXJ0bWFpbGVyLmNvbT4='));
        $arrval1[] = $xmail;
        $arrval2[] = $xmail;
        $hval1 = $hval2 = $bval = '';
        foreach($arrval1 as $heach1) $hval1 .= $heach1['name'].':
'.$heach1['value'].$this->_crlf;
        foreach($arrval2 as $heach2) $hval2 .= $heach2['name'].':
'.$heach2['value'].$this->_crlf;
        $multipart = false;
        if($this->_atext && $this->_ahtml) $multipart = true;
        if($this->_attach && count($this->_attach) > 0) $multipart = true;
        if($multipart){
            $bval .= 'This is a message in MIME Format. If you see this,
your mail reader does not support this format.'.$this->_crlf.$this->_crlf;
            $boundary1 = '=_'.$this->_getunique();
            $boundary2 = '=_'.$this->_getunique();
            $boundary3 = '=_'.$this->_getunique();
            $haveatt = ($this->_attach && count($this->_attach) > 0) ?
true : false;
            $inline = $attachment = false;
            $idarr = array();
            if($haveatt){
                foreach($this->_attach as $attdesc){
                    if($attdesc['disp'] == "inline"){
                        $inline = true;
                        $fname = $attdesc['name'];
                        if(!isset($idarr[$fname])) $idarr[$fname] =
$this->_getunique();
                    }else $attachment = true;
                }
            }
            $hadd = '';
            if($this->_atext && $this->_ahtml){
                $vhtml = (count($idarr) > 0) ?
$this->_putcid($this->_ahtml[2], $idarr) : $this->_ahtml[2];
                if($inline && $attachment){
                    $hadd .= 'Content-Type:
multipart/mixed;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                    $bval .= '--'.$boundary1.$this->_crlf.
                        'Content-Type:
multipart/related;'.$this->_crlf."\t".'boundary="'.$boundary2.'"'.$this->_crlf.$this->_crlf.
                        '--'.$boundary2.$this->_crlf.
                        'Content-Type:
multipart/alternative;'.$this->_crlf."\t".'boundary="'.$boundary3.'"'.$this->_crlf.$this->_crlf.
                        '--'.$boundary3.$this->_crlf.
                        $this->_atext[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($this->_atext[2],
$this->_atext[1]).
                        $this->_crlf.'--'.$boundary3.$this->_crlf.
                        $this->_ahtml[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($vhtml, $this->_ahtml[1]).
                        $this->_crlf.'--'.$boundary3.'--'.$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        if($attdesc['disp'] == "inline"){
                            $bval .= '--'.$boundary2.$this->_crlf.
                                'Content-Type:
'.$attdesc['mime'].$this->_crlf.
                                'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                                'Content-Disposition:
'.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.
                                'Content-ID:
<'.$idarr[$attdesc['name']].'>'.$this->_crlf.$this->_crlf.
                                $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                        }
                    }
                    $bval .= '--'.$boundary2.'--'.$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        if($attdesc['disp'] == "attachment"){
                            $bval .= '--'.$boundary1.$this->_crlf.
                                'Content-Type:
'.$attdesc['mime'].$this->_crlf.
                                'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                                'Content-Disposition:
'.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.$this->_crlf.
                                $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                        }
                    }
                    $bval .= '--'.$boundary1.'--';
                }elseif($inline){
                    $hadd .= 'Content-Type:
multipart/related;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                    $bval .= '--'.$boundary1.$this->_crlf.
                        'Content-Type:
multipart/alternative;'.$this->_crlf."\t".'boundary="'.$boundary2.'"'.$this->_crlf.$this->_crlf.
                        '--'.$boundary2.$this->_crlf.
                        $this->_atext[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($this->_atext[2],
$this->_atext[1]).
                        $this->_crlf.'--'.$boundary2.$this->_crlf.
                        $this->_ahtml[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($vhtml, $this->_ahtml[1]).
                        $this->_crlf.'--'.$boundary2.'--'.$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        $bval .= '--'.$boundary1.$this->_crlf.
                            'Content-Type: '.$attdesc['mime'].$this->_crlf.
                            'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                            'Content-Disposition: '.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.
                            'Content-ID:
<'.$idarr[$attdesc['name']].'>'.$this->_crlf.$this->_crlf.
                            $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                    }
                    $bval .= '--'.$boundary1.'--';
                }elseif($attachment){
                    $hadd .= 'Content-Type:
multipart/mixed;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                    $bval .= '--'.$boundary1.$this->_crlf.
                        'Content-Type:
multipart/alternative;'.$this->_crlf."\t".'boundary="'.$boundary2.'"'.$this->_crlf.$this->_crlf.
                        '--'.$boundary2.$this->_crlf.
                        $this->_atext[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($this->_atext[2],
$this->_atext[1]).
                        $this->_crlf.'--'.$boundary2.$this->_crlf.
                        $this->_ahtml[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($vhtml, $this->_ahtml[1]).
                        $this->_crlf.'--'.$boundary2.'--'.$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        $bval .= '--'.$boundary1.$this->_crlf.
                            'Content-Type: '.$attdesc['mime'].$this->_crlf.
                            'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                            'Content-Disposition: '.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.$this->_crlf.
                            $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                    }
                    $bval .= '--'.$boundary1.'--';
                }else{
                    $hadd .= 'Content-Type:
multipart/alternative;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                    $bval .= '--'.$boundary1.$this->_crlf.
                        $this->_atext[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($this->_atext[2],
$this->_atext[1]).
                        $this->_crlf.'--'.$boundary1.$this->_crlf.
                        $this->_ahtml[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($vhtml, $this->_ahtml[1]).
                        $this->_crlf.'--'.$boundary1.'--';
                }
            }elseif($this->_atext){
                $hadd .= 'Content-Type:
multipart/mixed;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                $bval .= '--'.$boundary1.$this->_crlf.
                    $this->_atext[0].$this->_crlf.$this->_crlf.
                    $this->_encodemsg($this->_atext[2],
$this->_atext[1]).$this->_crlf;
                foreach($this->_attach as $attdesc){
                    $bval .= '--'.$boundary1.$this->_crlf.
                        'Content-Type: '.$attdesc['mime'].$this->_crlf.
                        'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                        'Content-Disposition: '.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.$this->_crlf.
                        $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                }
                $bval .= '--'.$boundary1.'--';
            }elseif($this->_ahtml){
                $vhtml = (count($idarr) > 0) ?
$this->_putcid($this->_ahtml[2], $idarr) : $this->_ahtml[2];
                if($inline && $attachment){
                    $hadd .= 'Content-Type:
multipart/mixed;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                    $bval .= '--'.$boundary1.$this->_crlf.
                        'Content-Type:
multipart/related;'.$this->_crlf."\t".'boundary="'.$boundary2.'"'.$this->_crlf.$this->_crlf.
                        '--'.$boundary2.$this->_crlf.
                        $this->_ahtml[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($vhtml,
$this->_ahtml[1]).$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        if($attdesc['disp'] == "inline"){
                            $bval .= '--'.$boundary2.$this->_crlf.
                                'Content-Type:
'.$attdesc['mime'].$this->_crlf.
                                'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                                'Content-Disposition:
'.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.
                                'Content-ID:
<'.$idarr[$attdesc['name']].'>'.$this->_crlf.$this->_crlf.
                                $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                        }
                    }
                    $bval .= '--'.$boundary2.'--'.$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        if($attdesc['disp'] == "attachment"){
                            $bval .= '--'.$boundary1.$this->_crlf.
                                'Content-Type:
'.$attdesc['mime'].$this->_crlf.
                                'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                                'Content-Disposition:
'.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.$this->_crlf.
                                $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                        }
                    }
                    $bval .= '--'.$boundary1.'--';
                }elseif($inline){
                    $hadd .= 'Content-Type:
multipart/related;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                    $bval .= '--'.$boundary1.$this->_crlf.
                        $this->_ahtml[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($vhtml,
$this->_ahtml[1]).$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        $bval .= '--'.$boundary1.$this->_crlf.
                            'Content-Type: '.$attdesc['mime'].$this->_crlf.
                            'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                            'Content-Disposition: '.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.
                            'Content-ID:
<'.$idarr[$attdesc['name']].'>'.$this->_crlf.$this->_crlf.
                            $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                    }
                    $bval .= '--'.$boundary1.'--';
                }elseif($attachment){
                    $hadd .= 'Content-Type:
multipart/mixed;'.$this->_crlf."\t".'boundary="'.$boundary1.'"'.$this->_crlf;
                    $bval .= '--'.$boundary1.$this->_crlf.
                        $this->_ahtml[0].$this->_crlf.$this->_crlf.
                        $this->_encodemsg($vhtml,
$this->_ahtml[1]).$this->_crlf;
                    foreach($this->_attach as $attdesc){
                        $bval .= '--'.$boundary1.$this->_crlf.
                            'Content-Type: '.$attdesc['mime'].$this->_crlf.
                            'Content-Transfer-Encoding:
'.$attdesc['encode'].$this->_crlf.
                            'Content-Disposition: '.$attdesc['disp'].'
'.$this->_crlf."\t".'filename="'.$attdesc['name'].'"'.$this->_crlf.$this->_crlf.
                            $this->_encodemsg($attdesc['source'],
$attdesc['encode']);
                    }
                    $bval .= '--'.$boundary1.'--';
                }
            }
            $hadd  .= 'MIME-Version: 1.0';
            $hval1 .= $hadd;
            $hval2 .= $hadd;
        }else{
            if($this->_atext){
                $hval1 .= $this->_atext[0];
                $hval2 .= $this->_atext[0];
                $bval  .= $this->_encodemsg($this->_atext[2],
$this->_atext[1]);
            }else{
                $hval1 .= $this->_ahtml[0];
                $hval2 .= $this->_ahtml[0];
                $bval  .= $this->_encodemsg($this->_ahtml[2],
$this->_ahtml[1]);
            }
        }
        return array('header' => array('to' => $hto, 'local' => $hval1,
'client' => $hval2.$this->_crlf.$this->_crlf), 'body' =>
$this->_splitmsg($bval));

    }

    function send($subject, $charset = 'utf-8', $encoding =
'quoted-printable'){

        $ret = false;
        if(is_string($charset)){
            $charset = FUNC::str_clear($charset, array(' '));
            $charset = trim($charset);
            $charlen = strlen($charset);
            if(!($charlen > 1 && $charlen < 60)){
                $charset = 'utf-8';
                trigger_error('Invalid charset value, on class
SMTP::send()', 512);
            }
        }else{
            $charset = 'utf-8';
            trigger_error('Invalid charset type value, on class
SMTP::send()', 512);
        }
        if(is_string($encoding)){
            $encoding = FUNC::str_clear($encoding, array(' '));
            $encoding = trim(strtolower($encoding));
            if(!($encoding != 'quoted-printable' || $encoding != 'base64')){
                $encoding = 'quoted-printable';
                trigger_error('Invalid encoding value, on class
SMTP::send()', 512);
            }
        }else{
            $encoding = 'quoted-printable';
            trigger_error('Invalid encoding type value, on class
SMTP::send()', 512);
        }
        if(is_string($subject)){
            $subject = FUNC::str_clear($subject);
            $subject = trim($subject);
            if($subject != ""){
                $this->_subject = $this->enc_header($subject, $charset,
$encoding);
                $ver = true;
                if(!($this->_toaddrs && count($this->_toaddrs) > 0)){
                    $ver = false;
                    trigger_error('You must set "To" e-mail address(es)
using function "AddTo()", on class SMTP::send()', 512);
                }
                if(!($this->_atext || $this->_ahtml)){
                    $ver = false;
                    trigger_error('You must set the mail message using
function(s) "Text() or/and Html()", on class SMTP::send()', 512);
                }
                if($ver){
                    if($this->_ccaddrs && count($this->_ccaddrs) > 0){
                        $clearcc1 = array();
                        foreach($this->_ccaddrs as $ccaddrs1 => $ccname1){
                            $vercc1 = true;
                            foreach($this->_toaddrs as $toaddrs1 =>
$toname1){
                                if($ccaddrs1 == $toaddrs1) $vercc1 = false;
                            }
                            if($vercc1) $clearcc1[$ccaddrs1] = $ccname1;
                            else trigger_error('The e-mail address
"'.$ccaddrs1.'" appear in To and Cc, on class SMTP::send()', 512);
                        }
                        $this->_ccaddrs = $clearcc1;
                    }
                    if($this->_bccaddrs && count($this->_bccaddrs) > 0){
                        $clearbcc1 = array();
                        foreach($this->_bccaddrs as $bccaddrs1 =>
$bccname1){
                            $verbcc1 = true;
                            foreach($this->_toaddrs as $toaddrs2 =>
$toname2){
                                if($bccaddrs1 == $toaddrs2) $verbcc1 =
false;
                            }
                            if($verbcc1) $clearbcc1[$bccaddrs1] = $bccname1;
                            else trigger_error('The e-mail address
"'.$bccaddrs1.'" appear in To and Bcc, on class SMTP::send()', 512);
                        }
                        $this->_bccaddrs = $clearbcc1;
                    }
                    if($this->_bccaddrs && count($this->_bccaddrs) > 0
&& $this->_ccaddrs && count($this->_ccaddrs) > 0){
                        $clearbcc2 = array();
                        foreach($this->_bccaddrs as $bccaddrs2 =>
$bccname2){
                            $verbcc2 = true;
                            foreach($this->_ccaddrs as $ccaddrs2 =>
$ccname2){
                                if($bccaddrs2 == $ccaddrs2) $verbcc2 =
false;
                            }
                            if($verbcc2) $clearbcc2[$bccaddrs2] = $bccname2;
                            else trigger_error('The e-mail address
"'.$bccaddrs2.'" appear in Cc and Bcc, on class SMTP::send()', 512);
                        }
                        $this->_bccaddrs = $clearbcc2;
                    }
                    $group = $alldom = array();
                    foreach($this->_toaddrs as $toaddrs3 => $toname3){
                        $exp1 = explode('@', $toaddrs3);
                        $group[$exp1[1]][] = $toaddrs3;
                        $alldom[] = $toaddrs3;
                    }
                    if($this->_ccaddrs && count($this->_ccaddrs) > 0){
                        foreach($this->_ccaddrs as $ccaddrs3 => $ccname3){
                            $exp2 = explode('@', $ccaddrs3);
                            $group[$exp2[1]][] = $ccaddrs3;
                            $alldom[] = $ccaddrs3;
                        }
                    }
                    if($this->_bccaddrs && count($this->_bccaddrs) > 0){
                        foreach($this->_bccaddrs as $bccaddrs3 =>
$bccname3){
                            $exp3 = explode('@', $bccaddrs3);
                            $group[$exp3[1]][] = $bccaddrs3;
                            $alldom[] = $bccaddrs3;
                        }
                    }
                    $this->_content = $this->_writemsg();
                    $success = false;
                    foreach($this->_smtpconn as $conntype){
                        if(!$success){
                            if($conntype == "local"){
                                $success =
$this->_sendtohost('127.0.0.1', $alldom, false);
                            }elseif($conntype == "relay"){
                                if($this->_relay) $success =
$this->_sendtohost($this->_relay['ip'], $alldom, true);
                                else trigger_error('You must set relay
options with function "Relay()" in order to use relay connection, on
class SMTP::send()', 512);
                            }elseif($conntype == "client"){
                                $back1 = $back2 = true;
                                foreach($group as $hostname => $domaddrs){
                                    $back1 =
$this->_sendtohost($hostname, $domaddrs, false);
                                    if(!$back1) $back2 = false;
                                }
                                $success = $back2;
                            }
                        }else break;
                    }
                    $ret = $success;
                }
            }else trigger_error('Invalid subject value, on class
SMTP::send()', 512);
        }else trigger_error('Invalid subject type value, on class
SMTP::send()', 512);
        return $ret;

    }

}

TIA in advance for any assistance in this matter,

Philip

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux