下面是发送多封电子邮件从一个文本文件加载触点的代码。
import time
from time import sleep
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
uname = #[email protected]
name = "KTester"
password = #password1
server = smtplib.SMTP('smtp.gmail.com: 587')
server.starttls()
server.login(uname, password)
message="Test"
msg = MIMEMultipart('Alternative')
f= open("list.txt","r")clear
if f.mode == "r":
cont = f.read().splitlines()
for x in cont:
print time.ctime()
msg['Subject'] = "Test Mail - cripted Sample"
msg['To'] = x
msg['From'] = name+"\x0A\x0D"+uname
msg.attach(MIMEText(message, 'html'))
print "successfully sent email to %s:" % (msg['To'])
f.close()
server.quit()
在这种情况下,第一次编译是预期的结果,我们可以得到,如果我们使用print "successfully sent email to %s:" % (x)
变量“X”在每次迭代的结尾改变其值。
然而,味精[“为”] = X不接受来自环路(上面的第二代码的运行)的第二迭代值。
赋值操作不邮件对象上工作。
用什么去错了请帮助。谢谢!
此行为是由设计。
重新分配到msg['to']
不会覆盖现有的邮件头,它增加了一个。要发送现有消息到你需要设置它之前删除“到”标头的新地址。
del msg['to']
msg['to'] = '[email protected]'
这也适用于其他头了。从文档的Message.__setitem__
:
请注意,这不会覆盖或删除任何现有的头名称相同。如果你想确保新标题是字段名名在邮件中只有一个存在,首先删除字段,例如:
del msg['subject']
msg['subject'] = 'Python roolz!'
(原来的答案的编辑,澄清问题的输出后)
尝试移动以下行for循环:
msg = MIMEMultipart('Alternative')
看起来是这样的:
for x in cont:
msg = MIMEMultipart('Alternative')
print time.ctime()
msg['Subject'] = "Test Mail - cripted Sample"
msg['To'] = x
msg['From'] = name+"\x0A\x0D"+uname
msg.attach(MIMEText(message, 'html'))
print "successfully sent email to %s:" % (msg['To'])
我认为,味精,需要在每次迭代中是新的。
我的测试中取得了完全相同的结果 - 看似遍地发送到相同的电子邮件地址。因为味精头简单地获得附加。 for循环中创建多个到:头,但打印只露出第一。请参阅下面的是什么样子的调试:
Header of To: line in original for loop
内加入味精实例为循环后,输出是与不同的名字每次迭代的预期。
我认为,味精是如何构成的可能是,电子邮件可以有不止一个人在到根:行。上述解决方案假定您只希望每个一个人:行。
在脚本中的主要问题是,你必须= MimeMultipart的(“另类”)以外的for循环定义味精。尝试限定味精= MimeMultipart的(“替代”)内部for循环。
通过@Daniel西姆斯给出,但我已经把你的脚本更具可读性,让大家可以了解该解决方案是相同的
我在我自己的方式,其工作对我来说就像魅力编辑你的代码。试试:
[码]
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# credentials
uname = 'your email address'
name = "KTester"
password = 'password'
# Connecting to gmail server and logging to your gmail account
server = smtplib.SMTP('smtp.gmail.com: 587')
server.starttls()
server.login(uname, password)
message = "Test" # Your message
with open('list.txt', 'r') as lst:
lines = lst.readlines() # Reading files to get emails
for line in lines: # Getting each email from list of emails
msg = MIMEMultipart('Alternative') # This line is added here(which if you have did outside of the for loop)
msg['Subject'] = "Test Mail - cripted Sample"
msg['To'] = line
msg['From'] = '{}{}{}'.format(name, "\x0A\x0D", uname)
msg.attach(MIMEText(message, 'html'))
print(time.ctime())
print("successfully sent email to {}".format(msg['To']))
server.quit()