Python 邮件附件操作

邮件是现代社会中非常重要的通信方式之一,我们经常需要在邮件中添加附件,例如发送文件、图片等。Python 提供了强大的邮件处理库,使得我们可以轻松地在邮件中添加附件。本文将介绍如何使用 Python 发送带有附件的邮件,并提供代码示例。

1. 准备工作

在开始编写代码之前,我们需要确保已安装以下两个Python库:

  • smtplib:用于发送邮件的库
  • email:用于构建邮件内容的库

可以使用以下命令安装这两个库:

pip install smtplib
pip install email

2. 构建邮件对象

我们首先需要构建一个邮件对象,包括邮件的发送者、接收者、主题和正文等信息。下面是一个示例:

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

def build_email(sender, receiver, subject, body):
    # 创建一个 MIMEMultipart 邮件对象
    email_message = MIMEMultipart()
    email_message["From"] = sender
    email_message["To"] = receiver
    email_message["Subject"] = subject

    # 添加邮件正文
    email_message.attach(MIMEText(body, "plain"))

    return email_message

在上面的示例中,我们使用了MIMEMultipart类来创建一个带有多个部分的邮件对象。其中,MIMEText用于添加邮件正文。

3. 添加附件

要添加附件,我们可以使用MIMEMultipartattach()方法。下面是一个示例:

def add_attachment(email_message, file_path):
    with open(file_path, "rb") as attachment:
        part = MIMEBase("application", "octet-stream")
        part.set_payload(attachment.read())

    email.encoders.encode_base64(part)
    part.add_header(
        "Content-Disposition",
        f"attachment; filename= {os.path.basename(file_path)}",
    )

    email_message.attach(part)

在上面的示例中,我们打开要添加的附件文件,将其内容读取为二进制数据,并使用MIMEBase类创建一个新的邮件部分。然后,我们使用encode_base64()将数据编码为Base64格式,并使用add_header()方法设置附件的文件名。

4. 发送邮件

最后一步是发送邮件。我们需要使用 SMTP 服务器的地址和端口以及登录凭据来建立与服务器的连接,并使用send_message()方法发送邮件。下面是一个示例:

def send_email(email_message, sender, password, smtp_server, smtp_port=587):
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(sender, password)
        server.send_message(email_message)
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print("邮件发送失败:", str(e))

在上面的示例中,我们首先使用SMTP类创建一个 SMTP 对象,并使用starttls()方法启用 TLS 加密。然后,我们使用login()方法使用发送者的邮箱地址和密码进行登录。最后,我们使用send_message()方法发送邮件,并使用quit()方法关闭与服务器的连接。

完整示例

下面是一个完整的示例,演示了如何使用 Python 发送带有附件的邮件:

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


def build_email(sender, receiver, subject, body):
    # 创建一个 MIMEMultipart 邮件对象
    email_message = MIMEMultipart()
    email_message["From"] = sender
    email_message["To"] = receiver
    email_message["Subject"] = subject

    # 添加邮件正文
    email_message.attach(MIMEText(body, "plain"))

    return email_message


def add_attachment(email_message, file_path):
    with open(file_path, "rb") as attachment:
        part = MIMEBase("application", "octet-stream")
        part.set_payload(attachment.read())

    encoders.encode_base64(part)
    part.add_header(
        "Content-Disposition",
        f"attachment; filename= {os.path.basename(file_path)}",
    )

    email_message.attach(part)


def send_email(email_message, sender, password, smtp_server, smtp_port=587):
    try:
        server = smtplib.SM