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. 添加附件
要添加附件,我们可以使用MIMEMultipart
的attach()
方法。下面是一个示例:
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