Estoy jugando con Python imaplib (Python 2.6) para recuperar correos de GMail. Todo lo que obtengo es un correo electrónico con el método http://docs.python.org/library/imaplib.html#imaplib.IMAP4.fetch Recibo un correo electrónico completo. Solo necesito una parte de texto y también analizar los nombres de los archivos adjuntos, sin descargarlos. ¿Cómo se puede hacer esto? Veo que los correos electrónicos devueltos por GMail siguen el mismo formato que los navegadores envían a los servidores HTTP.Cómo analizar eficientemente correos electrónicos sin tocar archivos adjuntos usando Python
Respuesta
Me temo que estás de suerte. De acuerdo con this post, solo hay dos partes en el correo electrónico: el encabezado y el cuerpo. El cuerpo está donde están los archivos adjuntos si los hay y tienes que descargar todo el cuerpo antes de extraer solo el texto del mensaje. La información sobre el comando FETCH encontrado here también es compatible con esta opinión. Si bien dice que puedes extraer parciales del cuerpo, estos se especifican en términos de octetos, lo que realmente no ayuda.
Echa un vistazo a esta receta: http://code.activestate.com/recipes/498189/
adapté un poco para imprimir el De, Asunto, Fecha, nombre de los archivos adjuntos y el cuerpo del mensaje (solo texto plano por ahora - su trivial para agregar mensajes HTML) .
Usé el servidor Gmail pop3 en este caso, pero también debería funcionar para IMAP.
import poplib, email, string
mailserver = poplib.POP3_SSL('pop.gmail.com')
mailserver.user('recent:YOURUSERNAME') #use 'recent mode'
mailserver.pass_('YOURPASSWORD') #consider not storing in plaintext!
numMessages = len(mailserver.list()[1])
for i in reversed(range(numMessages)):
message = ""
msg = mailserver.retr(i+1)
str = string.join(msg[1], "\n")
mail = email.message_from_string(str)
message += "From: " + mail["From"] + "\n"
message += "Subject: " + mail["Subject"] + "\n"
message += "Date: " + mail["Date"] + "\n"
for part in mail.walk():
if part.is_multipart():
continue
if part.get_content_type() == 'text/plain':
body = "\n" + part.get_payload() + "\n"
dtypes = part.get_params(None, 'Content-Disposition')
if not dtypes:
if part.get_content_type() == 'text/plain':
continue
ctypes = part.get_params()
if not ctypes:
continue
for key,val in ctypes:
if key.lower() == 'name':
message += "Attachment:" + val + "\n"
break
else:
continue
else:
attachment,filename = None,None
for key,val in dtypes:
key = key.lower()
if key == 'filename':
filename = val
if key == 'attachment':
attachment = 1
if not attachment:
continue
message += "Attachment:" + filename + "\n"
if body:
message += body + "\n"
print message
print
Esto debería ser suficiente para conseguir que va en la dirección correcta.
Usted puede obtener sólo el texto del correo electrónico haciendo algo como:
connection.fetch(id, '(BODY[1])')
Para los mensajes de Gmail que he visto, apartado 1 tiene el texto completo, incluyendo la chatarra de varias partes. Esto puede no ser tan robusto.
No sé cómo obtener el nombre del archivo adjunto sin todo. No he intentado usar parciales.
- 1. Cómo recibir correos electrónicos y sus archivos adjuntos de PHP
- 2. Envío de correos electrónicos con archivos adjuntos programáticamente en ASP.NET
- 3. ¿Cómo puedo enviar correos electrónicos usando Python?
- 4. Cómo enviar correos electrónicos corporales HTML con varios archivos adjuntos de texto usando sendmail
- 5. Enviando correos electrónicos con archivos adjuntos desde C#, los archivos adjuntos llegan como parte 1.2 en Thunderbird
- 6. Enviando correos electrónicos usando C
- 7. Enviando correos electrónicos con datos adjuntos en django
- 8. ¿Cómo enviar archivos adjuntos de correo electrónico?
- 9. ¿por qué mi D2009 exe produce correos electrónicos con archivos adjuntos llamados ATTnnnnn.DAT
- 10. Obtener correos electrónicos con Python y poplib
- 11. Recibir y enviar correos electrónicos en python
- 12. Múltiples archivos adjuntos con Swiftmailer
- 13. Envío de correos electrónicos de mhtml - C#
- 14. ¿Cómo envío archivos adjuntos usando SMTP?
- 15. Enviar correos electrónicos asíncronos
- 16. Envío de correos electrónicos en hilos separados usando QueueUserWorkItem
- 17. Decodificación MIME (HTML + archivos adjuntos)
- 18. PHP enlaces/correos electrónicos
- 19. Postfix - ¿Cómo procesar los correos electrónicos entrantes?
- 20. Cómo enviar y recibir correos electrónicos cifrados usando PHP
- 21. Cómo recuperar solo correos electrónicos nuevos usando el protocolo POP3
- 22. ¿Cómo recuperar solo correos electrónicos no leídos usando pop3?
- 23. cómo corregir la forma de enviar correos electrónicos usando codeigniter
- 24. cómo leer correos electrónicos con caracteres especiales
- 25. ¿Cómo puedo enviar correos electrónicos de texto sin formato (con saltos de línea) usando sp_send_dbmail?
- 26. Enviando correos con archivos adjuntos a través del NodeJS
- 27. Cómo enviar correos electrónicos desde MySQL 5.1
- 28. Cómo enviar correos electrónicos usando Amazon SES sin verificar 'de' dirección de correo electrónico
- 29. ¿Cómo eliminar los correos más grandes de mi cuenta de gmail usando un script de python?
- 30. ¿Cómo enviar correos electrónicos firmados de java?
+1 gracias por los punteros. Haré más investigación sobre eso. – Viet