先上结论:改写IMAP4_SSL 这个类,把网络连接由于 socket 改为 socks 即可。 如果需要发邮件,那么用同样的方法改写SMTP_SSL这个类即可。
# -*-coding: utf-8 -*-
from socks import create_connection, PROXY_TYPE_SOCKS4, PROXY_TYPE_SOCKS5, PROXY_TYPE_HTTP
from imaplib import IMAP4_SSL, IMAP4_PORT, IMAP4_SSL_PORT
from smtplib import SMTP_SSL
import socket
# 收邮件用这个
# 为什么取名SocksIMAP4SSL 而 不叫 ProxyIMAP4SSL? 因为socks库的本质是对socket库的扩展,增加了通过Proxy进行网络通信的支持。 (python自带的socket库不支持proxy)
class SocksIMAP4SSL(IMAP4_SSL):
# __init__ 除了新增三个参数外,其他没有任何改变<------ 执行一次 IMAP4_SSL.__init__ () 把 IMAP4_SSL.__init__ () 的全部继承过来
def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None,
certfile=None, ssl_context=None, proxy_addr=None,
proxy_port=None, rdns=True):
self.proxy_addr = proxy_addr
self.proxy_port = proxy_port
self.rdns = rdns
IMAP4_SSL.__init__(self, host=host, port=port, keyfile=keyfile, certfile=certfile, ssl_context=ssl_context)
# 用 socks.create_connection 替换 socket.create_connection。 一个是socket,一个是socks,一个字母的差别!
def _create_socket(self):
sock = create_connection((self.host, self.port), proxy_type=PROXY_TYPE_HTTP, proxy_addr=self.proxy_addr,
proxy_port=self.proxy_port)
return self.ssl_context.wrap_socket(sock, server_hostname=self.host)
# 发邮件用这个
class SocksSMTP_SSL(SMTP_SSL):
def __init__(self, host='', port=465, local_hostname=None, keyfile=None,
certfile=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
source_address=None, context=None, proxy_addr=None, proxy_port=None):
self.proxy_addr = proxy_addr
self.proxy_port = proxy_port
super().__init__(host, port, local_hostname, keyfile, certfile, timeout, source_address, context)
# 如果有proxy,就用 socks.create_connection 替换 socket.create_connection,否则通过super()用回官方原来的即可。
def _get_socket(self, host, port, timeout):
if self.proxy_addr and self.proxy_port:
sock = create_connection((host, port), timeout, proxy_type=PROXY_TYPE_HTTP, proxy_addr=self.proxy_addr, proxy_port=self.proxy_port)
return self.context.wrap_socket(sock, server_hostname=host)
else:
return super()._get_socket(host, port, timeout)
以上代码已经直接可用。
------------------------------->
另备注:
网易邮箱需额外添加的内容:
收邮件,需要添加:imaplib.Commands['ID'] = ('AUTH')
import imaplib
# 添加缺失的命令
imaplib.Commands['ID'] = ('AUTH')
conn = imaplib.IMAP4_SSL(port = '993',host = 'imap.163.com')
conn.login('XXXX@163.com','HJKHSHDFIWRNKJHI')
# 上传客户端身份信息
args = ("name","XXXX","contact","XXXX@163.com","version","1.0.0","vendor","myclient")
typ, dat = conn._simple_command('ID', '("' + '" "'.join(args) + '")')
print(conn._untagged_response(typ, dat, 'ID'))
status, msgs = conn.select()
通过126发邮件,需要添加:mail_client.set_debuglevel(1) # 解决 500 Error: bad syntax
<

最低0.47元/天 解锁文章
1578

被折叠的 条评论
为什么被折叠?



