A-A+

解决SMTP server response: 536 authentication failed

2009年05月12日 未分类 暂无评论 阅读 1 次
php的mail函数,在Win下使用较难!用类解决。

服务器上有Smtp环境,但测试发邮件时:

  1. <?php  
  2. $to      = 'aa@21nw.com';  
  3. $subject = 'the subject';  
  4. $message = 'hello';  
  5. $headers = 'From: ad@21pt.com' . "rn" .  
  6. 'Reply-To: ad@21nw.com' . "rn" .  
  7. 'X-Mailer: PHP/' . phpversion();  
  8. mail($to, $subject, $message, $headers);  
  9. ?> 


一直提示:
Warning: mail() [function.mail]: SMTP server response: 536 authentication failed.
这里感谢一下OP的「mefee」给了我提示,对应办法,时间紧张,直接测试了个类,测试成功与大家分享:

zhoz:1:07 2008-9-26 此类已更新,zhoz更新版:php在win下Socket方式发邮件类,地址:http://log.zhoz.com/read.php?425,请使用新版本。

 

  1. <?php 
  2. /*
  3. * ZhozPhpSmtpSendMail.php
  4. * Created on 2008/09/02 zhoz.com
  5. * php smtp发送邮件类
  6. * 代替mail():因为它报错,我又不想
  7. */
  8. class ZhozPhpSmtpSendMail {  
  9. //您的SMTP 服务器供应商,可以是域名或IP地址
  10. var $smtp = "";  
  11. //SMTP需要要身份验证设值为 1, 不需要身份验证值为 0,现在大多数的SMTP服务商都要验证,如不清楚请与你的smtp 服务商联系。
  12. var $check = 1;  
  13. //您的email帐号名称
  14. var $username = "";  
  15. //您的email密码
  16. var $password = "";  
  17. //此email 必需是发信服务器上的email
  18. var $s_from = "";  
  19. /*
  20.   * 功能:发信初始化设置
  21.   * $from 你的发信服务器上的邮箱
  22.   * $password 你的邮箱密码
  23.   * $smtp 您的SMTP 服务器供应商,可以是域名或IP地址
  24.   * $check SMTP需要要身份验证设值为 1 不需要身份验证值为 0,现在大多数的SMTP服务商都要验证
  25.   */
  26. function ZhozPhpSmtpSendMail ( $from, $password, $smtp, $check = 1 ) {  
  27. if( preg_match("/^[^d-_][w-]*[^-_]@[^-][a-zA-Zd-]+[^-](.[^-][a-zA-Zd-]*[^-])*.[a-zA-Z]{2,3}/", $from ) ) {  
  28. $this->username = substr( $from, 0, strpos( $from , "@" ) );  
  29. $this->password = $password;  
  30. $this->smtp = $smtp ? $smtp : $this->smtp;  
  31. $this->check = $check;  
  32. $this->s_from = $from;  
  33.     }  
  34.   }  
  35. /*
  36.   * 功能:发送邮件
  37.   * $to 目标邮箱
  38.   * $from 来源邮箱
  39.   * $subject 邮件标题
  40.   * $message 邮件内容
  41.   */
  42. function send ( $to, $from, $subject, $message ) {  
  43. //连接服务器
  44. $fp = fsockopen ( $this->smtp, 25, $errno, $errstr, 60);  
  45. if (!$fp ) return "联接服务器失败".__LINE__;  
  46.     set_socket_blocking($fp, true );  
  47. $lastmessage=fgets($fp,512);  
  48. if ( substr($lastmessage,0,3) != 220 ) return "错误信息1:$lastmessage".__LINE__;  
  49. //HELO
  50. $yourname = "YOURNAME";  
  51. if($this->check == "1") $lastact="EHLO ".$yourname."rn";  
  52. else $lastact="HELO ".$yourname."rn";  
  53. fputs($fp, $lastact);  
  54. $lastmessage == fgets($fp,512);  
  55. if (substr($lastmessage,0,3) != 220 ) return "错误信息2:$lastmessage".__LINE__;  
  56. while (true) {  
  57. $lastmessage = fgets($fp,512);  
  58. if ( (substr($lastmessage,3,1) != "-") or (emptyempty($lastmessage)) )  
  59. break;  
  60.     }  
  61. //身份验证
  62. if ($this->check=="1") {  
  63. //验证开始
  64. $lastact="AUTH LOGIN"."rn";  
  65. fputs( $fp, $lastact);  
  66. $lastmessage = fgets ($fp,512);  
  67. if (substr($lastmessage,0,3) != 334) return "错误信息3:$lastmessage".__LINE__;  
  68. //用户姓名
  69. $lastact=base64_encode($this->username)."rn";  
  70. fputs( $fp, $lastact);  
  71. $lastmessage = fgets ($fp,512);  
  72. if (substr($lastmessage,0,3) != 334) return "错误信息4:$lastmessage".__LINE__;  
  73. //用户密码
  74. $lastact=base64_encode($this->password)."rn";  
  75. fputs( $fp, $lastact);  
  76. $lastmessage = fgets ($fp,512);  
  77. if (substr($lastmessage,0,3) != "235") return "错误信息5:$lastmessage".__LINE__;  
  78.     }  
  79. //FROM:
  80. $lastact="MAIL FROM: <". $this->s_from . ">rn";  
  81. fputs( $fp, $lastact);  
  82. $lastmessage = fgets ($fp,512);  
  83. if (substr($lastmessage,0,3) != 250) return "错误信息6:$lastmessage".__LINE__;  
  84. //TO:
  85. $lastact="RCPT TO: <". $to ."> rn";  
  86. fputs( $fp, $lastact);  
  87. $lastmessage = fgets ($fp,512);  
  88. if (substr($lastmessage,0,3) != 250) return "错误信息7:$lastmessage".__LINE__;  
  89. //DATA
  90. $lastact="DATArn";  
  91. fputs($fp, $lastact);  
  92. $lastmessage = fgets ($fp,512);  
  93. if (substr($lastmessage,0,3) != 354) return "错误信息8:$lastmessage".__LINE__;  
  94. //处理Subject头
  95. $head="Subject: $subjectrn";  
  96. $message = $head."rn".$message;  
  97. //处理From头
  98. $head="From: $fromrn";  
  99. $message = $head.$message;  
  100. //处理To头
  101. $head="To: $torn";  
  102. $message = $head.$message;  
  103. //加上结束串
  104. $message .= "rn.rn";  
  105. //发送信息
  106. fputs($fp, $message);  
  107. $lastact="QUITrn";  
  108.     fclose($fp);  
  109. return 0;  
  110.   }  
  111. }  
  112. ?>  

测试方法很简单了: zhoz_test_mail.php

  1. <?php  
  2. set_time_limit(9999);   < /li>
  3. include "ZhozPhpSmtpSendMail.php";  
  4. $sm = new ZhozPhpSmtpSendMail( "ad@21nw.com", "zhoz", "smtp.21nw.com" );  
  5. $end = $sm->send("ad@21nw.com", "ad@21pt.com", "subject is ad", "body is 21nw.com");  
  6. if( $end ) {  
  7. echo $end;  
  8. echo "no---------";  
  9. } else {  
  10. echo "send ok-----------------!";  
  11. die;  
  12. }  
  13. // 结果当然是:send ok-----------------!
  14. ?>  

作者:zhoz@Everyday NetLog
地址:http://log.zhoz.com/read.php?407

Tags: 主机配置 , qmail , 软件测试 , 网络协议

给我留言

Copyright © 浩然东方 保留所有权利.   Theme  Ality 07032740

用户登录