如何通过SOCKS5代理使用SMTP库发送邮件?连接错误求助
通过SOCKS5代理发送SMTP邮件的问题解决
你的代码存在两个关键错误,导致了代理连接失败:
SOCKS代理地址格式错误
socks.setdefaultproxy的addr参数仅需传入代理的IP或域名,不能附带socks5://前缀及账号密码。账号密码需要通过username和password专属参数单独传递。SMTP端口使用不当
465是SMTP SSL直连端口,应直接使用smtplib.SMTP_SSL创建连接,无需先初始化SMTP对象再调用starttls()。
修正后的完整代码:
import smtplib import socks # 正确配置SOCKS5代理:地址、端口单独传入,账号密码用专属参数 socks.setdefaultproxy( socks.SOCKS5, addr='127.0.0.1', port=8000, username='login', password='password' ) socks.wrapmodule(smtplib) smtpserver = 'smtp.example.com' smtpuser = 'example@mail.com' smtppass = 'password' RECIPIENTS = 'recipient@mail.com' SENDER = 'example@mail.com' # 邮件需符合SMTP格式,添加必要头信息避免被拒收 mssg = """From: {sender} To: {recipient} Subject: Test Proxy Email This is a test message sent via SOCKS5 proxy. """.format(sender=SENDER, recipient=RECIPIENTS) # 465端口使用SMTP_SSL直连 server = smtplib.SMTP_SSL(smtpserver, 465) server.ehlo() server.login(smtpuser, smtppass) server.set_debuglevel(1) server.sendmail(SENDER, [RECIPIENTS], mssg) server.quit()
额外注意事项:
- 确认代理服务器的IP、端口、账号密码真实有效,且服务器支持SOCKS5协议
- 若SMTP服务器使用587端口(STARTTLS端口),需换回
smtplib.SMTP并保留starttls()步骤,代码调整为:server = smtplib.SMTP(smtpserver, 587) server.ehlo() server.starttls() server.ehlo()
内容的提问来源于stack exchange,提问作者Koke
相关产品推荐
相关产品推荐

