2016-11-18 3 views
1

Mit Python, schrieb ich einen einfachen Timer, der eine E-Mail sendet, wenn der Timer 0 erreicht. Aber der einzige Teil der Nachricht gesendet wird, ist der Körper. Absenderadresse, Empfängeradresse und Betreff werden nicht gesendet. Hier ist der Code:Python smtplib nur Nachricht senden Körper

#Coffee timer 
import smtplib 

#Set timer for 00:03:00 
from time import sleep 
for i in range(0,180): 
print(180 - i), 
sleep(1) 
print("Coffee is ready") 

print("Sending E-mail") 

SUBJECT = 'Coffee timer' 
msg = '\nCoffee is ready' 
TO = '[email protected]' 
FROM = '[email protected]' 

server = smtplib.SMTP('192.168.1.8') 
server.sendmail(FROM, TO, msg, SUBJECT) 
server.quit() 

print("Done") 

Kann jemand erklären, warum das passiert/was kann ich tun, um es zu lösen?

Antwort

1

Bevor Sie die Nachricht an .sendmail() übergeben, müssen Sie die Nachricht als "RFC822" Nachricht formatieren. (Es heißt, dass nach der ursprünglichen und jetzt veralteten Version des Internet email message format Standard. Die aktuelle Version dieser Norm RFC5322 ist.)

Eine einfache Möglichkeit, RFC822-Nachrichten zu erstellen, ist email.message Typ Hierarchie des Pythons zu verwenden. In Ihrem Fall wird die Unterklasse email.mime.text.MIMEText gut funktionieren.

Versuchen Sie folgendes:

#Coffee timer 
import smtplib 
from email.mime.text import MIMEText 

print("Coffee is ready") 

print("Sending E-mail") 

SUBJECT = 'Coffee timer' 
msg = 'Coffee is ready' 
TO = '[email protected]' 
FROM = '[email protected]' 

msg = MIMEText(msg) 
msg['Subject'] = SUBJECT 
msg['To'] = TO 
msg['From'] = FROM 

server = smtplib.SMTP('192.168.1.8') 
server.sendmail(FROM, TO, msg.as_string()) 
server.quit() 

print("Done") 

Als bequeme Alternative zu .sendmail(), können Sie .send_message() verwenden, etwa so:

# Exactly the same code as above, until we get to smtplib: 
server = smtplib.SMTP('192.168.1.8') 
server.send_message(msg) 
server.quit() 
Verwandte Themen