<?php
/**
* Nomad MIME Mail Copyright (C) 2008 Alejandro Garcia Gonzalez
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the
* License, or (at your option) any later version.
*
* This library 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* Nomad MIME Mail (aka Nexus MIME Mail)
*
* A class for sending MIME based e-mail messages with SMTP and Auth
* SMTP support.
*
* + Plain Text
* + HTML
* + Plain Text with Attachments
* + HTML with Attachments
* + HTML with Embedded Images
* + HTML with Embedded Images and Attachments
* + Send email messages via SMTP and Auth SMTP
*
* @author Alejandro Garcia Gonzalez <nexus at developarts.com>
* @package nomad_mimemail
* @version 1.6
* @link http://www.developarts.com/nomad_mimemail
* @copyright Copyright (c) 2008, Alejandro Garcia Gonzalez
* @license http://www.opensource.org/licenses/lgpl-license.html GNU Lesser General Public License (LGPL)
*/
class Mail_gopher
{
/**
* Debug Status set how show the errors. "yes" by default.
* If "yes" show a line with error and continue
* If "no" Don't show anything and continue
* If "halt" show a line whit error and stop script
* @see _debug()
* @var string yes|no|halt
* @access private
*/
var $debug_status = "yes";
/**
* The charser of MIME construction. "ISO-8859-1" by default
* @see function set_charset()
* @var string
* @access private
*/
var $charset = "ISO-8859-1";
/**
* Subject text. "No subject" by default
* @see function set_subject()
* @var string
* @access private
*/
var $mail_subject = "No subject";
/**
* Email sender. "Anonymous <noreply@fake.com>" by default
* @see function set_from()
* @var string
* @access private
*/
var $mail_from = "Anonymous <noreply@fake.com>";
/**
* Collection of recipients email address separated by comma
* @see function set_to()
* @see function add_to()
* @var string
* @todo must be an array
* @access private
*/
var $mail_to;
/**
* Collection of carbon copy recipients email address separated by comma
* @see function set_cc()
* @see function add_cc()
* @var string
* @todo must be an array
* @access private
*/
var $mail_cc;
/**
* Collection of bind carbon copy recipients email address separated by comma
* @see function set_bcc()
* @see function add_bcc()
* @var string
* @todo must be an array
* @access private
*/
var $mail_bcc;
/**
* The plain text message of email
* @see function set_text()
* @var string
* @access private
*/
var $mail_text;
/**
* The HTML message of email
* @see function set_html()
* @var string
* @access private
*/
var $mail_html;
/**
* Numeric identifier based in elements of email
* @see _parse_elements()
* @var int
* @access private
*/
var $mail_type;
/**
* Header construction of email
* @see function _build_header
* @var string
* @access private
*/
var $mail_header;
/**
* Body construction of email
* @see function _build_body
* @var string
* @access private
*/
var $mail_body;
/**
* The reply email address
* @see function set_reply_to
* @var string
* @access private
*/
var $mail_reply_to;
/**
* The devilvery error return email address
* @see function set_return_path
* @var string
* @access private
*/
var $mail_return_path;
/**
* Attachments Index
* @see function add_attachment()
* @var int
* @access private
*/
var $attachments_index;
/**
* Mixed Attachments data
* @see function add_attachment()
* @var array
* @access private
*/
var $attachments = array();
/**
* Mixed Attachments images data
* @see function add_attachment()
* @var array
* @access private
*/
var $attachments_img = array();
/**
* Boundary Mixed Hash
* @see function nomad_mimemail()
* @var string
* @access private
*/
var $boundary_mix;
/**
* Boundary Related Hash
* @see function nomad_mimemail()
* @var string
* @access private
*/
var $boundary_rel;
/**
* Boundary Alternative Hash
* @see function nomad_mimemail()
* @var string
* @access private
*/
var $boundary_alt;
/**
* Mark if mail has been sent
* @see function send()
* @var init
* @access private
*/
var $sended_index;
/**
* SMTP connection pointer
* @see function _open_smtp_conn()
* @var resource
* @access private
*/
var $smtp_conn;
/**
* SMTP host name or IP
* @see function set_smtp_host()
* @var string
* @access private
*/
var $smtp_host;
/**
* SMTP host access port
* @see function set_smtp_host()
* @var int
* @access private
*/
var $smtp_port;
/**
* SMTP Username
* @see function set_smtp_auth()
* @var string
* @access private
*/
var $smtp_user;
/**
* SMTP Password
* @see function set_smtp_auth()
* @var string
* @access private
*/
var $smtp_pass;
/**
* SMTP log
* @see function set_smtp_log()
* @var bool
* @access private
*/
var $smtp_log = false;
/**
* SMTP log messages text
* @see function get_smtp_log()
* @var string
* @access private
*/
var $smtp_msg;
/**
* Error string array
* @see function _debug()
* @var array
* @access private
*/
var $error_msg = array(
1 => 'Mail was not sent',
2 => 'Body Build Incomplete',
3 => 'Need a mail recipient in mail_to',
4 => 'No valid Email Address: ',
5 => 'Could not Open File',
6 => 'Could not connect to SMTP server.',
7 => 'Unespected SMTP answer: '
);
/**
* Support MIME types
* @see _get_mimetype()
* @var array
* @access private
*/
var $mime_types = array(
'gif' => 'image/gif',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'bmp' => 'image/bmp',
'png' => 'image/png',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'swf' => 'application/x-shockwave-flash',
'doc' => 'application/msword',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'pdf' => 'application/pdf',
'ps' => 'application/postscript',
'eps' => 'application/postscript',
'rtf' => 'application/rtf',
'bz2' => 'application/x-bzip2',
'gz' => 'application/x-gzip',
'tgz' => 'application/x-gzip',
'tar' => 'application/x-tar',
'zip' => 'application/zip',
'html' => 'text/html',
'htm' => 'text/html',
'txt' => 'text/plain',
'css' => 'text/css',
'js' => 'text/javascript'
);
/**
* Constructor
* void nomad_mimemail()
*/
public function __construct()
{
$this->boundary_mix = "=-nxs_mix_" . md5(uniqid(rand()));
$this->boundary_rel = "=-nxs_rel_" . md5(uniqid(rand()));
$this->boundary_alt = "=-nxs_alt_" . md5(uniqid(rand()));
$this->attachments_index = 0;
$this->sended_index = 0;
// Line Break BR
if(!defined('BR')){
define('BR', "\r\n", TRUE);
}
}
public function __destruct()
{}
/**
* void set_from(string mail_from, [string name])
* Set the "from" email address. "Anonymous <fake@mail.com>" by default
* @access public
* @param string mail_from The email from address
* @param string name Optional name contact
* @return void
*/
function set_from($mail_from, $name = "")
{
if ($this->_validate_mail($mail_from)){
$this->mail_from = !empty($name) ? "$name <$mail_from>" : $mail_from;
}
else {
$this->mail_from = "Anonymous <noreply@fake.com>";
}
}
/**
* bool set_to(string mail_to, [string name])
* Set the recipient email address
* @access public
* @param string mail_to The recipient email address
* @param string name Optional name contact
* @return bool
*/
function set_to($mail_to, $name = "")
{
if ($this->_validate_mail($mail_to)){
$this->mail_to = !empty($name) ? "$name <$mail_to>" : $mail_to;
return true;
}
return false;
}
/**
* bool set_cc(string mail_cc, [string name])
* Set the carbon copy recipient email address
* @access public
* @param string mail_cc The carbon copy recipient email address
* @param string name Optional name contact
* @return bool
*/
function set_cc($mail_cc, $name = "")
{
if ($this->_validate_mail($mail_cc)){
$this->mail_cc = !empty($name) ? "$name <$mail_cc>" : $mail_cc;
return true;
}
return false;
}
/**
* bool set_bcc(string mail_bcc, [string name])
* Set the blind carbon copy recipient email address
* @access public
* @param string mail_bcc The blind carbon copy recipient email address
* @param string name Optional name contact
* @return bool
*/
function set_bcc($mail_bcc, $name = "")
{
if ($this->_validate_mail($mail_bcc)){
$this->mail_bcc = !empty($name) ? "$name <$mail_bcc>" : $mail_bcc;
return true;
}
return false;
}
/**
* bool set_reply_to(string mail_reply_to, [string name])
* Set the reply email address. If this var is not set, the reply mail are the "from" email address
* @access public
* @param string mail_reply_to The reply email address
* @param string name Optional name contact
* @return bool
*/
function set_reply_to($mail_reply_to, $name = "")
{
if ($this->_validate_mail($mail_reply_to)){
$this->mail_reply_to = !empty($name) ? "$name <$mail_reply_to>" : $mail_reply_to;
return true;
}
return false;
}
/**
* bool add_to(string mail_to, [string name])
* Set or add a new recipient email address
* @access public
* @param string mail_to The recipient email address
* @param string name Optional name contact
* @return bool
*/
function add_to($mail_to, $name = "")
{
if ($this->_validate_mail($mail_to)){
$mail_to = !empty($name) ? "$name <$mail_to>" : $mail_to;
$this->mail_to = !empty($this->mail_to) ? $this->mail_to . ", " . $mail_to : $mail_to;
return true;
}
return false;
}
/**
* bool add_cc(string mail_cc, [string name])
* Set or add a new carbon copy recipient email address
* @access public
* @param string mail_cc The carbon copy recipient email address
* @param string name Optional name contact
* @return bool
*/
function add_cc($mail_cc, $name = "")
{
if ($this->_validate_mail($mail_cc)){
$mail_cc = !empty($name) ? "$name <$mail_cc>" : $mail_cc;
$this->mail_cc = !empty($this->mail_cc) ? $this->mail_cc . ", " . $mail_cc : $mail_cc;
return true;
}
return false;
}
/**
* bool add_bcc(string mail_bcc, [string name])
* Set or add a new blind carbon copy recipient email address
* @access public
* @param string mail_bcc The blind carbon copy recipient email address
* @param string name Optional name contact
* @return bool
*/
function add_bcc($mail_bcc, $name = "")
{
if ($this->_validate_mail($mail_bcc)){
$mail_bcc = !empty($name) ? "$name <$mail_bcc>" : $mail_bcc;
$this->mail_bcc = !empty($this->mail_bcc) ? $this->mail_bcc . ", " . $mail_bcc : $mail_bcc;
return true;
}
return false;
}
/**
* bool add_reply_to(string mail_reply_to, [string name])
* Set or add a new reply email address. If this var is not set, the reply mail are the "from" email address
* @access public
* @param string mail_reply_to The reply email address
* @param string name Optional name contact
* @return bool
*/
function add_reply_to($mail_reply_to, $name = "")
{
if ($this->_validate_mail($mail_reply_to)){
$mail_reply_to = !empty($name) ? "$name <$mail_reply_to>" : $mail_reply_to;
$this->mail_reply_to = !empty($this->mail_reply_to) ? $this->mail_reply_to . ", " . $mail_reply_to : $mail_reply_to;
return true;
}
return false;
}
/**
* bool set_return_path(string mail_return_path)
* Set the devilvery error return email address
* @access public
* @param string mail_return_path The delivery error email account
* @return bool
*/
function set_return_path($mail_return_path)
{
if ($this->_validate_mail($mail_return_path)){
$this->mail_return_path = $mail_return_path;
return true;
}
return false;
}
/**
* void set_subject(string subject)
* Set the email subject string. "No subject" by default
* @access public
* @param string subject
* @return void
*/
function set_subject($subject)
{
$this->mail_subject = !empty($subject) ? trim($subject) : "No subject";
}
/**
* void set_text(string text)
* Set the plain text message in body of email
* @access public
* @param string text The plain text message
* @return void
*/
function set_text($text)
{
if (!empty($text)){
$this->mail_text = preg_replace("(\r\n|\r|\n)", BR, $text);
}
}
/**
* void set_html(string html)
* Set the HTML message in body of email
* @access public
* @param string html The HTML message
* @return void
*/
function set_html($html)
{
if (!empty($html)){
$this->mail_html = preg_replace("(\r\n|\r|\n)", BR, $html);
}
}
/**
* void set_charset(string charset)
* Set the charset if email
* @access public
* @param string charset The CharSet
* @return void
*/
function set_charset($charset)
{
if (!empty($charset)){
$this->charset = $charset;
}
}
/**
* bool set_smtp_host(string host, [int port])
* Set the SMTP host and port, if you call this method with valid parameters, the class sends email through SMTP
* @access public
* @param string host The Hostname/IP of the SMTP server
* @param int port Optional, the port to connect to SMTP server
* @return bool
*/
function set_smtp_host($host, $port = 25)
{
if (!empty($host) && is_numeric($port)){
$this->smtp_host = $host;
$this->smtp_port = $port;
return true;
}
return false;
}
/**
* bool set_smtp_host(string host, [int port])
* Set the Auth SMTP user and password, you need to call method set_smtp_host before
* @access public
* @param string user The Username Authentication account
* @param string pass The Password Authentication account
* @return bool
*/
function set_smtp_auth($user, $pass)
{
if(!empty($user) && !empty($pass)){
$this->smtp_user = $user;
$this->smtp_pass = $pass;
return true;
}
return false;
}
/**
* string get_eml()
* Get the EML format message of the email
* @access public
* @return mixed string if message has build, false if not
*/
function get_eml()
{
if ($this->_build_body()){
return
$this->mail_header . BR .
'Subject: ' . $this->mail_subject . BR .
$this->mail_body;
}
return false;
}
/**
* bool add_attachment(mixed file, string name, [string type])
* Add a file attachment
* @access public
* @param string file
* @param string name
* @param string type
* @return bool
*/
function add_attachment($file, $name, $type = "")
{
if (($content = $this->_open_file($file))){
$this->attachments[$this->attachments_index] = array(
'content' => chunk_split(base64_encode($content), 76, BR),
'name' => $name,
'type' => (empty($type) ? $this->_get_mimetype($name): $type),
'embedded' => false
);
$this->attachments_index++;
}
}
/**
* bool add_content_attachment(mixed file, string name, [string type])
* Add a content to an attachment
* @access public
* @param string content
* @param string name
* @param string type
* @return bool
*/
function add_content_attachment($content, $name, $type = "")
{
$this->attachments[$this->attachments_index] = array(
'content' => chunk_split(base64_encode($content), 76, BR),
'name' => $name,
'type' => (empty($type) ? $this->_get_mimetype($name): $type),
'embedded' => false
);
$this->attachments_index++;
}
/**
* void new_mail([mixed from], [mixed to], [string subject], [string text], [string html])
* Method shortcut to create an email
* @access public
* @return void
*/
function new_mail($from = "", $to = "", $subject = "", $text = "", $html = "")
{
// First, clear all vars
$this->mail_subject = "";
$this->mail_from = "";
$this->mail_to = "";
$this->mail_cc = "";
$this->mail_bcc = "";
$this->mail_text = "";
$this->mail_html = "";
$this->mail_header = "";
$this->mail_body = "";
$this->mail_reply_to = "";
$this->mail_return_path = "";
$this->attachments_index = 0;
$this->sended_index = 0;
// Clear Array Vars
$this->attachments = array();
$this->attachments_img = array();
// Asign vars
if (is_array($from)){
$this->set_from($from[0],$from[1]);
$this->set_return_path($from[0]);
}
else {
$this->set_from($from);
$this->set_return_path($from);
}
if (is_array($to)){
$this->set_to($to[0],$to[1]);
}
else {
$this->set_to($to);
}
$this->set_subject($subject);
$this->set_text($text);
$this->set_html($html);
}
/**
* bool send()
* Send the email message
* @access public
* @return bool
*/
function send()
{
if ($this->sended_index == 0 && !$this->_build_body()){
$this->_debug(1);
return false;
}
if (empty($this->smtp_host) && !empty($this->mail_return_path) && $this->_php_version_check('4.0.5') && !($this->_php_version_check('4.2.3') && ini_get('safe_mode'))){
return mail($this->mail_to, $this->mail_subject, $this->mail_body, $this->mail_header, '-f'.$this->mail_return_path);
}
elseif (empty($this->smtp_host)) {
return mail($this->mail_to, $this->mail_subject, $this->mail_body, $this->mail_header);
}
elseif (!empty($this->smtp_host)){
return $this->_smtp_send();
}
else {
return false;
}
}
/**
* void _build_header()
* Build all the headers of email
* @access private
* @param text content_type The Content Type of email
* @return void
*/
function _build_header($content_type)
{
$this->mail_header = "";
if (!empty($this->smtp_host)){
$this->mail_header .= "Subject: " . $this->mail_subject . BR;
}
if (!empty($this->mail_from)){
$this->mail_header .= "From: " . $this->mail_from . BR;
$this->mail_header .= !empty($this->mail_reply_to) ? "Reply-To: " . $this->mail_reply_to . BR : "Reply-To: " . $this->mail_from . BR;
}
if (!empty($this->mail_to) && !empty($this->smtp_host)){ // FixBug: http://www.developarts.com/version_14_de_nomad_mime_mail#comment-294
$this->mail_header .= "To: " . $this->mail_to . BR;
}
if (!empty($this->mail_cc)){
$this->mail_header .= "Cc: " . $this->mail_cc . BR;
}
if (!empty($this->mail_bcc) && empty($this->smtp_host)){
$this->mail_header .= "Bcc: " . $this->mail_bcc . BR;
}
if (!empty($this->mail_return_path)){
$this->mail_header .= "Return-Path: " . $this->mail_return_path . BR;
}
$this->mail_header .= $content_type . BR;
if (!empty($this->smtp_host)){
$this->mail_header .= "Date: " . date("r") . BR;
}
$this->mail_header .= "Message-Id: <" . md5(uniqid(rand())) . ".nomad_mimemail@" . $_SERVER['SERVER_ADDR'] . ">" . BR;
$this->mail_header .= "MIME-Version: 1.0" . BR;
$this->mail_header .= "X-Mailer: Nomad MIME Mail ". $this->get_version() . BR . BR;
}
/**
* bool _build_body()
* Build body email message
* @access private
* @return bool
*/
function _build_body()
{
switch ($this->_parse_elements()){
case 1: // Plain Text
$this->_build_header("Content-Type: text/plain; charset=\"$this->charset\"");
$this->mail_body = $this->mail_text;
break;
case 3: // Plain Text + HTML
$this->_build_header("Content-Type: multipart/alternative; boundary=\"$this->boundary_alt\"");
$this->mail_body .= "--" . $this->boundary_alt . BR;
$this->mail_body .= "Content-Type: text/plain; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR . BR;
$this->mail_body .= $this->mail_text . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . BR;
$this->mail_body .= "Content-Type: text/html; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR;
$this->mail_body .= $this->mail_html . BR;
$this->mail_body .= "--" . $this->boundary_alt . "--" . BR;
break;
case 5: // Plain Text + Attachments
$this->_build_header("Content-Type: multipart/mixed; boundary=\"$this->boundary_mix\"");
$this->mail_body .= "--" . $this->boundary_mix . BR;
$this->mail_body .= "Content-Type: text/plain; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR . BR;
$this->mail_body .= $this->mail_text . BR . BR;
foreach($this->attachments as $value){
$this->mail_body .= "--" . $this->boundary_mix . BR;
$this->mail_body .= "Content-Type: " . $value['type'] . "; name=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Disposition: attachment; filename=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: base64" . BR . BR;
$this->mail_body .= $value['content'] . BR . BR;
}
$this->mail_body .= "--" . $this->boundary_mix . "--" . BR;
break;
case 7: // Plain Text + HTML + Attachments
$this->_build_header("Content-Type: multipart/mixed; boundary=\"$this->boundary_mix\"");
$this->mail_body .= "--" . $this->boundary_mix . BR;
$this->mail_body .= "Content-Type: multipart/alternative; boundary=\"$this->boundary_alt\"" . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . BR;
$this->mail_body .= "Content-Type: text/plain; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR;
$this->mail_body .= $this->mail_text . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . BR . BR;
$this->mail_body .= "Content-Type: text/html; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR;
$this->mail_body .= $this->mail_html . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . "--" . BR . BR;
foreach($this->attachments as $value){
$this->mail_body .= "--" . $this->boundary_mix . BR;
$this->mail_body .= "Content-Type: " . $value['type'] . "; name=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Disposition: attachment; filename=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: base64" . BR . BR;
$this->mail_body .= $value['content'] . BR . BR;
}
$this->mail_body .= "--" . $this->boundary_mix . "--" . BR;
break;
case 11: // Plain Text + HTML + Embedded Images
$this->_build_header("Content-Type: multipart/related; type=\"multipart/alternative\"; boundary=\"$this->boundary_rel\"");
$this->mail_body .= "--" . $this->boundary_rel . BR;
$this->mail_body .= "Content-Type: multipart/alternative; boundary=\"$this->boundary_alt\"" . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . BR;
$this->mail_body .= "Content-Type: text/plain; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR . BR;
$this->mail_body .= $this->mail_text . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . BR;
$this->mail_body .= "Content-Type: text/html; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR . BR;
$this->mail_body .= $this->mail_html . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . "--" . BR . BR;
foreach($this->attachments as $value){
if ($value['embedded']){
$this->mail_body .= "--" . $this->boundary_rel . BR;
$this->mail_body .= "Content-ID: <" . $value['embedded'] . ">" . BR;
$this->mail_body .= "Content-Type: " . $value['type'] . "; name=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Disposition: attachment; filename=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: base64" . BR . BR;
$this->mail_body .= $value['content'] . BR . BR;
}
}
$this->mail_body .= "--" . $this->boundary_rel . "--" . BR;
break;
case 15: // Plain Text + HTML + Embedded Images + Attachments
$this->_build_header("Content-Type: multipart/mixed; boundary=\"$this->boundary_mix\"");
$this->mail_body .= "--" . $this->boundary_mix . BR;
$this->mail_body .= "Content-Type: multipart/related; type=\"multipart/alternative\"; boundary=\"$this->boundary_rel\"" . BR . BR;
$this->mail_body .= "--" . $this->boundary_rel . BR;
$this->mail_body .= "Content-Type: multipart/alternative; boundary=\"$this->boundary_alt\"" . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . BR;
$this->mail_body .= "Content-Type: text/plain; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR . BR;
$this->mail_body .= $this->mail_text . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . BR;
$this->mail_body .= "Content-Type: text/html; charset=\"$this->charset\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: 7bit" . BR . BR;
$this->mail_body .= $this->mail_html . BR . BR;
$this->mail_body .= "--" . $this->boundary_alt . "--" . BR . BR;
foreach($this->attachments as $value){
if ($value['embedded']){
$this->mail_body .= "--" . $this->boundary_rel . BR;
$this->mail_body .= "Content-ID: <" . $value['embedded'] . ">" . BR;
$this->mail_body .= "Content-Type: " . $value['type'] . "; name=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Disposition: attachment; filename=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: base64" . BR . BR;
$this->mail_body .= $value['content'] . BR . BR;
}
}
$this->mail_body .= "--" . $this->boundary_rel . "--" . BR . BR;
foreach($this->attachments as $value){
if (!$value['embedded']){
$this->mail_body .= "--" . $this->boundary_mix . BR;
$this->mail_body .= "Content-Type: " . $value['type'] . "; name=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Disposition: attachment; filename=\"" . $value['name'] . "\"" . BR;
$this->mail_body .= "Content-Transfer-Encoding: base64" . BR . BR;
$this->mail_body .= $value['content'] . BR . BR;
}
}
$this->mail_body .= "--" . $this->boundary_mix . "--" . BR;
break;
default:
return $this->_debug(2);
}
$this->sended_index++;
return true;
}
/**
* bool _php_version_check(string vercheck)
* Check if current version of PHP is above than other
* @access private
* @param string vercheck The compare version of PHP
* @return bool
*/
function _php_version_check($vercheck)
{
if (version_compare(PHP_VERSION, $vercheck) === 1){
return true;
}
return false;
}
/**
* mixed _parse_elements()
* Check all email message elements and return a identifier
* @access private
* @return mixed int|false
*/
function _parse_elements()
{
if (empty($this->mail_to)){
return $this->_debug(3);
}
$this->_search_images();
$this->mail_type = 0; // None
if (!empty($this->mail_text)){
$this->mail_type = $this->mail_type + 1; // Plain Text
}
if (!empty($this->mail_html)){
$this->mail_type = $this->mail_type + 2; // HTML
if (empty($this->mail_text)){
$this->mail_text = strip_tags(eregi_replace("<br>", BR, $this->mail_html));
$this->mail_type = $this->mail_type + 1; // Plain Text
}
}
if ($this->attachments_index != 0){
if (count($this->attachments_img) != 0){
$this->mail_type = $this->mail_type + 8; // Embedded Images
}
if ((count($this->attachments) - count($this->attachments_img)) >= 1){
$this->mail_type = $this->mail_type + 4; // Attachments
}
}
return $this->mail_type;
}
/**
* void _search_images()
* Search all embeded images in HTML and attachments
* @access private
* @return void
*/
function _search_images()
{
if ($this->attachments_index != 0){
foreach($this->attachments as $key => $value){
if (preg_match('/(css|image)/i', $value['type']) && preg_match('/\s(background|href|src)\s*=\s*[\"|\'](' . $value['name'] . ')[\"|\'].*>/is', $this->mail_html)) {
$img_id = md5($value['name']) . ".nomad@mimemail";
$this->mail_html = preg_replace('/\s(background|href|src)\s*=\s*[\"|\'](' . $value['name'] . ')[\"|\']/is', ' \\1="cid:' . $img_id . '"', $this->mail_html);
$this->attachments[$key]['embedded'] = $img_id;
$this->attachments_img[] = $value['name'];
}
}
}
}
/**
* bool _validate_mail(string mail)
* Validate an email address
* @access private
* @param string mail The email address string
* @return bool
*/
function _validate_mail($mail)
{
/* if (ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$',$mail)){
return true;
}
return $this->_debug(4, $mail);*/
return true;
}
/**
* mixed _extract_email(string parse)
* Extract all email addresses from a string. If extracted more than one
* return an array. If extraded only one email return string. Else return false
* @access private
* @param string parse String with one or more email addresses
* @return mixed array|string|false
*/
function _extract_email($parse)
{
preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $parse, $matches);
if (count($matches[0]) == 1){
return $matches[0][0];
}
elseif (!count($matches[0])){
return false;
}
else {
return $matches[0];
}
}
/**
* string _get_mimetype(string name)
* Search a mime type based in it's extension filename
* @access private
* @param string name The file name
* @return mixed string
*/
function _get_mimetype($name)
{
$ext_array = explode(".", $name);
if (($last = count($ext_array) - 1) != 0){
$ext = $ext_array[$last];
if (isset($this->mime_types[$ext]))
return $this->mime_types[$ext];
}
return "application/octet-stream";
}
/**
* mixed _open_file(string file)
* Opens a file and returns it's content
* @access private
* @param string file The file path
* @return mixed string|false
*/
function _open_file($file)
{
if(($fp = @fopen($file, 'r'))){
$content = fread($fp, filesize($file));
fclose($fp);
return $content;
}
return $this->_debug(5, $file);
}
/**
* bool false _debug(int msg, [string element])
* Printa a error and returns false
* @access private
* @param int msg The id error
* @param string element Optional The extra message error
* @return bool false
*/
function _debug($msg, $element="")
{
if ($this->debug_status == "yes"){
echo "<br><b>Error:</b> " . $this->error_msg[$msg] . " $element<br>";
}
elseif ($this->debug_status == "halt"){
die ("<br><b>Error:</b> " . $this->error_msg[$msg] . " $element<br>");
}
return false;
}
/**
* bool _open_smtp_conn()
* Opens a socket connection to SMTP server
* @access private
* @return bool
*/
function _open_smtp_conn()
{
if ($this->smtp_conn = @fsockopen ($this->smtp_host, $this->smtp_port)){
if (in_array($this->_get_smtp_response(), array(220, 250, 354))){
return true;
}
}
return $this->_debug(6);
}
/**
* void _close_smtp_conn()
* Close SMTP connection
* @access private
* @return void
*/
function _close_smtp_conn()
{
$this->_send_smtp_command("QUIT");
@fclose($this->smtp_conn);
}
/**
* bool _send_smtp_command(string command, [array number])
* Sends a Command to SMTP server
* @access private
* @param string command String of Command to send
* @param array number Optional array of accepted numbers for response
* @return bool
*/
function _send_smtp_command($command, $number="")
{
if (@fwrite($this->smtp_conn, $command . BR)){
$this->smtp_msg .= $this->smtp_log == true ? $command . "\n" : "";
if (!empty($number)){
if (!in_array($this->_get_smtp_response(), (array)$number)){
$this->_close_smtp_conn();
return $this->_debug(7);
}
}
return true;
}
return false;
}
/**
* int _get_smtp_response()
* Check the id number response from SMTP server
* @access private
* @return int
*/
function _get_smtp_response()
{
do {
$response = chop(@fgets($this->smtp_conn, 1024));
$this->smtp_msg .= $this->smtp_log == true ? $response . "\n" : "";
} while($response{3} == "-");
return intval(substr($response,0,3));
}
/**
* bool _smtp_send()
* Sends the email message via SMTP
* @access private
* @return bool
*/
function _smtp_send()
{
if ($this->_open_smtp_conn()){
if (!$this->_send_smtp_command("helo {$this->smtp_host}", array(220, 250, 354))){return false;}
if(!empty($this->smtp_user) && !empty($this->smtp_pass)){
if (!$this->_send_smtp_command("EHLO {$this->smtp_host}", array(220, 250, 354))){return false;}
if (!$this->_send_smtp_command("AUTH LOGIN", array(334))){return false;}
if (!$this->_send_smtp_command(base64_encode($this->smtp_user), array(334))){return false;}
if (!$this->_send_smtp_command(base64_encode($this->smtp_pass), array(235))){return false;}
}
if (!$this->_send_smtp_command("MAIL FROM:" . $this->_extract_email($this->mail_from), array(220, 250, 354))){return false;} // FixBug: http://www.developarts.com/version_14_de_nomad_mime_mail#comment-19
$all_email = $this->_extract_email(implode(", ", array($this->mail_to, $this->mail_cc, $this->mail_bcc)));
foreach ((array)$all_email as $email){
if (!$this->_send_smtp_command("RCPT TO:{$email}", array(220, 250, 354))){return false;}
}
if (!$this->_send_smtp_command("DATA", array(220, 250, 354))){return false;}
$this->_send_smtp_command($this->mail_header);
$this->_send_smtp_command($this->mail_body);
if (!$this->_send_smtp_command(".", array(220, 250, 354))){return false;}
$this->_close_smtp_conn();
return true;
}
return false;
}
/**
* void set_smtp_log(bool log)
* Activate or Deactivate SMTP log messages
* @access public
* @param bool log True if you can log SMTP messages, false by default
* @return void
*/
function set_smtp_log($log = false)
{
if ($log == true){
$this->smtp_log = true;
}
else {
$this->smtp_log = false;
}
}
/**
* string get_smtp_log()
* Get all SMTP log
* @access public
* @return string
*/
function get_smtp_log()
{
if ($this->smtp_log == true){
return $this->smtp_msg;
}
else {
return "No logs activated";
}
}
/**
* string get_version()
* Return the version of this class
* @access public
* @return string
*/
function get_version()
{
return "1.6.1";
}
public function sendMail($SendTo, $MessArr)
{
foreach($SendTo as $Receiver)
{
$this->set_from($MessArr['frommail']);
$this->set_to($Receiver);
$this->set_subject($MessArr['subject']);
$this->set_html($MessArr['message']);
if ($this->send()){
}
}
}
}