Python 提供了强大的邮件发送功能,借助 smtplibemail 库,我们可以轻松地实现自动化邮件发送。本文将通过几个实际场景来展示如何使用这两个库来发送带附件的邮件、HTML 格式邮件,并结合 schedule 库实现邮件定时发送的功能。


1. 发送带附件的邮件(如 Excel 报表)

首先,我们来看如何使用 Python 发送带附件的邮件。在实际办公场景中,发送包含 Excel 文件的报表邮件是一个常见的需求。这里我们将通过 smtplib 连接到 SMTP 服务器,使用 email 库来构建邮件内容和附件。

1.1 安装所需库

如果你还没有安装 schedule,可以通过以下命令安装:

pip install schedule

1.2 代码实现:发送带附件的邮件

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os

def send_email_with_attachment(sender_email, receiver_email, subject, body, attachment_path, smtp_server, smtp_port, smtp_user, smtp_password):
    # 创建 MIMEMultipart 对象,表示邮件的整体结构
    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = receiver_email
    msg['Subject'] = subject

    # 添加邮件正文
    msg.attach(MIMEText(body, 'plain'))

    # 添加附件
    filename = os.path.basename(attachment_path)
    attachment = open(attachment_path, 'rb')
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(attachment.read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', f'attachment; filename={filename}')
    msg.attach(part)

    # 连接到 SMTP 服务器并发送邮件
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()  # 启用 TLS 加密
        server.login(smtp_user, smtp_password)
        text = msg.as_string()
        server.sendmail(sender_email, receiver_email, text)
        server.quit()  # 退出服务器
        print(f"邮件已成功发送给 {receiver_email}")
    except Exception as e:
        print(f"邮件发送失败:{e}")

# 示例调用
send_email_with_attachment(
    sender_email='your_email@gmail.com',
    receiver_email='receiver_email@example.com',
    subject='月度销售报表',
    body='请查收附件中的月度销售报表。',
    attachment_path='path_to_your_excel_file.xlsx',
    smtp_server='smtp.gmail.com',
    smtp_port=587,
    smtp_user='your_email@gmail.com',
    smtp_password='your_email_password'
)

1.3 代码解释

  1. 创建邮件内容:我们使用 MIMEMultipart 来创建邮件的整体结构,使用 MIMEText 添加纯文本邮件内容。
  2. 添加附件:使用 MIMEBase 来处理附件,通过 open 打开附件文件,使用 encode_base64 进行编码,然后将其添加到邮件中。
  3. 发送邮件:使用 smtplib.SMTP 连接到 SMTP 服务器,并通过 sendmail 方法发送邮件。

2. 发送 HTML 格式的邮件

除了纯文本格式的邮件,有时我们需要发送富文本格式的邮件,如 HTML 格式的通知邮件。Python 的 MIMEText 类也支持 HTML 格式邮件的发送。

2.1 代码实现:发送 HTML 格式的邮件

def send_html_email(sender_email, receiver_email, subject, html_content, smtp_server, smtp_port, smtp_user, smtp_password):
    # 创建 MIMEMultipart 对象,表示邮件的整体结构
    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = receiver_email
    msg['Subject'] = subject

    # 添加 HTML 内容
    msg.attach(MIMEText(html_content, 'html'))

    # 连接到 SMTP 服务器并发送邮件
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()  # 启用 TLS 加密
        server.login(smtp_user, smtp_password)
        text = msg.as_string()
        server.sendmail(sender_email, receiver_email, text)
        server.quit()  # 退出服务器
        print(f"HTML 邮件已成功发送给 {receiver_email}")
    except Exception as e:
        print(f"邮件发送失败:{e}")

# 示例调用
html_content = """
<html>
  <body>
    <h2>尊敬的用户,</h2>
    <p>这是一个自动化邮件通知。</p>
    <p><strong>祝您生活愉快!</strong></p>
  </body>
</html>
"""

send_html_email(
    sender_email='your_email@gmail.com',
    receiver_email='receiver_email@example.com',
    subject='系统通知:自动化邮件',
    html_content=html_content,
    smtp_server='smtp.gmail.com',
    smtp_port=587,
    smtp_user='your_email@gmail.com',
    smtp_password='your_email_password'
)

2.2 代码解释

  1. HTML 邮件内容:我们通过 MIMEText 类,指定邮件内容格式为 'html',并将 HTML 格式的内容添加到邮件中。
  2. 发送邮件:与附件邮件类似,连接 SMTP 服务器并发送邮件。

3. 定时发送邮件:使用 schedule

有时候我们需要按时自动发送邮件,例如每天 9 点发送日报。Python 中的 schedule 库可以帮助我们轻松实现任务的定时调度。

3.1 代码实现:定时发送邮件

import schedule
import time

def job():
    # 发送邮件的实际操作
    send_html_email(
        sender_email='your_email@gmail.com',
        receiver_email='receiver_email@example.com',
        subject='定时发送的邮件',
        html_content="<h1>这是定时发送的邮件</h1>",
        smtp_server='smtp.gmail.com',
        smtp_port=587,
        smtp_user='your_email@gmail.com',
        smtp_password='your_email_password'
    )

# 定时任务:每天 9 点发送邮件
schedule.every().day.at("09:00").do(job)

# 保持运行并执行定时任务
while True:
    schedule.run_pending()
    time.sleep(60)  # 每分钟检查一次

3.2 代码解释

  1. 定义定时任务:使用 schedule.every().day.at("09:00").do(job) 设置每天 9 点执行 job 函数。job 函数中调用了 send_html_email 发送邮件。
  2. 执行定时任务schedule.run_pending() 会不断检查是否有任务需要执行,time.sleep(60) 确保每 60 秒检查一次任务。

4. 小结

在本文中,我们通过以下几个案例演示了如何使用 Python 进行邮件自动化:

  1. 发送带附件的邮件:使用 smtplibemail 库发送带有附件(如 Excel 报表)的邮件。
  2. 发送 HTML 格式邮件:构建并发送包含 HTML 格式内容的邮件。
  3. 定时发送邮件:结合 schedule 库,实现每天定时发送邮件的功能。