本文目录导读:

我来为您介绍Python发送邮件附件的完整案例,使用内置的smtplib和email库。
基础邮件附件示例
单附件发送
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, sender_password, receiver_email,
subject, body, file_path):
"""
发送带附件的邮件
:param sender_email: 发件人邮箱
:param sender_password: 发件人邮箱密码或授权码
:param receiver_email: 收件人邮箱
:param subject: 邮件主题
:param body: 邮件正文
:param file_path: 附件文件路径
"""
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = subject
# 添加邮件正文
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# 添加附件
try:
# 获取文件名
filename = os.path.basename(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= {filename}'
)
# 将附件添加到邮件
msg.attach(part)
print(f"成功添加附件: {filename}")
except Exception as e:
print(f"添加附件失败: {e}")
return False
# 发送邮件
try:
# 连接SMTP服务器(以QQ邮箱为例)
server = smtplib.SMTP('smtp.qq.com', 587)
server.starttls() # 启用TLS加密
# 登录邮箱
server.login(sender_email, sender_password)
# 发送邮件
text = msg.as_string()
server.sendmail(sender_email, receiver_email, text)
print("邮件发送成功!")
return True
except Exception as e:
print(f"邮件发送失败: {e}")
return False
finally:
server.quit()
# 使用示例
if __name__ == "__main__":
# 配置信息
sender = "your_email@qq.com" # 发件人邮箱
password = "your_authorization_code" # 邮箱授权码(不是登录密码)
receiver = "receiver@example.com" # 收件人邮箱
# 发送带附件的邮件
send_email_with_attachment(
sender_email=sender,
sender_password=password,
receiver_email=receiver,
subject="测试邮件附件",
body="这是一封测试邮件,请查收附件。",
file_path="test.pdf"
)
多附件发送
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email import encoders
import os
def send_email_with_multiple_attachments(sender_email, sender_password,
receiver_email, subject, body,
file_paths):
"""
发送多附件的邮件
:param file_paths: 附件文件路径列表
"""
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = subject
# 添加HTML格式的邮件正文
html_body = f"""
<html>
<body>
<h2>{subject}</h2>
<p>{body}</p>
<p>附件列表:</p>
<ul>
"""
for file_path in file_paths:
filename = os.path.basename(file_path)
html_body += f"<li>{filename}</li>"
html_body += """
</ul>
</body>
</html>
"""
msg.attach(MIMEText(html_body, 'html', 'utf-8'))
# 遍历添加多个附件
for file_path in file_paths:
try:
filename = os.path.basename(file_path)
# 判断文件类型,选择合适的MIME类型
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
# 图片文件
with open(file_path, 'rb') as img:
part = MIMEImage(img.read(), name=filename)
else:
# 其他文件
with open(file_path, 'rb') as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
# 添加文件名到Content-Disposition
part.add_header(
'Content-Disposition',
f'attachment; filename="{filename}"'
)
msg.attach(part)
print(f"成功添加附件: {filename}")
except Exception as e:
print(f"添加附件 {file_path} 失败: {e}")
# 发送邮件
try:
# 连接SMTP服务器(以163邮箱为例)
server = smtplib.SMTP_SSL('smtp.163.com', 465) # SSL加密连接
server.login(sender_email, sender_password)
text = msg.as_string()
server.sendmail(sender_email, receiver_email, text)
print("邮件发送成功!")
return True
except Exception as e:
print(f"邮件发送失败: {e}")
return False
finally:
server.quit()
# 使用示例
if __name__ == "__main__":
# 多个附件
files_to_attach = [
"document.pdf",
"image.png",
"report.docx",
"data.xlsx"
]
send_email_with_multiple_attachments(
sender_email="your_email@163.com",
sender_password="your_authorization_code",
receiver_email="receiver@example.com",
subject="月度报告及附件",
body="请查收本月的工作报告和相关资料。",
file_paths=files_to_attach
)
带附件的HTML邮件
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_html_email_with_attachment(sender_email, sender_password,
receiver_email, subject, html_content,
file_paths):
"""
发送带附件的HTML格式邮件
"""
msg = MIMEMultipart('mixed')
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = subject
# 创建HTML部分
msg_alternative = MIMEMultipart('alternative')
msg_alternative.attach(MIMEText(html_content, 'html', 'utf-8'))
msg.attach(msg_alternative)
# 添加附件
for file_path in file_paths:
try:
filename = os.path.basename(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="{filename}"'
)
msg.attach(part)
print(f"已添加附件: {filename}")
except Exception as e:
print(f"添加附件失败: {e}")
# 发送邮件
try:
# 使用GMail SMTP服务器
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login(sender_email, sender_password)
server.send_message(msg)
print("邮件发送成功!")
return True
except Exception as e:
print(f"邮件发送失败: {e}")
return False
# 使用示例
if __name__ == "__main__":
# HTML内容
html_content = """
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.attachment { color: blue; font-weight: bold; }
</style>
</head>
<body>
<h1>项目更新报告</h1>
<p>您好,</p>
<p>以下是本月项目的更新情况:</p>
<ul>
<li>完成了首要任务</li>
<li>修复了3个关键bug</li>
<li>新增了用户反馈功能</li>
</ul>
<p class="attachment">请在附件中查看详细报告。</p>
<p>祝好!</p>
</body>
</html>
"""
send_html_email_with_attachment(
sender_email="your_email@gmail.com",
sender_password="your_password",
receiver_email="receiver@example.com",
subject="项目更新报告 - 2024年1月",
html_content=html_content,
file_paths=["project_report.pdf", "screenshots.zip"]
)
注意事项
邮箱授权码
大多数邮箱(QQ、163、Gmail等)需要使用授权码而不是登录密码:
# QQ邮箱授权码获取方法 # 设置 -> 账户 -> POP3/IMAP/SMTP服务 -> 生成授权码 # 163邮箱授权码获取方法 # 设置 -> POP3/SMTP/IMAP -> 新增授权码
不同邮箱的SMTP配置
# QQ邮箱 SMTP_SERVER = 'smtp.qq.com' SMTP_PORT = 587 # TLS # 或 SMTP_PORT = 465 # SSL # 163邮箱 SMTP_SERVER = 'smtp.163.com' SMTP_PORT = 25 # 普通 SMTP_PORT = 465 # SSL # Gmail SMTP_SERVER = 'smtp.gmail.com' SMTP_PORT = 587 # TLS
文件大小限制
- 大多数邮箱限制附件总大小不超过25MB
- 超过限制需要分卷压缩或使用云存储链接
中文文件名处理
from email.header import Header
# 处理中文文件名
filename = "报告文件.pdf"
# 使用Header编码文件名
part.add_header(
'Content-Disposition',
f'attachment; filename="{Header(filename, "utf-8").encode()}"'
)
这个示例涵盖了Python发送邮件附件的主要场景,您可以根据实际需求调整使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播