📄 functions_email.php
字号:
<?php
/**
* functions_email.php
* Processes all email activities from Zen Cart
* Hooks into phpMailer class for actual email encoding and sending
*
* @package functions
* @copyright Copyright 2003-2006 Zen Cart Development Team
* @copyright Portions Copyright 2003 osCommerce
* @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0
* @version $Id: functions_email.php 3779 2006-06-16 01:53:31Z drbyte $
*/
/**
* Set email system debugging off or on
*/
define('EMAIL_SYSTEM_DEBUG','off');
/**
* Send email (text/html) using MIME. This is the central mail function.
* The SMTP Server should be configured correctly in php.ini
*
* @param string $to_name The name of the recipient, e.g. "Jim Johanssen"
* @param string $to_email_address The eMail address of the recipient, e.g. john.smith@hzq.com
* (used as $to_email_address after validation)
* @param string $email_subject The subject of the eMail
* @param string $email_text The text of the eMail, may contain HTML entities
* @param string $from_email_name The name of the sender, e.g. Shop Administration
* @param string $from_email_adrdess The eMail address of the sender, e.g. info@myzenshop.com
* @param array $block Array containing values to be inserted into HTML-based email template
* @param string $module The module name of the routine calling zen_mail. Used for html template selection and email archiving.
* This is passed to the archive function denoting what module initiated the sending of the email
* @param array $attachments_list Array of attachment names/mime-types to be included (this portion still in testing, and not fully reliable)
**/
function zen_mail($to_name, $to_address, $email_subject, $email_text, $from_email_name, $from_email_address, $block=array(), $module='default', $attachments_list='' ) {
global $db, $messageStack, $zco_notifier;
if (SEND_EMAILS != 'true') return false; // if sending email is disabled in Admin, just exit
// ignore sending emails for any of the following pages
// (The EMAIL_MODULES_TO_SKIP constant can be defined in a new file in the "extra_configures" folder)
if (defined('EMAIL_MODULES_TO_SKIP') && in_array($module,explode(",",constant('EMAIL_MODULES_TO_SKIP')))) return false;
// check for injection attempts. If new-line characters found in header fields, simply fail to send the message
foreach(array($from_email_address, $to_address, $from_email_name, $to_name, $email_subject) as $key=>$value) {
if (eregi("\r",$value) || eregi("\n",$value)) return false;
}
// if no text or html-msg supplied, exit
if (!zen_not_null($email_text) && !zen_not_null($block['EMAIL_MESSAGE_HTML'])) return false;
// Parse "from" addresses for "name" <email@address.com> structure, and supply name/address info from it.
if (eregi(" *([^<]*) *<([^>]*)> *",$from_email_address,$regs)) {
$from_email_name = trim($regs[1]);
$from_email_address = $regs[2];
}
// if email name is same as email address, use the Store Name as the senders 'Name'
if ($from_email_name == $from_email_address) $from_email_name = STORE_NAME;
// loop thru multiple email recipients if more than one listed --- (esp for the admin's "Extra" emails)...
foreach(explode(',',$to_address) as $key=>$value) {
if (eregi(" *([^<]*) *<([^>]*)> *",$value,$regs)) {
$to_name = str_replace('"', '', trim($regs[1]));
$to_email_address = $regs[2];
} elseif (eregi(" *([^ ]*) *",$value,$regs)) {
$to_email_address = trim($regs[1]);
}
if (!isset($to_email_address)) $to_email_address=$to_address; //if not more than one, just use the main one.
//define some additional html message blocks available to templates, then build the html portion.
if ($block['EMAIL_TO_NAME']=='') $block['EMAIL_TO_NAME'] = $to_name;
if ($block['EMAIL_TO_ADDRESS']=='') $block['EMAIL_TO_ADDRESS'] = $to_email_address;
if ($block['EMAIL_SUBJECT']=='') $block['EMAIL_SUBJECT'] = $email_subject;
if ($block['EMAIL_FROM_NAME']=='') $block['EMAIL_FROM_NAME'] = $from_email_name;
if ($block['EMAIL_FROM_ADDRESS']=='') $block['EMAIL_FROM_ADDRESS'] = $from_email_address;
$email_html = zen_build_html_email_from_template($module, $block);
// if ($attachments_list == '') $attachments_list= array();
// bof: body of the email clean-up
// clean up & and && from email text
while (strstr($email_text, '&&')) $email_text = str_replace('&&', '&', $email_text);
while (strstr($email_text, '&')) $email_text = str_replace('&', '&', $email_text);
while (strstr($email_text, '&&')) $email_text = str_replace('&&', '&', $email_text);
// clean up currencies for text emails
$zen_fix_currencies = split("[:,]" , CURRENCIES_TRANSLATIONS);
$size = sizeof($zen_fix_currencies);
for ($i=0, $n=$size; $i<$n; $i+=2) {
$zen_fix_current = $zen_fix_currencies[$i];
$zen_fix_replace = $zen_fix_currencies[$i+1];
if (strlen($zen_fix_current)>0) {
while (strpos($email_text, $zen_fix_current)) $email_text = str_replace($zen_fix_current, $zen_fix_replace, $email_text);
}
}
// fix double quotes
while (strstr($email_text, '"')) $email_text = str_replace('"', '"', $email_text);
// fix slashes
$email_text = stripslashes($email_text);
$email_html = stripslashes($email_html);
// eof: body of the email clean-up
//determine customer's email preference type: HTML or TEXT-ONLY (HTML assumed if not specified)
$customers_email_format_read = $db->Execute("select customers_email_format from " . TABLE_CUSTOMERS . " where customers_email_address= '" . $to_email_address . "'");
$customers_email_format = $customers_email_format_read->fields['customers_email_format'];
if ($customers_email_format=='NONE' || $customers_email_format=='OUT') return; //if requested no mail, then don't send.
if ($customers_email_format =='HTML') $customers_email_format='HTML'; // if they opted-in to HTML messages, then send HTML format
//determine what format to send messages in if this is an "extra"/admin-copy email:
if (ADMIN_EXTRA_EMAIL_FORMAT == 'TEXT' && substr($module,-6)=='_extra') {
$email_html=''; // just blank out the html portion if admin has selected text-only
}
//notifier intercept option
$zco_notifier->notify('NOTIFY_EMAIL_AFTER_EMAIL_FORMAT_DETERMINED');
// Build the email based on whether customer has selected HTML or TEXT, and whether we have supplied HTML or TEXT-only components
if (!zen_not_null($email_text)) {
$text = str_replace('<br[[:space:]]*/?[[:space:]]*>', "@CRLF", $block['EMAIL_MESSAGE_HTML']);
$text = str_replace('</p>', '</p>@CRLF', $text);
$text = htmlspecialchars(stripslashes(strip_tags($text)));
} else {
$text = strip_tags($email_text);
}
// now lets build the mail object with the phpmailer class
$mail = & new PHPMailer();
$lang_code = ($_SESSION['languages_code'] == '' ? 'en' : $_SESSION['languages_code'] );
$mail->SetLanguage($lang_code,DIR_WS_CLASSES . 'support/');
$mail->CharSet = (defined('CHARSET')) ? CHARSET : "iso-8859-1";
if ($debug_mode=='on') $mail->SMTPDebug = true;
if (EMAIL_TRANSPORT=='smtp' || EMAIL_TRANSPORT=='smtpauth') {
$mail->IsSMTP(); // set mailer to use SMTP
$mail->Host = EMAIL_SMTPAUTH_MAIL_SERVER; // specify main (could also do backup server... future feature?)
if (EMAIL_TRANSPORT=='smtpauth') {
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->Username = (zen_not_null(EMAIL_SMTPAUTH_MAILBOX)) ? EMAIL_SMTPAUTH_MAILBOX : EMAIL_FROM; // SMTP username
$mail->Password = EMAIL_SMTPAUTH_PASSWORD; // SMTP password
}
}
$mail->Subject = $email_subject;
$mail->From = $from_email_address;
$mail->FromName = $from_email_name;
$mail->AddAddress($to_email_address, $to_name);
// $mail->AddAddress($to_email_address); // (alternate format if no name, since name is optional)
$mail->WordWrap = 76; // set word wrap to 76 characters
// set the reply-to address. If none set yet, then use Store's default email name/address.
// If sending from contact-us or tell-a-friend page, use the supplied info
$email_reply_to_address = ($email_reply_to_address) ? $email_reply_to_address : ($module=='contact_us' || $module=='tell_a_friend' ? $from_email_address : EMAIL_FROM);
$email_reply_to_name = ($email_reply_to_name) ? $email_reply_to_name : ($module=='contact_us' || $module=='tell_a_friend' ? $from_email_name : STORE_NAME);
$mail->AddReplyTo($email_reply_to_address, $email_reply_to_name);
// if mailserver requires that all outgoing mail must go "from" an email address matching domain on server, set it to store address
if (EMAIL_SEND_MUST_BE_STORE=='Yes') $mail->From = EMAIL_FROM;
// process attachments
$zco_notifier->notify('NOTIFY_EMAIL_BEFORE_PROCESS_ATTACHMENTS');
// Note: $attachments_list array requires that the 'file' portion contains the full path to the file to be attached
if (EMAIL_ATTACHMENTS_ENABLED && zen_not_null($attachments_list) ) {
// if ($attachments_list == '') $attachments_list = array();
// while ( list($key, $value) = each($attachments_list)) {
// $mail->AddAttachment($value['file']); // add attachments
$mail->AddAttachment($attachments_list['file']); // add attachments
// $mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional format if specifying filename
// } //endwhile attach_list
} //endif attachments
$zco_notifier->notify('NOTIFY_EMAIL_AFTER_PROCESS_ATTACHMENTS');
if (EMAIL_USE_HTML == 'true' && trim($email_html) != '' &&
($customers_email_format == 'HTML' || (ADMIN_EXTRA_EMAIL_FORMAT != 'TEXT' && substr($module,-6)=='_extra'))) {
$mail->IsHTML(true); // set email format to HTML
$mail->Body = $email_html; // HTML-content of message
$mail->AltBody = $text; // text-only content of message
} else { // use only text portion if not HTML-formatted
$mail->Body = $text; // text-only content of message
}
$zco_notifier->notify('NOTIFY_EMAIL_READY_TO_SEND');
if (!$mail->Send()) {
$messageStack->add('header',sprintf(EMAIL_SEND_FAILED . ' '. $mail->ErrorInfo, $to_name, $to_email_address, $email_subject),'error');
$ErrorInfo .= $mail->ErrorInfo . '<br />';
}
$zco_notifier->notify('NOTIFY_EMAIL_AFTER_SEND');
// Archive this message to storage log
// don't archive pwd-resets and CC numbers
if (EMAIL_ARCHIVE == 'true' && $module != 'password_forgotten_admin' && $module != 'cc_middle_digs' && $module != 'no_archive') {
zen_mail_archive_write($to_name, $to_email_address, $from_email_name, $from_email_address, $email_subject, $email_html, $text, $module );
} // endif archiving
} // end foreach loop thru possible multiple email addresses
$zco_notifier->notify('NOTIFY_EMAIL_AFTER_SEND_ALL_SPECIFIED_ADDRESSES');
return $ErrorInfo;
} // end function
/**
* zen_mail_archive_write()
*
* this function stores sent emails into a table in the database as a log record of email activity. This table CAN get VERY big!
* To disable this function, set the "Email Archives" switch to 'false' in ADMIN!
*
* See zen_mail() function description for more details on the meaning of these parameters
* @param string $to_name
* @param string $to_email_address
* @param string $from_email_name
* @param string $from_email_address
* @param string $email_subject
* @param string $email_html
* @param array $email_text
* @param string $module
**/
function zen_mail_archive_write($to_name, $to_email_address, $from_email_name, $from_email_address, $email_subject, $email_html, $email_text, $module) {
global $db;
$to_name = zen_db_prepare_input($to_name);
$to_email_address = zen_db_prepare_input($to_email_address);
$from_email_name = zen_db_prepare_input($from_email_name);
$from_email_address = zen_db_prepare_input($from_email_address);
$email_subject = zen_db_prepare_input($email_subject);
$email_html = (EMAIL_USE_HTML=='true') ? zen_db_prepare_input($email_html) : zen_db_prepare_input('HTML disabled in admin');
$email_text = zen_db_prepare_input($email_text);
$module = zen_db_prepare_input($module);
$db->Execute("insert into " . TABLE_EMAIL_ARCHIVE . "
(email_to_name, email_to_address, email_from_name, email_from_address, email_subject, email_html, email_text, date_sent, module)
values ('" . zen_db_input($to_name) . "',
'" . zen_db_input($to_email_address) . "',
'" . zen_db_input($from_email_name) . "',
'" . zen_db_input($from_email_address) . "',
'" . zen_db_input($email_subject) . "',
'" . zen_db_input($email_html) . "',
'" . zen_db_input($email_text) . "',
now() ,
'" . zen_db_input($module) . "')");
return $db;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -