2013-01-03 13 views
15

Napisałem skrypt, który zapisuje wiadomość do pliku tekstowego, a także wysyła ją jako e-mail. Wszystko idzie dobrze, z wyjątkiem tego, że wiadomość e-mail w końcu wydaje się być w jednym wierszu.Jak uzyskać podział linii w wiadomościach e-mail wysyłanych przy użyciu smtplib w języku Python?

Dodaję podziały wierszy przez \n i działa dla pliku tekstowego, ale nie dla wiadomości e-mail. Czy wiesz, jaki może być możliwy powód?


Oto mój kod:

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) 

Odpowiedz

12

Masz swoją treść wiadomości uznanych za treść HTML ("Content-Type: text/html"). Kod HTML podziału wiersza to <br>. Należy zmienić typ zawartości na text/plain lub zamiast znacznika \n użyć znacznika HTML dla podziałów wierszy, ponieważ ten ostatni zostanie zignorowany podczas renderowania dokumentu HTML.


Na marginesie przyjrzyj się także email package. Istnieje kilka klas, które mogą uprościć definicję wiadomości e-mail (with examples).

Na przykład można spróbować (niesprawdzone):

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

Niestety dla nas wszystkich, nie każdy rodzaj programu lub aplikacji korzysta z tej samej standaryzacji, że Python robi.

Patrząc na swoje pytanie zauważam Twój nagłówek jest: "Content-Type: text/html"

Czyli trzeba używać znaczników HTML dla stylu nowych linii, nazywane są one line-przerwy. <br>

Twój tekst powinien być:

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

Jeśli wolisz używać rodzaj znaku nowej linii, należy zmienić nagłówek w brzmieniu: "Content-Type: text/plain"

Można by jeszcze zmienić New- znak linii od pojedynczego \n do podwójnego \r\n, który jest używany w e-mailu.

Twój tekst będzie:

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

Dziękuję bardzo. '\ r \ n' nie działa dla mnie, ale' 'r 'robi. –

0

Ustawienie nagłówka Content-Type do Content-Type: text/plain (z \r\n na końcu) pozwolił mi wysłać kilka linii maile zwykłego tekstu.

0

Program Outlook usunie ciągi wierszy ze zwykłego tekstu, który uważa za dodatki. https://support.microsoft.com/en-us/kb/287816

Możesz spróbować poniżej aktualizacji, aby linie wyglądały jak pociski. To działało dla mnie.

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

Dlaczego głosowanie w dół? – edW

Powiązane problemy