分享一个直接发送邮件的代码
直接投递到邮件服务器,不需要使用smtp,建议设置spf,支持附件发送<?php
/**
* Email Class
*
* @author eslizn <eslizn@live.cn>
* @package Vendor\Util
* @version $Id
*/
class Email{
var $data;
var $error=array();
var $version='1.0';
var $mailer='Xmailer';
var $charset='UTF-8';
var $type='text/plain';
var $boundary='#25f9e794323b453885f5181f1b624d0b#';
var $subject;
var $message;
var $attach=array();
/**
* 设置邮件主要信息
* @param string $subject 邮件主题
* @param string $message 邮件正文
* @param string $from 邮件发送人
* @param mixed $data 邮件正文替换数据
*/
function __construct($subject,$message,$from,$data=null){
$this->subject=$subject;
$this->message=$message;
$this->from=$from;
$this->data=$data;
}
/**
* 添加附件
* @paramstring $name 附件名
* @parambytes $data 附件数据
* @paramstring $type 附件MIME类型
* @return object
*/
function attach($name,$data,$type){
array_push($this->attach,array(
'type'=>$type,
'name'=>$name,
'data'=>$data
));
return $this;
}
/**
* 增加替换数据
* @paramstring $offset
* @paramstring $value
* @return object
*/
function assign($offset,$value){
$this->data[$offset]=$value;
return $this;
}
/**
* 发送邮件
* @paramstring $to 收件人
* @return boolean
*/
function send($to){
$msg=array();
if($this->version){
array_push($msg, "MIME-Version: {$this->version}");
}
if($this->mailer){
array_push($msg, "X-Mailer: {$this->mailer}");
}
$rule="/(+)\@(+)/i";
if(!preg_match($rule,$to,$to) || !preg_match($rule,$this->from,$from)){
array_push($this->error,'email format error!');
return false;
}
if (!getmxrr($to,$mx)){
array_push($this->error,'get mx record error!');
return false;
}
array_push($msg, "From: {$from} <{$from}>");
array_push($msg, "To: {$to} <{$to}>");
array_push($msg, "Date: ".date("D, t F Y H:i:s O"));
array_push($msg, "Subject: =?{$this->charset}?B?".base64_encode($this->subject)."?=");
if($this->attach){
array_push($msg, "Content-Type: multipart/mixed; boundary=\"{$this->boundary}\"");
}else{
array_push($msg, "Content-Type: {$this->type}; charset={$this->charset}");
}
array_push($msg, "Content-Transfer-Encoding: base64");
if($this->data){
foreach ($this->data as $offset => $value) {
$this->message=str_replace('{.$offset.'}', $value, $this->message);
}
}
if($this->attach){
array_push($msg, "--{$this->boundary}");
array_push($msg, "Content-Type: {$this->type}; charset={$this->charset}");
array_push($msg, "Content-Transfer-Encoding: base64");
array_push($msg, "");
array_push($msg, base64_encode($this->message));
}else{
array_push($msg, "");
array_push($msg, base64_encode($this->message));
}
if($this->attach){
foreach ($this->attach as $attach) {
array_push($msg, "--{$this->boundary}");
array_push($msg, "Content-Type: {$attach['type']}; name=\"{$attach['name']}\"");
array_push($msg, "Content-Transfer-Encoding: base64");
array_push($msg, "");
array_push($msg, base64_encode($attach['data']));
}
}
$cmds=array(
"HELO {$from}",
"MAIL FROM:<{$from}>",
"RCPT TO:<{$to}>",
"DATA",
implode("\r\n",$msg)."\r\n.\r\n",
"QUIT"
);
$fp=fsockopen(current($mx),25);
foreach($cmds as $val){
fwrite($fp,$val."\r\n");
$status=fgets($fp);
if(preg_match('/^(\d+) ([\w\W]+)$/', $status,$status)){
if(!in_array($status, array(220, 354, 214, 211, 250, 251))){
array_push($this->error, $status);
return false;
}
}
}
fclose($fp);
return true;
}
/**
* 获取错误信息
* @return
*/
function getError(){
return $this->error;
}
}
页:
[1]