HOOOS

Python定制:如何根据邮件内容自动回复不同信息?

0 3 自动化小能手 Python邮件自动回复IMAP
Apple

想用Python实现一个能根据邮件内容自动回复的脚本?这需求简直太常见了!比如说,你可能想根据不同的关键词回复不同的内容,或者根据发件人自动分配邮件到不同的处理流程。别担心,这完全可以实现,而且并不难!

核心思路:

  1. 收取邮件: 使用imapliboutlook等库连接到你的邮箱服务器,收取未读邮件。
  2. 解析邮件内容: 使用email库解析邮件,提取发件人、主题、正文等信息。
  3. 条件判断: 根据提取到的信息,使用if...elif...else语句或更复杂的规则引擎进行条件判断。
  4. 准备回复内容: 根据不同的条件,准备不同的回复内容。
  5. 发送邮件: 使用smtplib库连接到你的邮箱服务器,发送回复邮件。

准备工作:

  • 安装必要的库:

    pip install imaplib email smtplib
    # 如果你需要处理HTML邮件,可以安装beautifulsoup4
    pip install beautifulsoup4
    
  • 开启邮箱的IMAP/SMTP服务:

    你需要登录你的邮箱,在设置中开启IMAP/SMTP服务,并获取授权码(有些邮箱需要授权码才能通过第三方客户端登录)。

代码示例:

下面是一个简单的示例,演示了如何根据邮件主题中的关键词回复不同的内容。

import imaplib
import email
from email.header import decode_header
import smtplib

# 邮箱配置
EMAIL_ADDRESS = "your_email@example.com" # 你的邮箱地址
EMAIL_PASSWORD = "your_email_password" # 你的邮箱密码或授权码
IMAP_SERVER = "imap.example.com" # IMAP服务器地址
SMTP_SERVER = "smtp.example.com" # SMTP服务器地址
SMTP_PORT = 587 # SMTP端口,通常为587或465


def process_email():
    # 连接到IMAP服务器
    imap = imaplib.IMAP4_SSL(IMAP_SERVER)
    imap.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
    imap.select("INBOX")

    # 搜索未读邮件
    status, messages = imap.search(None, "UNSEEN")
    if status == "OK":
        messages = messages[0].split()

        for mail_id in messages:
            # 获取邮件内容
            status, msg_data = imap.fetch(mail_id, "(RFC822)")
            if status == "OK":
                msg = email.message_from_bytes(msg_data[0][1])

                # 解码邮件主题
                subject = decode_header(msg["Subject"])[0][0]
                if isinstance(subject, bytes):
                    subject = subject.decode()

                # 解码发件人
                from_ = decode_header(msg.get("From"))[0][0]
                if isinstance(from_, bytes):
                    from_ = from_.decode()

                print(f"主题: {subject}")
                print(f"发件人: {from_}")

                # 获取邮件正文
                body = ""
                if msg.is_multipart():
                    for part in msg.walk():
                        content_type = part.get_content_type()
                        content_disposition = str(part.get("Content-Disposition"))

                        if content_type == "text/plain" and "attachment" not in content_disposition:
                            body = part.get_payload(decode=True).decode()
                            break # 只取第一个text/plain部分
                        elif content_type == "text/html" and "attachment" not in content_disposition:
                             # 使用BeautifulSoup解析HTML,提取纯文本
                            from bs4 import BeautifulSoup
                            html = part.get_payload(decode=True).decode()
                            soup = BeautifulSoup(html, "html.parser")
                            body = soup.get_text()
                            break

                else:
                    body = msg.get_payload(decode=True).decode()

                print(f"正文: {body[:100]}...") # 打印前100个字符

                #  回复邮件逻辑
                reply_subject = f"Re: {subject}"
                reply_body = ""

                if "咨询" in subject:
                    reply_body = "您好,感谢您的咨询,我们会尽快回复您。"
                elif "合作" in subject:
                    reply_body = "您好,感谢您的合作意向,请留下您的联系方式。"
                else:
                    reply_body = "您好,这是一条自动回复邮件。"

                # 发送回复邮件
                send_reply(from_, reply_subject, reply_body)

                # 标记邮件为已读
                imap.store(mail_id, '+FLAGS', '\\Seen')

    imap.close()
    imap.logout()


def send_reply(to_email, subject, body):
    # 构建邮件内容
    msg = email.message.EmailMessage()
    msg['From'] = EMAIL_ADDRESS
    msg['To'] = to_email
    msg['Subject'] = subject
    msg.set_content(body)

    # 连接到SMTP服务器
    with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as smtp:
        smtp.starttls()
        smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        smtp.send_message(msg)
        print(f"已回复邮件至: {to_email}")

# 主程序
if __name__ == "__main__":
    process_email()

代码解释:

  • process_email() 函数:
    • 连接到IMAP服务器,并选择收件箱。
    • 搜索未读邮件。
    • 循环处理每一封未读邮件:
      • 获取邮件内容(主题、发件人、正文)。
      • 根据主题中的关键词,设置不同的回复内容。
      • 调用send_reply()函数发送回复邮件。
      • 将邮件标记为已读。
    • 关闭IMAP连接。
  • send_reply() 函数:
    • 构建邮件内容(发件人、收件人、主题、正文)。
    • 连接到SMTP服务器,并发送邮件。

注意事项:

  • 安全性: 不要将你的邮箱密码直接写在代码中,可以使用环境变量或配置文件来存储密码。更安全的方式是使用OAuth 2.0认证。
  • 错误处理: 代码中缺少错误处理,例如网络连接错误、邮箱登录错误等。在实际应用中,你需要添加适当的try...except语句来处理这些错误。
  • 编码问题: 邮件的编码可能很复杂,需要小心处理,避免出现乱码问题。email库提供了强大的编码处理功能,可以参考官方文档。
  • 频率限制: 不要过于频繁地收取邮件和发送邮件,以免被邮箱服务器认为是垃圾邮件发送者。
  • HTML邮件: 上面的代码示例可以处理纯文本和HTML邮件。对于HTML邮件,我们使用BeautifulSoup库来提取纯文本内容。如果邮件包含复杂的HTML结构,可能需要更复杂的解析逻辑。
  • 邮件附件: 如果你需要处理邮件附件,可以使用email库的相关方法来提取附件,并进行相应的处理。

更高级的应用:

  • 使用正则表达式: 可以使用正则表达式来更灵活地匹配邮件内容,例如匹配特定的日期格式、电话号码等。
  • 使用机器学习: 可以使用机器学习模型来对邮件进行分类,例如判断邮件是否是垃圾邮件、是否需要紧急处理等。
  • 集成到Web应用: 可以将这个脚本集成到Web应用中,提供一个用户友好的界面来配置自动回复规则。

总结:

通过Python的imaplibemailsmtplib库,你可以轻松地实现根据邮件内容自动回复不同信息的脚本。希望这个示例能帮助你入门,并启发你构建更强大的邮件自动化系统!记住,安全第一,错误处理也很重要哦!

点评评价

captcha
健康