Python: ¿cómo puedo obtener correos electrónicos a través de POP o IMAP a través de un proxy?
(3)
Ni poplib ni imaplib parecen ofrecer soporte proxy y no pude encontrar mucha información al respecto a pesar de mis intentos de google-fu.
Estoy usando python para buscar correos electrónicos de varios servidores habilitados para imap / pop y necesito poder hacerlo a través de proxies.
Idealmente, me gustaría poder hacerlo en python directamente, pero usar un contenedor (programa externo / script, basado en OSX) para forzar todo el tráfico a pasar por el proxy podría ser suficiente si no puedo encontrar algo mejor.
¿Alguien podría darme una mano? No me puedo imaginar que soy el único que alguna vez necesitó buscar correos electrónicos a través de un proxy en Python ...
** EDITAR edición de título para eliminar HTTP, porque no debería escribir tan rápido cuando estoy cansado, lo siento por esos chicos **
Los proxies que planeo usar permiten calcetines además de http.
El trabajo de Pop o Imap a través de http no tendría mucho sentido (de estado frente a sin estado) pero mi entendimiento es que los calcetines me permitirían hacer lo que quisiera.
Hasta ahora, la única forma de lograr lo que quiero parece ser un hacking sucio de imaplib ... preferiría evitarlo si pudiera.
Responde a mi propia pregunta ... Hay una forma rápida y sucia de forzar el tráfico de una secuencia de comandos python para pasar por un proxy sin problemas usando Socksipy (gracias MattH por señalarme de esa manera)
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,proxy_ip,port,True)
socket.socket = socks.socksocket
Esa anulación de socket global es, obviamente, un poco brutal, pero funciona como una solución rápida hasta que encuentre el momento de subclasificar adecuadamente IMAP4 e IMAP4_SSL.
No es necesario que piratee vilmente imaplib. Podría intentar usar el paquete SocksiPy, que es compatible con socks4, socks5 y http proxy (connect):
Algo como esto, obviamente querrías manejar mejor las opciones de setproxy, a través de argumentos adicionales a un método __init__
personalizado, etc.
from imaplib import IMAP4, IMAP4_SSL, IMAP4_PORT, IMAP4_SSL_PORT
from socks import sockssocket, PROXY_TYPE_SOCKS4, PROXY_TYPE_SOCKS5, PROXY_TYPE_HTTP
class SocksIMAP4(IMAP4):
def open(self,host,port=IMAP4_PORT):
self.host = host
self.port = port
self.sock = sockssocket()
self.sock.setproxy(PROXY_TYPE_SOCKS5,''socks.example.com'')
self.sock.connect((host,port))
self.file = self.sock.makefile(''rb'')
Podría hacer algo similar con IMAP4_SSL. Sólo tenga cuidado de envolverlo en un zócalo ssl
import ssl
class SocksIMAP4SSL(IMAP4_SSL):
def open(self, host, port=IMAP4_SSL_PORT):
self.host = host
self.port = port
#actual privoxy default setting, but as said, you may want to parameterize it
self.sock = create_connection((host, port), PROXY_TYPE_HTTP, "127.0.0.1", 8118)
self.sslobj = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
self.file = self.sslobj.makefile(''rb'')
Si te entiendo correctamente estás tratando de poner una clavija cuadrada en un agujero redondo.
Un proxy HTTP solo sabe cómo "hablar" HTTP, por lo que no puede conectarse directamente a un servidor POP o IMAP.
Si quieres hacer esto, necesitarás implementar tu propio servidor en alguna parte para hablar con los servidores de correo. Recibirá solicitudes HTTP y luego realizará las llamadas apropiadas al servidor de correo. P.ej:
Qué práctico sería esto. No lo sé, ya que tendría que convertir un protocolo con estado en uno sin estado .