继续上一次的介绍,上次介绍了发送邮件预定义的东西,比如服务器、端口什么的,还有邮件的主题、内容、收件人,本文开始介绍对元素进行处理。
- $mail['subject'] = str_replace("\n", '', $mail['subject']);
- $mail['subject'] = str_replace("\r", '', $mail['subject']);
- $mail['subject'] = '=?'.$charset.'?B?'.base64_encode($mail['subject']).'?=';
- $mail['message'] = str_replace("\n\r", "\r", $mail['message']);
- $mail['message'] = str_replace("\r\n", "\n", $mail['message']);
- $mail['message'] = str_replace("\r", "\n", $mail['message']);
- $mail['message'] = str_replace("\n", "\r\n", $mail['message']);
- $mail['message'] = str_replace("\r\n.", " \r\n..", $mail['message']);
- $mail['message'] = chunk_split(base64_encode($mail['message']));
这里是对邮件的主题和内容进行BASE64编码,这个东西似乎是比较通用的邮件编码了。不愧是知名论坛的程序,很严谨,对邮件主题禁止换行,对邮件正文所有能用到的换行全部替换掉了。人家原来是主题一行、正文一行,这里为了看起来方便,戒烟如你把每个命令分行写出来了,如果需要的话可以自己改回去。
说下戒烟如你遇到的一个新函数“string chunk_split ( string body [, int chunklen [, string end]] )”,手册上这样说“本函数将字符串变成小段供其它函数使用。例如将 base64_encode 的输出转换成符合 RFC 2045 语义的字符串。它会在每 chunklen(默认为 76)个字符后边插入 end(默认为“\r\n”)”。
- if (preg_match('/^(.+?) \<(.+?)\>$/',$set['from'], $from)) {
- $set['from'] = '=?'.$charset.'?B?'.base64_encode($from[1]).'?= <'.$from[2].'>';
- }
- foreach(explode(',', $mail['to']) as $touser) {
- if (preg_match('/^(.+?) \<(.+?)\>$/',$touser, $to)) {
- $tousers[] = '=?'.$charset.'?B?'.base64_encode($to[1]).'?= <'.$to[2].'>';
- } else $tousers[] = $touser;
- }
- $mail['to'] = implode(',', $tousers);
这里是对发件人和收件人的地址进行处理,首先通过正则表达式判断地址是“发件人名称 <email@domain.com>”格式的还是单纯的邮件地址,如果是前者,则对发件人名称进行BASE64编码。
回到上次说的空格,这里在正则表达式中也有一个空格,和前面对应。如果前面没有空格,这里把空格删除就可以了。
- $headers = 'From: '.$set['from'].$delimiter.
- 'X-Priority: 3'.$delimiter.
- 'X-Mailer: HuBing.info'.$delimiter.
- 'MIME-Version: 1.0'.$delimiter.
- 'Content-type: text/plain; charset='.$charset.$delimiter.
- 'Content-Transfer-Encoding: base64'.$delimiter;
定义邮件头,分别是发件人、优先级、发送邮件的软件、MIME版本、邮件内容格式、邮件编码等,具体的可以研究下关于电子邮件的相关资料。

