通过代理使用imaplib读取邮件

先上结论:改写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

<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值