Zencart发送邮件函数(zen_mail)

发送电子邮件函数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]