2016-07-23 6 views
0

Jedes Mal, wenn ich eine E-Mail mit dieser Funktion sende, fügt sie den Betreff und die Nachricht nicht den richtigen Feldern hinzu, sondern fügt sie stattdessen dem Absender hinzu: ' oder so. Here's the image of it. Irgendeine Idee, wie das behoben werden kann? Danke für die AntwortPython Smptlib E-Mail (Falscher Betreff und Nachrichtenfeld)

import smtplib 

## NON-ANONYMOUS EMAIL 
def email(): 
    # Parts of an email 
    SERVER = 'smtp.gmail.com' 
    PORT = 587 
    USER = '[email protected]' 
    PASS = 'something' 
    FROM = USER 
    TO = ['[email protected]'] 
    #SUBJECT = 'Test' 
    MESSAGE = 'Test message.' 

    # Connects all parts of email together 
    message = "From: %s\r\n To: %s\r\n %s" % (FROM, ", ".join(TO), MESSAGE) 

    # Sends an email 
    email = smtplib.SMTP() 
    email.connect(SERVER,PORT) 
    email.starttls() 
    email.login(USER,PASS) 
    email.sendmail(FROM, TO, message) 
    email.quit() 

email() 
+0

können Sie mir zeigen, ein Beispiel dafür, welche Daten in die 'TO' vari geben wird bitte? Zeigen Sie mir zum Beispiel, welcher Code diese 'email' Funktion aufruft. –

+0

Ja. Ich habe sie bereits hinzugefügt. Danke für die Antwort – Kesi

+0

Eigentlich scheint es kein Problem mit '.join' zu sein, wie ich zuerst dachte. Anstatt die "Nachricht" über mehrere Zeilen hinweg zu definieren, ändern Sie sie wie folgt: '" Von:% s \ r \ n Nach:% s \ r \ n Betreff:% s \ r \ n% s " % (FROM, "," .join (TO), SUBJECT, MESSAGE) '. Es ist möglich, dass \ n (newline) nicht dazu führt, dass sendmail die verschiedenen Teile der Nachricht erkennt. Ich habe bemerkt, dass 'send_message' \ r \ n als E-Mail-Trennzeichen verwendet, während' .join (TO) '\ n erzeugt, wenn ich mich nicht irre. –

Antwort

1

Sie können keinen Platz nach dem \r\n haben. Eine E-Mail-Kopfzeile wird fortgesetzt, indem sie eingerückt wird. Daher erstellt Ihr Code einen wirklich langen Header mit allen Daten, die Sie in verschiedene Felder eingeben möchten.

Wie auch immer, manuell zusammenkleben Schnipsel von Nur-Text ist eine wirklich grobe und fehleranfällige Möglichkeit, eine E-Mail-Nachricht zu erstellen. Sie werden bald feststellen, dass Sie die verschiedenen Funktionen des Python email Moduls sowieso benötigen (Legacy-E-Mail ist nur 7-Bit-Single-Part-ASCII; Sie werden wahrscheinlich einen oder mehrere Anhänge, Content-Encoding, Zeichensatz-Unterstützung, Multipart-Nachrichten oder einer der vielen anderen MIME-Funktionen). Dies bietet auch zufällig viel bessere Dokumentation für die Korrektur einer trivialen E-Mail-Nachricht.

0

von @tripleee Vorschlag Im Anschluss an das email Modul zu verwenden, ist hier ein einfaches Beispiel Ihres aktuellen Code verwendet:

import smtplib 
from email.mime.text import MIMEText 

## NON-ANONYMOUS EMAIL 
def email(): 
    # Parts of an email 
    SERVER = 'smtp.gmail.com' 
    PORT = 587 
    USER = '[email protected]' 
    PASS = 'something' 
    FROM = USER 
    TO = ['[email protected]'] 
    SUBJECT = 'Test' 

    # Create the email 
    message = MIMEText('Test message.') 
    message['From'] = FROM 
    message['To'] = ",".join(TO) 
    message['Subject'] = SUBJECT 

    # Sends an email 
    email = smtplib.SMTP() 
    email.connect(SERVER,PORT) 
    email.starttls() 
    email.login(USER,PASS) 
    email.sendmail(FROM, TO, message.as_string()) 
    email.quit() 

Beachten Sie, wie viel einfacher es ist, die Teile der E-Mail mit Tasten wie zu definieren message['Subject'] anstatt zu versuchen, eine Schnur zu bauen oder Teile aneinander zu kleben, wie Triplee es ausdrückte.

Die verschiedenen Felder (Von, Bis, Betreff usw.), auf die Sie zugreifen können, sind in RFC 2822 - Internet Message Format definiert.

Diese Dokumente sind nicht leicht zu lesen, so ist hier eine Liste von einigen der Sie können Tasten Felder verwenden: To, From, Cc, Bcc, Reply-To, Sender, Subject.

You cannot have a space after the \r\n. An email header line is continued by indenting it, so your code is creating a really long From: header with all the data you are trying to put in different fields.

Als TripleE und dem RFC-2822-Dokument sagt, wenn Sie die E-Mail-String manuell an den Felddefinitionen in diesem Dokument aussehen wollen, sind zu bauen, die auf dieses Beispiel wie folgt aussehen:

from = "From:" mailbox-list CRLF

Sie kann dies in Python-Code übersetzen, wenn wie so einen E-Mail-String Aufbau:

"From: [email protected] \r\n"

+0

Habe gerade versucht, aber es zeigt einen Fehler: 'Datei" C: \ python27 \ lib \ email \ quoprimime.py ", Zeile 97, in _max_append L.append (s.lstrip()) AttributeError: 'list' Objekt hat kein Attribut 'lstrip'' Irgendwelche Idee, wie das zu lösen? ** EDIT: ** Warum gibt es das 'as_string()'? – Kesi

+0

'as_string()' konvertiert die Nachricht in eine Zeichenfolge. Dies liegt daran, dass 'MIMEText' eine _Objektstruktur_und' sendmail_ _'msg__ Parameter eine 'Zeichenkette' ist; Sie müssen es konvertieren. Mit anderen Worten, es entspricht dem, was Sie zuvor getan haben, indem Sie die E-Mail-Struktur selbst erstellt haben. Rufen Sie 'print (message.as_string())' auf, um zu sehen. In Bezug auf diesen Fehler verwenden Sie immer noch '", ".join (TO)'? –

+0

(1) Nein, ich habe den ganzen vorherigen Code gelöscht, also verwende ich nicht "", ".join (TO)". (2) Was ist der Unterschied zwischen "message.as_string()" und "str (message)"? – Kesi

Verwandte Themen