使用php发邮件二(发邮件流程)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29729735/article/details/80901939

发送邮件过程:
1、配置好你的邮箱服务(qq邮箱为例)
2、使用socket连接,创建一个套接字$fp=fsockopen($hostname,$port,$errno,$errmsg,30)
3、向对方邮件服务器发出的标识自己的身份的命令fputs($fp,"EHLO ki\r\n");
4、即将进行身份认证fputs($fp,"AUTH LOGIN\r\n")
5、发送用户名fputs($fp, base64_encode($sendmail_from)."\r\n");
6、发送密码fputs($fp, base64_encode($sendmail_psw)."\r\n");
7、告诉对方本次邮件的发送人是谁
fputs($fp,"MAIL FROM: <".preg_replace("/.*\&amp;amp;lt;(.+?)\>.*/","\\1",$mail_from).">\r\n");
8、发送给谁fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser).">\r\n");
9、告诉对方本次邮件,接下来我们发送邮件具体内容了fputs($fp, "DATA\r\n");
10、发送内容包括头部和body
11、邮件内容输入完毕,执行指令退出fputs($fp, "QUIT\r\n");

代码:

<?php function dmail($mail_to,$mail_subject,$mail_body,$mail_from='',$mail_sign=true){ $sendmail_from = '@qq.com';//你的邮箱 $sendmail_psw = '';//授权码 $hostname = 'smtp.qq.com'; $port=25; $mail_from = "=?utf-8?B?".base64_encode('tt').'?= <'.$sendmail_from.'>';//这里的=?utf-8?B?标识要写上,如果发送的内容含有中文字符,带上这个标识不会出现乱码 $mail_subject = "=?utf-8?B?".base64_encode($mail_subject)."?="; //主题 $mail_body = stripslashes($mail_body); //内容 $mail_body = chunk_split(base64_encode(str_replace("\r\n.", " \r\n..", str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $mail_body)))))));//将\n\r替换为\r //chunk_split把字符串分割为一连串更小的部分 $mail_dlmt="\r\n";//分隔符 $headers = ''; $headers .= "From: $mail_from".$mail_dlmt; $headers .= "X-Priority: 3".$mail_dlmt; $headers .= "X-Mailer: ki".$mail_dlmt; $headers .= "MIME-Version: 1.0".$mail_dlmt; //MIME的版本 $headers .= "Content-type: text/html; charset=utf-8".$mail_dlmt; //邮件内容的格式 $headers .= "Content-Transfer-Encoding: base64".$mail_dlmt; $host = $hostname.':'.$port.' ' ; if(!$fp=fsockopen($hostname,$port,$errno,$errmsg,30)){ //创建一个套接字 echo "$host can not connect to the SMTP server"; return; } stream_set_blocking($fp,true); $RE =fgets($fp,512); if(substr($RE,0,3) !='220'){ echo 'ERROR'.$host.$RE; return 0; } //向对方邮件服务器发出的标识自己的身份的命令 fputs($fp,"EHLO ki\r\n"); $RE = fgets($fp,512); if(substr($RE,0,3)!=220&&substr($RE,0,3) !=250){ $errmsg = $host.'HELO/EHLO - '.$RE; echo $errmsg; return 0 ; } while(1){ if(substr($RE,3,1) != '-' || empty($RE)) break; $RE = fgets($fp,512); } if(1){ fputs($fp,"AUTH LOGIN\r\n");//即将进行身份认证 $RE = fgets($fp,512); if(substr($RE,0,3)!=334){ exit("ERROR:$host AUTH LOGIN - $RE"); } fputs($fp, base64_encode($sendmail_from)."\r\n"); //用户名使用base64编码才行 $RE = fgets($fp, 512);//334 if(substr($RE, 0, 3) != 334) { $errmsg = $host.'USERNAME - '.$RE; exit($errmsg); } fputs($fp, base64_encode($sendmail_psw)."\r\n"); //密码使用base64编码才行 $RE = fgets($fp, 512);//235 Authentication successful if(substr($RE, 0, 3) != 235) { $errmsg = $host.'PASSWORD - '.$RE; exit($errmsg); } $mail_from = $sendmail_from; } fputs($fp,"MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/","\\1",$mail_from).">\r\n"); //告诉对方本次邮件发送人是谁 $RE = fgets($fp,512); if(substr($RE, 0, 3) != 250) { //出错再发一次 fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $mail_from).">\r\n"); $RE = fgets($fp, 512); if(substr($RE, 0, 3) != 250) { $errmsg = $host.'MAIL FROM - '.$RE; exit($errmsg); } } foreach(explode(',',$mail_to) as $touser){ $touser = trim($touser); if($touser){ fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser).">\r\n"); //发送给谁 $RE = fgets($fp, 512);//250 Ok if(substr($RE, 0, 3) != 250) { fputs($fp, "RCPT TO: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $touser).">\r\n"); $RE = fgets($fp, 512); $errmsg = $host.'RCPT TO - '.$RE; exit($errmsg); } } } fputs($fp, "DATA\r\n"); //告诉对方本次邮件,接下来我们发送邮件具体内容了 $RE = fgets($fp, 512); if(substr($RE, 0, 3) != 354) { $errmsg = $host.'DATA - '.$RE; exit($errmsg); } //内容 list($msec, $sec) = explode(' ', microtime()); $headers .= "Message-ID: <".date('YmdHis', $sec).".".($msec*1000000).".".substr($mail_from, strpos($mail_from,'@')).">".$mail_dlmt; fputs($fp, "Date: ".date('r')."\r\n"); fputs($fp, "To: ".$mail_to."\r\n"); fputs($fp, "Subject: ".$mail_subject."\r\n"); fputs($fp, $headers."\r\n"); fputs($fp, "\r\n\r\n"); fputs($fp, "$mail_body\r\n.\r\n"); $RE = fgets($fp, 512);//250 Ok: queued as if(substr($RE, 0, 3) != 250) { $errmsg = $host.'END - '.$RE; exit($errmsg); } fputs($fp, "QUIT\r\n"); //221 Bye邮件内容输入完毕后,执行该指令退出 return 'SUCCESS'; } dmail("接受者的邮箱@qq.com","主题","内容");

参考链接
https://www.jb51.net/article/112291.htm
https://blog.csdn.net/zb3288/article/details/1929438
https://blog.csdn.net/wsxqaz/article/details/6307906

猜你喜欢

转载自blog.csdn.net/qq_29729735/article/details/80901939