Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

PHP使用SMTP发送邮件

  由于要在PHP中用到SMTP的邮件发送,于是就写了这个来和大家分享下。PHP自带的mail函数几乎是废的,所以发送邮件都需要自己想办法。以前为别人做项目都是网络上随便找的SMTP类,这回是做自己的东西了就不用网络上找的源码,用自己写的比较有感觉。
/**************程序信息*****************
   php发送邮件函数      作者:次碳酸钴
   有问题请提交至admin@web-tinker.com
   参数:
      收信邮箱地址
      发信邮箱地址
      发信邮箱密码
      邮件标题
      邮件内容(HTML)
   返回:
      成功:无返回
      错误:返回错误信息字符串
****************************************/
function send_mail($to,$from,$password,$subject,$body){
  //标题不能带换行
  $subject=str_replace("\r\n",' ',$subject);
  //行首的“.”是SMTP预留的格式,需要用“..”转意
  $body=preg_replace('/(=?^|\r\n)\./','..',$body);
  //从发信邮箱中找到用户名和服务器域名
  $u=explode('@',$from);
  //连接邮箱SMTP服务器的25端口
  $s=fsockopen('smtp.'.$u[1],25);
  fgets($s);
  //构造邮件内容数据
  $data=array(
    'MIME-Version: 1.0',
    'Content-Type: text/html',
    "From: $from","To: $to",
    "Subject: $subject",
    "\r\n$body",'.'
  );
  //根据SMTP协议与邮件服务器做一些应答
  foreach(array(
    'HELO sb',
    'AUTH LOGIN',
    base64_encode($u[0]),
    base64_encode($password),
    "MAIL FROM: <$from>",
    "RCPT TO: <$to>",
    'DATA',implode("\r\n",$data)
  ) as $i){
   //发送消息
    fwrite($s,"$i\r\n");
//等待返回并获取返回信息
    $m=fgets($s);
    //如果返回的是错误信息则结束函数
    if($m[0]>3)return $m;
  };
  //关闭sock
  fclose($s);
};
  我已经注释的很详细了,SMTP协议本身需要做一些应答,一开始发送“HELO”,后面的“sb”随便改成什么都行。在收到服务器返回的成功代码后再发送“AUTH LOGIN”表示请求登陆验证。收到消息后再发送用户名和密码,这也是分别发送的。就是每发送一个信息都要等服务器返回成功代码后再发送下一个数据。注意用户名和密码需要使用base64。接着发送发信地址和收信地址,注意格式。最后发送“DATA”表示剩下的是数据部分。数据部分的格式如程序中$data变量所见,和HTTP协议类似,我就不解释啥了。服务器返回的信息都是“状态码 状态描述\r\n”这样的格式。状态码是三位数的,以2或3开头的是成功的状态码,错误状态码一般以5开头,这里我用直接用大于3来判断成功了。
  这个函数只是简易的邮件发送,我没做添加附件那么麻烦的东西。一般自动发邮件也不会用到附件那么猥琐的东西吧 = =。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^