Python案例如何发送邮件消息?

wen python案例 9

本文目录导读:

Python案例如何发送邮件消息?

  1. 使用 smtplib 发送简单邮件
  2. 发送HTML格式邮件
  3. 发送带附件的邮件
  4. 完整示例:邮件发送函数
  5. 常用邮箱SMTP配置
  6. 获取邮箱授权码
  7. 注意事项
  8. 使用环境变量示例

我来介绍几种在Python中发送邮件的方法。

使用 smtplib 发送简单邮件

基础示例(使用QQ邮箱)

import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件配置
smtp_server = "smtp.qq.com"
smtp_port = 465  # SSL端口
sender_email = "your_email@qq.com"
sender_password = "your_authorization_code"  # QQ邮箱授权码
receiver_email = "receiver@example.com"
# 创建邮件内容
message = MIMEText("这是一封测试邮件。", "plain", "utf-8")
message["From"] = Header("发件人昵称", "utf-8")
message["To"] = Header("收件人昵称", "utf-8")
message["Subject"] = Header("邮件主题", "utf-8")
try:
    # 连接SMTP服务器(SSL方式)
    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("邮件发送成功!")
except Exception as e:
    print(f"邮件发送失败:{e}")

发送HTML格式邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_html_email():
    html_content = """
    <html>
        <body>
            <h1>HTML格式邮件</h1>
            <p>这是一封 <b>HTML</b> 格式的邮件。</p>
            <p>可以包含样式和格式。</p>
            <ul>
                <li>列表项1</li>
                <li>列表项2</li>
                <li>列表项3</li>
            </ul>
            <a href="https://www.example.com">点击访问</a>
        </body>
    </html>
    """
    message = MIMEText(html_content, "html", "utf-8")
    message["From"] = "发件人 <sender@example.com>"
    message["To"] = "收件人 <receiver@example.com>"
    message["Subject"] = "HTML格式测试邮件"
    with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
        server.login("your_email@qq.com", "password")
        server.sendmail("sender@example.com", ["receiver@example.com"], message.as_string())
send_html_email()

发送带附件的邮件

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
def send_email_with_attachment():
    # 创建多部分邮件对象
    msg = MIMEMultipart()
    msg["From"] = "sender@example.com"
    msg["To"] = "receiver@example.com"
    msg["Subject"] = "带附件的测试邮件"
    # 邮件正文
    body = "这是一封带附件的邮件。"
    msg.attach(MIMEText(body, "plain", "utf-8"))
    # 添加附件
    filename = "test.txt"  # 附件文件名
    attachment_path = "path/to/your/file"  # 附件路径
    try:
        with open(attachment_path, "rb") as attachment:
            part = MIMEBase("application", "octet-stream")
            part.set_payload(attachment.read())
        encoders.encode_base64(part)
        part.add_header(
            "Content-Disposition",
            f"attachment; filename= {filename}",
        )
        msg.attach(part)
    except FileNotFoundError:
        print("附件文件未找到")
        return
    # 发送邮件
    with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
        server.login("your_email@qq.com", "password")
        server.send_message(msg)
send_email_with_attachment()

完整示例:邮件发送函数

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from typing import List, Dict, Optional
import os
class EmailSender:
    """邮件发送类"""
    def __init__(self, smtp_server: str, smtp_port: int, 
                 email: str, password: str, use_ssl: bool = True):
        self.smtp_server = smtp_server
        self.smtp_port = smtp_port
        self.email = email
        self.password = password
        self.use_ssl = use_ssl
    def send_email(self, 
                   receivers: List[str],
                   subject: str,
                   body: str,
                   body_type: str = "plain",
                   attachments: Optional[List[str]] = None,
                   cc: Optional[List[str]] = None,
                   bcc: Optional[List[str]] = None) -> bool:
        """
        发送邮件
        Args:
            receivers: 收件人列表
            subject: 邮件主题
            body: 邮件正文
            body_type: 正文类型 ("plain" 或 "html")
            attachments: 附件路径列表
            cc: 抄送人列表
            bcc: 密送人列表
        Returns:
            bool: 是否发送成功
        """
        try:
            # 创建邮件对象
            msg = MIMEMultipart()
            msg["From"] = self.email
            msg["Subject"] = subject
            # 处理收件人
            all_receivers = receivers.copy()
            if cc:
                msg["Cc"] = ", ".join(cc)
                all_receivers.extend(cc)
            if bcc:
                all_receivers.extend(bcc)
            msg["To"] = ", ".join(receivers)
            # 添加正文
            msg.attach(MIMEText(body, body_type, "utf-8"))
            # 添加附件
            if attachments:
                for file_path in attachments:
                    if not os.path.exists(file_path):
                        print(f"附件不存在: {file_path}")
                        continue
                    with open(file_path, "rb") as f:
                        part = MIMEBase("application", "octet-stream")
                        part.set_payload(f.read())
                    encoders.encode_base64(part)
                    filename = os.path.basename(file_path)
                    part.add_header(
                        "Content-Disposition",
                        f"attachment; filename={filename}"
                    )
                    msg.attach(part)
            # 发送邮件
            if self.use_ssl:
                with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server:
                    server.login(self.email, self.password)
                    server.sendmail(self.email, all_receivers, msg.as_string())
            else:
                with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:
                    server.ehlo()
                    server.starttls()
                    server.ehlo()
                    server.login(self.email, self.password)
                    server.sendmail(self.email, all_receivers, msg.as_string())
            print("邮件发送成功!")
            return True
        except Exception as e:
            print(f"邮件发送失败: {e}")
            return False
# 使用示例
if __name__ == "__main__":
    # 初始化发送器
    sender = EmailSender(
        smtp_server="smtp.qq.com",
        smtp_port=465,
        email="your_email@qq.com",
        password="your_authorization_code",
        use_ssl=True
    )
    # 发送邮件
    success = sender.send_email(
        receivers=["receiver@example.com", "another@example.com"],
        subject="测试邮件",
        body="<h1>Hello!</h1><p>这是一封测试邮件。</p>",
        body_type="html",
        attachments=["/path/to/file1.pdf", "/path/to/file2.txt"],
        cc=["cc@example.com"],
        bcc=["bcc@example.com"]
    )
    if success:
        print("邮件发送完成")
    else:
        print("邮件发送失败")

常用邮箱SMTP配置

邮箱服务 SMTP服务器 SSL端口 TLS端口 备注
QQ邮箱 smtp.qq.com 465 587 需开启SMTP服务
163邮箱 smtp.163.com 465 25 需开启IMAP/SMTP
Gmail smtp.gmail.com 465 587 需开启低安全性应用访问
Outlook smtp.office365.com 587 587 需开启SMTP认证

获取邮箱授权码

QQ邮箱:

  1. 登录QQ邮箱
  2. 设置 → 账户
  3. 开启POP3/SMTP服务
  4. 生成授权码(用于登录密码)

163邮箱:

  1. 登录163邮箱
  2. 设置 → POP3/SMTP/IMAP
  3. 开启SMTP服务
  4. 设置客户端授权密码

注意事项

  1. 安全性:不要在代码中硬编码密码,建议使用环境变量或配置文件
  2. 错误处理:添加完善的异常处理机制
  3. 发送限制:大多数邮箱有日发送量限制
  4. 垃圾邮件:避免发送大量邮件,防止被标记为垃圾邮件
  5. 附件大小:注意附件大小限制(通常25MB以内)

使用环境变量示例

import os
from dotenv import load_dotenv
load_dotenv()
EMAIL = os.getenv("EMAIL")
PASSWORD = os.getenv("EMAIL_PASSWORD")
SMTP_SERVER = os.getenv("SMTP_SERVER", "smtp.qq.com")
SMTP_PORT = int(os.getenv("SMTP_PORT", "465"))

这些示例涵盖了Python发送邮件的常见场景,你可以根据实际需求选择合适的方案。

抱歉,评论功能暂时关闭!