设为首页   加入最爱           最新更新:全方位英文文章资料库
 
资料坊搜索: 标题 全文     
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
   首页>>YesizeCOM>>电脑技能坊>>PHP>>正文       
 
广告招租,e-mail:yesize@hotmail.com

广告招租,e-mail:yesize@hotmail.com

 

smtp.php

<?php
class smtp

{

/* Public Variables */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* Private Variables */
var $sock;

/* Constractor */

function smtp($relay_host = , $smtp_port = 25,$auth = false,$user,$pass)

{

$this->debug = FALSE;

$this->smtp_port = $smtp_port;

$this->relay_host = $relay_host;

$this->time_out = 30; //is used in fsockopen()
#

$this->auth = $auth;//auth

$this->user = $user;

$this->pass = $pass;

#

$this->host_name = localhost; //is used in HELO command
$this->log_file = ;

 

$this->sock = FALSE;

}

/* Main Function */

function sendmail($to, $from, $subject = , $body = , $mailtype, $cc = , $bcc = , $additional_headers = )

{

$mail_from = $this->get_address($this->strip_comment($from));

$body = ereg_replace((^|(\r\n))(\.), \1.\3, $body);

$header .= MIME-Version:1.0\r\n;

if($mailtype==HTML){

$header .= Content-Type:text/html\r\n;

}

$header .= To: .$to.\r\n;

if ($cc != ) {

$header .= Cc: .$cc.\r\n;

}

$header .= From: $from<.$from.>\r\n;

$header .= Subject: .$subject.\r\n;

$header .= $additional_headers;

$header .= Date: .date(r).\r\n;

$header .= X-Mailer:By Redhat (PHP/.phpversion().)\r\n;

list($msec, $sec) = explode( , microtime());

$header .= Message-ID: <.date(YmdHis, $sec)...($msec*1000000)...$mail_from.>\r\n;

$TO = explode(,, $this->strip_comment($to));

if ($cc != ) {

$TO = array_merge($TO, explode(,, $this->strip_comment($cc)));

}

if ($bcc != ) {

$TO = array_merge($TO, explode(,, $this->strip_comment($bcc)));

}

$sent = TRUE;

foreach ($TO as $rcpt_to) {

$rcpt_to = $this->get_address($rcpt_to);

if (!$this->smtp_sockopen($rcpt_to)) {

$this->log_write(Error: Cannot send email to .$rcpt_to.\n);

$sent = FALSE;

continue;

}

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {

$this->log_write(E-mail has been sent to <.$rcpt_to.>\n);

} else {

$this->log_write(Error: Cannot send email to <.$rcpt_to.>\n);

$sent = FALSE;

}

fclose($this->sock);

$this->log_write(Disconnected from remote host\n);

}

return $sent;

}

 

/* Private Functions */

 

function smtp_send($helo, $from, $to, $header, $body = )

{

if (!$this->smtp_putcmd(HELO, $helo)) {

return $this->smtp_error(sending HELO command);

}

#auth

if($this->auth){

if (!$this->smtp_putcmd(AUTH LOGIN, base64_encode($this->user))) {

return $this->smtp_error(sending HELO command);

}

if (!$this->smtp_putcmd(, base64_encode($this->pass))) {

return $this->smtp_error(sending HELO command);

}

}

#

if (!$this->smtp_putcmd(MAIL, FROM:<.$from.>)) {

return $this->smtp_error(sending MAIL FROM command);

}

if (!$this->smtp_putcmd(RCPT, TO:<.$to.>)) {

return $this->smtp_error(sending RCPT TO command);

}

if (!$this->smtp_putcmd(DATA)) {

return $this->smtp_error(sending DATA command);

}

if (!$this->smtp_message($header, $body)) {

return $this->smtp_error(sending message);

}

if (!$this->smtp_eom()) {

return $this->smtp_error(sending <CR><LF>.<CR><LF> [EOM]);

}

if (!$this->smtp_putcmd(QUIT)) {

return $this->smtp_error(sending QUIT command);

}

return TRUE;

}

function smtp_sockopen($address)

{

if ($this->relay_host == ) {

return $this->smtp_sockopen_mx($address);

} else {

return $this->smtp_sockopen_relay();

}

}

function smtp_sockopen_relay()

{

$this->log_write(Trying to .$this->relay_host.:.$this->smtp_port.\n);

$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {

$this->log_write(Error: Cannot connenct to relay host .$this->relay_host.\n);

$this->log_write(Error: .$errstr. (.$errno.)\n);

return FALSE;

}

$this->log_write(Connected to relay host .$this->relay_host.\n);

return TRUE;;

}

 

function smtp_sockopen_mx($address)

{

$domain = ereg_replace(^.+@([^@]+)$, \1, $address);

if (!@getmxrr($domain, $MXHOSTS)) {

$this->log_write(Error: Cannot resolve MX \.$domain.\\n);

return FALSE;

}

foreach ($MXHOSTS as $host) {

$this->log_write(Trying to .$host.:.$this->smtp_port.\n);

$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {

$this->log_write(Warning: Cannot connect to mx host .$host.\n);

$this->log_write(Error: .$errstr. (.$errno.)\n);

continue;

}

$this->log_write(Connected to mx host .$host.\n);

return TRUE;

}

$this->log_write(Error: Cannot connect to any mx hosts (.implode(, , $MXHOSTS).)\n);

return FALSE;

}

 

function smtp_message($header, $body)

{

fputs($this->sock, $header.\r\n.$body);

$this->smtp_debug(> .str_replace(\r\n, \n.> , $header.\n> .$body.\n> ));

 

return TRUE;

}

 

function smtp_eom()

{

fputs($this->sock, \r\n.\r\n);

$this->smtp_debug(. [EOM]\n);

 

return $this->smtp_ok();

}

 

function smtp_ok()

{

$response = str_replace(\r\n, , fgets($this->sock, 512));

$this->smtp_debug($response.\n);

 

if (!ereg(^[23], $response)) {

fputs($this->sock, QUIT\r\n);

fgets($this->sock, 512);

$this->log_write(Error: Remote host returned \.$response.\\n);

return FALSE;

}

return TRUE;

}

function smtp_putcmd($cmd, $arg = )

{

if ($arg != ) {

if($cmd==) $cmd = $arg;

else $cmd = $cmd. .$arg;

}

fputs($this->sock, $cmd.\r\n);

$this->smtp_debug(> .$cmd.\n);

return $this->smtp_ok();

}

function smtp_error($string)

{

$this->log_write(Error: Error occurred while .$string..\n);

return FALSE;

}

function log_write($message)

{

$this->smtp_debug($message);

if ($this->log_file == ) {

return TRUE;

}

$message = date(M d H:i:s ).get_current_user().[.getmypid().]: .$message;

if (log_file>!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, a))) {

$this->smtp_debug(Warning: Cannot open log file \.$this->log_file.\\n);

return FALSE;;

}

flock($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);


return TRUE;

}


function strip_comment($address)

{

$comment = \([^()]*\);

while (ereg($comment, $address)) {

$address = ereg_replace($comment, , $address);

}


return $address;

}


function get_address($address)

{

$address = ereg_replace(([ \t\r\n])+, , $address);

$address = ereg_replace(^.*<(.+)>.*$, \1, $address);

return $address;

}

function smtp_debug($message)

{

if ($this->debug) {

echo $message;

}

}

}

?>

test.php

<?php

/*

这是一个测试程序!!!

请按照说明设置好以下的参数,以下是以tom.com的用户为例设置好的.

*/

require(sm.php);

##########################################

$smtpserver = smtp.tom.com;//SMTP服务器

$smtpserverport =25;//SMTP服务器端口

$smtpusermail = someone@tom.com;//SMTP服务器的用户邮箱

$smtpemailto = jack@knowsky.com;//发送给谁

$smtpuser = someone;//SMTP服务器的用户帐号

$smtppass = someonepass;//SMTP服务器的用户密码

$mailsubject = Test Subject;//邮件主题

$mailbody = <h1>This is a test mail</h1>;//邮件内容

$mailtype = HTML;//邮件格式(HTML/TXT),TXT为文本邮件

##########################################

$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.

$smtp->debug = TRUE;//是否显示发送的调试信息

$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);

?>


上一篇:动态网站web开发 PHP、ASP还是ASP.NET 下一篇:PHP文本数据库的搜索方法

版权说明:作品来源于网上,版权归作者所有,如果无意中侵犯了您的版权,请来信告知,本站将在3个工作日内删除。yesize@hotmail.com
  热门小游戏分类 
射击小游戏 连连看小游戏
台球小游戏 成人小游戏
CS小游戏 化妆小游戏
赛车小游戏 休闲小游戏
篮球小游戏 换装小游戏
儿童小游戏 牛牛小游戏
麻将小游戏 冒险小游戏
美媚小游戏 益智小游戏
体育小游戏  
Society Recreation & Sports
Travel & Leisure Communications
Vehicles Computers
Fashion Arts & Entertainment
Reference & Education Disease & Illness
Writing & Speaking Politics
Product Reviews Food & Beverage
Finance Internet Business
Self Improvement Home & Family
Health & Fitness Business
最新更新内容
警惕“公务员报考热”背
公务员考试不是丈母娘考
一名新公务员的自白:我
公务员考脑筋急转弯与挂
北努斗:2006行政能力测
大讨论:06行测BT题目大
过来人回忆:当年,我也
一家之言:公务员热折射
公务员考试申论要是有正
数十万大学生走进公务员
      粤ICP备05005424         Copyright ©2000 - 2004 Yesize.COM