Archived
refactor: SMTP 发信改 aiosmtplib,最后一个阻塞网络调用从 to_thread 里取出来
为什么:smtplib 是同步栈,原先靠 asyncio.to_thread 卸载——线程池里躺着的仍是一次 完整的 TCP + TLS 握手加多轮 SMTP 交互,属于「同步网络 IO 藏在 to_thread 里」:既 占着线程,也不产生并发收益。这是本系列最后一条此类遗留(aria2p 那条已在 C2 清零)。 改动: - auth_system/mail.py:_smtp_connect / _smtp_send 两个同步函数合成一个原生异步 _smtp_send,底层换 aiosmtplib.SMTP。TLS 口径与原实现一一对应:465 用 use_tls (隐式 TLS),其余端口用 start_tls(显式 STARTTLS,先握手再 LOGIN);两条路都传 显式构造的 ssl.create_default_context(),不依赖运行时默认校验口径。finally 里 quit 失败只吞连接关闭错误,sendmail 的真实异常原样上抛——send_verify_code 依赖 它决定「不写库、不烧 24h 额度」。 - auth_system/mail.py:send_email 改直接 await;移除 import asyncio / import smtplib。 - auth_system/__init__.py:撤掉 _smtp_connect 的再导出——它是同步时代的辅助函数, 全仓无消费方,新实现里也不存在对应物。 - web/routers/register.py:更新过时的模块说明(原文仍写「smtplib 阻塞发送已卸载」)。 - pyproject.toml / uv.lock:新增 aiosmtplib>=5.1.3,<6.0。 - tests/test_mail_smtp.py(新增 5 条):SMTP 路径此前零覆盖,而「端口 → TLS 方式」 的映射属「授权码会不会明文过网」级别的差异,一旦被改反不会有任何地方报警。用假 SMTP 替身记录构造参数与调用序、全程不触网:587 必须 start_tls 且 LOGIN 在 connect 之后、465 必须 use_tls 且不得再叠 STARTTLS、端口缺省回落 587、quit 失败不掩盖结果、 sendmail 失败原样上抛且仍关连接。 验证: - uv run ruff check . → All checks passed! - uv run pyright → 0 errors, 0 warnings, 0 informations (aiosmtplib 自带 py.typed,故对它的调用是有效类型校验;另用 inspect 逐一核对了 5.1.3 的 SMTP / connect / login / sendmail / quit 参数名) - uv run pytest → 397 项,0 失败 / 0 error / 0 skipped(C3 后 392,新增 5) - data/site.db sha256 前后一致(a19f5dbf…6487),无 -wal/-shm 残留
This commit is contained in:
1 parent
e8cc7cb34a
commit
22b263f547
6 files changed
+158
-26
No files matched your search
@@ -124,6 +124,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "aiosmtplib"
|
||||
version = "5.1.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/9b/5c/9cabc5db6d607616e81ba6d8f1f231cd5a75955807a308c1090a59072d6d/aiosmtplib-5.1.3.tar.gz", hash = "sha256:ac2b418d3260ba62d9cfd0fe7359726e9dc009a4e8e8d9909fdfae332f522a7c", size = 77010, upload-time = "2026-09-08T02:11:20.532Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/9c/0a/b56ab8163d54960337fdca475d3dfd56c8badf6172e79cf2ad00d5335dc1/aiosmtplib-5.1.3-py3-none-any.whl", hash = "sha256:f7d76ce3d4995a65a178c1f11e1bd1607706b921d00cb768e7a2c7f7ef5517a8", size = 30116, upload-time = "2026-09-08T02:11:19.352Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "aiosqlite"
|
||||
version = "0.22.1"
|
||||
@@ -1512,6 +1521,7 @@ version = "3.0.0"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "aiohttp" },
|
||||
{ name = "aiosmtplib" },
|
||||
{ name = "aiosqlite" },
|
||||
{ name = "cryptography" },
|
||||
{ name = "fastapi" },
|
||||
@@ -1536,6 +1546,7 @@ dev = [
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
{ name = "aiohttp", specifier = ">=3.10,<4.0" },
|
||||
{ name = "aiosmtplib", specifier = ">=5.1.3,<6.0" },
|
||||
{ name = "aiosqlite", specifier = ">=0.20,<1.0" },
|
||||
{ name = "cryptography", specifier = ">=50.0,<51.0" },
|
||||
{ name = "fastapi", specifier = ">=0.115,<1.0" },
|
||||
|
||||
Reference in new issue
Block a user