发送电子邮件函数function zen_mail($to_name, $to_address, $email_subject, $email_text, $from_email_name, $from_email_address, $block=array(), $module=‘default’, $attachments_list=’’ ) 为于文件includes\functions\functions_email.php文件中。
该函数主要就是zen cart系统用于发送邮件。要想正确的方式邮件的话,zen cart后台的邮件设置一定要设置正确才可以正常发送。
简单的解释一下该函数的参数内容
*@param string $to_name //收件者的名字,就是对接收邮件者的称呼
- @param string $to_email_address //收件人的邮箱地址
- @param string $email_subject //邮件的主题
- @param string $email_text ///邮件的内容,可以是纯文本也可以是HTML文本。zencart发HTML邮件的模板代码就是来源email/目录下面的模板文件。所以如果要制作漂亮一点的邮件内容的话,就可以修改里面的模板文件就可以了
- @param string $from_email_name //发邮件人的名字
- @param string $from_email_adrdess ///从发邮件人的邮箱地址,注:这个并不是用该邮箱来发送邮件
- @param array $block //邮件模板文件里面的替换字符数组,比如要替换模板文件里面的$EMAIL_MESSAGE_HTML这个字符,就是在这个参数里面设置EMAIL_MESSAGE_HTML这个值。如果不使用模板文件,可以使用默认值,即空数组
- @param string $module //使用默认值
-
@param array $attachments_list //使用默认值
函数返回值:如果邮件发送成功,返回值为空,否则返回的是错误信息
函数原型代码[code]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 (!defined(‘DEVELOPER_OVERRIDE_EMAIL_STATUS’) || (defined(‘DEVELOPER_OVERRIDE_EMAIL_STATUS’) && DEVELOPER_OVERRIDE_EMAIL_STATUS == ‘site’))
if (SEND_EMAILS != ‘true’) return false; // if sending email is disabled in Admin, just exit
if (defined('DEVELOPER_OVERRIDE_EMAIL_ADDRESS') && DEVELOPER_OVERRIDE_EMAIL_ADDRESS != '') $to_address = DEVELOPER_OVERRIDE_EMAIL_ADDRESS;
// 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 (preg_match("/\r/i",$value) || preg_match("/\n/i",$value)) return false;
}
// if no text or html-msg supplied, exit
if (trim($email_text) == '' && (!zen_not_null($block) || (isset($block['EMAIL_MESSAGE_HTML']) && $block['EMAIL_MESSAGE_HTML'] == '')) ) return false;
// Parse "from" addresses for "name" <[email protected]> structure, and supply name/address info from it.
if (preg_match("/ *([^<]*) *<([^>]*)> */i",$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 (preg_match("/ *([^<]*) *<([^>]*)> */i",$value,$regs)) {
$to_name = str_replace('"', '', trim($regs[1]));
$to_email_address = $regs[2];
} elseif (preg_match("/ *([^ ]*) */i",$value,$regs)) {
$to_email_address = trim($regs[1]);
}
if (!isset($to_email_address)) $to_email_address=trim($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.
//define some additional html message blocks available to templates, then build the html portion.
if (!isset($block['EMAIL_TO_NAME']) || $block['EMAIL_TO_NAME'] == '') $block['EMAIL_TO_NAME'] = $to_name;
if (!isset($block['EMAIL_TO_ADDRESS']) || $block['EMAIL_TO_ADDRESS'] == '') $block['EMAIL_TO_ADDRESS'] = $to_email_address;
if (!isset($block['EMAIL_SUBJECT']) || $block['EMAIL_SUBJECT'] == '') $block['EMAIL_SUBJECT'] = $email_subject;
if (!isset($block['EMAIL_FROM_NAME']) || $block['EMAIL_FROM_NAME'] == '') $block['EMAIL_FROM_NAME'] = $from_email_name;
if (!isset($block['EMAIL_FROM_ADDRESS']) || $block['EMAIL_FROM_ADDRESS'] == '') $block['EMAIL_FROM_ADDRESS'] = $from_email_address;
$email_html = (!is_array($block) && substr($block, 0, 6) == '<html>') ? $block : zen_build_html_email_from_template($module, $block);
if (!is_array($block) && $block == '' || $block == 'none') $email_html = '';
// Build the email based on whether customer has selected HTML or TEXT, and whether we have supplied HTML or TEXT-only components
// special handling for XML content
if ($email_text == '') {
$email_text = str_replace(array('<br>','<br />'), "<br />\n", $block['EMAIL_MESSAGE_HTML']);
$email_text = str_replace('</p>', "</p>\n", $email_text);
$email_text = ($module != 'xml_record') ? htmlspecialchars(stripslashes(strip_tags($email_text))) : $email_text;
} else {
$email_text = ($module != 'xml_record') ? strip_tags($email_text) : $email_text;
}
if ($module != 'xml_record') {
if (!strstr($email_text, sprintf(EMAIL_DISCLAIMER, STORE_OWNER_EMAIL_ADDRESS)) && $to_email_address != STORE_OWNER_EMAIL_ADDRESS && !defined('EMAIL_DISCLAIMER_NEW_CUSTOMER')) $email_text .= "\n" . sprintf(EMAIL_DISCLAIMER, STORE_OWNER_EMAIL_ADDRESS);
if (defined('EMAIL_SPAM_DISCLAIMER') && EMAIL_SPAM_DISCLAIMER != '' && !strstr($email_text, EMAIL_SPAM_DISCLAIMER) && $to_email_address != STORE_OWNER_EMAIL_ADDRESS) $email_text .= "\n" . EMAIL_SPAM_DISCLAIMER;
}
// 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 = preg_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);
// prevent null characters
while (strstr($email_text, chr(0))) $email_text = str_replace(chr(0), ' ', $email_text);
// fix slashes
$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)
$sql = "select customers_email_format from " . TABLE_CUSTOMERS . " where customers_email_address= :custEmailAddress:";
$sql = $db->bindVars($sql, ':custEmailAddress:', $to_email_address, 'string');
$result = $db->Execute($sql);
$customers_email_format = ($result->RecordCount() > 0) ? $result->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
// handling admin/"extra"/copy emails:
if (ADMIN_EXTRA_EMAIL_FORMAT == 'TEXT' && substr($module,-6)=='_extra') {
$email_html=''; // just blank out the html portion if admin has selected text-only
}
//determine what format to send messages in if this is an admin email for newsletters:
if ($customers_email_format == '' && ADMIN_EXTRA_EMAIL_FORMAT == 'HTML' && in_array($module, array('newsletters', 'product_notification')) && isset($_SESSION['admin_id'])) {
$customers_email_format = 'HTML';
}
// special handling for XML content
if ($module == 'xml_record') {
$email_html = '';
$customers_email_format ='TEXT';
}
//notifier intercept option
$zco_notifier->notify('NOTIFY_EMAIL_AFTER_EMAIL_FORMAT_DETERMINED');
// now lets build the mail object with the phpmailer class
$mail = new PHPMailer();
$lang_code = strtolower(($_SESSION['languages_code'] == '' ? 'en' : $_SESSION['languages_code'] ));
$mail->SetLanguage($lang_code, DIR_FS_CATALOG . DIR_WS_CLASSES . 'support/');
$mail->CharSet = (defined('CHARSET')) ? CHARSET : "iso-8859-1";
$mail->Encoding = (defined('EMAIL_ENCODING_METHOD')) ? EMAIL_ENCODING_METHOD : "7bit";
if ((int)EMAIL_SYSTEM_DEBUG > 0 ) $mail->SMTPDebug = (int)EMAIL_SYSTEM_DEBUG;
$mail->WordWrap = 76; // set word wrap to 76 characters
// set proper line-endings based on switch ... important for windows vs linux hosts:
$mail->LE = (EMAIL_LINEFEED == 'CRLF') ? "\r\n" : "\n";
switch (EMAIL_TRANSPORT) {
case 'smtp':
$mail->IsSMTP();
$mail->Host = trim(EMAIL_SMTPAUTH_MAIL_SERVER);
if (EMAIL_SMTPAUTH_MAIL_SERVER_PORT != '25' && EMAIL_SMTPAUTH_MAIL_SERVER_PORT != '') $mail->Port = trim(EMAIL_SMTPAUTH_MAIL_SERVER_PORT);
$mail->LE = "\r\n";
break;
case 'smtpauth':
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Username = (zen_not_null(EMAIL_SMTPAUTH_MAILBOX)) ? trim(EMAIL_SMTPAUTH_MAILBOX) : EMAIL_FROM;
$mail->Password = trim(EMAIL_SMTPAUTH_PASSWORD);
$mail->Host = trim(EMAIL_SMTPAUTH_MAIL_SERVER);
if (EMAIL_SMTPAUTH_MAIL_SERVER_PORT != '25' && EMAIL_SMTPAUTH_MAIL_SERVER_PORT != '') $mail->Port = trim(EMAIL_SMTPAUTH_MAIL_SERVER_PORT);
$mail->LE = "\r\n";
//set encryption protocol to allow support for Gmail or other secured email protocols
if (EMAIL_SMTPAUTH_MAIL_SERVER_PORT == '465' || EMAIL_SMTPAUTH_MAIL_SERVER_PORT == '587' || EMAIL_SMTPAUTH_MAIL_SERVER == 'smtp.gmail.com') $mail->Protocol = 'ssl';
if (defined('SMTPAUTH_EMAIL_PROTOCOL') && SMTPAUTH_EMAIL_PROTOCOL != 'none') {
$mail->Protocol = SMTPAUTH_EMAIL_PROTOCOL;
if (SMTPAUTH_EMAIL_PROTOCOL == 'starttls' && defined('SMTPAUTH_EMAIL_CERTIFICATE_CONTEXT')) {
$mail->Starttls = true;
$mail->Context = SMTPAUTH_EMAIL_CERTIFICATE_CONTEXT;
}
}
break;
case 'PHP':
$mail->IsMail();
break;
case 'Qmail':
$mail->IsQmail();
break;
case 'sendmail':
case 'sendmail-f':
$mail->LE = "\n";
default:
$mail->IsSendmail();
if (defined('EMAIL_SENDMAIL_PATH')) $mail->Sendmail = trim(EMAIL_SENDMAIL_PATH);
break;
}
$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->AddBCC(STORE_NAME, STORE_OWNER_EMAIL_ADDRESS);
// 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 = (isset($email_reply_to_address) && $email_reply_to_address != '') ? $email_reply_to_address : (in_array($module, array('contact_us', 'tell_a_friend')) ? $from_email_address : EMAIL_FROM);
$email_reply_to_name = (isset($email_reply_to_name) && $email_reply_to_name != '') ? $email_reply_to_name : (in_array($module, array('contact_us', '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;
if (EMAIL_TRANSPORT=='sendmail-f' || EMAIL_SEND_MUST_BE_STORE=='Yes') {
$mail->Sender = EMAIL_FROM;
}
if (EMAIL_USE_HTML == 'true') $email_html = processEmbeddedImages($email_html, $mail);
// PROCESS FILE ATTACHMENTS
if ($attachments_list == '') $attachments_list = array();
if (is_string($attachments_list)) {
if (file_exists($attachments_list)) {
$attachments_list = array(array('file' => $attachments_list));
} elseif (file_exists(DIR_FS_CATALOG . $attachments_list)) {
$attachments_list = array(array('file' => DIR_FS_CATALOG . $attachments_list));
} else {
$attachments_list = array();
}
}
global $newAttachmentsList;
$zco_notifier->notify('NOTIFY_EMAIL_BEFORE_PROCESS_ATTACHMENTS', array('attachments'=>$attachments_list, 'module'=>$module));
if (isset($newAttachmentsList) && is_array($newAttachmentsList)) $attachments_list = $newAttachmentsList;
if (defined('EMAIL_ATTACHMENTS_ENABLED') && EMAIL_ATTACHMENTS_ENABLED && is_array($attachments_list) && sizeof($attachments_list) > 0) {
foreach($attachments_list as $key => $val) {
$fname = (isset($val['name']) ? $val['name'] : null);
$mimeType = (isset($val['mime_type']) && $val['mime_type'] != '' && $val['mime_type'] != 'application/octet-stream') ? $val['mime_type'] : '';
switch (true) {
case (isset($val['raw_data']) && $val['raw_data'] != ''):
$fdata = $val['raw_data'];
if ($mimeType != '') {
$mail->AddStringAttachment($fdata, $fname, "base64", $mimeType);
} else {
$mail->AddStringAttachment($fdata, $fname);
}
break;
case (isset($val['file']) && file_exists($val['file'])): //'file' portion must contain the full path to the file to be attached
$fdata = $val['file'];
if ($mimeType != '') {
$mail->AddAttachment($fdata, $fname, "base64", $mimeType);
} else {
$mail->AddAttachment($fdata, $fname);
}
break;
} // end switch
} //end foreach attachments_list
} //endif attachments_enabled
$zco_notifier->notify('NOTIFY_EMAIL_AFTER_PROCESS_ATTACHMENTS', sizeof($attachments_list));
// prepare content sections:
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
}
/**
-
Send the email. If an error occurs, trap it and display it in the messageStack
*/
$ErrorInfo = ‘’;
$zco_notifier->notify(‘NOTIFY_EMAIL_READY_TO_SEND’);
if (!($result = $mail->Send())) {
if (IS_ADMIN_FLAG === true) {
$messageStack->add_session(sprintf(EMAIL_SEND_FAILED . ’ '. $mail->ErrorInfo, $to_name, $to_email_address, $email_subject),‘error’);
} else {
$messageStack->add(‘header’,sprintf(EMAIL_SEND_FAILED . ’ '. $mail->ErrorInfo, $to_name, $to_email_address, $email_subject),‘error’);
}
$ErrorInfo .= $mail->ErrorInfo . ‘
’;
}
$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, $ErrorInfo ); } // endif archiving
} // end foreach loop thru possible multiple email addresses
$zco_notifier->notify(‘NOTIFY_EMAIL_AFTER_SEND_ALL_SPECIFIED_ADDRESSES’);if (EMAIL_FRIENDLY_ERRORS==‘false’ && $ErrorInfo != ‘’) die('
Email Error: ’ . $ErrorInfo);return $ErrorInfo;
} // end function[/code]