2013-01-03 8 views
15

Ich habe ein Skript geschrieben, das eine Nachricht in eine Textdatei schreibt und sie auch als E-Mail versendet. Alles läuft gut, außer die E-Mail scheint schließlich alle in einer Zeile zu sein.Wie erhalten Sie Zeilenumbrüche in E-Mails, die mit Pythons smtplib gesendet werden?

Ich füge Zeilenumbrüche von \n und es funktioniert für die Textdatei, aber nicht für die E-Mail. Weißt du, was der mögliche Grund sein könnte?


Hier ist mein Code:

import smtplib, sys 
import traceback 
def send_error(sender, recipient, headers, body): 

    SMTP_SERVER = 'smtp.gmail.com' 
    SMTP_PORT = 587 
    session = smtplib.SMTP('smtp.gmail.com', 587) 
    session.ehlo() 
    session.starttls() 
    session.ehlo 
    session.login(sender, 'my password') 
    send_it = session.sendmail(sender, recipient, headers + "\r\n\r\n" + body) 
    session.quit() 
    return send_it 


SMTP_SERVER = 'smtp.gmail.com' 
SMTP_PORT = 587 
sender = '[email protected]' 
recipient = '[email protected]' 
subject = 'report' 
body = "Dear Student, \n Please send your report\n Thank you for your attention" 
open('student.txt', 'w').write(body) 

headers = ["From: " + sender, 
       "Subject: " + subject, 
       "To: " + recipient, 
       "MIME-Version: 1.0", 
       "Content-Type: text/html"] 
headers = "\r\n".join(headers) 
send_error(sender, recipient, headers, body) 

Antwort

12

Sie haben Ihren Nachrichtentext ("Content-Type: text/html") haben HTML-Inhalt deklariert. Der HTML-Code für den Zeilenumbruch lautet <br>. Sie sollten entweder den Inhaltstyp auf text/plain ändern oder das HTML-Markup für Zeilenumbrüche anstelle von \n verwenden, da letzteres beim Rendern eines HTML-Dokuments ignoriert wird.


Als eine Randnotiz, werfen Sie auch einen Blick auf die email package. Es gibt einige Klassen, die die Definition von E-Mail-Nachrichten für Sie vereinfachen können (with examples).

Zum Beispiel könnten Sie versuchen (ungetestet):

import smtplib 
from email.mime.text import MIMEText 

# define content 
recipients = ["[email protected]"] 
sender = "[email protected]" 
subject = "report reminder" 
body = """ 
Dear Student, 
Please send your report 
Thank you for your attention 
""" 

# make up message 
msg = MIMEText(body) 
msg['Subject'] = subject 
msg['From'] = sender 
msg['To'] = ", ".join(recipients) 

# sending 
session = smtplib.SMTP('smtp.gmail.com', 587) 
session.starttls() 
session.login(sender, 'my password') 
send_it = session.sendmail(sender, recipients, msg.as_string()) 
session.quit() 
21

Leider für uns alle, nicht jede Art von Programm oder eine Anwendung verwendet die gleiche Standardisierung dass Python tut.

auf Ihre Frage Suche i bemerken, dass Ihr Header ist: "Content-Type: text/html"

Was bedeutet, dass Sie für Ihre neue Zeilen HTML-Stil-Tags verwenden, werden diese Zeilenumbrüche genannt. <br>

soll Ihr Text sein:

"Dear Student, <br> Please send your report<br> Thank you for your attention" 

Wenn Sie lieben Zeichentyp neue Linien verwenden würden, können Sie den Header lesen ändern müssen: "Content-Type: text/plain"

Sie würden immer noch die neuen- ändern müssen Zeilenzeichen von einer einzigen \n zu der Doppel \r\n, die in E-Mail verwendet wird.

Ihr Text wäre:

"Dear Student, \r\n Please send your report\r\n Thank you for your attention" 
+0

Vielen Dank. '\ r \ n' funktioniert nicht für mich, aber die'
'tut. –

0

Einstellen der Content-Type-Header Content-Type: text/plain (mit \r\n am Ende) erlaubt mir Klartext-E-Mails mit mehreren Leitungen zu senden.

0

Outlook entfernt Zeilenvorschübe aus reinem Text, von dem es glaubt, dass es Extras sind. https://support.microsoft.com/en-us/kb/287816

Sie können unter Update versuchen, die Linien wie Kugeln aussehen zu lassen. Das hat für mich funktioniert.

body = "Dear Student, \n- Please send your report\n- Thank you for your attention" 
+0

Warum die down vote? – edW

Verwandte Themen