论坛风格切换
  • 33497阅读
  • 1回复

zencart发送邮件函数(zen_mail) [复制链接]

上一主题 下一主题
 

发帖
6653
大洋
50269
贡献值
940
只看楼主 正序阅读 使用道具 楼主  发表于: 2012-05-20

发送电子邮件函数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  //使用默认值 
函数返回值:如果邮件发送成功,返回值为空,否则返回的是错误信息 
 
 
函数原型代码 
 
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@address.com> 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 . '<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, $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('<br /><br />Email Error: ' . $ErrorInfo); 
 
 
    return $ErrorInfo; 
  }  // end function 

zencart外贸网站案例请看http://www.zencar-bbs.com/ 如果QQ在线联系没有反应,请直接加QQ:1023206115 或者 2257583107
关于zen cart的问题请发帖说明,不要发站内信,也不要QQ问,就是问了也没有人回复的。可以发好帖子,发帖子地址给我,叫我回复
!!!我要免费模板!!!
发帖
44
大洋
-5
贡献值
22
只看该作者 沙发  发表于: 2012-06-10

不错啊,得试试看!!!!

快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容(---删除纯表情和无意义内容,扣1分---)
 
上一个 下一个