如何在Python中向不同的收件人发送不同的内容电子邮件?

时间:2018-01-30 12:03:54

标签: python email-integration

我正在编写一个python脚本来帮助朋友的课后计划向家长发送学费账单。我有{studentName, tuition} dict中的学生学费,以及另一个{studentName, parentContact} dict中的家长联系,由于出勤率不同,每个学生的学费编号不同。我有以下功能打算向个别父母发送带有不同学费信息的个人电子邮件。我遇到的问题是,当我运行我的python脚本时,从python shell,当我打印出来时,看起来不同的电子邮件具有不同的学费号码是针对不同的父母,但每个父母收到的实际电子邮件是相同的副本第一个学生的学费信息。这是我的发送电子邮件功能:

def send_mail(studentParentContact, studentTuition):
    msg=MIMEMultipart()
    msg['Subject'] = 'Your kid After-school Program Tuition Bill'
    msg['From'] = FLPEmail   #after-school program's email address

    # Send the message via SMTP server
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.starttls()
    s.login(username, PASSWORD)  #after-school program gmail login

    for student in studentParentContact:    
        ParentEmail=studentParentContact[student]
        tuition=studentTuition[student]
        msg['To'] = ParentEmail
        body="Hi, \nThe tuition for "+student+' is '+'$'+ str(tuition)
        msg.attach(MIMEText(body, 'plain'))
        text=msg.as_string()
        print FLPEmail, ParentEmail, text
        s.sendmail(FLPEmail, ParentEmail, text)
    s.quit()

因此,不是将学生A的学费信息发送给A的父母,学生B的学费信息给B的父母,学生C的学费信息给C的父母,现在的实际结果是它将A的学费信息发送给A和B以及C的父母。所有父母的学费相同。我该如何解决?非常感谢你!

1 个答案:

答案 0 :(得分:1)

每次循环都会添加另一个正文部分。所以第一个父母只接收他们自己的身体部位,第二个父母接收两个身体部位,第一个是前一个学生的部分,等等。在循环结束时,最后一个父母接收 n 不同的身体部位,其中最后一个实际上是他们的,但他们也接受了以前所有学生的那些。

我只是简单地在循环中移动msg = MimeMultipart()等初始化;无论如何,回收一个空的多部分是一个可疑的优化(当然,到目前为止,你回收的那个并不空)。

如果您只发送一个零件,无论如何将它放在一个多件容器内是毫无意义的。

def send_mail(studentParentContact, studentTuition):
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.starttls()
    s.login(username, PASSWORD)

    for student in studentParentContact:    
        ParentEmail=studentParentContact[student]
        tuition=studentTuition[student]

        body="Hi, \nThe tuition for "+student+' is '+'$'+ str(tuition)
        msg=MIMEText(body, 'plain')
        msg['Subject'] = "Your Kid's After-school Program Tuition Bill"
        msg['From'] = FLPEmail    
        msg['To'] = ParentEmail

        text=msg.as_string()
        #print FLPEmail, ParentEmail, text
        s.sendmail(FLPEmail, ParentEmail, text)
    s.quit()

使用相同键的多个dict变量不是一个错误,但感觉有点混乱。一个常见的设计是有一个dicts的词典,其中每个记录都有许多相同的键(在这种情况下,可能是student[s]['parent_email']来获取父母的电子邮件,student[s]['name']来获取学生和#39;全名,student[s]['tuition']以获得学费等。最后,您可能希望将这些内容封装为student类的属性。)