封装PHP mail函数发送HTML邮件并使用中文发件人

在写PHP代码时,发送邮件着实是一件比较让人郁闷的事情,PHP默认提供的mail函数太弱了,很难琢磨清楚到底该怎么用。虽然也有很一些做得比较好得第三方库,可以提供相当强大的邮件功能,尤其是可以很简单的配置其使用gmail的stmp服务来发送邮件。但是使用这些库通过stmp来发送邮件就不能随意指定发件地址了,也没办法使用到默认mail函数所提供的调用立即返回,后台sendmail从等待列表中自动发送邮件的功能了。再加上有时就是为了写个小脚本,比如每天监控一下服务器状态,然后发送邮件报告的小功能,动用这种第三方库就有点杀鸡用牛刀了。通过不断的搜索+尝试,终于搞定了使用PHP默认mail函数发送邮件时让人模不着头脑的四大金刚:

  1. 怎样发送HTML格式邮件
  2. 主题给填上中文怎么是乱码啊!
  3. 收件人中除了填上收件人的邮件,还要填上名字,而且还是中文的
  4. 发件人要填上网站的名字,让人收到邮件的时候不是光秃秃的显示邮件地址,那太搓了,就像下面这张图

闲话不再说了,直接上代码,相信都能看懂的。

// 对邮件地址进行中文的UTF-8编码转化
function format_mail_address($address){
  if(preg_match("|<([^<]+)>|", $address, $matches)){
    $name = mb_substr($address, 0, strpos($address, '<'));
    $name = trim($name);
    $mail = $matches[1];
    $address = "=?UTF-8?B?".base64_encode($name)."?= " . "<$mail>";
  }
  return $address;
}

// 发送html格式的邮件
function html_mail($from, $to, $subject, $body){
  if(preg_match("|<([^<]+)>|", $from, $matches)){
    $from_name = mb_substr($from, 0, strpos($from, '<'));
    $from_mail = $matches[1];
    $from = "=?UTF-8?B?".base64_encode($from_name)."?= " . "<$from_mail>";
  }else{
    $from_mail = $from;
  }
  $headers[] = "From: $from";
  $headers[] = "X-Mailer: PHP";
  $headers[] = "MIME-Version: 1.0";
  $headers[] = "Content-type: text/html; charset=utf8";
  $headers[] = "Reply-To: $from_mail";
  $subject = "=?UTF-8?B?".base64_encode($subject)."?=";
  if(is_array($to)){
    foreach($to as $mail)
      $to_mails[] = format_mail_address($mail);
    $to = join(", ", $to_mails);
  }
  mail($to, $subject, $body, join("\n", $headers), "-f $from_mail");
}

函数使用可以参照下面的例子:

html_mail(
    "老谷自言自语 <admin@yorkgu.me>",
    array(
        "用户A <user1@gmail.com>",
        "用户B <user2@163.com>"),
    "这是一封测试邮件",
    "<html><body><h1 style='color:red'>
      感谢党,感谢政府,感谢大中华局域网,给我这个发送邮件的机会。
    </h1></body></html>"
);

PHP mail函数调用sendmail发送邮件,请尽量在linux系统中尝试以上代码

注意:以上代码运行可能存在国内邮箱中收不到的情况,因为可能包含敏感词汇。

如我的测试中,gmail收到邮件并置于垃圾邮箱中,而163没有收到。

 

This entry was posted in PHP and tagged , . Bookmark the permalink.

3 Responses to 封装PHP mail函数发送HTML邮件并使用中文发件人

  1. Sumkei says:

    Thanks! It Work!

  2. verglas says:

    收件人为数组时,其中一个收件人查看邮件会看到所有收件人。
    $to = array(
    \”用户A \”,);时好像有问题。

    if(is_array($to)){}else{添加$to = format_mail_address($to);}

    • york_gu says:

      一般来说我们自己发送邮件给多个用户的时候,一般来说每个收件人都会看到所有其他收件人的,这个不是问题。如果不想让收件人看到还发给了谁,就要用for循环一个一个用户的发送了

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Verify Code   If you cannot see the CheckCode image,please refresh the page again!