设为首页 收藏本站
查看: 596|回复: 0

[经验分享] php工具类之【邮件发送类】

[复制链接]

尚未签到

发表于 2017-4-4 11:03:07 | 显示全部楼层 |阅读模式
class email {
var $mail;
var $recipient;
var $title;
var $content;
var $sender;
var $delimiter;
var $header;
var $charset;
function __construct(&$mail) {
$this->email($mail);
}
function email(&$mail) {
$this->mail = $mail;
$this->charset = CHARSET;
}
function send($recipient, $title, $content, $sender = '') {
if($this->mail['silent']) {
error_reporting(0);
}
$tousers = array();
foreach(explode(',', $recipient) as $touser) {
$tousers[] = preg_match('/^(.+?) \<(.+?)\>$/', $touser, $to) ? '=?'.$this->charset.'?B?'.base64_encode($to[1])."?= <$to[2]>" : $touser;
}
$this->recipient = implode(',', $tousers);
$this->title = '=?'.$this->charset.'?B?'.base64_encode(str_replace(array("\r", "\n"), '', $title)).'?=';
$this->content = chunk_split(base64_encode(str_replace(array("\n\r", "\r\n", "\r", "\n", "\r\n."), array("\r", "\n", "\n", "\r\n", " \r\n.."), $content)));
$this->delimiter = $this->mail['delimiter'] == 1 ? "\r\n" :
($this->mail['delimiter'] == 2 ? "\r" : "\n");
$this->sender = preg_match('/^(.+?) \<(.+?)\>$/', $sender, $from) ? '=?'.$this->charset.'?B?'.base64_encode($from[1])."?= <$from[2]>" : $sender;
$this->header = "From: $this->sender{$this->delimiter}".
"X-Priority: 3{$this->delimiter}".
"X-Mailer: Email{$this->delimiter}".
"MIME-Version: 1.0{$this->delimiter}".
"Content-type: text/plain; charset={$this->charset}{$this->delimiter}".
"Content-Transfer-Encoding: base64{$this->delimiter}";
$this->mail['port'] = $this->mail['port'] ? $this->mail['port'] : 25;
if($this->mail['type'] == 1) {
return $this->sendMail();
} elseif($this->mail['type'] == 2) {
return $this->socketSmtp();
} elseif($this->mail['type'] == 3) {
return $this->phpSmtp();
}
}
function sendMail() {
if(!function_exists('mail')) {
return array('status' => 1, 'error' => 'SendMail\tFunction "mail()" NOT exists!');
}
if(@mail($this->recipient, $this->title, $this->content, $this->header)) {
return array('status' => 0);
} else {
return array('status' => 2, 'error' => 'PHP Mail\tPHP sendmail error!');
}
}
function socketSmtp() {
$error = "({$this->mail[server]}:{$this->mail[port]})";
if(!$fp = fsockopen($this->mail['server'], $this->mail['port'], $errno, $errstr, 30)) {
return array('status' => 4, 'error' => "SMTP\t$error CONNECT - Unable to connect to the SMTP server");
}
stream_set_blocking($fp, true);
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != '220') {
return array('status' => 5, 'error' => "SMTP\t$error CONNECT - $lastmessage");
}
fputs($fp, ($this->mail['auth'] ? 'EHLO' : 'HELO')." hello\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 220 && substr($lastmessage, 0, 3) != 250) {
return array('status' => 6, 'error' => "SMTP\t$error HELO/EHLO - $lastmessage");
}
while(1) {
if(substr($lastmessage, 3, 1) != '-' || empty($lastmessage)) {
break;
}
$lastmessage = fgets($fp, 512);
}
if($this->mail['auth']) {
fputs($fp, "AUTH LOGIN\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 334) {
return array('status' => 7, 'error' => "SMTP\t$error AUTH LOGIN - $lastmessage");
}
fputs($fp, base64_encode($this->mail['auth_username'])."\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 334) {
return array('status' => 8, 'error' => "SMTP\t$error USERNAME - $lastmessage");
}
fputs($fp, base64_encode($this->mail['auth_password'])."\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 235) {
return array('status' => 9, 'error' => "SMTP\t$error PASSWORD - $lastmessage");
}
$this->sender = $this->mail['auth_from'];
}
fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $this->sender).">\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 250) {
fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $this->sender).">\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 250) {
return array('status' => 10, 'error' => "SMTP\t$error MAIL FROM - $lastmessage");
}
}
foreach(explode(',', $this->recipient) as $touser) {
$touser = trim($touser);
if($touser) {
fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser).">\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 250) {
fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser).">\r\n");
$lastmessage = fgets($fp, 512);
return array('status' => 11, 'error' => "SMTP\t$error RCPT TO - $lastmessage");
}
}
}
fputs($fp, "DATA\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 354) {
return array('status' => 12, 'error' => "SMTP\t$error DATA - $lastmessage");
}
$this->header .= 'Message-ID: <'.gmdate('YmdHs').'.'.substr(md5($this->content.microtime()), 0, 6).rand(100000, 999999).'@'.$_SERVER['HTTP_HOST'].">{$this->delimiter}";
fputs($fp, "Date: ".gmdate('r')."\r\n");
fputs($fp, "To: ".$this->recipient."\r\n");
fputs($fp, "Subject: ".$this->title."\r\n");
fputs($fp, $this->header."\r\n");
fputs($fp, "\r\n\r\n");
fputs($fp, "$this->content\r\n.\r\n");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 250) {
return array('status' => 13, 'error' => "SMTP\t$error END - $lastmessage");
}
fputs($fp, "QUIT\r\n");
return array('status' => 0);
}
function phpSmtp() {
if(!function_exists('mail')) {
return array('status' => 1, 'error' => 'SendMail\tFunction "mail()" NOT exists!');
}
ini_set('SMTP', $this->mail['server']);
ini_set('smtp_port', $this->mail['port']);
ini_set('sendmail_from', $this->sender);
if(@mail($this->recipient, $this->title, $this->content, $this->header)) {
return array('status' => 0);
} else {
return array('status' => 3, 'error' => 'PHP SMTP\tPHP smtp mail error!');
}
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-359990-1-1.html 上篇帖子: PHP生成唯一会员卡号 下篇帖子: php工具类之【文件上传类】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表