一. 导引
运维侠想要自动发送邮件,发送Excel表格或者图片,于是他又去问了deepseek!!!开心呀,终于实现了…
deepseek的回答
二.运维侠的代码演示:
⚠️避坑指南(血泪经验总结)
- 提前检查有没有需要安装的模块如果没,执行:pip install smtplib
- 附件乱码问题:统一使用utf-8编码
- 被识别为垃圾邮件:控制发送频率,添加退订链接
- 大附件发送失败:压缩、切割
- 连接超时处理:增加重试机制
- 需要先测试:deepseek给的代码不一定每次都可用,运维侠已经帮您踩过坑了。
⏰提示:先创建所需Excel表格
(1)读取Excel数据,发送简单文字邮件
💻 代码:第一步:读取Excel中的邮箱地址
# 安装库:pip install openpyxl
import openpyxl
import smtplib
from email.mime.text import MIMEText
# 步骤1:读取Excel中的邮箱地址(测试用表)
wb = openpyxl.load_workbook(r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\文档\contacts.xlsx')
sheet = wb.active
emails = [cell.value for cell in sheet['B'][1:] if cell.value] # 跳过标题行
print(emails)
执行代码效果:
(2)配置邮件参数
💻 代码:
# ====== 配置区(必须修改)=======
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 465
SENDER = 'xxxxxxxx@qq.com'
PASSWORD = 'xxxxxxxxxxxxx' # 授权码不是登录密码
ATTACH_FILES = [
r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\文档\[赵老师]mysql主从复制实施文档.docx', # Word文档路径
r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\其他\老球的Excel.zip', # 压缩包
r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\文档\3单篇文章分析-关注数0.xlsx' # Excel文件路径
]
# =============================
(3)精简版批量发送邮件
💻 代码:
import openpyxl
import smtplib
from email.mime.text import MIMEText
import time
# ====== 配置区(必须修改)=======
EMAIL_HOST = 'smtp.qq.com' # 服务器地址
EMAIL_PORT = 465 # 端口
SENDER = 'xxxxxxx@qq.com' # 发件邮箱
PASSWORD = 'xxxxxxxx' # 授权码(不是密码!)
# =============================
# 读取Excel(测试文件)
wb = openpyxl.load_workbook(r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\文档\contacts.xlsx')
sheet = wb.active
emails = [cell.value for cell in sheet['B'][1:] if cell.value]
# 创建邮件内容
msg = MIMEText('您的测试邮件正文内容', 'plain', 'utf-8')
msg['From'] = SENDER
msg['Subject'] = 'Python自动发送测试'
# 发送循环
for email in emails:
try:
with smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_PORT) as server:
server.login(SENDER, PASSWORD) # 关键认证点
server.sendmail(SENDER, email, msg.as_string())
server.quit()
print(f"✅ 成功发送至 {email}")
time.sleep(3)
except Exception as e:
print(f"❌ 发送到 {email} 失败:{str(e)}")
执行代码效果:
(4)豪华版批量发送邮件
💻 代码:适用于发送各类附件,并带有进度提示
# 安装所需库:pip install openpyxl
import openpyxl
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.header import Header # 修正导入方式
import time
# ====== 配置区(必须修改)=======
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 465
SENDER = 'xxxxxx@qq.com'
PASSWORD = 'xixxxxxxxxx' # 授权码非登录密码
ATTACH_FILES = [
r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\文档\[赵老师]mysql主从复制实施文档.docx', # Word文档路径
r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\其他\老球的Excel.zip', # 压缩包
r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\文档\3单篇文章分析-关注数0.xlsx' # Excel文件路径
]
# =============================
def create_email():
"""创建带附件的邮件对象"""
msg = MIMEMultipart()
msg['From'] = SENDER
msg['Subject'] = Header('某某项目合同资料,请查收工作文档', 'utf-8') # 中文主题编码
# HTML正文内容
body = '''
<p>您好:</p>
<p style="text-indent: 2em;">已发送最新工作文档,请查收附件内容。</p>
<p style="color: #666; margin-top: 20px;">本邮件由Python自动发送,请勿直接回复</p>
'''
msg.attach(MIMEText(body, 'html', 'utf-8'))
# 添加多个附件
for file_path in ATTACH_FILES:
if not os.path.exists(file_path):
print(f"⚠️ 附件不存在:{file_path}")
continue
with open(file_path, 'rb') as f:
file_data = f.read()
basename = os.path.basename(file_path)
attach = MIMEApplication(file_data)
# 修正编码方式(核心修复点)
filename_header = Header(basename, 'utf-8').encode()
attach.add_header(
'Content-Disposition',
'attachment',
filename=filename_header
)
msg.attach(attach)
return msg
# 读取收件人列表(保持不变)
try:
wb = openpyxl.load_workbook(r'C:\Users\ZHAOY\PycharmProjects\1\整理后的文件\文档\contacts.xlsx')
sheet = wb.active
emails = [cell.value for cell in sheet['B'][1:] if cell.value]
print(f"成功读取 {len(emails)} 个收件人")
except Exception as e:
print("❌ Excel读取失败:", str(e))
exit()
# 发送邮件(增加进度显示)
total = len(emails)
for index, email in enumerate(emails, 1):
try:
msg = create_email()
msg['To'] = Header(f'收件人 <{email}>', 'utf-8') # 优化收件人显示
with smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_PORT) as server:
server.login(SENDER, PASSWORD)
server.sendmail(SENDER, email, msg.as_string())
print(f"✅ 进度:{index}/{total} | 发送成功")
time.sleep(5)
except Exception as e:
print(f"❌ 第 {index} 封失败:{str(e)}")
continue
print("👉 任务完成!成功发送:{} 封,失败:{} 封".format(
total - len([e for e in emails if "失败" in e]),
len([e for e in emails if "失败" in e])
))
执行代码效果:
⏰提示:可能会有误报的失败提示进度,不影响结果。因为延时等问题,需要多等一些时间。
三.注意事项
⏰提示:deepseek有时候给的代码不一定适合需要,所以要自己不断实践并总结,并且要注意问deepseek的话术模版。一种需求可以有多种类型代码实现,实际中,我们可以从中选择,最适合的。
💡开启你的效率革命
掌握自动化邮件技能后,你可以:
-
每天节省1小时处理时间
-
实现精准定时推送
-
轻松处理大批量发送任务
-
成为办公室效率达人
💡下期预告:《Python+Excel自动化:3小时完成全天工作》即将发布,点击关注不迷路!