pre 1,Verify smtplib
in Python REPL:
python3 -c "import smtplib; print('SMTP_SSL available' if hasattr(smtplib, 'SMTP_SSL') else 'SMTP_SSL missing')"
输出SMTP_SSL missing,一顿环境和条件的监测操作:
which python3
/usr/local/bin/python3
1. 检查 smtplib.py
是否完整
python3 -c "import smtplib; print(smtplib.__file__)"
/usr/local/lib/python3.9/smtplib.py
运行以下命令检查 smtplib.py
是否包含 SMTP_SSL
:
grep "SMTP_SSL" /usr/local/lib/python3.9/smtplib.py
有输出,说明文件正常,可能是Python加载了错误的版本
python3 -c "from smtplib import SMTP_SSL; print('SMTP_SSL is available')"
false
python3 -c "import sys; print(sys.path)"
['', '/usr/local/lib/python39.zip', '/usr/local/lib/python3.9', '/usr/local/lib/python3.9/lib-dynload', '/usr/local/lib/python3.9/site-packages']
python3
位于 /usr/local/bin/python3
,但 smtplib
在 /usr/local/lib/python3.9/
下。同时,sys.path
显示Python的库路径包含 /usr/local/lib/python3.9
,但 SMTP_SSL
仍然缺失,可能是文件损坏或版本不匹配。
/usr/local/bin/python3.9 -c "import sys; print(sys.version); import ssl; print(ssl.OPENSSL_VERSION)"
/usr/local/bin/python3.9 -c "import sys; print(sys.version); import ssl; print(ssl.OPENSSL_VERSION)"
No module named '_ssl' 问题已经超出了简单的 smtplib
模块损坏,而是 Python 3.9 的 SSL 模块完全缺失(ModuleNotFoundError: No module named '_ssl'
),这会导致所有依赖 SSL/TLS 的功能(包括 SMTP_SSL
)不可用。
_ssl
模块缺失:Python 编译时未正确链接 OpenSSL 库,Python无法导入_ssl
模块,表明SSL支持未正确编译。
2:清除冲突路径
检查并清理 PYTHONPATH
:
echo $PYTHONPATH # 查看是否有自定义路径
unset PYTHONPATH # 临时禁用(测试用)
echo $PYTHONPATH
输出为空,说明当前没有自定义的 Python 模块搜索路径干扰,无冲突。这种情况下,SMTP_SSL
缺失的问题更可能是由于 Python 环境本身异常 或 字节码缓存损坏 导致的
3. 删除字节码缓存
清除可能损坏的 .pyc
文件:
find /usr/local/lib/python3.9 -name "smtplib*.pyc" -delete
find /usr/local/lib/python3.9 -type d -name "__pycache__" -exec rm -rf {} +
4. 手动验证 smtplib.py
内容
确认文件内容完整:
sudo grep -A 10 "class SMTP_SSL" /usr/local/lib/python3.9/smtplib.py
解决方案(分步操作)
第一步:确认OpenSSL开发包完整安装
# 检查openssl-devel是否安装
rpm -qa | grep openssl-devel
# 如果没有输出,安装开发包
sudo yum install openssl-devel -y
# 确认openssl头文件位置
ls /usr/include/openssl/ssl.h
第二步:彻底重装Python 3.9(带SSL支持)
# 进入源码目录
cd /usr/local/src/Python-3.9.16
# 彻底清理旧编译
make distclean
# 配置时显式指定openssl路径
./configure \
--enable-optimizations \
--with-openssl=/usr \
--with-ssl-default-suites=openssl
# 编译安装(使用altinstall避免覆盖系统python)
make -j$(nproc)
sudo make altinstall
第三步:验证SSL模块
# 检查_ssl模块是否存在
ls /usr/local/lib/python3.9/lib-dynload/_ssl*.so
# 测试SSL功能
/usr/local/bin/python3.9 -c "import ssl; print(ssl.OPENSSL_VERSION)"
第四步:解决pip路径警告(可选)
# 将/usr/local/bin加入PATH
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
关键检查点
检查项 | 命令 | 期望结果 |
---|---|---|
OpenSSL开发包 | rpm -qa | grep openssl-devel |
显示已安装的openssl-devel包 |
OpenSSL头文件 | ls /usr/include/openssl/ssl.h |
文件存在 |
Python SSL模块 | ls /usr/local/lib/python3.9/lib-dynload/_ssl*.so |
存在_ssl共享库 |
SSL功能测试 | python3.9 -c "import ssl; print(ssl.OPENSSL_VERSION)" |
显示OpenSSL版本号 |
检查日志
最终验证
成功编译后,你应该能看到:
/usr/local/bin/python3.9 -c "import ssl; print(ssl.OPENSSL_VERSION)"