web-dev-qa-db-fra.com

Comment envoyer du courrier avec IMAP?

Je développe un client Gmail léger pour les téléphones mobiles, accédant à Gmail par IMAP. Je souhaite envoyer un brouillon à partir du dossier Brouillons, mais il contient des pièces jointes et je ne peux pas les télécharger toutes pour les envoyer par SMTP.

Le déplacer/le copier dans "Courrier envoyé" ne l'envoie pas, il suffit de le déplacer dans ce dossier.

Comment puis-je envoyer un brouillon directement sans récupérer tout le contenu et les pièces jointes du client? Existe-t-il une commande IMAP pour le faire?

25
Ignacio Lago

IMAP est un protocole de boîte aux lettres. Il ne prend pas (nativement) en charge l'envoi de courrier, il n'y accède que. Afin d'envoyer du courrier vous devez utiliser SMTP. Il est possible qu'il existe une extension IMAP pour l'envoi de courrier, et il est possible que Google Mail prenne en charge cette extension, mais j'en doute. Par conséquent, si vous souhaitez envoyer un e-mail avec des pièces jointes, vous devez en fait avoir le contenu complet du message à votre disposition pour envoyer.

41
Jherico

IMAP a été conçu pour recevoir des e-mails, pas pour les envoyer. Il n'y a pas de commande IMAP pour envoyer des courriels AFAIK. Il existe cependant au moins un serveur IMAP qui prend en charge un dossier spécial "Boîte d'envoi". Lorsque vous placez le message dans ce dossier, il sera envoyé automatiquement.

Vérifiez documentation Courier-IMAP sur l'envoi de courrier via une connexion IMAP . Notez qu'il s'agit d'une méthode non standard et je ne connais aucun autre serveur qui prend en charge cela.

RFC 4468 qui étend SMTP pour qu'il puisse récupérer le contenu du courrier du serveur IMAP, mais je ne connais aucune implémentation fonctionnelle et largement utilisée.

Parler de gmail: s'en tenir à SMTP est probablement le moyen le plus sûr.

13
Martin Vobr

Soit dit en passant, maintenant que tout client de messagerie moderne (y compris les clients Web) prend en charge un dossier Sent, vous devez généralement utiliser à la fois SMTP et IMAP pour envoyer un seul courrier. Et il y a une condition de concurrence entre l'envoi de l'e-mail via SMTP et avec succès l'enregistrement de l'e-mail dans le dossier IMAP Envoyé. L'utilisation d'IMAP pour envoyer des e-mails est un moyen d'éviter cette condition de concurrence.

5
Pavel Šimerda

L'envoi d'e-mails est une fonctionnalité spéciale de certains serveurs imap. Ce n'est rien dans le protocole imap. Vous venez de copier votre e-mail dans un répertoire imap spécial sur le serveur et il les envoie. Je doute que gmail le supporte.

1
Wienczny

J'ai envoyé un e-mail à ma propre adresse e-mail à l'aide d'IMAP en utilisant Python 3 à un compte gmail. Ce qui signifie, c'est ajouter un message à une boîte aux lettres. Vous devez utiliser une poignée de bibliothèques natives de Python. Étudiez également ceci documentation pour imaplib , ce code est présenté dans la section Téléchargement de messages: Pour ajouter un nouveau message à une boîte aux lettres , construisez une instance de Message et passez-la à la méthode append (), avec l'horodatage du message.

Vérifiez ensuite votre boîte de réception Gmail et vous verrez le nouveau message.

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])
1
Joansy