解决SMTP server response: 536 authentication failed

php的mail函数,在Win下使用较难!用类解决。

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

  1. <?php  
  2. $to      = ‘aa@21nw.com’;  
  3. $subject = ‘the subject’;  
  4. $message = ‘hello’;  
  5. $headers = ‘From: ad@21pt.com’ . "\r\n" .  
  6. ‘Reply-To: ad@21nw.com’ . "\r\n" .  
  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-Z\d\-]+[^\-](\.[^\-][a-zA-Z\d\-]*[^\-])*\.[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."\r\n";  
  52. else $lastact="HELO ".$yourname."\r\n";  
  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"."\r\n";  
  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)."\r\n";  
  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)."\r\n";  
  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 . ">\r\n";  
  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 ."> \r\n";  
  86. fputs( $fp, $lastact);  
  87. $lastmessage = fgets ($fp,512);  
  88. if (substr($lastmessage,0,3) != 250) return "错误信息7:$lastmessage".__LINE__;  
  89. //DATA
  90. $lastact="DATA\r\n";  
  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: $subject\r\n";  
  96. $message = $head."\r\n".$message;  
  97. //处理From头
  98. $head="From: $from\r\n";  
  99. $message = $head.$message;  
  100. //处理To头
  101. $head="To: $to\r\n";  
  102. $message = $head.$message;  
  103. //加上结束串
  104. $message .= "\r\n.\r\n";  
  105. //发送信息
  106. fputs($fp, $message);  
  107. $lastact="QUIT\r\n";  
  108.     fclose($fp);  
  109. return 0;  
  110.   }  
  111. }  
  112. ?>  

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

  1. <?php  
  2. set_time_limit(9999);  
  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 , 软件测试 , 网络协议



评论权限被关闭.



赞助商

文章索引模板

好友推荐链接

强力推荐链接

分类目录

   

统计信息

Translator

Chinese (Simplified) flagItalian flagKorean flagChinese (Traditional) flagPortuguese flagEnglish flagGerman flagFrench flagSpanish flagJapanese flagArabic flagRussian flagGreek flagDutch flagBulgarian flagCzech flag
Croatian flagDanish flagFinnish flagPolish flagSwedish flagNorwegian flag          

标签

专利战 世界 中国 为什么 介绍 使用 公司 分析 利用 功能 原谅我红尘颠倒 发现 天涯 如何 实现 工具 慕容雪村 技术 插件 搜索引擎 支持 数据库 文件 方式 时间 服务器 用户 简单 系统 网站 美国 解决 谁的心不曾柔软 进行 部分 问题 AJAX blog Google LAN Linux MySQL PHP plugin WordPress

热门浏览