Một kết nối IMAP SSL có thể đi qua SOCKS trong khi vẫn giữ máy chủ thư là đối tác TLS của nó. Điểm tích hợp hữu ích là nơi ứng dụng khách tạo ra phương thức vận chuyển của mình, trước khi lời chào IMAP thông thường và việc xử lý khả năng bắt đầu.

Đối với CPython 3.14, phần sau minh họa một bộ điều hợp nhỏ dùng PySocks. Nó ghi đè một hook vận chuyển riêng, vì vậy hãy giữ nó gắn với phiên bản imaplib đang được duy trì:

import imaplib
import ssl
import socks

class SocksIMAP4SSL(imaplib.IMAP4_SSL):
    def _create_socket(self, timeout):
        stream = socks.create_connection(
            (self.host, self.port),
            timeout=timeout,
            proxy_type=socks.SOCKS5,
            proxy_addr="proxy.example",
            proxy_port=1080,
            proxy_rdns=True,
        )
        try:
            return self.ssl_context.wrap_socket(
                stream, server_hostname=self.host)
        except Exception:
            stream.close()
            raise

context = ssl.create_default_context()
with SocksIMAP4SSL("imap.example", ssl_context=context,
                  timeout=15) as mailbox:
    mailbox.noop()

Tên và cổng là các trình giữ chỗ cho một proxy và dịch vụ IMAP đã có sẵn. Đối với một đích IMAP công cộng được phép dùng proxy công cộng, danh sách proxy SOCKS5 cung cấp các ứng viên; mỗi ứng viên phải cho phép máy chủ và cổng thư cần thiết. Phụ thuộc PySocks cung cấp việc thương lượng SOCKS; imaplib vẫn khởi tạo phiên thư. Không có việc thay thế socket.socket toàn cục nào tham gia.

Giữ nguyên danh tính của máy chủ thư

Tên máy chủ TLS vẫn là imap.example. Đó không phải tên máy chủ SOCKS. Việc truyền ssl.create_default_context() cố ý bật các kiểm tra chứng chỉ và tên máy chủ thông thường; chỉ một socket được mã hóa thì không đủ để thiết lập các kiểm tra đó.

proxy_rdns=True yêu cầu đường SOCKS xử lý tên máy chủ đích. Nếu proxy yêu cầu một tài khoản, các đối số thông tin xác thực được hỗ trợ của nó thuộc về cấu hình vận chuyển đó. Chúng không đăng nhập vào hộp thư.

Để việc khởi tạo phiên cho imaplib

Bộ điều hợp trả luồng TLS về cho hàm khởi tạo thông thường. Việc triển khai lại open() từ một ví dụ cũ có thể bỏ sót tham số thời gian chờ, bộ đệm và các kỳ vọng khởi tạo khác. Trong CPython 3.14, ngay cả truy cập file cũ cũng là một thuộc tính tương thích, không phải một trường có thể tái tạo tự do.

Khi nâng cấp thư viện, hãy xem lại hook riêng này so với mã nguồn tương ứng. Nếu việc duy trì một lớp con không phù hợp, hãy chọn một ứng dụng thư có giao diện vận chuyển proxy được ghi lại. Mọi cách bố trí đều nên giữ nguyên sự tách biệt: kết nối proxy, xác minh TLS của đích, sau đó xác thực IMAP.

Bài viết liên quan