class_smtp.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:9k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. /***************************************
  3. ** Filename.......: class.smtp.inc
  4. ** Project........: SMTP Class
  5. ** Version........: 1.0.5
  6. ** Last Modified..: 21 December 2001
  7. ***************************************/
  8. define('SMTP_STATUS_NOT_CONNECTED', 1, TRUE);
  9. define('SMTP_STATUS_CONNECTED', 2, TRUE);
  10. class smtp{
  11. var $authenticated;
  12. var $connection;
  13. var $recipients;
  14. var $headers;
  15. var $timeout;
  16. var $errors;
  17. var $status;
  18. var $body;
  19. var $from;
  20. var $host;
  21. var $port;
  22. var $helo;
  23. var $auth;
  24. var $user;
  25. var $pass;
  26. /***************************************
  27.         ** Constructor function. Arguments:
  28. ** $params - An assoc array of parameters:
  29. **
  30. **   host    - The hostname of the smtp server Default: localhost
  31. **   port    - The port the smtp server runs on Default: 25
  32. **   helo    - What to send as the HELO command Default: localhost
  33. **             (typically the hostname of the
  34. **             machine this script runs on)
  35. **   auth    - Whether to use basic authentication Default: FALSE
  36. **   user    - Username for authentication Default: <blank>
  37. **   pass    - Password for authentication Default: <blank>
  38. **   timeout - The timeout in seconds for the call Default: 5
  39. **             to fsockopen()
  40.         ***************************************/
  41. function smtp($params = array()){
  42. if(!defined('CRLF'))
  43. define('CRLF', "rn", TRUE);
  44. $this->authenticated = FALSE;
  45. $this->timeout = 5;
  46. $this->status = SMTP_STATUS_NOT_CONNECTED;
  47. $this->host = 'localhost';
  48. $this->port = 25;
  49. $this->helo = 'localhost';
  50. $this->auth = FALSE;
  51. $this->user = '';
  52. $this->pass = '';
  53. $this->errors    = array();
  54. foreach($params as $key => $value){
  55. $this->$key = $value;
  56. }
  57. }
  58. /***************************************
  59.         ** Connect function. This will, when called
  60. ** statically, create a new smtp object, 
  61. ** call the connect function (ie this function)
  62. ** and return it. When not called statically,
  63. ** it will connect to the server and send
  64. ** the HELO command.
  65.         ***************************************/
  66. function &connect($params = array()){
  67. if(!isset($this->status)){
  68. $obj = new smtp($params);
  69. if($obj->connect()){
  70. $obj->status = SMTP_STATUS_CONNECTED;
  71. }
  72. return $obj;
  73. }else{
  74. @$this->connection = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);
  75. if(function_exists('socket_set_timeout')){
  76. @socket_set_timeout($this->connection, 5, 0);
  77. }
  78. $greeting = $this->get_data();
  79. if(is_resource($this->connection)){
  80. return $this->auth ? $this->ehlo() : $this->helo();
  81. }else{
  82. $this->errors[] = 'Failed to connect to server: '.$errstr;
  83. return FALSE;
  84. }
  85. }
  86. }
  87. /***************************************
  88.         ** Function which handles sending the mail.
  89. ** Arguments:
  90. ** $params - Optional assoc array of parameters.
  91. **            Can contain:
  92. **              recipients - Indexed array of recipients
  93. **              from       - The from address. (used in MAIL FROM:),
  94. **                           this will be the return path
  95. **              headers    - Indexed array of headers, one header per array entry
  96. **              body       - The body of the email
  97. **            It can also contain any of the parameters from the connect()
  98. **            function
  99.         ***************************************/
  100. function send($params = array()){
  101. foreach($params as $key => $value){
  102. $this->set($key, $value);
  103. }
  104. if($this->is_connected()){
  105. // Do we auth or not? Note the distinction between the auth variable and auth() function
  106. if($this->auth AND !$this->authenticated){
  107. if(!$this->auth())
  108. return FALSE;
  109. }
  110. $this->mail($this->from);
  111. if(is_array($this->recipients))
  112. foreach($this->recipients as $value)
  113. $this->rcpt($value);
  114. else
  115. $this->rcpt($this->recipients);
  116. if(!$this->data())
  117. return FALSE;
  118. // Transparency
  119. $headers = str_replace(CRLF.'.', CRLF.'..', trim(implode(CRLF, $this->headers)));
  120. $body    = str_replace(CRLF.'.', CRLF.'..', $this->body);
  121. $body    = $body[0] == '.' ? '.'.$body : $body;
  122. $this->send_data($headers);
  123. $this->send_data('');
  124. $this->send_data($body);
  125. $this->send_data('.');
  126. $result = (substr(trim($this->get_data()), 0, 3) === '250');
  127. //$this->rset();
  128. return $result;
  129. }else{
  130. $this->errors[] = 'Not connected!';
  131. return FALSE;
  132. }
  133. }
  134. /***************************************
  135.         ** Function to implement HELO cmd
  136.         ***************************************/
  137. function helo(){
  138. if(is_resource($this->connection)
  139. AND $this->send_data('HELO '.$this->helo)
  140. AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){
  141. return TRUE;
  142. }else{
  143. $this->errors[] = 'HELO command failed, output: ' . trim(substr(trim($error),3));
  144. return FALSE;
  145. }
  146. }
  147. /***************************************
  148.         ** Function to implement EHLO cmd
  149.         ***************************************/
  150. function ehlo(){
  151. if(is_resource($this->connection)
  152. AND $this->send_data('EHLO '.$this->helo)
  153. AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){
  154. return TRUE;
  155. }else{
  156. $this->errors[] = 'EHLO command failed, output: ' . trim(substr(trim($error),3));
  157. return FALSE;
  158. }
  159. }
  160. /***************************************
  161.         ** Function to implement RSET cmd
  162.         ***************************************/
  163. function rset(){
  164. if(is_resource($this->connection)
  165. AND $this->send_data('RSET')
  166. AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){
  167. return TRUE;
  168. }else{
  169. $this->errors[] = 'RSET command failed, output: ' . trim(substr(trim($error),3));
  170. return FALSE;
  171. }
  172. }
  173. /***************************************
  174.         ** Function to implement QUIT cmd
  175.         ***************************************/
  176. function quit(){
  177. if(is_resource($this->connection)
  178. AND $this->send_data('QUIT')
  179. AND substr(trim($error = $this->get_data()), 0, 3) === '221' ){
  180. fclose($this->connection);
  181. $this->status = SMTP_STATUS_NOT_CONNECTED;
  182. return TRUE;
  183. }else{
  184. $this->errors[] = 'QUIT command failed, output: ' . trim(substr(trim($error),3));
  185. return FALSE;
  186. }
  187. }
  188. /***************************************
  189.         ** Function to implement AUTH cmd
  190.         ***************************************/
  191. function auth(){
  192. if(is_resource($this->connection)
  193. AND $this->send_data('AUTH LOGIN')
  194. AND substr(trim($error = $this->get_data()), 0, 3) === '334'
  195. AND $this->send_data(base64_encode($this->user)) // Send username
  196. AND substr(trim($error = $this->get_data()),0,3) === '334'
  197. AND $this->send_data(base64_encode($this->pass)) // Send password
  198. AND substr(trim($error = $this->get_data()),0,3) === '235' ){
  199. $this->authenticated = TRUE;
  200. return TRUE;
  201. }else{
  202. $this->errors[] = 'AUTH command failed: ' . trim(substr(trim($error),3));
  203. return FALSE;
  204. }
  205. }
  206. /***************************************
  207.         ** Function that handles the MAIL FROM: cmd
  208.         ***************************************/
  209. function mail($from){
  210. if($this->is_connected()
  211. AND $this->send_data('MAIL FROM:<'.$from.'>')
  212. AND substr(trim($this->get_data()), 0, 2) === '250' ){
  213. return TRUE;
  214. }else
  215. return FALSE;
  216. }
  217. /***************************************
  218.         ** Function that handles the RCPT TO: cmd
  219.         ***************************************/
  220. function rcpt($to){
  221. if($this->is_connected()
  222. AND $this->send_data('RCPT TO:<'.$to.'>')
  223. AND substr(trim($error = $this->get_data()), 0, 2) === '25' ){
  224. return TRUE;
  225. }else{
  226. $this->errors[] = trim(substr(trim($error), 3));
  227. return FALSE;
  228. }
  229. }
  230. /***************************************
  231.         ** Function that sends the DATA cmd
  232.         ***************************************/
  233. function data(){
  234. if($this->is_connected()
  235. AND $this->send_data('DATA')
  236. AND substr(trim($error = $this->get_data()), 0, 3) === '354' ){
  237.  
  238. return TRUE;
  239. }else{
  240. $this->errors[] = trim(substr(trim($error), 3));
  241. return FALSE;
  242. }
  243. }
  244. /***************************************
  245.         ** Function to determine if this object
  246. ** is connected to the server or not.
  247.         ***************************************/
  248. function is_connected(){
  249. return (is_resource($this->connection) AND ($this->status === SMTP_STATUS_CONNECTED));
  250. }
  251. /***************************************
  252.         ** Function to send a bit of data
  253.         ***************************************/
  254. function send_data($data){
  255. if(is_resource($this->connection)){
  256. return fwrite($this->connection, $data.CRLF, strlen($data)+2);
  257. }else
  258. return FALSE;
  259. }
  260. /***************************************
  261.         ** Function to get data.
  262.         ***************************************/
  263. function &get_data(){
  264. $return = '';
  265. $line   = '';
  266. $loops  = 0;
  267. if(is_resource($this->connection)){
  268. while((strpos($return, CRLF) === FALSE OR substr($line,3,1) !== ' ') AND $loops < 100){
  269. $line    = fgets($this->connection, 512);
  270. $return .= $line;
  271. $loops++;
  272. }
  273. return $return;
  274. }else
  275. return FALSE;
  276. }
  277. /***************************************
  278.         ** Sets a variable
  279.         ***************************************/
  280. function set($var, $value){
  281. $this->$var = $value;
  282. return TRUE;
  283. }
  284. } // End of class
  285. ?>