- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个Python脚本来帮助 friend 的课后项目向家长发送学费账单。我在一个{studentName,tutorial}
字典中有学生学费,在另一个{studentName,parentContact}
字典中有学生学费,由于出勤率不同,每个学生的学费数字不同。我有以下功能打算向个别家长发送包含不同学费信息的个人电子邮件。我遇到的问题是,当我从 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 的家长。 parent 。所有家长的学费相同。我该如何解决?非常感谢!
最佳答案
每次循环时,您都会添加另一个 body 部位。因此,第一个家长只收到自己的 body 部位,第二个家长收到两个 body 部位,第一个是前一个学生的 body 部位,依此类推。到循环结束时,最后一个家长收到 n 不同的 body 部位,其中最后一个实际上是他们的,但他们也收到了之前所有学生的 body 部位。
我只需将 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
变量并不是一个错误,但感觉有点困惑。一种常见的设计是有一个字典的字典,其中每个记录都有许多相同的键(在这种情况下,可能是 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
以及如何进行身份验证等)显然取决于您的邮件服务器;我只是使用了您在问题中提供的约定。
关于python - 如何在Python中向不同的收件人发送不同内容的电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48521036/
我是一名优秀的程序员,十分优秀!