Python邮件自动化完全指南:从基础到高级应用

发布于:2025-06-27 ⋅ 阅读:(16) ⋅ 点赞:(0)

Python邮件自动化完全指南:从基础到高级应用

电子邮件仍然是现代通信的重要方式,掌握用Python发送邮件的技能可以极大提升工作效率。本文将全面介绍如何使用Python实现邮件发送功能,涵盖多种场景和高级应用。

一、邮件协议基础

1. 核心协议对比

协议 端口 加密方式 用途
SMTP 25/587/465 SSL/TLS 发送邮件
POP3 110/995 SSL/TLS 接收邮件
IMAP 143/993 SSL/TLS 管理邮件

2. 常见邮件服务配置

MAIL_SERVERS = {
    'gmail': {
        'smtp': 'smtp.gmail.com',
        'port': 587,
        'ssl_port': 465
    },
    'qq': {
        'smtp': 'smtp.qq.com',
        'port': 465,
        'ssl_port': 465
    },
    '163': {
        'smtp': 'smtp.163.com',
        'port': 25,
        'ssl_port': 465
    }
}

二、基础邮件发送

1. 使用smtplib发送纯文本邮件

import smtplib
from email.mime.text import MIMEText

def send_email(sender, password, receiver, subject, content):
    # 创建邮件内容
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = subject
    
    try:
        # 连接服务器 (以QQ邮箱为例)
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        server.login(sender, password)
        server.sendmail(sender, [receiver], msg.as_string())
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败: {e}")

# 使用示例
send_email(
    sender='your_email@qq.com',
    password='your_authorization_code',  # 注意是授权码不是登录密码
    receiver='target@example.com',
    subject='Python邮件测试',
    content='这是一封来自Python的测试邮件'
)

2. 发送HTML格式邮件

from email.mime.text import MIMEText

html_content = """
<html>
  <body>
    <h1 style="color: red;">重要通知</h1>
    <p>您的订单已发货,<a href="https://example.com">点击查看详情</a></p>
    <img src="cid:image1" width="200">
  </body>
</html>
"""

msg = MIMEText(html_content, 'html', 'utf-8')

三、高级邮件功能

1. 发送带附件的邮件

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

def send_with_attachment(sender, password, receiver, subject, content, file_path):
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = subject
    
    # 添加正文
    msg.attach(MIMEText(content, 'plain', 'utf-8'))
    
    # 添加附件
    with open(file_path, 'rb') as f:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(f.read())
        encoders.encode_base64(part)
        part.add_header(
            'Content-Disposition',
            f'attachment; filename="{file_path.split("/")[-1]}"'
        )
        msg.attach(part)
    
    # 发送邮件(代码同前)

2. 发送带嵌入图片的HTML邮件

from email.mime.image import MIMEImage

msg = MIMEMultipart()
msg.attach(MIMEText(html_content, 'html', 'utf-8'))

# 嵌入图片
with open('logo.png', 'rb') as img:
    image = MIMEImage(img.read())
    image.add_header('Content-ID', '<image1>')
    msg.attach(image)

四、安全与认证

1. 获取邮箱授权码

邮箱服务 获取方式
QQ邮箱 设置→账户→POP3/IMAP服务→生成授权码
163邮箱 设置→POP3/SMTP/IMAP→客户端授权密码
Gmail 账号→安全性→应用专用密码

2. 使用环境变量保护凭证

import os
from dotenv import load_dotenv

load_dotenv()  # 加载.env文件

sender = os.getenv('EMAIL_USER')
password = os.getenv('EMAIL_PASSWORD')

五、批量发送与模板

1. 使用Jinja2模板引擎

from jinja2 import Template

template = Template("""
尊敬的{{ name }}:
您的订单{{ order_id }}已于{{ ship_date }}发货
""")

content = template.render(
    name="张三",
    order_id="20230815001",
    ship_date="2023-08-16"
)

2. 批量发送邮件

import pandas as pd

# 从Excel读取收件人列表
df = pd.read_excel('contacts.xlsx')

for _, row in df.iterrows():
    personalized_content = f"""
    尊敬的{row['姓名']}:
    您的{row['产品']}购买申请已受理
    """
    send_email(
        sender=sender,
        password=password,
        receiver=row['邮箱'],
        subject='购买确认通知',
        content=personalized_content
    )

六、错误处理与日志

1. 增强错误处理

try:
    server = smtplib.SMTP_SSL('smtp.qq.com', 465)
    server.login(sender, password)
    server.sendmail(sender, [receiver], msg.as_string())
except smtplib.SMTPAuthenticationError:
    print("认证失败,请检查用户名和授权码")
except smtplib.SMTPConnectError:
    print("无法连接到服务器")
except smtplib.SMTPException as e:
    print(f"邮件发送错误: {e}")
finally:
    server.quit() if 'server' in locals() else None

2. 添加发送日志

import logging

logging.basicConfig(
    filename='email.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

logging.info(f"发送邮件给{receiver},主题:{subject}")

七、替代方案与扩展

1. 使用yagmail简化操作

import yagmail

yag = yagmail.SMTP(
    user='your_email@gmail.com',
    password='your_password',
    host='smtp.gmail.com'
)

yag.send(
    to='target@example.com',
    subject='Yagmail测试',
    contents=['正文内容', '/本地路径/附件.pdf']
)

2. 使用Flask-Mail集成到Web应用

from flask import Flask
from flask_mail import Mail, Message

app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = 'your_email@163.com'
app.config['MAIL_PASSWORD'] = 'your_password'

mail = Mail(app)

@app.route('/send')
def send():
    msg = Message(
        'Flask邮件测试',
        sender='your_email@163.com',
        recipients=['target@example.com']
    )
    msg.body = "这是邮件正文"
    mail.send(msg)
    return "邮件已发送"

八、最佳实践

  1. 频率控制:避免被识别为垃圾邮件

    • 普通邮箱:每分钟不超过1封
    • 企业邮箱:每分钟不超过10封
  2. 内容优化

    • 避免使用垃圾邮件敏感词(“免费”、"赢取"等)
    • 平衡文本和图片比例
  3. DKIM/SPF设置

    # SPF记录示例
    example.com. TXT "v=spf1 include:spf.mail.qq.com -all"
    
    # DKIM记录(需从邮件服务商获取)
    mail._domainkey.example.com. TXT "k=rsa; p=..."
    

通过本文,您已经掌握了从基础到高级的Python邮件发送技术。无论是简单的通知邮件,还是复杂的批量营销邮件,现在都可以轻松实现。记得在实际应用中遵守相关法律法规和邮件服务商的使用政策。


网站公告

今日签到

点亮在社区的每一天
去签到