在蟒蛇while循环电子邮件标头:更新“为”

问题描述 投票:1回答:3

下面是发送多封电子邮件从一个文本文件加载触点的代码。

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()

OUTPUT:enter image description here

在这种情况下,第一次编译是预期的结果,我们可以得到,如果我们使用print "successfully sent email to %s:" % (x)

变量“X”在每次迭代的结尾改变其值。

然而,味精[“为”] = X不接受来自环路(上面的第二代码的运行)的第二迭代值。

赋值操作不邮件对象上工作。

用什么去错了请帮助。谢谢!

python python-2.7 mime multipart smtplib
3个回答
1
投票

此行为是由设计。

重新分配到msg['to']不会覆盖现有的邮件头,它增加了一个。要发送现有消息到你需要设置它之前删除“到”标头的新地址。

del msg['to']
msg['to'] = '[email protected]'

这也适用于其他头了。从文档的Message.__setitem__

请注意,这不会覆盖或删除任何现有的头名称相同。如果你想确保新标题是字段名名在邮件中只有一个存在,首先删除字段,例如:

del msg['subject']

msg['subject'] = 'Python roolz!'


0
投票

(原来的答案的编辑,澄清问题的输出后)

尝试移动以下行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

Output of original for loop

内加入味精实例为循环后,输出是与不同的名字每次迭代的预期。

我认为,味精是如何构成的可能是,电子邮件可以有不止一个人在到根:行。上述解决方案假定您只希望每个一个人:行。


0
投票

在脚本中的主要问题是,你必须= 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()
© www.soinside.com 2019 - 2024. All rights reserved.