2009-10-26 2 views
22

Ich entwickle einen leichten Gmail-Client für Mobiltelefone. Es greift auf Gmail per IMAP zu. Dann möchte ich einen Entwurf aus dem Ordner Entwürfe senden, aber es hat einige Anhänge und ich kann nicht alle herunterladen, um es per SMTP zu senden.Wie können Sie E-Mails mit IMAP senden?

Verschieben/kopieren Sie es in "Gesendete Mail" sendet es nicht, verschiebt es einfach in diesen Ordner.

Wie kann ich einen Entwurf direkt senden, ohne alle Inhalte und Anhänge vom Client abzurufen? Gibt es einen IMAP-Befehl, um es zu tun?

+0

Es ist ein Entwurf von einem der [Trojita] (http://trojita.flaska.net/) Autoren diese Funktionalität bereitstellt: https://tools.ietf.org/html/draft-kundrat- imap-submit-02 – Flow

Antwort

37

IMAP ist ein Mailbox-Protokoll. Es unterstützt (nativ) nicht das Senden von E-Mails, sondern nur den Zugriff darauf. Um E-Mails zu senden, müssen Sie SMTP verwenden. Es ist möglich, dass es eine IMAP-Erweiterung zum Senden von E-Mails gibt, und es ist möglich, dass Google Mail diese Erweiterung unterstützt, aber ich bezweifle es. Wenn Sie also eine E-Mail mit Anhängen senden möchten, müssen Sie tatsächlich den vollständigen Inhalt der Nachricht zum Senden zur Verfügung haben.

+1

In der Tat unterstützt Google Mail diese "Erweiterung" nicht. Deshalb habe ich versucht, die Mail direkt in das Feld "Gesendete Mail" zu verschieben. –

1

E-Mail senden ist eine Besonderheit einiger IMAP-Server. Es ist nichts im IMAP-Protokoll. Sie kopieren einfach Ihre E-Mail in ein spezielles IMAP-Verzeichnis auf dem Server und dieser sendet sie. Ich bezweifle, dass Google Mail dies unterstützt.

+0

Welche Server unterstützen dies? Ich habe noch nie davon gehört und möchte es noch genauer untersuchen. Danke! –

+2

Nur ein paar Jahre zu spät ... Anscheinend [Courier Mail Server] (http://www.courier-mta.org/imap/INSTALL.html#imapsend) unterstützt dies. –

12

IMAP wurde entwickelt, um E-Mail-Nachrichten zu empfangen, nicht um sie zu senden. Es gibt keinen IMAP-Befehl zum Senden von E-Mail AFAIK. Es gibt jedoch mindestens einen IMAP-Server, der einen speziellen 'Outbox'-Ordner unterstützt. Wenn Sie die Nachricht in diesem Ordner ablegen, wird sie automatisch gesendet.

Überprüfen Sie Courier-IMAP documentation on Sending mail via an IMAP connection. Beachten Sie, dass dies keine Standardmethode ist und mir kein anderer Server bekannt ist, der dies unterstützt.

Es gibt einen Entwurf für RFC 4468 SMTP erweitern, so dass es den E-Mail-Inhalt vom IMAP-Server abrufen kann, aber ich weiß nicht über jede funktionierende und weit verbreitete Implementierung.

Über Gmail sprechen: mit SMTP zu bleiben ist wahrscheinlich der sicherste Weg zu gehen.

+1

Ich würde gerne wissen, warum das so ist; Ist es rein historisch, dass eine separate Verbindung zum Empfangen und Senden verwendet wird? Liegt es daran, dass POP der Standard war? – Roderick

+0

Es ist hauptsächlich nur, weil SMTP bereits gut eingerichtet wurde, also keine Notwendigkeit, seinen Zweck zu duplizieren, indem E-Mail-Übermittlung Unterstützung in ein anderes Protokoll für einen anderen Zweck erstellt. Es ist nicht schaden, verschiedene Protokolle für die Einreichung und das Lesen zu verwenden - sie sind zwei sehr unterschiedliche Aufgaben, wenn es um E-Mails geht. – thomasrutter

+1

Senden Sie die Nachricht nicht zweimal: einmal an SMPT für die Zustellung und einmal an IMAP für die Speicherung. Dies wäre ineffizient. –

5

Übrigens, jetzt, dass jeder moderne E-Mail-Client (einschließlich der webbasierten) unterstützt einen Ordner Gesendet, müssen Sie sowohl SMTP als auch IMAP verwenden, um eine einzelne Mail zu senden. Und es gibt eine Race-Bedingung zwischen dem Senden der E-Mail über SMTP und erfolgreich Speichern der E-Mail in den Ordner IMAP Gesendet. Die Verwendung von IMAP zum Senden von E-Mails ist eine Möglichkeit, diesen Wettlauf zu vermeiden.

1

Ich habe eine E-Mail an meine eigene E-Mail-Adresse mit IMAP mit Python 3 an ein Google Mail-Konto gesendet. Eine Nachricht wird an ein Postfach angehängt. Sie müssen eine Handvoll nativer Python-Bibliotheken verwenden. Studieren Sie auch diese documentation for imaplib, dieser Code ist im Abschnitt Hochladen von Nachrichten: Um eine neue Nachricht zu einem Postfach hinzufügen, erstellen Sie eine Message-Instanz und übergeben Sie es an die append() -Methode, zusammen mit dem Zeitstempel für die Nachricht.

Dann überprüfen Sie Ihre Gmail-Posteingang und Sie werden die neue Nachricht sehen.

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

Sie senden keine E-Mails - Sie fügen eine E-Mail in Ihr Posteingangspostfach ein, um so angezeigt zu werden, wie Sie sie erhalten haben. Das hat OP nicht verlangt. – ankostis

+0

Der 'encode ('utf-8')' Teil hat das endlich für mich funktioniert. – usumoio