很多个人站点都在用 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,包含连接、认证、投递与调试日志。