制作Z-Blog插件“异地登录通知”时需要用到邮件功能,考虑到PHPMailer太大并且很多功能都用不到就没有使用。Google了一下,找到个功能简单又足以插件需求的SMTP发件函数,单独测试了一下,嘿,还行,心里还挺美的。
把函数移植到插件中,我[此处应有哔声——],调了半天愣是没运行成功 ,再看那函数也没看出个所以然来,为了一探究竟便把SMTP发信从SMTP协议到socket通信到PHP代码实现都了解了一遍,自己鼓捣出来一个最简单的SMTP发信函数...[笑哭]

<?php
/**
* PHP使用fsockopen函数SMTP实现发信
*
* @version 1.0
* @date 2017/01/29 22:31
* @author 森林生灵 <admin@lanseyujie.com>
* @link https://www.lanseyujie.com
* @copyright Copyright(c) 2014-2018, lanseyujie.com
*/
function smtp_mailer($mailto, $subject = 'No Subject', $body = 'No Body') {
$smtp_host = 'smtp.lanseyujie.com'; //SMTP服务器地址
$smtp_port = 465; //SMTP服务器端口
$smtp_openssl = 1; //是否使用SSL加密通信
$smtp_debug = 1; //是否debug输出运行信息
$smtp_username = 'service@lanseyujie.com'; //用户账号
$smtp_password = '1234567890abcdefghij'; //用户密码
$smtp_from = 'service@lanseyujie.com'; //发件邮箱
$smtp = array(
//1.EHLO 向服务器标识用户身份发送者 收到 220 或 250 时OK
array("EHLO ". $smtp_host ."\r\n", "220,250", "EHLO: "),
//2.AUTH LOGIN 请求登录认证 334 OK
array("AUTH LOGIN\r\n", "334", "AUTH LOGIN: "),
//3.发送经Base64加密的用户账号 334 OK
array(base64_encode($smtp_username) ."\r\n", "334", "Send Base64 Encode username: "),
//4.发送经Base64加密的用户密码 235 OK
array(base64_encode($smtp_password) ."\r\n", "235", "Send Base64 Encode password: "),
//5.Mail From 发送发件人邮箱 250 OK
array("MAIL FROM: <". $smtp_from .">\r\n", "250", "MAIL FROM: "),
//6.发送收件人邮箱 250 OK
array("RCPT TO: <". $mailto .">\r\n", "250", "RCPT TO: "),
//7.开始发送邮件数据 354 OK
array("DATA\r\n", "354", "DATA Start: "),
//8.0 发件人
array("From: ". $smtp_from ."\r\n", "", ""),
//8.1 收件人
array("To: ". $mailto ."\r\n", "", ""),
//8.2 发件代理客户端
array("X-Mailer: LANSEYUJIE WebMailer 1.0\r\n", "", ""),
//8.3 邮件重要级别 1(Highest) 3(Normal) 5(Lowest)
array("X-Priority: 1 (Highest)\r\n", "", ""),
//8.4 标题
array("Subject: ". $subject ."\r\n", "", ""),
//8.5 编码
array("Content-Type: text/html; charset=\"utf-8\"\r\n", "", ""),
//8.6 内容加密方式
array("Content-Transfer-Encoding: base64\r\n\r\n", "", ""),
//8.7 Base64 Encode Body
array(base64_encode($body) ."\r\n", "", ""),
//9.结束发送邮件数据 250
array("\r\n.\r\n", "250", "DATA End: "),
//10.结束会话
array("QUIT\r\n", "221", "QUIT: ")
);
$info = '';
//建立socket通信
if (1 == $smtp_openssl) {
//SSL加密通信
$fp = @fsockopen('ssl://'. $smtp_host, $smtp_port);
}
else {
//普通无加密通信
$fp = @fsockopen($smtp_host, $smtp_port);
}
if (!$fp) {
$info .= "FSOCKOPEN Error: Cannot conect to ". $smtp_host ."\r\n<br />";
}
//发送smtp数组中的命令/数据
foreach ($smtp as $request) {
//发送请求信息
@fputs($fp, $request[0]);
//接收响应信息
if (1 == $smtp_debug && '' != $request[1]) {
//接收信息
$response = @fgets($fp, 128);
$info .= $request[2] . $response ."\r\n<br />";
}
}
//关闭连接
@fclose($fp);
return $info;
}
echo smtp_mailer('test@lanseyujie.com', 'Mailer Test', '<i style="color: red;font-size: 16px;">This is a test mail to verify the Mailer run or not!</i>');参考链接:
[1] http://blog.csdn.net/tpnndhqc/article/details/51240678
[2] http://www.chilkatsoft.com/p/p_471.asp
[3] http://blog.csdn.net/kerry0071/article/details/28604267
本文标题:fsockopen函数使用SMTP协议发邮件
版权声明:本文使用「署名 4.0 国际」创作共享协议,转载或使用请遵守署名协议。