php hpsocket,php win下Socket方式发邮件类

本文介绍了一个使用PHP编写的SMTP Socket类,用于发送电子邮件,解决了传统mail()函数存在的问题。通过实例配置和发送邮件过程,展示了如何通过SMTP身份验证和自定义邮件头进行高效邮件发送。

复制代码代码如下:

/*

*phpsmtp发送邮件Scoket类

*ZhozPhpSmtpSendMail.php

*Createdon2008/09/02zhoz.com

*@authorzhoz

*v1.72update2008/09/26zhoz.Com

*/

classZhozPhpSmtpSendMail{

//您的SMTP服务器供应商,可以是域名或IP地址

var$smtp="";

//SMTP需要要身份验证设值为1,不需要身份验证值为0,现在大多数的SMTP服务商都要验证,如不清楚请与你的smtp服务商联系。

var$check=1;

//您的email帐号名称

var$username="";

//您的email密码

var$password="";

//此email必需是发信服务器上的email

var$s_from="";

/*

*功能:发信初始化设置

*$from你的发信衿魃系挠氏?

*$password你的邮箱密码

*$smtp您的SMTP服务器供应商,可以是域名或IP地址

*$checkSMTP需要要身份验证设值为1不需要身份验证值为0,现在大多数的SMTP服务商都要验证

*/

functionZhozPhpSmtpSendMail($from,$password,$smtp,$check=1){

if(preg_match("/^[^\d\-_][\w\-]*[^\-_]@[^\-][a-zA-Z\d\-]+[^\-](\.[^\-][a-zA-Z\d\-]*[^\-])*\.[a-zA-Z]{2,3}/",$from)){

$this->username=substr($from,0,strpos($from,"@"));

$this->password=$password;

$this->smtp=$smtp?$smtp:$this->smtp;

$this->check=$check;

$this->s_from=$from;

}

}

/*

*功能:发送邮件

*$to目标邮箱

*$from来源邮箱

*$subject邮件标题

*$message邮件内容

*/

functionzhoz_send($to,$from,$subject,$message){

//连接服务器

$fp=fsockopen($this->smtp,25,$errno,$errstr,60);

if(!$fp)return"联接服务器失败".__LINE__;

set_socket_blocking($fp,true);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=220)return"错误信息1:$lastmessage".__LINE__;

//HELO

$yourname="YOURNAME";

if($this->check=="1")$lastact="EHLO".$yourname."\r\n";

else$lastact="HELO".$yourname."\r\n";

fputs($fp,$lastact);

$lastmessage==fgets($fp,512);

if(substr($lastmessage,0,3)!=220)return"错误信息2:$lastmessage".__LINE__;

while(true){

$lastmessage=fgets($fp,512);

if((substr($lastmessage,3,1)!="-")or(emptyempty($lastmessage)))

break;

}

//身份验证

if($this->check=="1"){

//验证开始

$lastact="AUTHLOGIN"."\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=334)return"错误信息3:$lastmessage".__LINE__;

//用户姓名

$lastact=base64_encode($this->username)."\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=334)return"错误信息4:$lastmessage".__LINE__;

//用户密码

$lastact=base64_encode($this->password)."\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!="235")return"错误信息5:$lastmessage".__LINE__;

}

//FROM:

$lastact="MAILFROM:s_from.">\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=250)return"错误信息6:$lastmessage".__LINE__;

//TO:

$lastact="RCPTTO:\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=250)return"错误信息7:$lastmessage".__LINE__;

//DATA

$lastact="DATA\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=354)return"错误信息8:$lastmessage".__LINE__;

//处理Subject头

$head="Subject:$subject\r\n";

$message=$head."\r\n".$message;

//处理From头

$head="From:$from\r\n";

$message=$head.$message;

//处理To头

$head="To:$to\r\n";

$message=$head.$message;

//加上结束串

$message.="\r\n.\r\n";

//发送信息

fputs($fp,$message);

$lastact="QUIT\r\n";

fclose($fp);

error_log("sendover------->ok!!",0);

returntrue;

}

}

?>

/*

*phpsmtp发送邮件Scoket类

*ZhozPhpSmtpSendMail.php

*Createdon2008/09/02zhoz.com

*@authorzhoz

*v1.72update2008/09/26zhoz.Com

*/

classZhozPhpSmtpSendMail{

/

/您的SMTP服务器供应商,可以是域名或IP地址

var$smtp="";

//SMTP需要要身份验证设值为1,不需要身份验证值为0,现在大多数的SMTP服务商都要验证,如不清楚请与你的smtp服务商联系。

var$check=1;

//您的email帐号名称

var$username="";

//您的email密码

var$password="";

//此email必需是发信服务器上的email

var$s_from="";

/*

*功能:发信初始化设置

*$from你的发信服务器上的邮箱

*$password你的邮箱密码

*$smtp您的SMTP服务器供应商,可以是域名或IP地址

*$checkSMTP需要要身份验证设值为1不需要身份验证值为0,现在大多数的SMTP服务商都要验证

*/

functionZhozPhpSmtpSendMail($from,$password,$smtp,$check=1){

if(preg_match("/^[^\d\-_][\w\-]*[^\-_]@[^\-][a-zA-Z\d\-]+[^\-](\.[^\-][a-zA-Z\d\-]*[^\-])*\.[a-zA-Z]{2,3}/",$from)){

$this->username=substr($from,0,strpos($from,"@"));

$this->password=$password;

$this->smtp=$smtp?$smtp:$this->smtp;

$this->check=$check;

$this->s_from=$from;

}

}

/*

*功能:发送邮件

*$to目标邮箱

*$from来源邮箱

*$subject邮件标题

*$message邮件内容

*/

functionzhoz_send($to,$from,$subject,$message){

//连接服务器

$fp=fsockopen($this->smtp,25,$errno,$errstr,60);

if(!$fp)return"联接服务器失败".__LINE__;

set_socket_blocking($fp,true);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=220)return"错误信息1:$lastmessage".__LINE__;

//HELO

$yourname="YOURNAME";

if($this->check=="1")$lastact="EHLO".$yourname."\r\n";

else$lastact="HELO".$yourname."\r\n";

fputs($fp,$lastact);

$lastmessage==fgets($fp,512);

if(substr($lastmessage,0,3)!=220)return"错误信息2:$lastmessage".__LINE__;

while(true){

$lastmessage=fgets($fp,512);

if((substr($lastmessage,3,1)!="-")or(empty($lastmessage)))

break;

}

//身份验证

if($this->check=="1"){

//验证开始

$lastact="AUTHLOGIN"."\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=334)return"错误信息3:$lastmessage".__LINE__;

//用户姓名

$lastact=base64_encode($this->username)."\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=334)return"错误信息4:$lastmessage".__LINE__;

//用户密码

$lastact=base64_encode($this->password)."\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!="235")return"错误信息5:$lastmessage".__LINE__;

}

//FROM:

$lastact="MAILFROM:s_from.">\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=250)return"错误信息6:$lastmessage".__LINE__;

//TO:

$lastact="RCPTTO:\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=250)return"错误信息7:$lastmessage".__LINE__;

//DATA

$lastact="DATA\r\n";

fputs($fp,$lastact);

$lastmessage=fgets($fp,512);

if(substr($lastmessage,0,3)!=354)return"错误信息8:$lastmessage".__LINE__;

//处理Subject头

$head="Subject:$subject\r\n";

$message=$head."\r\n".$message;

//处理From头

$head="From:$from\r\n";

$message=$head.$message;

//处理To头

$head="To:$to\r\n";

$message=$head.$message;

//加上结束串

$message.="\r\n.\r\n";

//发送信息

fputs($fp,$message);

$lastact="QUIT\r\n";

fclose($fp);

error_log("sendover------->ok!!",0);

returntrue;

}

}

?>

测试方法一样。

运行代码查看代码复制代码打印关于

/**

*ZhozPhpSmtpSendMail.php

*Createdon2008/09/02zhoz.com

*phpsmtp发送邮件类

*代替mail():因为它报错,我又不想

*/

//这里配置发信服务器信息,如果不改也可以正常使用:

$from='zhoz@zhoz.com';//你的发信服务器上的邮箱

$password='zhoz';//你的邮箱密码

$smtp='smtp.zhoz.com'

;//您的SMTP服务器供应商,可以是域名或IP地址

//类初始化

$zhoz_obj=newZhozPhpSmtpSendMail($from,$password,$smtp);

//发送开始

$status=$zhoz_obj->zhoz_send("zhoz008@126.com","zhoz@zhoz.com","subjectiszhoz","bodyiszhoz.com");

if($status){

echo$status;

echo"no---------";

}else{

echo"sendok-----------------!";

die;

}

//结果当然是:sendok-----------------!

?>

您可能感兴趣的文章:使用PHPSocket写的POP3类php自定义类fsocket模拟post或get请求的方法PHP的Socket网络编程入门指引PHP基于socket实现客户端和服务端通讯功能PHP利用Socket获取网站的SSL证书与公钥用PHP的socket实现客户端到服务端的通信实例详解php中使用websocket详解PHP使用socket发送HTTP请求的方法利用PHP如何实现Socket服务器PHPSocket网络操作类定义与用法示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值