12-实战项目3-自动发邮件
再也不用记着发邮件了!
你有没有过这样的经历:
- 每天要定时给客户发日报,忘了就被老板骂
- 需要给100个人发相同的邮件,一个个手动发到手抽筋
- 需要根据不同的人发送不同的内容,复制粘贴到眼花
别再假装你会手动发邮件了,用Python吧!
今天我们做一个自动发邮件的工具,设置一次,终身受益。
准备工作
1. 开启邮箱的SMTP服务
以QQ邮箱为例:
- 登录QQ邮箱
- 点击"设置" -> “账户”
- 找到"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"
- 开启"POP3/SMTP服务"
- 按照提示发送短信验证
- 保存授权码(非常重要!)
以网易163邮箱为例:
- 登录163邮箱
- 点击"设置" -> “POP3/SMTP/IMAP”
- 开启"POP3/SMTP服务"
- 按照提示设置授权密码
- 保存授权密码
2. 安装库
Python 3.6+ 已经内置了smtplib,不需要额外安装。
基础:发送纯文本邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_text_email(sender_email, sender_password, receiver_email, subject, content):
"""
发送纯文本邮件
Args:
sender_email: 发件人邮箱
sender_password: 邮箱授权码(不是登录密码!)
receiver_email: 收件人邮箱
subject: 邮件主题
content: 邮件内容
"""
# 邮件服务器配置
smtp_server = "smtp.qq.com" # QQ邮箱的SMTP服务器
smtp_port = 465 # QQ邮箱的SMTP端口
try:
# 创建邮件对象
message = MIMEText(content, "plain", "utf-8")
# 设置邮件头
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = Header(subject, "utf-8")
# 连接SMTP服务器
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_email, message.as_string())
print(f"邮件发送成功!收件人:{receiver_email}")
except Exception as e:
print(f"邮件发送失败:{e}")
# 使用示例
if __name__ == "__main__":
sender_email = "your_email@qq.com"
sender_password = "your_authorization_code" # 授权码,不是登录密码!
receiver_email = "receiver@example.com"
subject = "测试邮件"
content = """
你好!
这是一封用Python自动发送的测试邮件。
祝好!
"""
send_text_email(sender_email, sender_password, receiver_email, subject, content)
实战:自动发送日报
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from datetime import datetime
import os
def send_daily_report(sender_email, sender_password, receiver_email, data, attachment_path=None):
"""
发送日报
Args:
sender_email: 发件人邮箱
sender_password: 邮箱授权码
receiver_email: 收件人邮箱(可以是列表)
data: 日报数据字典
attachment_path: 附件路径(可选)
"""
smtp_server = "smtp.qq.com"
smtp_port = 465
try:
# 生成日报内容
report_date = data.get("date", datetime.now().strftime("%Y-%m-%d"))
content = f"""
日报日期:{report_date}
姓名:{data.get('name', '')}
【今日工作】
""" + "\n ".join(f"- {task}" for task in data.get("tasks", [])) + f"""
【工作进度】
{data.get('progress', '')}
【遇到的问题】
""" + "\n ".join(f"- {problem}" for problem in data.get("problems", [])) + f"""
【明日计划】
""" + "\n ".join(f"- {plan}" for plan in data.get("tomorrow", []))
# 创建邮件对象
message = MIMEMultipart()
# 设置邮件头
message["From"] = sender_email
if isinstance(receiver_email, list):
message["To"] = ", ".join(receiver_email)
else:
message["To"] = receiver_email
message["Subject"] = Header(f"日报 - {data.get('name', '')} - {report_date}", "utf-8")
# 添加邮件正文
message.attach(MIMEText(content, "plain", "utf-8"))
# 连接SMTP服务器
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
server.login(sender_email, sender_password)
if isinstance(receiver_email, list):
server.sendmail(sender_email, receiver_email, message.as_string())
else:
server.sendmail(sender_email, receiver_email, message.as_string())
print(f"日报发送成功!")
except Exception as e:
print(f"日报发送失败:{e}")
# 使用示例
if __name__ == "__main__":
sender_email = "your_email@qq.com"
sender_password = "your_authorization_code"
receiver_email = ["boss@example.com"]
# 日报数据
report_data = {
"name": "张三",
"date": datetime.now().strftime("%Y-%m-%d"),
"tasks": ["完成用户模块开发", "修复登录bug"],
"progress": "用户模块开发完成80%",
"problems": ["部分用户反馈页面加载慢"],
"tomorrow": ["完成用户模块开发", "优化页面加载速度"]
}
send_daily_report(sender_email, sender_password, receiver_email, report_data)
常见问题
1. 授权码 vs 登录密码
一定要注意:SMTP需要的是授权码,不是登录密码!
2. 发送失败:连接超时
检查SMTP服务器地址和端口是否正确。
3. 发送失败:认证失败
检查授权码是否正确,是否开启了SMTP服务。
本章小结
- 发送纯文本邮件:基本邮件发送功能
- 发送HTML邮件:美化邮件样式
- 发送带附件邮件:自动发送报表
- 批量发送邮件:给多人发邮件
- 自动日报:定时自动发送日报
这个工具可以帮你每天节省30分钟发邮件的时间!下一章我们学习爬取网页数据,信息差就是钱!
继续学下去,马上就能做实用项目了!