Python邮件自动化批量处理实用技巧指南

目录

一、环境准备与基础操作

1. 安装必要库

2. 配置邮箱

3. 发送简单邮件

二、邮件内容高级处理

1. 发送HTML格式邮件

2. 使用模板生成邮件内容

三、邮件附件处理

1. 添加单个附件

2. 批量添加附件

四、结合schedule实现定时邮件发送

五、总结


在日常工作和生活中,我们经常需要发送邮件,比如批量通知、营销推广、日报自动发送、服务器告警提醒等。手动发送邮件不仅繁琐,而且容易出错。幸运的是,Python提供了强大的smtplib和email模块,可以实现邮件的自动化发送,无论是纯文本邮件,还是带附件、HTML格式的邮件,都能轻松搞定。本文将详细介绍如何使用Python批量发送邮件、添加附件、发送HTML邮件,并结合schedule实现定时邮件发送,让你的工作更智能、更高效。

一、环境准备与基础操作

1. 安装必要库

Python自带的smtplib和email模块无需额外安装,但如果你需要定时发送邮件,可以安装schedule库。安装命令如下:

pip install schedule

2. 配置邮箱

以QQ邮箱为例,登录QQ邮箱后,在设置中找到“账户”选项,开启POP3/SMTP服务,并获取授权码(用于代替密码)。其他邮箱的配置过程大同小异,一般需要开启SMTP服务并生成授权码。

3. 发送简单邮件

下面是一个发送简单文本邮件的示例代码:

import smtplib
from email.mime.text import MIMEText
 
def send_email(subject, content, to_addr):
    # 邮件配置
    from_addr = 'your_email@qq.com'
    password = 'your_authorization_code'  # 授权码
 
    # 创建邮件内容
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = subject
 
    # 发送邮件
    try:
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败:{str(e)}")
 
# 使用示例
send_email('测试邮件', '这是一封测试邮件', 'recipient@example.com')

在这段代码中,我们首先导入了必要的库,然后定义了send_email函数,用于发送邮件。在函数内部,我们设置了发件人邮箱、授权码和收件人邮箱,并创建了邮件内容。接着,我们使用SMTP服务器发送邮件,并处理可能的异常。

二、邮件内容高级处理

1. 发送HTML格式邮件

HTML格式的邮件可以包含超链接、图片和自定义样式,使邮件内容更加美观。下面是一个发送HTML格式邮件的示例代码:

from email.mime.text import MIMEText
 
def send_html_email(subject, html_content, to_addr):
    from_addr = 'your_email@qq.com'
    password = 'your_authorization_code'
 
    msg = MIMEText(html_content, 'html', 'utf-8')
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = subject
 
    try:
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败:{str(e)}")
 
# 使用示例
html_content = """
<h1>月度报告</h1>
<p>以下是本月的主要数据:</p>
<ul>
    <li>销售额:¥120,000</li>
    <li>新增客户:15</li>
    <li>客户满意度:95%</li>
</ul>
"""
send_html_email('月度报告', html_content, 'manager@example.com')

在这段代码中,我们只需要将邮件内容设置为HTML格式的字符串,并将MIMEText的第二个参数设置为'html'即可。

2. 使用模板生成邮件内容

为了简化邮件内容的编写,我们可以使用模板生成邮件内容。下面是一个使用模板生成HTML邮件内容的示例代码:

from string import Template
from email.mime.text import MIMEText
 
def generate_email_content(template_file, data):
    with open(template_file, 'r', encoding='utf-8') as file:
        template = Template(file.read())
    return template.substitute(data)
 
# 模板文件示例(template.html)
"""
<h1>${title}</h1>
<p>亲爱的${name}:</p>
<p>${content}</p>
<p>截止日期:${deadline}</p>
"""
 
# 使用示例
data = {
    'title': '项目进度提醒',
    'name': '张经理',
    'content': '请及时提交项目进度报告',
    'deadline': '2023-10-15'
}
html_content = generate_email_content('template.html', data)
send_html_email('项目提醒', html_content, 'manager@example.com')

在这段代码中,我们首先定义了generate_email_content函数,用于从模板文件中读取模板,并使用提供的数据替换模板中的占位符。然后,我们使用示例数据和模板文件生成HTML邮件内容,并调用send_html_email函数发送邮件。

三、邮件附件处理

1. 添加单个附件

在发送邮件时,我们有时需要添加附件,比如PDF、Excel、图片等。下面是一个添加单个附件的示例代码:

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
 
def send_email_with_attachment(subject, content, to_addr, attachment_path):
    from_addr = 'your_email@qq.com'
    password = 'your_authorization_code'
 
    msg = MIMEMultipart()
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = subject
 
    # 添加正文
    msg.attach(MIMEText(content, 'plain', 'utf-8'))
 
    # 添加附件
    with open(attachment_path, 'rb') as file:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(file.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', f'attachment; filename={attachment_path}')
    msg.attach(part)
 
    try:
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
        print("邮件发送成功,附件已附带!")
    except Exception as e:
        print(f"邮件发送失败:{str(e)}")
 
# 使用示例
send_email_with_attachment('带附件的邮件', '请查收附件', 'recipient@example.com', 'monthly_report.pdf')

在这段代码中,我们使用了MIMEMultipart对象来创建邮件,并使用MIMEBase和encoders模块来添加附件。注意,在添加附件时,我们需要将附件文件以二进制模式打开,并读取其内容。

2. 批量添加附件

如果需要批量添加附件,我们可以对上面的代码进行简单的修改。下面是一个批量添加附件的示例代码:

def send_email_with_attachments(subject, content, to_addr, attachment_paths):
    from_addr = 'your_email@qq.com'
    password = 'your_authorization_code'
 
    msg = MIMEMultipart()
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Subject'] = subject
 
    # 添加正文
    msg.attach(MIMEText(content, 'plain', 'utf-8'))
 
    # 添加多个附件
    for path in attachment_paths:
        with open(path, 'rb') as file:
            part = MIMEBase('application', 'octet-stream')
            part.set_payload(file.read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition', f'attachment; filename={path}')
        msg.attach(part)
 
    try:
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()
        print("邮件发送成功,多个附件已附带!")
except Exception as e:
print(f"邮件发送失败:{str(e)}")

使用示例
attachment_paths = ['report1.pdf', 'report2.xlsx', 'image.jpg']
send_email_with_attachments('带多个附件的邮件', '请查收所有附件', 'recipient@example.com', attachment_paths)

在这段代码中,我们只需对attachment_paths列表进行迭代,为每个附件执行相同的添加步骤即可。

四、结合schedule实现定时邮件发送

使用schedule库,我们可以轻松实现定时邮件发送。下面是一个结合schedule发送定时邮件的示例代码:

import schedule
import time

定时发送邮件的函数
def scheduled_email():
subject = '定时提醒'
content = '这是一封定时发送的邮件'
to_addr = 'recipient@example.com'
send_email(subject, content, to_addr)

设定每天上午9点发送邮件
schedule.every().day.at("09:00").do(scheduled_email)

保持脚本运行,检查并执行定时任务
while True:
schedule.run_pending()
time.sleep(1)

在这段代码中,我们首先定义了scheduled_email函数,该函数调用之前定义的send_email函数来发送邮件。然后,我们使用schedule.every().day.at("09:00").do(scheduled_email)来设定每天上午9点执行scheduled_email函数。最后,我们使用一个无限循环来保持脚本运行,并不断检查是否有定时任务需要执行。

注意:在实际应用中,直接将脚本放在无限循环中运行可能不是最佳实践。你可以考虑使用操作系统的计划任务功能(如Windows的任务计划程序或Linux的cron作业)来定期运行Python脚本。

五、总结

通过本文,我们学习了如何使用Python的smtplib和email模块来发送简单邮件、HTML格式邮件、带附件的邮件,并结合schedule库实现了定时邮件发送。这些技巧可以大大提高你的工作效率,减少手动发送邮件的繁琐和出错率。无论是日常通知、营销推广、日报发送还是服务器告警提醒,Python都能帮你轻松搞定。
 

作者:傻啦嘿哟

物联沃分享整理
物联沃-IOTWORD物联网 » Python邮件自动化批量处理实用技巧指南

发表回复