通过代理使用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

<
Python中,imaplib模块用于访问IMAP4(Internet Message Access Protocol version 4)服务器,以便读取、管理电子邮件。如果你想要通过imaplib使用网易邮箱接收邮件,首先你需要满足以下几个条件: 1. **设置邮箱授权码**:由于网易等一些邮箱服务会启用SMTP/IMAP的二次验证,你需要获取一个专用的授权码,通常是在邮箱的安全中心设置里生成。 2. **安装必要的库**:确保已经安装了`imaplib`以及如`smtplib`(用于发送授权码)这样的基础库。如果没有,可以使用pip安装: ``` pip install imaplib smtplib ``` 3. **配置连接信息**: - `host`: 网易邮箱的IMAP服务器地址,通常是`imap.163.com`或`imapsmtp.163.com`; - `port`: 根据网易邮箱是否开启SSL/TLS,可能是993(加密)或143(非加密); - `username` 和 `password` 或 `auth_code`(授权码)。 下面是一个简单的例子,演示如何使用imaplib从网易邮箱接收邮件: ```python import imaplib import email from email.header import decode_header # 连接到IMAP服务器 mail = imaplib.IMAP4_SSL('imap.163.com') mail.login('your_username', 'your_auth_code') # 替换为你的用户名和授权码 # 检查邮箱并选择收件箱 status, mailboxes = mail.list() inbox_idx = mailboxes.index("INBOX") mail.select(inbox_idx) # 搜索未读邮件 typ, data = mail.search(None, "UNSEEN") # 查找所有未读邮件 mail_ids = data[0].split() # 遍历邮件ID,取出邮件内容 for msg_id in mail_ids: typ, raw_message_data = mail.fetch(msg_id, "(RFC822)") # 解析邮件正文 message = email.message_from_bytes(raw_message_data[0][1]) subject, encoding = decode_header(message['Subject'])[0] if isinstance(subject, bytes): subject = subject.decode(encoding) print(f"Subject: {subject}") print(f"From: {message.get('From')}") print("\nMessage Body:\n", message.get_payload()) # 关闭连接 mail.close() mail.logout() ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值