Need assistance using sendmail or mail()
| From: | philip | Date: | Wed, 30 Jan 2008 01:17:03 +0000 |
| Subject: | Need assistance using sendmail or mail() | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-268297@lists.php.net to get a copy of this message | ||
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@doe.ja'=>'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