2009-10-26 22 views
22

Estoy desarrollando un cliente ligero de Gmail para teléfonos móviles. Accede a Gmail por IMAP. Luego deseo enviar un borrador desde la carpeta Borradores, pero tiene algunos archivos adjuntos y no puedo descargarlos todos para enviarlos por SMTP.¿Cómo se puede enviar un correo usando IMAP?

Moverlo/copiarlo a "Correo enviado" no lo envía, simplemente lo mueve a esa carpeta.

¿Cómo puedo enviar un borrador directamente sin recuperar todo el contenido y los archivos adjuntos del cliente? ¿Hay algún comando IMAP para hacerlo?

+0

Hay un proyecto de uno de los autores [Trojita] (http://trojita.flaska.net/) que proporcionan esta funcionalidad: https://tools.ietf.org/html/draft-kundrat- imap-submit-02 – Flow

Respuesta

37

IMAP es un protocolo de buzón. No admite (de forma nativa) el envío de correo, solo accediendo a él. Para enviar correos electrónicos, debe usar SMTP. Es posible que haya una extensión IMAP para enviar correos, y es posible que Google Mail admita esa extensión, pero lo dudo. Por lo tanto, si desea enviar un correo electrónico con archivos adjuntos, debe tener el contenido completo del mensaje a su disposición para enviarlo.

+1

De hecho, Google Mail no es compatible con esa "extensión". Es por eso que traté de mover el correo al cuadro "Correo enviado" directamente. –

1

El envío de correo electrónico es una característica especial de algunos servidores imap. No hay nada en el protocolo imap. Simplemente copie su correo electrónico en un directorio especial de imap en el servidor y los envía. Dudo que gmail apoye esto.

+0

¿Qué servidor (es) es compatible con esto? Nunca he oído hablar de esto, y me gustaría investigarlo un poco más. Gracias! –

+2

Solo unos años tarde ... Aparentemente [Courier Mail Server] (http://www.courier-mta.org/imap/INSTALL.html#imapsend) es compatible con esto. –

12

IMAP fue diseñado para recibir mensajes de correo electrónico, no para enviarlos. No hay comando IMAP para enviar correos electrónicos AFAIK. Sin embargo, hay al menos un servidor IMAP que admite una carpeta especial de 'Bandeja de salida'. Cuando coloque el mensaje en esta carpeta, se enviará automáticamente.

Verificar Courier-IMAP documentation on Sending mail via an IMAP connection. Tenga en cuenta que este es un método no estándar y no conozco ningún otro servidor que admita esto.

Hay un borrador para RFC 4468 que extiende SMTP para que pueda recuperar el contenido del correo del servidor IMAP, pero no conozco ninguna implementación que funcione y sea ampliamente utilizada.

Hablando de gmail: seguir con SMTP es probablemente la forma más segura de hacerlo.

+1

Me encantaría saber por qué es esto; ¿es puramente histórico que se use una conexión separada para recibir y enviar? ¿Es porque POP solía ser el estándar? – Roderick

+0

Se debe principalmente a que SMTP ya estaba bien establecido, por lo que no hay necesidad de duplicar su propósito mediante la creación de soporte de envío de correo electrónico en otro protocolo diseñado para un propósito diferente. No hay inconveniente en usar diferentes protocolos para enviar y leer; son dos tareas muy diferentes cuando se trata de correo electrónico. – thomasrutter

+1

¿No está enviando el mensaje dos veces: una vez a SMPT para la entrega y una vez a IMAP para el almacenamiento. Esto sería ineficiente. –

5

Por cierto, ahora que cualquier cliente de correo moderno (incluidos los basados ​​en web) admite una carpeta Enviado, típicamente debe usar tanto SMTP como IMAP para enviar un solo correo. Y hay una condición de carrera entre el envío del correo electrónico a través de SMTP y con éxito guardando el correo electrónico en la carpeta IMP Enviado. Usar IMAP para enviar correos electrónicos es una forma de evitar esta condición de carrera.

1

Envié un correo electrónico a mi propia dirección de correo electrónico usando IMAP usando Python 3 a una cuenta de gmail. Lo que hace es agregar un mensaje a un buzón. Necesita utilizar un puñado de bibliotecas nativas de Python. También estudie esto documentation for imaplib, este código aparece en la sección Cargando mensajes: Para agregar un nuevo mensaje a un buzón, construya una instancia de mensaje y páselo al método append(), junto con la marca de tiempo del mensaje.

Luego revisa tu bandeja de entrada de gmail y verás el nuevo mensaje.

import imaplib 
import time 
import email.message 
import imaplib_connect 

new_message = email.message.Message() 
new_message.set_unixfrom('name') 
new_message['Subject'] = 'Test' 
new_message['From'] = '[email protected]' 
new_message['To'] = '[email protected]' 
new_message.set_payload('This is an example message body.\n') 

print(new_message) 

with imaplib_connect.open_connection() as c: 
    c.append('INBOX', '', 
      imaplib.Time2Internaldate(time.time()), 
      str(new_message).encode('utf-8')) 

# Show the headers for all messages in the mailbox 
c.select('INBOX') 
typ, [msg_ids] = c.search(None, 'ALL') 
for num in msg_ids.split(): 
    typ, msg_data = c.fetch(num, '(BODY.PEEK[HEADER])') 
    for response_part in msg_data: 
     if isinstance(response_part, tuple): 
      print('\n{}:'.format(num)) 
      print(response_part[1]) 
+0

No "envía" un correo electrónico; de hecho agrega un correo electrónico en su buzón de 'Bandeja de entrada' para que aparezca tal como lo recibió. Eso no es lo que OP pidió. – ankostis

+0

La parte 'encode ('utf-8')' finalmente consiguió que esto funcione para mí. – usumoio

Cuestiones relacionadas