Reputation: 23
I'm trying to connect to an IMAP server through a SOCKS5 proxy using Python. However, I keep encountering the error: Socket error: 0x02: Connection not allowed by ruleset. Below is the code I'm using:
import imaplib
import socks
import socket
import ssl
import requests
from requests.auth import HTTPProxyAuth
# Proxy configuration
PROXY_HOST = "178.xx.xx.xxx"
PROXY_PORT = 10300
PROXY_USERNAME = "xxx"
PROXY_PASSWORD = "xxx"
# Email configuration
IMAP_SERVER = "imap.gmx.com"
IMAP_PORT = 993
EMAIL = "[email protected]"
PASSWORD = "xxxxx"
def check_proxy_connection():
session = requests.Session()
session.proxies = {
"http": f"http://{PROXY_USERNAME}:{PROXY_PASSWORD}@{PROXY_HOST}:{PROXY_PORT}",
"https": f"http://{PROXY_USERNAME}:{PROXY_PASSWORD}@{PROXY_HOST}:{PROXY_PORT}"
}
try:
response = session.get("http://api.myip.com", timeout=10)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
print(f"An error occurred: {e}")
return None
# Check the proxy connection
proxy_response = check_proxy_connection()
if proxy_response:
print(f"Proxy is working. Response from api.myip.com:\n{proxy_response}")
else:
print("Proxy is not working. Exiting the script.")
exit()
# Set up the proxy with authentication
socks.set_default_proxy(
socks.SOCKS5,
PROXY_HOST,
PROXY_PORT,
username=PROXY_USERNAME,
password=PROXY_PASSWORD
)
socket.socket = socks.socksocket
try:
# Create an SSL context
ssl_context = ssl.create_default_context()
# Connect to the IMAP server through the proxy
imap_client = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT, ssl_context=ssl_context)
# Login to the email account
imap_client.login(EMAIL, PASSWORD)
print("Successfully logged in")
# List available mailboxes
status, mailboxes = imap_client.list()
if status == 'OK':
print("Available mailboxes:")
for mailbox in mailboxes:
print(mailbox.decode())
# Select the inbox
imap_client.select('INBOX')
# Search for emails
status, messages = imap_client.search(None, 'ALL')
if status == 'OK':
message_numbers = messages[0].split()
print(f"Number of emails in inbox: {len(message_numbers)}")
# Fetch the latest email
if message_numbers:
latest_email_id = message_numbers[-1]
status, msg_data = imap_client.fetch(latest_email_id, '(RFC822)')
if status == 'OK':
print("Latest email fetched successfully")
# Here you can process the email content if needed
# raw_email = msg_data[0][1]
# email_message = email.message_from_bytes(raw_email)
# ...
except imaplib.IMAP4.error as e:
print(f"An IMAP error occurred: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
finally:
try:
imap_client.logout()
print("Logged out and closed the connection")
except Exception as e:
print(f"Failed to close the connection cleanly: {e}")
Error Message:
An unexpected error occurred: Socket error: 0x02: Connection not allowed by ruleset
Steps I've Taken:
Verified that the proxy works by checking the response from http://api.myip.com.
Attempted to connect to the IMAP server through the proxy using imaplib.IMAP4_SSL.
Environment:
Python version: 3.12.3
pysocks library for proxy handling
IMAP server: imap.gmx.com
Proxy: SOCKS5 with authentication
What could be causing the "Connection not allowed by ruleset" error when connecting through the SOCKS5 proxy? Are there any additional steps I need to take to properly configure the proxy for IMAP connections?
Upvotes: 1
Views: 218