由于php没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。
首先是使用telnet来连接本地的25端口,稍微熟悉点网络的人都知道smtp协议使用25端口,这也就是说,现在在连接本地的smtp服务器。
这些东西是系统输出信息,说明已经连接上了,而且这个smtp服务器是postfix做的。
“MAIL FROM: teste@dominio.com.br”这个命令指明了发件地址是teste@dominio.com.br,“250 Ok”说明这条命令被服务器接受并正确执行,这类似http协议的200、404、500等状态代码。接下来的“RCPT TO: teste@dominio.com.br”指明了收件地址是teste@dominio.com.br。
这一段是输入邮件正文,输入“DATA”以后系统提示使用“<回车>.<回车>”来结束输入,正文内容是“teste”。
最后使用“QUIT”退出。
以上就是最简单的一次发送mail的过程,从这个例子我们可以看出,发送mail其实是很简单的事情,实质上也就是建立一个对smtp服务器的连接,然后发送一些简单的命令给它,一封内容简单的邮件就发送出去了,至于更加复杂内容的邮件或者操作,其实也就是在此基础上稍加扩展而已。
把这个过程用php来实现,其实就是利用php的Socket functions、Network Functions等等操作socket的函数来和smtp服务器建立一个连接,然后发送文本的命令给服务器
require_once 'Mail.php';
$conf['mail'] = array(
'host' => 'xx.xx.xx.xx', //smtp服务器地址,可以用ip地址或者域名
'auth' => true, //true表示smtp服务器需要验证,false代码不需要
'username' => 'tester', //用户名
'password' => 'retset' //密码
);
/***
* 使用$headers数组,可以定义邮件头的内容,比如使用$headers['Reply-To']可以定义回复地址
* 通过这种方式,可以很方便的定制待发送邮件的邮件头
***/
$headers['From'] = 'tester@domain.com'; //发信地址
$headers['To'] = 'tester@domain.com'; //收信地址
$headers['Subject'] = 'test mail send by php'; //邮件标题
$mail_object = &Mail::factory('smtp', $conf['mail']);
$body = <<< MSG //邮件正文
hello world!!!
MSG;
$mail_res = $mail_object->send($headers['To'], $headers, $body); //发送
if( Mail::isError($mail_res) ){ //检测错误
die($mail_res->getMessage());
}
?>
其实用smtp协议发送邮件很简单,用框架或者原生都可以,我们需要用到class.phpmailer.php 和class.smtp.php,可以去网上下载。
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
写了一个mail_send.php然后引入一个封装的类
// 接收值
isset($_POST['address'])?$address=$_POST['address']:$address='';
isset($_POST['titles'])?$titles=$_POST['titles']:$titles='';
isset($_POST['content'])?$content=$_POST['content']:$content='';
isset($_POST['user'])?$user=$_POST['user']:$user='';
//引入类
require 'Mail.class.php';
if( Mail::send($titles,$contents,$user,$address)){
echo "发送成功";
}else{
echo "发送失败".'
';
echo Mail::$error;
}
?>
3、这里是我们封装好了一个类(Mail.class.php)上面引入的类
header("content-type:text/html;charset=utf-8");
//引入原来的类文件
require 'class.phpmailer.php';
class Mail {
static public $error = '';
static public function send($title,$content,$user,$address){
$mail= new PHPMailer();
/*服务器相关信息*/
$mail->IsSMTP(); //设置使用SMTP服务器发送
$mail->SMTPAuth = true; //开启SMTP认证
$mail->Host = 'smtp.163.com'; //设置 SMTP 服务器,自己注册邮箱服务器地址 QQ则是ssl://smtp.qq.com
$mail->Username = 'zzy9i7'; //发信人的邮箱名称,本人网易邮箱 zzy9i7@163.com 这里就写
$mail->Password = '******'; //发信人的邮箱密码
/*内容信息*/
$mail->IsHTML(true); //指定邮件格式为:html *不加true默认为以text的方式进行解析
$mail->CharSet ="UTF-8"; //编码
$mail->From = 'zzy9i7@163.com'; //发件人完整的邮箱名称
$mail->FromName = $user; //发信人署名
$mail->Subject = $title; //信的标题
$mail->MsgHTML($content); //发信主体内容
//$mail->AddAttachment("15.jpg"); //附件
/*发送邮件*/
$mail->AddAddress($address); //收件人地址
//使用send函数进行发送
if($mail->Send()) {
return true;
} else {
self::$error=$mail->ErrorInfo;
return false;
}
}
}
?>
phpmail有这个类