Posted in PHP onNovember 26, 2007
smtp.class.php
<?php define('SMTP_STATUS_NOT_CONNECTED', 1, TRUE); define('SMTP_STATUS_CONNECTED', 2, TRUE); class smtp { var $connection; var $recipients; var $headers; var $timeout; var $errors; var $status; var $body; var $from; var $host; var $port; var $helo; var $auth; var $user; var $pass; var $debug; /** * 参数为一个数组 * host SMTP 服务器的主机 默认:localhost * port SMTP 服务器的端口 默认:25 * helo 发送HELO命令的名称 默认:localhost * user SMTP 服务器的用户名 默认:空值 * pass SMTP 服务器的登陆密码 默认:空值 * timeout 连接超时的时间 默认:5 * @return bool */ function smtp($params = array()) { if(!defined('CRLF')) define('CRLF', “\r\n”, TRUE); $this->timeout = 5; $this->status = SMTP_STATUS_NOT_CONNECTED; $this->host = ‘localhost'; $this->port = 25; $this->auth = FALSE; $this->user = ”; $this->pass = ”; $this->errors = array(); $this->debug = false; foreach($params as $key => $value) { $this->$key = $value; } $this->helo = $this->host; // 如果没有设置用户名则不验证 $this->auth = (” == $this->user) ? FALSE : TRUE; } function connect($params = array()) { if(!isset($this->status)) { $obj = new smtp($params); if($obj->connect()) { $obj->status = SMTP_STATUS_CONNECTED; } return $obj; } else { $this->connection = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout); socket_set_timeout($this->connection, 0, 250000); $greeting = $this->get_data(); if(is_resource($this->connection)) { $this->status = 2; return $this->auth ? $this->ehlo() : $this->helo(); } else { $this->errors[] = ‘Failed to connect to server: ‘.$errstr; return FALSE; } } } /** * 参数为数组 * recipients 接收人的数组 * from 发件人的地址,也将作为回复地址 * headers 头部信息的数组 * body 邮件的主体 */ function send($params = array()) { foreach($params as $key => $value) { $this->set($key, $value); } if($this->is_connected()) { // 服务器是否需要验证 if($this->auth) { if(!$this->auth()) return FALSE; } $this->mail($this->from); if(is_array($this->recipients)) { foreach($this->recipients as $value) { $this->rcpt($value); } } else { $this->rcpt($this->recipients); } if(!$this->data()) return FALSE; $headers = str_replace(CRLF.'.', CRLF.'..', trim(implode(CRLF, $this->headers))); $body = str_replace(CRLF.'.', CRLF.'..', $this->body); $body = $body[0] == ‘.' ? ‘.'.$body : $body; $this->send_data($headers); $this->send_data(”); $this->send_data($body); $this->send_data('.'); return (substr(trim($this->get_data()), 0, 3) === ‘250′); } else { $this->errors[] = ‘Not connected!'; return FALSE; } } function helo() { if(is_resource($this->connection) AND $this->send_data('HELO ‘.$this->helo) AND substr(trim($error = $this->get_data()), 0, 3) === ‘250′ ) { return TRUE; } else { $this->errors[] = ‘HELO command failed, output: ‘ . trim(substr(trim($error),3)); return FALSE; } } function ehlo() { if(is_resource($this->connection) AND $this->send_data('EHLO ‘.$this->helo) AND substr(trim($error = $this->get_data()), 0, 3) === ‘250′ ) { return TRUE; } else { $this->errors[] = ‘EHLO command failed, output: ‘ . trim(substr(trim($error),3)); return FALSE; } } function auth() { if(is_resource($this->connection) AND $this->send_data('AUTH LOGIN') AND substr(trim($error = $this->get_data()), 0, 3) === ‘334′ AND $this->send_data(base64_encode($this->user)) // Send username AND substr(trim($error = $this->get_data()),0,3) === ‘334′ AND $this->send_data(base64_encode($this->pass)) // Send password AND substr(trim($error = $this->get_data()),0,3) === ‘235′ ) { return TRUE; } else { $this->errors[] = ‘AUTH command failed: ‘ . trim(substr(trim($error),3)); return FALSE; } } function mail($from) { if($this->is_connected() AND $this->send_data('MAIL FROM:<'.$from.'>') AND substr(trim($this->get_data()), 0, 2) === ‘250′ ) { return TRUE; } else { return FALSE; } } function rcpt($to) { if($this->is_connected() AND $this->send_data('RCPT TO:<'.$to.'>') AND substr(trim($error = $this->get_data()), 0, 2) === ‘25′ ) { return TRUE; } else { $this->errors[] = trim(substr(trim($error), 3)); return FALSE; } } function data() { if($this->is_connected() AND $this->send_data('DATA') AND substr(trim($error = $this->get_data()), 0, 3) === ‘354′ ) { return TRUE; } else { $this->errors[] = trim(substr(trim($error), 3)); return FALSE; } } function is_connected() { return (is_resource($this->connection) AND ($this->status === SMTP_STATUS_CONNECTED)); } function send_data($data) { if(is_resource($this->connection)) { if($this->debug) echo nl2br($data.CRLF); return fwrite($this->connection, $data.CRLF, strlen($data)+2); } else { return FALSE; } } function &get_data() { $return = ”; $line = ”; if(is_resource($this->connection)) { while(strpos($return, CRLF) === FALSE OR substr($line,3,1) !== ‘ ‘) { $line = fgets($this->connection, 512); $return .= $line; } if($this->debug===true) echo nl2br($return.CRLF); return $return; } else { return FALSE; } } function set($var, $value) { $this->$var = $value; return TRUE; } } // End of class ?>
php a simple smtp class
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@