【问题标题】:How to send different content email to different recipient in Python?如何在 Python 中向不同的收件人发送不同的内容电子邮件?
【发布时间】:2022-03-22 13:54:49
【问题描述】:

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

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 的父母。所有父母的学费相同。我该如何解决?非常感谢!

【问题讨论】:

  • 你能把输入参数贴出来吗? studentParentContact & studentTuition

标签: python email


【解决方案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的dict,其中每条记录都有许多相同的键(在这种情况下,可能student[s]['parent_email']获取父母的电子邮件,student[s]['name']获取学生的全名,student[s]['tuition']获取学费等。最终,您可能希望将这些封装为 student 类的属性。)

由于email 库在 Python 3.6 中进行了大修,新代码可能应该使用新的EmailMessage API 而不是旧的MIMEMultipart 等。您会注意到它比旧代码简单一点:

from email.message import EmailMessage

...

    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]

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

            s.send_message(message)
        s.quit()

您应该使用SMTP_SSL 还是纯未加密的SMTP(然后是哪个端口,以及是否使用starttls 以及如何进行身份验证等)显然取决于您的邮件服务器;我只是使用了您在问题中提供的约定。

【讨论】:

  • 非常感谢您的帮助,将 msg = MimeMultipart() 移入循环确实解决了问题,也感谢您对如何处理学生的学费和家长联系数据的好建议,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 2016-01-06
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多