es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comando IMAP UID FETCH: Argumento demasiado largo

Estoy utilizando imaplib (imap4) con Python 3.7.0 y estoy tratando de obtener una carpeta grande y obtengo el siguiente error:

Error en el comando FETCH: BAD [b'Error en el comando IMAP UID FETCH: Argumento demasiado largo (0.001 + 0.122 + 0.122 segundos).']

El código que estoy utilizando es el siguiente:

    def run(self, verifyQueue):
        config = json.load(open("config.json", "r+"))
        client = IMAPClient(host=config.get('imapHost'))
        while True:
            try:
                client.login(config.get('imapUsername'), config.get('imapPassword'))
                client.select_folder(config.get('imapFolder'))
                self.log('Cargado')
                while True:
                    try:
                        client.idle()
                        responses = client.idle_check(timeout=30)
                        if responses:
                            client.idle_done()
                            messages = client.search("UNSEEN")
                            for uid, message_data in client.fetch(messages, "RFC822").items():
                                emailMSG = email.message_from_bytes(message_data[b"RFC822"])

Esto funciona perfectamente para carpetas pequeñas, pero esta carpeta tiene varios miles de correos electrónicos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el argumento pasado al comando UID FETCH es demasiado largo. Esto puede ser debido al gran número de correos electrónicos en la carpeta, lo que provoca que el comando tarde demasiado tiempo en ejecutarse. Puedes intentar dividir el comando fetch en lotes más pequeños utilizando el parámetro limit en el método search para limitar la cantidad de mensajes recuperados cada vez. Por ejemplo, puedes recuperar 100 mensajes a la vez de esta manera:

    messages = client.search("UNSEEN", limit=100)
    for uid, message_data in client.fetch(messages, "RFC822").items():
        emailMSG = email.message_from_bytes(message_data[b"RFC822"])
    

    Puedes ajustar el valor del límite para encontrar el tamaño óptimo del lote para tu caso de uso específico. Además, puedes utilizar el método uid_validity para verificar si la carpeta ha cambiado desde la última recuperación y actualizar tu caché local en consecuencia.

Comments are closed.