使用 Python 自动从 Excel 发送电子邮件

2025-06-10

使用 Python 自动从 Excel 发送电子邮件

前几天,我妻子问我能不能帮她想个办法,让她给那些还未付款的客户发通知。我妻子经营着一家小公司,很多事情都要用Excel来做。她问我能不能自动给那些还没付款的客户发送电子邮件,这样她就不用给每个客户都发邮件了。

所以我为她写了一个脚本来自动化这个过程。😃

Excel 文件包含大量信息,但我们将重点介绍最重要的信息——姓名、电子邮件、所在城市、已付款(是/否)以及金额。脚本的工作原理非常简单,我们设置了“已付款”单元格,如果客户尚未付款,我们会向其发送一封个性化电子邮件,提醒其欠款金额。脚本会向所有未付款的客户发送电子邮件。

让我们开始编写代码吧。

'xlrd我们首先安装“。 'Xlrd”是一个用于从 Microsoft Excel (tm) 电子表格文件中提取数据的库。之后,我们将导入'smtplib“。该smtplib模块定义了一个 SMTP 客户端会话对象,可用于将邮件发送到任何具有 SMTP 或 ESMTP 监听守护进程的 Internet 计算机。

让我们导入我们需要的所有东西。

import xlrd
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
Enter fullscreen mode Exit fullscreen mode

之后,我们需要 Excel 文件的路径以及该文件所需的所有信息(姓名、电子邮件、城市、付款、金额)。

path =  "clients.xlsx"
openFile = xlrd.open_workbook(path)
sheet = openFile.sheet_by_name('clients')
Enter fullscreen mode Exit fullscreen mode

我把欠款客户的邮箱、金额和姓名分别放在三个不同的列表中。然后我通过这些列表来查看客户是否已经付款。

mail_list = []
amount = []
name = []
for k in  range(sheet.nrows-1):
    client = sheet.cell_value(k+1,0)
    email = sheet.cell_value(k+1,1)
    paid = sheet.cell_value(k+1,3)
    count_amount = sheet.cell_value(k+1,4)
    if paid ==  'No':
         mail_list.append(email)
         amount.append(count_amount)
         name.append(client)
Enter fullscreen mode Exit fullscreen mode

之后,我们需要专注于发送电子邮件。

email =  'some@gmail.com'
password =  'pass'
server = smtplib.SMTP('smtp.gmail.com',  587)
server.starttls()
server.login(email, password)
Enter fullscreen mode Exit fullscreen mode

我们需要获取索引,这样才能找到该人的名字。

for mail_to in mail_list:
    send_to_email = mail_to
    find_des = mail_list.index(send_to_email)
    clientName = name[find_des]
    subject =  f'{clientName} you have a new email'
    message =  f'Dear {clientName}, \n'  \ 
               f'we inform you that you owe ${amount[find_des]}.  \n'\
               '\n'  \
               'Best Regards'
msg = MIMEMultipart()
msg['From ']  = send_to_email
msg['Subject']  = subject
msg.attach(MIMEText(message,  'plain'))
text = msg.as_string()
print(f'Sending email to {clientName}... ')
server.sendmail(email, send_to_email, text)
Enter fullscreen mode Exit fullscreen mode

最后我们需要确保一切正常。

server.quit()
print('Process is finished!')
time.sleep(10)
Enter fullscreen mode Exit fullscreen mode

让我们把所有内容整合在一起。

import xlrd
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

path = "clients.xlsx"
openFile = xlrd.open_workbook(path)
sheet = openFile.sheet_by_name('clients')


mail_list = []
amount = []
name = []
for k in range(sheet.nrows-1):
    client = sheet.cell_value(k+1,0)
    email = sheet.cell_value(k+1,1)
    paid = sheet.cell_value(k+1,3)
    count_amount = sheet.cell_value(k+1,4)
    if paid == 'No':
        mail_list.append(email) 
        amount.append(count_amount)
        name.append(client)


email = 'some@gmail.com' 
password = 'pass' 
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(email, password)

for mail_to in mail_list:
    send_to_email = mail_to
    find_des = mail_list.index(send_to_email) 
    clientName = name[find_des] 
    subject = f'{clientName} you have a new email'
    message = f'Dear {clientName}, \n' \
              f'we inform you that you owe ${amount[find_des]}. \n'\
              '\n' \
              'Best Regards' 

    msg = MIMEMultipart()
    msg['From '] = send_to_email
    msg['Subject'] = subject
    msg.attach(MIMEText(message, 'plain'))
    text = msg.as_string()
    print(f'Sending email to {clientName}... ') 
    server.sendmail(email, send_to_email, text)

server.quit()
print('Process is finished!')
time.sleep(10) 
Enter fullscreen mode Exit fullscreen mode

谢谢大家

鏂囩珷鏉ユ簮锛�https://dev.to/stokry/automate-sending-emails-from-excel-with-python-3p42
PREV
使用 Vapid CMS 构建网站
NEXT
使用 HTTP 标头实现更快的响应