也许过去我不是一个好孩子,但现在我要做个好爸爸...... 注册 | 登陆

PHP发送SMTP邮件的代码(Part 3)

  前面介绍了预定义的变量和对邮件元素的处理,下面继续代码的最后一部分:连接服务器、发送邮件。 

PHP代码
  1. if(!$fp = fsockopen($set['server'], $set['port'], $errno$errstr, 30)) {
  2.     return false;
  3. }
  4.  
  5. stream_set_blocking($fp, true);
  6.  
  7. $lastmessage = fgets($fp, 512);
  8. if(substr($lastmessage, 0, 3) != '220') {
  9.     return false;
  10. }

  上面是连接服务器的代码,要求服务器返回以220开头的指令。

  bool stream_set_blocking ( resource $stream , int $mode )函数,戒烟如你也是第一次遇到,查了下资料,该函数是设置数据流阻塞模式,mode 如果为1或TRUE,则为块模式,等待数据满足要求,防止数据没有读完就退出。 

PHP代码
  1. fputs($fp, ($set['auth'] ? 'EHLO' : 'HELO')." HuBing\r\n");
  2. $lastmessage = fgets($fp, 512);
  3. if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
  4.     return false;
  5. }
  6.  
  7. while(1) {
  8.     if(substr($lastmessage, 3, 1) != '-' || emptyempty($lastmessage)) {
  9.         break;
  10.     }
  11.     $lastmessage = fgets($fp, 512);
  12. }

  这里说一下第一行的EHLO和HELO,这是开始SMTP会话的指令,前者要求身份验证,后者不需要。

PHP代码
  1. if($set['auth']) {
  2.     fputs($fp"AUTH LOGIN\r\n");
  3.     $lastmessage = fgets($fp, 512);
  4.     if(substr($lastmessage, 0, 3) != 334) {
  5.         return false;
  6.     }
  7.  
  8.     fputs($fpbase64_encode($set['username'])."\r\n");
  9.     $lastmessage = fgets($fp, 512);
  10.     if(substr($lastmessage, 0, 3) != 334) {
  11.         return false;
  12.     }
  13.  
  14.     fputs($fpbase64_encode($set['password'])."\r\n");
  15.     $lastmessage = fgets($fp, 512);
  16.     if(substr($lastmessage, 0, 3) != 235) {
  17.         return false;
  18.     }
  19. }

  如果需要身份验证,则向服务器发送用户名和密码,请求验证。

PHP代码
  1. fputs($fp"MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/""\\1"$set['from']).">\r\n");
  2. $lastmessage = fgets($fp, 512);
  3. if(substr($lastmessage, 0, 3) != 250) {
  4.     fputs($fp"MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/""\\1"$set['from']).">\r\n");
  5.     $lastmessage = fgets($fp, 512);
  6.     if(substr($lastmessage, 0, 3) != 250) {
  7.         return false;
  8.     }
  9. }
  10.  
  11. $email_tos = array();
  12. foreach(explode(','$mail['to']) as $touser) {
  13.     $touser = trim($touser);
  14.     if($touser) {
  15.         fputs($fp"RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/""\\1"$touser).">\r\n");
  16.         $lastmessage = fgets($fp, 512);
  17.         if(substr($lastmessage, 0, 3) != 250) {
  18.             fputs($fp"RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/""\\1"$touser).">\r\n");
  19.             $lastmessage = fgets($fp, 512);
  20.             if (substr($lastmessage, 0, 3) != 250) {
  21.                 return false;
  22.             }
  23.         }
  24.     }
  25. }

  向服务器发送发件人和收件人信息,注意一下,这里每次发送都进行了两次测试,一次不成功就再来一次。

PHP代码
  1. fputs($fp"DATA\r\n");
  2. $lastmessage = fgets($fp, 512);
  3. if(substr($lastmessage, 0, 3) != 354) {
  4.     return false;
  5. }

  告诉SMTP服务器邮件正文开始了,服务器返回354指令,那就继续吧!

PHP代码
  1. $headers .= 'Message-ID: <'.gmdate('YmdHs').'.'.substr(md5($mail['message'].
  2.             microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].
  3.             '>'.$delimiter;
  4.  
  5. fputs($fp"Date: ".gmdate('r')."\r\n");
  6. fputs($fp"To: ".$mail['to']."\r\n");
  7. fputs($fp"Subject: ".$mail['subject']."\r\n");
  8. fputs($fp$headers."\r\n");
  9. fputs($fp"\r\n\r\n");
  10. fputs($fp$mail['message']."\r\n.\r\n");
  11. $lastmessage = fgets($fp, 512);
  12. if(substr($lastmessage, 0, 3) != 250) {
  13.     return false;
  14. }

  第一行向邮件头部添加了一个Message-ID的东东,然后就逐一发送发件时间、收件人、主题、邮件头、正文,发邮件的过程到此结束,下面是发送退出指令了。

PHP代码
  1. fputs($fp"QUIT\r\n");
  2. return true;

  到此结束。

Tags: php, smtp

« 上一篇 | 下一篇 »

只显示5条记录相关文章

截取固定长度UTF-8字符串的PHP函数 (浏览: 34265, 评论: 2)
FPDF代码研究(Part 5) (浏览: 30548, 评论: 1)
FPDF代码研究(Part 4) (浏览: 11607, 评论: 1)
FPDF代码研究(Part 3) (浏览: 11839, 评论: 0)
FPDF代码研究(Part 2,构造函数) (浏览: 22515, 评论: 0)

发表评论

评论内容 (必填):