2014-09-24 44 views
1

由于之前尚不清楚,因此编辑。smtplib - 在while循环中缩进时发送但没有主题

如果我运行下面的代码,而没有它在while循环中,它运行完美。只要我把它放在一个while循环(我需要作为更大的脚本的一部分)中,它由于某种原因就会丢失邮件的主题并将其发送给空白。其他一切都可以 - 电子邮件的收件人,发件人和正文都可以。它只是由于某种原因而抛弃了主题。有任何想法吗?这里

import smtplib 
import time 


while True : 
newnumber = "200" 
oldnumber = "100" 
SERVER = "mail" 
FROM = "mail" 
TO = "mail" 
SUBJECT = "Blah blah blah blah blah" 
BODY = """Blah blah blah blah blah.\n\n 
The new number is: %s\n 
The old number is: %s\n\n 
Blah blah blah blah blah.\n\n 
Blah blah blah blah blah\n 
Blah.""" % (newnumber,oldnumber) 

message = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (FROM, TO, SUBJECT, BODY) 

if oldnumber < newnumber: 
     server = smtplib.SMTP(SERVER) 
     server.sendmail(FROM, TO, message) 
     server.quit() 
     time.sleep(60) 
+0

我试着用现有的FROM,TO和SERVER(所以它通过postfix传递)和...我用正确的'From','To'和'Subject'头正确接收它。 – 2014-09-24 12:31:57

+0

当我把它放在while循环中时,它似乎将它的内裤打结。当我缩进时,它会失去这个主题。我不知道如何或为什么会发生这种情况? – 2014-09-24 15:55:54

+0

如果您在循环中遇到问题,但不显示循环,则我不知道问题出在哪里......请显示循环,以便我可以尝试重现问题。等等,*你如何缩进*?标题必须从行首开始,如果不行,我相信读作为延续行。致歉,请致电 – 2014-09-24 16:02:34

回答

1

看到Python文档https://docs.python.org/3.4/library/email-examples.html#email-examples

下面是一个例子发送多部分消息

import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText SERVER = "localhost" 

SERVER = "localhost"  
FROM = "me" 
TO = "you" 
SUBJECT = "Test" 
BODY = "Test" 

# Create message container - the correct MIME type is multipart/alternative. 
msg = MIMEMultipart('alternative') 
msg['Subject'] = SUBJECT 
msg['From'] = FROM 
msg['To'] = TO 
# Record the MIME types of both parts - text/plain and text/html. 
part1 = MIMEText(BODY, 'text') 
# part2 = MIMEText(HTML_BODY, 'html') 

# Attach parts into message container. 
# According to RFC 2046, the last part of a multipart message, in this case 
# the HTML message, is best and preferred. 
msg.attach(part1) 
# msg.attach(part2) 

# Send the message via SMTP server. 
s = smtplib.SMTP(SERVER) 
# sendmail function takes 3 arguments: sender's address, recipient's address 
# and message to send - here it is sent as one string. 
failed_addresses = s.sendmail(mailFrom, mailTo, msg.as_string()) 
+0

AFAIK,OP从不要求多部分HTML邮件! 'smtplib'如果足够单独提出问题。所显示的代码完美地工作。 – 2014-09-24 16:05:34

0

如果您缩进消息块,它可能会导致此问题。考虑简化您的字符串一点:

message = "From: {}\nTo: {}\nSubject: {}\n\n{}" 
message.format(FROM, TO, SUBJECT, BODY) 

现在你可以尽量进出,只要你喜欢没有问题缩进这一点。

1

好的,正如我在我上面的评论中所建议的那样,问题来自于你缩进message。 根据SMTP协议的要求,标题不再位于其行首,它们可能被拒绝进入消息正文。您必须编写之一:

message = "From: %s\nTo: %s\nSubject: %s\n\n%s" % (FROM, TO, SUBJECT, BODY) 

message = """\ 
From: %s 
To: %s 
Subject: %s 

%s\ 
""" % (FROM, TO, SUBJECT, BODY) 

事实上,你必须确保有前From:To:Subject:不能有任何的空间。

您还可以使用smtpd模块测试发送的邮件。

python -m smtpd -c DebuggingServer -n localhost:8025 

将启动监听本地主机端口8025和简单地显示所接收的消息的SMTP服务器。如果你使用它,你会看到标题存在,但它们并没有从第一列开始。

最后的评论:你重新打开每个消息的smtp服务器的新连接。你可以通过下面的方式避开它:

import smtplib 
import time 

server = smtplib.SMTP(SERVER) 
while True : 
    ... 
    if oldnumber < newnumber: 
     server.sendmail(FROM, TO, message) 
     time.sleep(60) 

server.quit() 
1

你需要在邮件的开头提到Subject:

例如在你的情况下,你的消息应该像

message = """Subject: %s 
From: %s 
To: %s 
%s 
""" % (FROM, TO, SUBJECT, BODY) 

我也面临同样的问题,它对我有用。