Python从localhost发邮件报ConnectionRefusedError错误咨询
报错产生原因
- 核心问题是SMTP连接参数使用错误:你代码中
smtplib.SMTP(local_hostname="localhost")的local_hostname参数作用是SMTP握手时本地向服务器宣告的自身主机名,不是你要连接的目标SMTP服务器地址。由于你没有传入目标SMTP的host、port参数,smtplib默认会尝试连接本地IP的25端口。 - OSX 10.11系统默认没有开启本地SMTP转发服务(如postfix),25端口无进程监听,因此直接返回连接拒绝错误,这段代码实际根本没有发起对Gmail服务器的连接,和Gmail的低安全应用限制无关。
- 你之前遇到的低安全应用访问被拦截的问题,是Google全面关闭了普通账号密码登录第三方SMTP的权限,常规的账号密码直连方式已经失效。
修正步骤
- 前置账号配置
- 为你的Gmail账号开启两步验证,未开启两步验证的账号无法生成应用专用密码
- 进入Google账号安全设置页,生成用于邮件发送的16位应用专用密码,妥善保存该密码(仅生成时可见)
- 修正代码逻辑
- 替换连接目标为Gmail官方SMTP服务器
smtp.gmail.com,使用465端口走SSL加密连接 - 发件人字段填写你自己的Gmail邮箱地址,不要填
localhost,否则会被Gmail的反垃圾规则拒收 - 登录时使用你的Gmail邮箱+刚才生成的应用专用密码做鉴权
修正后的可运行代码如下:
import smtplib from email.mime.text import MIMEText # 替换为你自己的Gmail地址和生成的应用专用密码 SENDER_EMAIL = "your.name@gmail.com" APP_PASSWORD = "你生成的16位应用专用密码" RECEIVER_EMAIL = "my.name@gmail.com" content = "Some content" message = MIMEText(content) message['Subject'] = "Some text" message['From'] = SENDER_EMAIL message['To'] = RECEIVER_EMAIL # 连接Gmail的SSL SMTP服务器,不要连本地 with smtplib.SMTP_SSL(host="smtp.gmail.com", port=465) as connection: connection.login(SENDER_EMAIL, APP_PASSWORD) connection.send_message(message) print("邮件发送成功")
注意事项
- 不要在代码里硬编码应用专用密码,正式使用时建议从环境变量或本地加密配置文件读取,避免密码泄露
- 如果运行时出现证书校验错误,先确认你系统的Python根证书库已更新,OSX系统自带的Python可以通过运行对应版本目录下的
Install Certificates.command完成证书更新 - 不要尝试用25端口非加密连接Gmail服务器,Gmail已经全面拦截非加密的邮件传输请求
内容的提问来源于stack exchange,提问作者Neuran
相关产品推荐
相关产品推荐

