在数字化办公场景中,邮件自动化是提升工作效率的关键技能。本文将通过实际案例,演示如何使用Python的smtplib和email库构建一个支持图文混排、多附件、多收件人的智能邮件系统。无需复杂配置,只需跟随步骤操作,即可实现邮件自动化发送。

以163邮箱为例,首先需要开启SMTP服务:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Headerdef send_email(config):
msg = MIMEMultipart()
msg['From'] = config['sender']
msg['To'] = ', '.join(config['receivers'])
msg['Subject'] = Header(config['subject'], 'utf-8')
# 添加正文
msg.attach(MIMEText(config['body'], 'html', 'utf-8'))
try:
with smtplib.SMTP_SSL(config['smtp_server'], config['port']) as server:
server.login(config['sender'], config['password'])
server.sendmail(config['sender'], config['receivers'], msg.as_string())
print("邮件发送成功")
except Exception as e:
print(f"发送失败: {str(e)}")def add_attachments(msg, file_paths):
for file_path in file_paths:
with open(file_path, 'rb') as f:
attachment = MIMEText(f.read(), 'base64', 'utf-8')
attachment['Content-Type'] = 'application/octet-stream'
attachment['Content-Disposition'] = f'attachment; filename="{file_path.split("/")[-1]}"'
msg.attach(attachment)def add_images(msg, image_paths):
for img_path in image_paths:
with open(img_path, 'rb') as f:
img = MIMEImage(f.read())
img.add_header('Content-ID', f'<{img_path.split("/")[-1]}>')
msg.attach(img)def validate_receivers(receivers):
valid_emails = []
for email in receivers:
if '@' in email and '.' in email.split('@')[1]:
valid_emails.append(email)
return valid_emails某公司需要向全体员工发送季度工作报告,要求包含:
def main():
# 配置参数
config = {
'sender': 'your_email@163.com',
'password': '授权码',
'smtp_server': 'smtp.163.com',
'port': 465,
'receivers': ['test1@example.com', 'test2@example.com'],
'subject': '2025年第二季度工作报告',
'body': '''
<h1>季度工作报告</h1>
<p>附件包含详细数据,正文图表如下:</p>
<img src="cid:业绩趋势图.png">
'''
}
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = config['sender']
msg['To'] = ', '.join(config['receivers'])
msg['Subject'] = Header(config['subject'], 'utf-8')
# 添加正文
msg.attach(MIMEText(config['body'], 'html', 'utf-8'))
# 添加附件
add_attachments(msg, [
'./reports/季度数据.xlsx',
'./reports/正式报告.pdf'
])
# 添加图片
add_images(msg, [
'./charts/业绩趋势图.png'
])
# 发送邮件
send_email(config, msg)
if __name__ == '__main__':
main()结合schedule库实现定时任务:
import schedule
import time
schedule.every().day.at("09:30").do(main)
while True:
schedule.run_pending()
time.sleep(60)从CSV读取收件人信息:
import pandas as pd
def batch_send(csv_path):
df = pd.read_csv(csv_path)
for index, row in df.iterrows():
config['receivers'] = [row['email']]
config['body'] = f"尊敬的{row['name']},这是您的专属报告"
main()添加重试机制和日志记录:
import logging
from retrying import retry
logging.basicConfig(filename='email.log', level=logging.INFO)
@retry(stop_max_attempt_number=3)
def send_email_safe(config, msg):
try:
# 原有发送逻辑
logging.info(f"成功发送至{config['receivers']}")
except Exception as e:
logging.error(f"发送失败: {str(e)}")
raise通过本文介绍的方案,可以实现从简单邮件到复杂邮件的自动化发送。实际使用中可根据需求添加模板引擎、数据库集成等功能,构建更完善的邮件自动化系统。