---
title: 原生 PHP 手写 SMTP 客户端：用 465 端口发一封漂亮的验证码邮件
site: 星湖の小窝
category: PHP
tags: [PHP, SMTP, 邮件, 踩坑记录]
date: 2026-09-28
updated: 2026-09-30
id: note-php-smtp-465
---

# 原生 PHP 手写 SMTP 客户端：用 465 端口发一封漂亮的验证码邮件

很多个人站点都在用 `mail()` 发信，但服务器没装 sendmail 时它基本发不出去。更稳的做法是直接说 SMTP 协议。

### 1. 握手与加密

465 端口本身就是 SSL 加密通道，连接时用 `ssl://` 前缀即可：

```php
$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 邮箱里会显示乱码：

```php
$subject = '=?UTF-8?B?' . base64_encode($title) . '?=';
```

本项目的完整实现放在 `lib/email.php`，包含连接、认证、投递与调试日志。
