很多个人站点都在用 mail() 发信,但服务器没装 sendmail 时它基本发不出去。更稳的做法是直接说 SMTP 协议。
1. 握手与加密
465 端口本身就是 SSL 加密通道,连接时用 ssl:// 前缀即可:
$socket = stream_socket_client(
'ssl://smtp.qq.com:465',
$errno, $errstr, 15
);
if (!$socket) {
exit('连接失败:' . $errstr);
}2. 认证与投递
依次发送 EHLO → AUTH LOGIN(账号、授权码分别 base64)→ MAIL FROM → RCPT TO → DATA,最后用单独一行 . 结束正文。
注意:正文里行首的
.需要转义成两个点,否则会被服务端当成结束标记。
3. 中文主题
主题和发件人名称要用 MIME 编码,否则 QQ 邮箱里会显示乱码:
$subject = '=?UTF-8?B?' . base64_encode($title) . '?=';本项目的完整实现放在 lib/email.php,包含连接、认证、投递与调试日志。