再也不用记着发邮件了!

你有没有过这样的经历:

  • 每天要定时给客户发日报,忘了就被老板骂
  • 需要给100个人发相同的邮件,一个个手动发到手抽筋
  • 需要根据不同的人发送不同的内容,复制粘贴到眼花

别再假装你会手动发邮件了,用Python吧!

今天我们做一个自动发邮件的工具,设置一次,终身受益。

准备工作

1. 开启邮箱的SMTP服务

以QQ邮箱为例:

  1. 登录QQ邮箱
  2. 点击"设置" -> “账户”
  3. 找到"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"
  4. 开启"POP3/SMTP服务"
  5. 按照提示发送短信验证
  6. 保存授权码(非常重要!)

以网易163邮箱为例:

  1. 登录163邮箱
  2. 点击"设置" -> “POP3/SMTP/IMAP”
  3. 开启"POP3/SMTP服务"
  4. 按照提示设置授权密码
  5. 保存授权密码

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分钟发邮件的时间!下一章我们学习爬取网页数据,信息差就是钱!

继续学下去,马上就能做实用项目了!