当前位置:首页 > Python > 正文

Python邮件收发完整教程 - 实现SMTP发送与POP3/IMAP接收 | Python编程指南

Python邮件收发完整教程

使用SMTP、POP3和IMAP协议实现电子邮件自动化

Python邮件处理简介

Python提供了强大的库来处理电子邮件的发送和接收。本教程将指导您使用Python实现完整的邮件收发功能,包括:

  • 使用SMTP协议发送电子邮件
  • 使用POP3协议接收电子邮件
  • 使用IMAP协议接收电子邮件
  • 处理HTML格式邮件和附件
  • 邮件安全最佳实践

这些技能对于自动化邮件通知、邮件营销系统、邮件监控工具等应用至关重要。

环境准备

在开始之前,请确保您已安装Python(建议3.6+版本)。Python标准库已包含我们所需的核心模块:

  • smtplib - 用于SMTP协议发送邮件
  • email - 用于构建和解析邮件内容
  • poplib - 用于POP3协议接收邮件
  • imaplib - 用于IMAP协议接收邮件

重要提示:

大多数邮件服务商(如Gmail、QQ邮箱、163邮箱等)需要启用SMTP/POP3/IMAP服务并获取授权码代替密码进行验证。

使用Python发送电子邮件

1. 发送纯文本邮件

import smtplib
from email.mime.text import MIMEText

# 邮件配置
smtp_server = 'smtp.example.com'  # 替换为您的SMTP服务器
smtp_port = 587                   # 通常587用于TLS,465用于SSL
sender_email = 'your_email@example.com'
password = 'your_password_or_app_password'  # 使用授权码而非登录密码
receiver_email = 'recipient@example.com'

# 创建邮件内容
subject = 'Python邮件测试'
body = '这是一封来自Python的测试邮件。'

# 创建MIMEText对象
message = MIMEText(body, 'plain', 'utf-8')
message['From'] = sender_email
message['To'] = receiver_email
message['Subject'] = subject

# 发送邮件
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()  # 启用TLS加密
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, message.as_string())
    print("邮件发送成功!")
except Exception as e:
    print(f"邮件发送失败: {e}")

2. 发送HTML格式邮件

from email.mime.multipart import MIMEMultipart

# 创建多部分消息
msg = MIMEMultipart('alternative')
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = 'HTML格式邮件测试'

# 创建纯文本和HTML版本
text = "您的邮件客户端不支持HTML邮件。"
html = """<html>
<body>
    <h1 style="color: #3498db;">Python邮件测试</h1>
    <p>这是一封<b>HTML格式</b>的测试邮件。</p>
    <p><a  href="https://liuhe.jltcw.com/Jz52_goto?url=yaXapqxzlJPd2Kplptvay9PRXqKnyw,," rel="nofollow">访问Python官网</a></p>
</body>
</html>"""

# 添加两个版本到邮件
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)

# 发送邮件(同上)

3. 发送带附件的邮件

from email.mime.base import MIMEBase
from email import encoders
import os

# 创建多部分消息
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = '带附件的邮件'

# 添加邮件正文
body = "请查收附件。"
msg.attach(MIMEText(body, 'plain'))

# 添加附件
filename = 'example.pdf'  # 替换为您的文件
attachment = open(filename, 'rb')

part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename={os.path.basename(filename)}')

msg.attach(part)

# 发送邮件(同上)

使用Python接收电子邮件

1. 使用POP3接收邮件

import poplib
from email.parser import Parser

# POP3配置
pop3_server = 'pop.example.com'  # 替换为您的POP3服务器
pop3_port = 995                   # 通常995用于SSL
username = 'your_email@example.com'
password = 'your_password_or_app_password'

# 连接服务器
try:
    server = poplib.POP3_SSL(pop3_server, pop3_port)
    server.user(username)
    server.pass_(password)
    
    # 获取邮件统计信息
    num_messages = len(server.list()[1])
    print(f"邮箱中有 {num_messages} 封邮件")
    
    # 获取最新邮件
    if num_messages > 0:
        response, lines, octets = server.retr(num_messages)
        msg_content = b'\r\n'.join(lines).decode('utf-8')
        message = Parser().parsestr(msg_content)
        
        # 打印邮件信息
        print(f"发件人: {message['From']}")
        print(f"主题: {message['Subject']}")
        print(f"日期: {message['Date']}")
        
        # 处理邮件内容...
    
    # 关闭连接
    server.quit()
except Exception as e:
    print(f"接收邮件失败: {e}")

2. 使用IMAP接收邮件

import imaplib
import email

# IMAP配置
imap_server = 'imap.example.com'  # 替换为您的IMAP服务器
imap_port = 993                   # 通常993用于SSL
username = 'your_email@example.com'
password = 'your_password_or_app_password'

# 连接服务器
try:
    mail = imaplib.IMAP4_SSL(imap_server, imap_port)
    mail.login(username, password)
    mail.select('inbox')  # 选择收件箱
    
    # 搜索未读邮件
    status, messages = mail.search(None, 'UNSEEN')
    if status == 'OK':
        message_ids = messages[0].split()
        
        for msg_id in message_ids:
            # 获取邮件内容
            status, msg_data = mail.fetch(msg_id, '(RFC822)')
            if status == 'OK':
                raw_email = msg_data[0][1]
                email_message = email.message_from_bytes(raw_email)
                
                # 打印邮件信息
                print(f"发件人: {email_message['From']}")
                print(f"主题: {email_message['Subject']}")
                print(f"日期: {email_message['Date']}")
                
                # 处理邮件正文和附件...
    
    # 关闭连接
    mail.logout()
except Exception as e:
    print(f"接收邮件失败: {e}")

高级技巧与最佳实践

安全注意事项

  • 始终使用SSL/TLS加密连接
  • 避免在代码中硬编码凭据 - 使用环境变量
  • 为应用程序创建专用邮箱账户
  • 使用应用专用密码而非账户密码

常见服务商配置

服务商 SMTP服务器 POP3/IMAP服务器
Gmail smtp.gmail.com:587 imap.gmail.com:993
QQ邮箱 smtp.qq.com:587 imap.qq.com:993
163邮箱 smtp.163.com:465 imap.163.com:993

错误处理建议

try:
    # 邮件操作代码...
except smtplib.SMTPAuthenticationError:
    print("认证失败:用户名或密码不正确")
except smtplib.SMTPServerDisconnected:
    print("服务器意外断开连接")
except smtplib.SMTPException as e:
    print(f"SMTP错误: {str(e)}")
except poplib.error_proto as e:
    print(f"POP3协议错误: {str(e)}")
except imaplib.IMAP4.error as e:
    print(f"IMAP错误: {str(e)}")
except Exception as e:
    print(f"未知错误: {str(e)}")

总结

本教程详细介绍了如何使用Python实现电子邮件的发送和接收功能。关键要点包括:

  1. 使用smtplibemail模块发送各种类型的邮件
  2. 通过POP3和IMAP协议接收邮件并解析内容
  3. 处理HTML邮件和附件的方法
  4. 邮件处理的安全最佳实践

Python的邮件处理功能强大而灵活,可以应用于各种自动化场景,如系统监控通知、批量邮件发送、邮件数据分析等。

现在您已经掌握了Python邮件处理的核心技能,开始构建您自己的邮件自动化应用吧!

发表评论