Files
openclaw-workspace/tools/proton_imap_test.py
2026-04-11 09:45:12 -05:00

110 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""Quick test of Proton Mail Bridge IMAP connectivity"""
import socket
import ssl
import base64
# Proton Bridge settings
IMAP_HOST = "127.0.0.1"
IMAP_PORT = 1143
USERNAME = "alexthenerdyai@proton.me"
PASSWORD = "8yiNBTJBMc6HyOQjIZKjMw"
def send_command(sock, cmd):
"""Send IMAP command and get response"""
sock.send(f"{cmd}\r\n".encode())
response = b""
while True:
try:
sock.settimeout(5)
chunk = sock.recv(4096)
if not chunk:
break
response += chunk
# Check if we got a complete response (ends with \r\n)
if b"\r\n" in chunk:
break
except socket.timeout:
break
return response.decode()
def main():
print("=" * 50)
print("Proton Mail Bridge IMAP Test")
print("=" * 50)
# Connect to IMAP server
print(f"\n[1] Connecting to {IMAP_HOST}:{IMAP_PORT}...")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
try:
sock.connect((IMAP_HOST, IMAP_PORT))
greeting = sock.recv(1024).decode()
print(f"[OK] Connected! Server: {greeting.strip()}")
except Exception as e:
print(f"[ERR] Connection failed: {e}")
return
# Authenticate with LOGIN
print("\n[2] Authenticating...")
response = send_command(sock, f'A1 LOGIN "{USERNAME}" "{PASSWORD}"')
if "OK" in response and "completed" in response.lower():
print("[OK] Authentication successful!")
elif "OK" in response:
print("[OK] Authentication successful!")
else:
print(f"[ERR] Authentication failed: {response.strip()}")
sock.close()
return
# List folders
print("\n[3] Listing mailboxes...")
# Try LSUB first (subscribed folders)
response = send_command(sock, 'A2a LSUB "" "*"')
print(f"LSUB response:\n{response}")
response = send_command(sock, 'A2b LIST "" "*"')
print(f"LIST response:\n{response}")
folders = []
for line in response.split("\r\n"):
if 'LSUB' in line:
# Parse folder name from LSUB response
if '"/' in line:
folder = line.split('"/"')[-1].strip().strip('"')
else:
folder = line.split()[-1].strip().strip('"')
folders.append(folder)
print(f" [FOLDER] {folder}")
# Check INBOX for unread
print("\n[4] Checking INBOX...")
response = send_command(sock, 'A3 EXAMINE "INBOX"')
print(f"EXAMINE response: {response[:200]}")
# Search for unread messages
response = send_command(sock, 'A4 SEARCH UNSEEN')
print(f"SEARCH response: {response[:200]}")
if 'SEARCH' in response:
unseen = response.split('SEARCH')[1].strip().split()
if unseen and unseen[0] != '':
print(f"[OK] {len(unseen)} unread messages")
else:
print("[OK] No unread messages")
else:
print(" Could not check unread count")
# Logout
print("\n[5] Logging out...")
send_command(sock, "A5 LOGOUT")
print("[OK] Done!")
sock.close()
if __name__ == "__main__":
main()