邮件自动化:用 Python 发送和接收邮件

好的,各位朋友,欢迎来到“Python邮件自动化奇妙夜”!我是你们今晚的导游,将带领大家探索用Python玩转邮件的奥秘。别担心,即使你觉得自己是编程小白,今晚之后也能变成邮件大师!准备好了吗?让我们启程!🚀

第一幕:拨开云雾见邮件

首先,我们要搞清楚,电子邮件到底是个什么玩意儿? 简单来说,它就像我们以前用的信,只不过是电子版的,通过互联网传递。你可以把它想象成一只数字信鸽,嗖的一下,就把你的消息送到对方手中。🕊️

SMTP (Simple Mail Transfer Protocol): 这位老兄是邮件发送的功臣,专门负责把你的邮件投递到服务器。你可以把他看作是邮局的投递员。
IMAP (Internet Message Access Protocol): 这位老哥则负责帮你从服务器上收取邮件,并且允许你在多个设备上同步邮件状态。他就像你的私人邮箱管理员。

第二幕:Python 的魔法棒:smtplibimaplib

Python 提供了两个强大的库,让我们能够轻松地与 SMTP 和 IMAP 服务器对话:

  • smtplib: 发送邮件的神器!有了它,你可以像写信一样,告诉服务器你想把邮件发给谁,邮件的内容是什么。
  • imaplib: 接收邮件的利器!它能帮你连接到邮箱服务器,搜索、读取、删除邮件,甚至还能像整理房间一样,把邮件归类到不同的文件夹里。

第三幕:用 smtplib 发送你的第一封邮件

好,现在让我们来动手发一封邮件吧!

1. 准备工作:

你需要一个邮箱账号(QQ邮箱、Gmail、163邮箱都可以),并且开启 SMTP 服务。注意,为了安全起见,大多数邮箱都需要你设置一个“授权码”作为密码。这个授权码就像进入你邮箱的通行证,务必保管好!

2. 代码登场!

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 你的邮箱账号和授权码
sender = '[email protected]'
password = 'your_authorization_code'  # 千万不要直接在代码里写密码!
receiver = '[email protected]'

# 邮件内容
mail_content = '亲爱的朋友,你好!nn这是一封来自 Python 的问候!👋'
message = MIMEText(mail_content, 'plain', 'utf-8')  # 内容,类型,编码
message['From'] = Header(sender, 'utf-8')  # 发件人
message['To'] = Header(receiver, 'utf-8')  # 收件人
message['Subject'] = Header('Python 邮件测试', 'utf-8')  # 邮件主题

# 连接 SMTP 服务器并发送邮件
try:
    smtpObj = smtplib.SMTP_SSL('smtp.example.com', 465)  # SMTP服务器地址和端口
    smtpObj.login(sender, password)  # 登录
    smtpObj.sendmail(sender, receiver, message.as_string())  # 发送
    print("邮件发送成功!🎉")
except smtplib.SMTPException as e:
    print("Error: 邮件发送失败!", e)
finally:
    smtpObj.quit() # 关闭连接

代码解读:

  • import smtplib, email: 导入需要的库。
  • sender, password, receiver: 填写你的邮箱账号、授权码和收件人邮箱。
  • MIMEText: 创建一个邮件对象,指定邮件内容、类型(plain/html)和编码。
  • Header: 设置邮件头,包括发件人、收件人和主题。
  • smtplib.SMTP_SSL: 连接到 SMTP 服务器,smtp.example.com 替换成你邮箱的 SMTP 服务器地址,465 是 SSL 加密端口(通常 Gmail、QQ邮箱使用)。
  • smtpObj.login: 使用你的账号和授权码登录。
  • smtpObj.sendmail: 发送邮件!
  • smtpObj.quit(): 发送完毕,记得关闭连接,释放资源。

注意事项:

  • 邮箱服务器地址: 不同的邮箱服务商的 SMTP 服务器地址不一样,比如 Gmail 是 smtp.gmail.com,QQ邮箱是 smtp.qq.com,163邮箱是 smtp.163.com。请根据你使用的邮箱服务商查找正确的地址。
  • 端口号: 常用的端口号有 25 (明文传输), 465 (SSL 加密), 587 (TLS 加密)。
  • 授权码: 请务必使用授权码,而不是你的邮箱密码!
  • 异常处理: 使用 try...except 块来捕获发送邮件过程中可能出现的错误,例如网络连接问题、账号密码错误等。

第四幕:让邮件更精彩:HTML 邮件、附件、抄送/密送

光发送纯文本邮件太单调了?没问题,我们可以让邮件变得更漂亮、更实用!

1. HTML 邮件:

from email.mime.multipart import MIMEMultipart

# 创建一个带附件的邮件对象
message = MIMEMultipart()
message['From'] = Header(sender, 'utf-8')
message['To'] = Header(receiver, 'utf-8')
message['Subject'] = Header('HTML 邮件测试', 'utf-8')

# HTML 内容
html_content = """
<html>
  <body>
    <h1>你好!</h1>
    <p>这是一封 <b>HTML</b> 格式的邮件。</p>
    <img src="https://www.example.com/image.jpg">
  </body>
</html>
"""
html_part = MIMEText(html_content, 'html', 'utf-8')
message.attach(html_part)

关键点:

  • 使用 MIMEMultipart 创建一个多部分邮件对象。
  • 使用 MIMEText(html_content, 'html', 'utf-8') 创建一个 HTML 邮件部分。
  • 使用 message.attach(html_part) 将 HTML 部分添加到邮件中。

2. 添加附件:

from email.mime.application import MIMEApplication

# 添加附件
with open('example.pdf', 'rb') as f:
    attachment = MIMEApplication(f.read(), _subtype='pdf')
    attachment.add_header('Content-Disposition', 'attachment', filename='example.pdf')
    message.attach(attachment)

关键点:

  • 使用 MIMEApplication 创建一个附件对象。
  • _subtype 指定附件的类型 (pdf, doc, jpg 等)。
  • add_header 设置附件的头部信息,包括文件名。

3. 抄送/密送:

message['Cc'] = Header('[email protected]', 'utf-8')  # 抄送
message['Bcc'] = Header('[email protected]', 'utf-8')  # 密送

关键点:

  • 使用 message['Cc'] 添加抄送人。
  • 使用 message['Bcc'] 添加密送人(密送人不会显示在收件人列表中)。
  • smtpObj.sendmail 的第二个参数中,将所有收件人(包括收件人、抄送人、密送人)的邮箱地址放到一个列表中。

完整示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.header import Header

sender = '[email protected]'
password = 'your_authorization_code'
receiver = '[email protected]'
cc = '[email protected]'
bcc = '[email protected]'

message = MIMEMultipart()
message['From'] = Header(sender, 'utf-8')
message['To'] = Header(receiver, 'utf-8')
message['Cc'] = Header(cc, 'utf-8')
message['Bcc'] = Header(bcc, 'utf-8')
message['Subject'] = Header('带附件和抄送/密送的邮件测试', 'utf-8')

# HTML 内容
html_content = """
<html>
  <body>
    <h1>你好!</h1>
    <p>这是一封 <b>HTML</b> 格式的邮件,带附件和抄送/密送。</p>
  </body>
</html>
"""
html_part = MIMEText(html_content, 'html', 'utf-8')
message.attach(html_part)

# 添加附件
with open('example.pdf', 'rb') as f:
    attachment = MIMEApplication(f.read(), _subtype='pdf')
    attachment.add_header('Content-Disposition', 'attachment', filename='example.pdf')
    message.attach(attachment)

try:
    smtpObj = smtplib.SMTP_SSL('smtp.example.com', 465)
    smtpObj.login(sender, password)
    all_receivers = [receiver, cc, bcc] # 所有收件人
    smtpObj.sendmail(sender, all_receivers, message.as_string())
    print("邮件发送成功!🎉")
except smtplib.SMTPException as e:
    print("Error: 邮件发送失败!", e)
finally:
    smtpObj.quit()

第五幕:用 imaplib 接收和处理邮件

发送邮件已经学会了,现在让我们来学习如何接收邮件吧!

1. 连接到 IMAP 服务器:

import imaplib

# 连接到 IMAP 服务器
mail = imaplib.IMAP4_SSL('imap.example.com') # IMAP服务器地址
mail.login(sender, password) # 登录

2. 选择邮箱:

mail.select('inbox')  # 选择收件箱

3. 搜索邮件:

result, data = mail.search(None, 'ALL')  # 搜索所有邮件
mail_ids = data[0].split() # 获取所有邮件的 ID 列表

4. 读取邮件:

for mail_id in mail_ids:
    result, data = mail.fetch(mail_id, '(RFC822)') # 获取邮件内容
    raw_email = data[0][1] # 原始邮件内容 (bytes)

    # 将 bytes 转换为字符串
    import email
    email_message = email.message_from_bytes(raw_email)

    print("Subject:", email_message['Subject']) # 邮件主题
    print("From:", email_message['From'])       # 发件人
    print("Date:", email_message['Date'])       # 发送日期

    # 处理邮件内容
    if email_message.is_multipart():
        for part in email_message.walk():
            if part.get_content_type() == 'text/plain':
                body = part.get_payload(decode=True).decode() # 获取邮件正文 (纯文本)
                print("Body:", body)
            elif part.get_content_type() == 'text/html':
                html_body = part.get_payload(decode=True).decode() # 获取邮件正文 (HTML)
                # 你可以解析 HTML 内容
                print("HTML Body:", html_body[:200] + "...") # 只显示部分 HTML 内容

    else:
        body = email_message.get_payload(decode=True).decode() # 获取邮件正文
        print("Body:", body)

5. 其他操作:

  • 删除邮件: mail.store(mail_id, '+FLAGS', '\Deleted') 然后 mail.expunge() 真正删除
  • 移动邮件: 你需要先创建一个新的文件夹,然后使用 mail.copy(mail_id, 'NewFolderName') 复制邮件到新文件夹,再删除原邮件。

完整示例:

import imaplib
import email

sender = '[email protected]'
password = 'your_authorization_code'

try:
    mail = imaplib.IMAP4_SSL('imap.example.com')
    mail.login(sender, password)
    mail.select('inbox')

    result, data = mail.search(None, 'ALL')
    mail_ids = data[0].split()

    for mail_id in mail_ids:
        result, data = mail.fetch(mail_id, '(RFC822)')
        raw_email = data[0][1]
        email_message = email.message_from_bytes(raw_email)

        print("Subject:", email_message['Subject'])
        print("From:", email_message['From'])
        print("Date:", email_message['Date'])

        if email_message.is_multipart():
            for part in email_message.walk():
                if part.get_content_type() == 'text/plain':
                    body = part.get_payload(decode=True).decode()
                    print("Body:", body)
                elif part.get_content_type() == 'text/html':
                    html_body = part.get_payload(decode=True).decode()
                    print("HTML Body:", html_body[:200] + "...")
        else:
            body = email_message.get_payload(decode=True).decode()
            print("Body:", body)

except imaplib.IMAP4.error as e:
    print("Error: 邮件接收失败!", e)
finally:
    try:
        mail.close()
    except:
        pass
    try:
        mail.logout()
    except:
        pass

第六幕:邮件自动化的进阶技巧

掌握了基本的发送和接收邮件,我们可以开始探索更高级的自动化技巧:

  • 定时发送邮件: 使用 schedule 库可以定时执行发送邮件的任务。
  • 邮件过滤和分类: 根据发件人、主题、内容等条件,自动将邮件分类到不同的文件夹。
  • 自动回复邮件: 设置自动回复规则,例如收到特定主题的邮件时,自动回复一条预设的消息。
  • 邮件数据分析: 从邮件中提取关键信息,例如订单信息、用户反馈等,进行数据分析和报表生成。

第七幕:安全第一!

邮件安全至关重要!请务必注意以下几点:

  • 不要将密码直接写在代码中! 使用环境变量或者配置文件来存储敏感信息。
  • 使用 SSL/TLS 加密连接! 确保你的邮件内容在传输过程中是加密的。
  • 验证邮件发件人! 防止钓鱼邮件和欺诈行为。
  • 小心处理附件! 不要随意打开来历不明的附件。

总结:

恭喜各位,我们已经完成了 Python 邮件自动化之旅!掌握了 smtplibimaplib 这两把利剑,你就可以像魔法师一样,轻松地操控邮件,让它们为你服务。记住,编程的乐趣在于不断探索和创新,希望大家能够利用这些知识,创造出更多有趣的邮件自动化应用! 愿你的代码永不 Bug,愿你的邮件永远畅通! 🚀✨

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注