上次课我们讲了电子邮件的发送流程以及不同形式的邮件的发送。 本节课我们以一个实例来讲下 Python 在自动化发送电子邮件方面对效率的提升。
# 1.批量电子邮件的发送
在例子中,我们有一个 Excel 文档,文档内容如下图所示: 在上面的文档中,第一列为成员名称,第二列为成员的邮箱地址,后面各列为每个成员在每个月的付款情况。我们现在要做的是针对每个成员最后一个月未付款的发邮件提醒付款。如果成员数较多,手动发送这些邮件不但耗时而又容易出错。像这种每封邮件内容的格式固定的场景是自动化的用武之处。下面我们来看下自动化发送这些邮件的代码:
import openpyxl
import smtplib
import sys
from email.message import EmailMessage
wb = openpyxl.load_workbook('duesRecords.xlsx')
ws = wb['Sheet1']
lastCol = ws.max_column
latestMonth = ws.cell(row=1, column=lastCol).value
unpaidMembers = {}
for r in range(2, ws.max_row + 1):
payment = ws.cell(row=r, column=lastCol).value
if payment != 'paid':
name = ws.cell(row=r, column=1).value
email = ws.cell(row=r, column=2).value
unpaidMembers[name] = email
msg = EmailMessage()
server = 'smtp.qq.com'
port = 465
email_sender = '******@qq.com'
passwd = '******'
with smtplib.SMTP_SSL(server, port) as server:
server.login(email_sender, passwd)
for name, email in unpaidMembers.items():
body = "Dear %s,\nRecords show that you have not paid dues Ior %s. Please make this payment as soon as possible. Thank you!'" % (name, latestMonth)
print('Sending email to %s...' % email)
msg['From'] = email_sender
msg['to'] = email
msg['Subject'] = f'SubMect: {latestMonth} dues unpaid.'
msg.set_content(body)
status = server.send_message(msg)
if status != {}:
print('There was a problem sending email to %s: %s' % (email, status))
msg.clear()
print('Done!')
server.quit()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
在上面的代码中:
1.获取最后一个月未付款的用户的名称和邮箱地址。 2.循环遍历未付款的用户,为每个用户发邮件,提醒其进行付款。
这便是自动化发送批量邮件的流程。在上面的代码中有一点要注意的是,在发送完一封邮件后进行邮件内容的清空。