Skip to content

Instantly share code, notes, and snippets.

@Anthonybelui
Last active August 31, 2023 17:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Anthonybelui/eca1bf3bea6729c1ef98b5bda1be958f to your computer and use it in GitHub Desktop.
Save Anthonybelui/eca1bf3bea6729c1ef98b5bda1be958f to your computer and use it in GitHub Desktop.
Python (v2 - v3) - IMAP through SOCKS proxy using PySocks module (UPDATE 20/02/2023)
import ssl
import socks
from imaplib import IMAP4
from imaplib import IMAP4_PORT
from imaplib import IMAP4_SSL_PORT
__author__ = "sstevan" # update 0.2 Tony
__license__ = "GPLv3"
__version__ = "0.2"
class SocksIMAP4(IMAP4):
"""
IMAP service trough SOCKS proxy. PySocks module required.
"""
PROXY_TYPES = {"socks4": socks.PROXY_TYPE_SOCKS4,
"socks5": socks.PROXY_TYPE_SOCKS5,
"http": socks.PROXY_TYPE_HTTP}
def __init__(self, host, port=IMAP4_PORT, proxy_addr=None, proxy_port=None,
rdns=True, username=None, password=None, proxy_type="http", timeout=None):
self.proxy_addr = proxy_addr
self.proxy_port = proxy_port
self.rdns = rdns
self.username = username
self.password = password
self.proxy_type = SocksIMAP4.PROXY_TYPES[proxy_type.lower()]
IMAP4.__init__(self, host, port, timeout)
def _create_socket(self, timeout=None):
return socks.create_connection((self.host, self.port), proxy_type=self.proxy_type, proxy_addr=self.proxy_addr,
proxy_port=self.proxy_port, proxy_rdns=self.rdns, proxy_username=self.username,
proxy_password=self.password, timeout=timeout)
class SocksIMAP4SSL(SocksIMAP4):
def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None, proxy_addr=None,
proxy_port=None, rdns=True, username=None, password=None, proxy_type="http", timeout=None):
if ssl_context is not None and keyfile is not None:
raise ValueError("ssl_context and keyfile arguments are mutually "
"exclusive")
if ssl_context is not None and certfile is not None:
raise ValueError("ssl_context and certfile arguments are mutually "
"exclusive")
self.keyfile = keyfile
self.certfile = certfile
if ssl_context is None:
ssl_context = ssl._create_stdlib_context(certfile=certfile,
keyfile=keyfile)
self.ssl_context = ssl_context
SocksIMAP4.__init__(self, host, port, proxy_addr=proxy_addr, proxy_port=proxy_port,
rdns=rdns, username=username, password=password, proxy_type=proxy_type, timeout=timeout)
def _create_socket(self, timeout=None):
sock = SocksIMAP4._create_socket(self, timeout=timeout)
server_hostname = self.host if ssl.HAS_SNI else None
return self.ssl_context.wrap_socket(sock, server_hostname=server_hostname)
# Looks like newer versions of Python changed open() method in IMAP4 lib.
# Adding timeout as additional parameter should resolve issues mentioned in comments.
# Check https://github.com/python/cpython/blob/main/Lib/imaplib.py#L202 for more details.
def open(self, host='', port=IMAP4_PORT, timeout=None):
SocksIMAP4.open(self, host, port, timeout)
@skords
Copy link

skords commented Feb 28, 2023

Remove
from socks import create_connection from socks import PROXY_TYPE_SOCKS4 from socks import PROXY_TYPE_SOCKS5 from socks import PROXY_TYPE_HTTP
and add import socks

@Anthonybelui
Copy link
Author

Remove
from socks import create_connection from socks import PROXY_TYPE_SOCKS4 from socks import PROXY_TYPE_SOCKS5 from socks import PROXY_TYPE_HTTP
and add import socks

Updated, thanks

@aholovenko
Copy link

aholovenko commented Jun 20, 2023

Hi! I get

Traceback (most recent call last):
  File "/home/user/.pyenv/versions/ver/lib/python3.10/site-packages/socks.py", line 809, in connect
    negotiate(self, dest_addr, dest_port)
  File "/home/user/.pyenv/versions/ver/lib/python3.10/site-packages/socks.py", line 443, in _negotiate_SOCKS5
    self.proxy_peername, self.proxy_sockname = self._SOCKS5_request(
  File "/home/user/.pyenv/versions/ver/lib/python3.10/site-packages/socks.py", line 475, in _SOCKS5_request
    raise GeneralProxyError(
socks.GeneralProxyError: SOCKS5 proxy server sent invalid data

Any idea why this might be happening?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment