基于LangChain的QQ邮件智能收发工具--全网首发

项目简介

langchain官方原先有一个gmail邮箱工具,但是经过实测,配置麻烦,发送不了附件。而且最新的工具发送不了邮件,还需要进行进一步研究配置。为此本人经过仔细研究,开发出一款基于langchain的国内QQ邮箱智能邮件收发工具,配置操作简单,通过自然语言处理即可实现邮件的智能操作。该工具可以通过简单的自然语言指令完成邮件发送、抄送、附件处理以及邮件内容分析汇总等功能。

功能特性

  • 支持自然语言指令控制
  • 灵活的收件人和抄送人设置(单人/多人)
  • 支持纯文本和HTML格式邮件
  • 支持本地文件附件发送
  • 智能邮件总结和聚类分析

环境配置

必要的环境变量

在项目根目录创建.env文件,配置以下环境变量:

QQ_EMAIL=your_qq_email@qq.com
QQ_PASSWORD=your_authorization_code
OPENAI_API_KEY=your_openai_api_key
HTTP_PROXY=your_http_proxy
HTTPS_PROXY=your_https_proxy

依赖安装

pip install langchain python-dotenv openai imaplib html2text

核心代码结构

文件名:qq_email_tool.py

import os
from typing import Optional, List, Union, Type
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from langchain.tools import BaseTool
from dotenv import load_dotenv
from pydantic import BaseModel, Field
import imaplib
import email
from email.header import decode_header
import html2text


load_dotenv()


class QQEmailInput(BaseModel):
    """Input for QQ Email Tool."""
    to: str = Field(..., description="The recipient's email address")
    subject: str = Field(..., description="The subject of the email")
    body: str = Field(..., description="The content of the email")
    cc: Optional[str] = Field(None, description="Optional CC recipient's email address")
    is_html: Optional[bool] = Field(False, description="Whether the email content is HTML format")
    attachment_path: Optional[str] = Field(None, description="Optional path to an attachment file")


class QQEmailTool(BaseTool):
    """Tool for sending emails via QQ Mail."""
    name: str = "qq_email_sender"
    description: str = """Send emails via QQ Mail with support for HTML content, CC recipients, and attachments.
    Input should be a natural language request describing the email details.

    Examples:
    1. "Send an email to user@qq.com with subject 'Hello' and body 'Test email'"
    2. "Send HTML email to user@qq.com, CC to cc@qq.com, subject 'Test', content '<h1>Hello</h1>'"
    3. "Send email to user@qq.com, subject 'Files', body 'See attachment', attach file.txt"

    The tool will format your request into proper email parameters."""
    args_schema: Type[BaseModel] = QQEmailInput

    def __init__(self, **data):
        super().__init__(**data)
        self._sender_email = os.getenv("QQ_EMAIL")
        self._auth_code = os.getenv("QQ_PASSWORD")
        if not self._sender_email or not self._auth_code:
            raise ValueError("QQ_EMAIL and QQ_PASSWORD environment variables must be set")

    def _prepare_message(
            self,
            to_email: str,
            subject: str,
            body: str,
            cc_email: Optional[str] = None,
            is_html: bool = False,
            attachment_path: Optional[str] = None
    ) -> MIMEMultipart:
        """Prepare the email message with all components."""
        message = MIMEMultipart()
        message["From"] = self._sender_email
        message["To"] = to_email
        if cc_email:
            message["Cc"] = cc_email
        message["Subject"] = subject

        # Add body
        body_part = MIMEText(body, 'html' if is_html else 'plain', 'utf-8')
        message.attach(body_part)

        # Add attachment if provided
        if attachment_path and os.path.exists(attachment_path):
            with open(attachment_path, 'rb') as f:
                attachment = MIMEApplication(f.read())
                attachment.add_header(
                    'Content-Disposition',
                    'attachment',
                    filename=os.path.basename(attachment_path)
                )
                message.attach(attachment)

        return message

    def _run(
            self,
            to: str,
            subject: str,
            body: str,
            cc: Optional[str] = None,
            is_html: bool = False,
            attachment_path: Optional[str] = None
    ) -> str:
        """Run the tool to send an email."""
        try:
            # Create message
            msg = self._prepare_message(
                to_email=to,
                subject=subject,
                body=body,
                cc_email=cc,
                is_html=is_html,
                attachment_path=attachment_path
            )

            # Create list of recipients
            recipients = [to]
            if cc:
                recipients.append(cc)

            try:
                # Connect to QQ Mail's SMTP server
                server = smtplib.SMTP_SSL("smtp.qq.com", 465)
                server.login(self._sender_email, self._auth_code)

                # Send the email
                server.sendmail(self._sender_email, recipients, msg.as_string())
                server.quit()

                return f"Email sent successfully to {to}" + (f" with CC to {cc}" if cc else "")

            except smtplib.SMTPException as e:
                return f"SMTP error occurred: {str(e)}"

        except Exception as e:
            return f"Failed to send email: {str(e)}"


class QQEmailReadInput(BaseModel):
    """Input for reading emails."""
    num_emails: int = Field(..., description="Number of recent emails to read (max 50)")


class QQEmailToolReading(BaseTool):
    """Tool for reading and summarizing QQ Mail emails."""
    name: str = "qq_email_reader"
    description: str = """Read and summarize recent emails from your QQ Mail inbox.
    Input should be a number between 1 and 50 indicating how many recent emails to read.

    Examples:
    1. "Read my last 20 emails"
    2. "Show me my 30 most recent emails"
    3. "Summarize my latest 50 emails"
    4. "Get a summary of my last 15 emails"
    """
    args_schema: Type[BaseModel] = QQEmailReadInput

    def __init__(self, **data):
        super().__init__(**data)
        self._email = os.getenv("QQ_EMAIL")
        self._auth_code = os.getenv("QQ_PASSWORD")
        if not self._email or not self._auth_code:
            raise ValueError("QQ_EMAIL and QQ_PASSWORD environment variables must be set")
        self._h2t = html2text.HTML2Text()
        self._h2t.ignore_links = True

    def _decode_email_subject(self, subject):
        """Decode email subject."""
        if not subject:
            return "No Subject"
        decoded_list = decode_header(subject)
        subject = ""
        for decoded_str, charset in decoded_list:
            if isinstance(decoded_str, bytes):
                if charset:
                    try:
                        subject += decoded_str.decode(charset)
                    except:
                        subject += decoded_str.decode('utf-8', errors='ignore')
                else:
                    subject += decoded_str.decode('utf-8', errors='ignore')
            else:
                subject += str(decoded_str)
        return subject

    def _get_email_content(self, msg):
        """Extract email content from message."""
        try:
            content = ""
            if msg.is_multipart():
                for part in msg.walk():
                    if part.get_content_type() == "text/plain":
                        try:
                            content = part.get_payload(decode=True).decode()
                            break
                        except:
                            content = part.get_payload(decode=True).decode('utf-8', errors='ignore')
                            break
                    elif part.get_content_type() == "text/html":
                        try:
                            html_content = part.get_payload(decode=True).decode()
                            content = self._h2t.handle(html_content)
                            break
                        except:
                            html_content = part.get_payload(decode=True).decode('utf-8', errors='ignore')
                            content = self._h2t.handle(html_content)
                            break
            else:
                try:
                    content = msg.get_payload(decode=True).decode()
                except:
                    content = msg.get_payload(decode=True).decode('utf-8', errors='ignore')

            # Clean up the content
            content = content.strip()
            content = ' '.join(content.split())  # Remove extra whitespace
            return content
        except Exception as e:
            return f"[Error extracting content: {str(e)}]"

    def _run(
            self,
            num_emails: int
    ) -> str:
        """Run the tool to read recent emails."""
        try:
            # Limit number of emails to 50
            num_emails = min(max(1, num_emails), 50)

            # Connect to QQ Mail's IMAP server
            mail = imaplib.IMAP4_SSL("imap.qq.com")
            mail.login(self._email, self._auth_code)

            # Select inbox
            mail.select("INBOX")

            # Search for all emails and get the latest ones
            _, messages = mail.search(None, "ALL")
            email_ids = messages[0].split()
            latest_emails = email_ids[-num_emails:]

            # Process each email
            summaries = []
            separator = "-" * 50

            for email_id in reversed(latest_emails):
                try:
                    _, msg_data = mail.fetch(email_id, "(RFC822)")
                    email_body = msg_data[0][1]
                    msg = email.message_from_bytes(email_body)

                    # Get subject
                    subject = self._decode_email_subject(msg["subject"])

                    # Get sender
                    sender = msg["from"] if msg["from"] else "Unknown Sender"

                    # Get content
                    content = self._get_email_content(msg)

                    # Create summary
                    summary = f"\nFrom: {sender}\nSubject: {subject}\nContent Summary: {content[:200]}...\n{separator}"
                    summaries.append(summary)
                except Exception as e:
                    summaries.append(f"\nError processing email: {str(e)}\n{separator}")

            mail.close()
            mail.logout()

            if not summaries:
                return "No emails found in the inbox."

            header = f"Latest {num_emails} emails:"
            top_separator = "=" * 50
            bottom_separator = "=" * 50

            return f"{header}\n{top_separator}\n{''.join(summaries)}\n{bottom_separator}\nEnd of email summaries."

        except Exception as e:
            return f"Failed to read emails: {str(e)}"


使用示例

import dotenv

# 加载通用的环境变量,默认是.env
dotenv.load_dotenv()
True
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from qq_email_tool import QQEmailTool, QQEmailToolReading


# Initialize tools
tools = [QQEmailTool(), QQEmailToolReading()]

# Initialize the language model
llm = ChatOpenAI(
    temperature=0,
    model_name="gpt-4o"
)

# Create the prompt template
prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a helpful assistant that processes email requests, read and summarize emails."),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
])

# Create the agent
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True
)

1.发送普通邮件

input_data = """向 1018150066@qq.com 发送一封主题为“代理测试电子邮件”且正文为“此电子邮件通过 LangChain 代理发送的电子邮件。'"""
agent_executor.invoke({"input": input_data})
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m
Invoking: `qq_email_sender` with `{'to': '1018150066@qq.com', 'subject': '代理测试电子邮件', 'body': '此电子邮件通过 LangChain 代理发送的电子邮件。'}`


[0m[36;1m[1;3mEmail sent successfully to 1018150066@qq.com[0m[32;1m[1;3m电子邮件已成功发送至 1018150066@qq.com。[0m

[1m> Finished chain.[0m


{'input': "向 1018150066@qq.com 发送一封主题为“代理测试电子邮件”且正文为“此电子邮件通过 LangChain 代理发送的电子邮件。'",
 'output': '电子邮件已成功发送至 1018150066@qq.com。'}

在这里插入图片描述

2.发送html邮件并且抄送

input_data = """向 1018150066@qq.com 发送 HTML 电子邮件,将 CC 发送到 1909787671@qq.com,主题为“HTML 代理测试”,内容显示“来自代理的问候”作为标题,将“此电子邮件演示 HTML 格式”作为段落。'"""
agent_executor.invoke({"input": input_data})
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m
Invoking: `qq_email_sender` with `{'to': '1018150066@qq.com', 'cc': '1909787671@qq.com', 'subject': 'HTML 代理测试', 'body': '<h1>来自代理的问候</h1><p>此电子邮件演示 HTML 格式</p>', 'is_html': True}`


[0m[36;1m[1;3mEmail sent successfully to 1018150066@qq.com with CC to 1909787671@qq.com[0m[32;1m[1;3m我已成功向 1018150066@qq.com 发送了电子邮件,并抄送给 1909787671@qq.com。[0m

[1m> Finished chain.[0m

{'input': "向 1018150066@qq.com 发送 HTML 电子邮件,将 CC 发送到 1909787671@qq.com,主题为“HTML 代理测试”,内容显示“来自代理的问候”作为标题,将“此电子邮件演示 HTML 格式”作为段落。'",
 'output': '我已成功向 1018150066@qq.com 发送了电子邮件,并抄送给 1909787671@qq.com。'}

在这里插入图片描述

3.发送智能邮件

input_data = """向 1018150066@qq.com 发送一封简短的电子邮件,谢谢他请喝酒'"""
agent_executor.invoke({"input": input_data})

[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m
Invoking: `qq_email_sender` with `{'to': '1018150066@qq.com', 'subject': '感谢你的款待', 'body': '非常感谢你请我喝酒,我过得很愉快。期待下次再见。'}`


[0m[36;1m[1;3mEmail sent successfully to 1018150066@qq.com[0m[32;1m[1;3m我已经帮你向1018150066@qq.com发送了一封感谢邮件。[0m

[1m> Finished chain.[0m

{'input': "向 1018150066@qq.com 发送一封简短的电子邮件,谢谢他请喝酒'",
 'output': '我已经帮你向1018150066@qq.com发送了一封感谢邮件。'}

在这里插入图片描述

4.发送带附件邮件

input_data = """向 1018150066@qq.com 发送电子邮件,主题为“测试附件”,正文为“请找到附件的测试文件”,并附上 ./test.txt'"""
agent_executor.invoke({"input": input_data})
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m
Invoking: `qq_email_sender` with `{'to': '1018150066@qq.com', 'subject': '测试附件', 'body': '请找到附件的测试文件', 'attachment_path': './test.txt'}`


[0m[36;1m[1;3mEmail sent successfully to 1018150066@qq.com[0m[32;1m[1;3m已成功向 1018150066@qq.com 发送电子邮件。[0m

[1m> Finished chain.[0m


{'input': "向 1018150066@qq.com 发送电子邮件,主题为“测试附件”,正文为“请找到附件的测试文件”,并附上 ./test.txt'",
 'output': '已成功向 1018150066@qq.com 发送电子邮件。'}

在这里插入图片描述

5.接收邮件并且汇总

input_data = """阅读并总结我最近的 3 封电子邮件"""
agent_executor.invoke({"input": input_data})
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m
Invoking: `qq_email_reader` with `{'num_emails': 3}`

[0m[33;1m[1;3mLatest 3 emails:
==================================================

From: Start =?utf-8?b?5q+P5pel?= <microsoft.start@email2.microsoft.com>
Subject: 雷军回应小米产品卖到80多万:真正关心的是产品够不够酷
Content Summary:            <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><title>Start Daily</title></head><body bgcolor="#f0f0f0"><ta...

From: Vvacard <mobilecode@vvacard.com>
Subject: The verification code for Vvacard!
Content Summary: Your verification code (user login) is: <span
style='color:red;font-size: 20px;'>963701</span> ,
The verification code is valid for 5 minutes.
Please do not reply to this email!

...

From: =?UTF-8?B?6Zi/6YeM5LqR?= <monitor@monitor.aliyun.com>
Subject: 您的专属安全周报已送达,建议您及时掌握资产安全态势,预防黑客入侵,破坏业务运行
Content Summary: 此邮件由阿里云发送,由系统自动发出,请勿直接回复,谢谢!

![阿里云 logo](https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png)

产品 解决方案 文档与社区 免费试用 定价 云市场 了解阿里云

|
![banner](https://img.alicdn.com/imgextra/i1/O1CN01oDs2...
[0m[32;1m[1;3m以下是您最近的3封电子邮件的摘要:

1. 发件人:Start(microsoft.start@email2.microsoft.com)
   主题:雷军回应小米产品卖到80多万:真正关心的是产品够不够酷
   内容摘要:这是一封来自Start Daily的HTML格式邮件。

2. 发件人:Vvacard(mobilecode@vvacard.com)
   主题:The verification code for Vvacard!
   内容摘要:这是一封验证码邮件,验证码为963701,有效期为5分钟。

3. 发件人:阿里云(monitor@monitor.aliyun.com)
   主题:您的专属安全周报已送达,建议您及时掌握资产安全态势,预防黑客入侵,破坏业务运行
   内容摘要:这是一封来自阿里云的安全周报邮件,建议您及时掌握资产安全态势。[0m

[1m> Finished chain.[0m

{'input': '阅读并总结我最近的 3 封电子邮件',
 'output': '以下是您最近的3封电子邮件的摘要:\n\n1. 发件人:Start(microsoft.start@email2.microsoft.com)\n   主题:雷军回应小米产品卖到80多万:真正关心的是产品够不够酷\n   内容摘要:这是一封来自Start Daily的HTML格式邮件。\n\n2. 发件人:Vvacard(mobilecode@vvacard.com)\n   主题:The verification code for Vvacard!\n   内容摘要:这是一封验证码邮件,验证码为963701,有效期为5分钟。\n\n3. 发件人:阿里云(monitor@monitor.aliyun.com)\n   主题:您的专属安全周报已送达,建议您及时掌握资产安全态势,预防黑客入侵,破坏业务运行\n   内容摘要:这是一封来自阿里云的安全周报邮件,建议您及时掌握资产安全态势。'}

6.接收邮件并且聚类汇总

input_data = """显示我最近的 30 封电子邮件并且做分类总结"""
agent_executor.invoke({"input": input_data})
[1m> Entering new AgentExecutor chain...[0m
[32;1m[1;3m
Invoking: `qq_email_reader` with `{'num_emails': 30}`

[0m[33;1m[1;3mLatest 30 emails:
==================================================

From: Start =?utf-8?b?5q+P5pel?= <microsoft.start@email2.microsoft.com>
Subject: 雷军回应小米产品卖到80多万:真正关心的是产品够不够酷
Content Summary: <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><title>Start Daily</title></head><body bgcolor="#f0f0f0"><table align="...
--------------------------------------------------
From: Vvacard <mobilecode@vvacard.com>
Subject: The verification code for Vvacard!
Content Summary: Your verification code (user login) is: <span style='color:red;font-size: 20px;'>963701</span> , The verification code is valid for 5 minutes. Please do not reply to this email!...
--------------------------------------------------
From: =?UTF-8?B?6Zi/6YeM5LqR?= <monitor@monitor.aliyun.com>
Subject: 您的专属安全周报已送达,建议您及时掌握资产安全态势,预防黑客入侵,破坏业务运行
Content Summary: 此邮件由阿里云发送,由系统自动发出,请勿直接回复,谢谢! ![阿里云 logo](https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png) 产品 解决方案 文档与社区 免费试用 定价 云市场 了解阿里云 | ![banner](https://img.alicdn.com/imgextra/i1/O1CN01oDs2Uv1...
--------------------------------------------------
From: =?UTF-8?B?6Zi/6YeM5LqR?= <system@notice.aliyun.com>
Subject: 云解析解析记录修改通知
Content Summary: 此邮件由阿里云发送,由系统自动发出,请勿直接回复,谢谢! ![阿里云 logo](https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png) 产品 解决方案 文档与社区 免费试用 定价 云市场 了解阿里云 尊敬的用户:haisheng11a --- 您于2024-10-30 02:52:42(UTC+8)对域名haishen...
--------------------------------------------------
From: =?UTF-8?B?6auY5b635byA5pS+5bmz5Y+w?= <lbs@service.amap.com>
Subject: 讲师招募计划|携手云图,点亮云端成长之路
Content Summary: Autonavi LBS...
--------------------------------------------------
From: "PostMaster" <PostMaster@qq.com>
Subject: 来自qq.com的退信
Content Summary: 很抱歉您发送的邮件被退回,以下是该邮件的相关信息: 被退回邮件 | 主 题:Test Email with Attachment 时 间:1970-01-01 07:59:59 ---|--- 无法发送到 test@example.com --- 退信原因 | 收件人(test@example.com)所属域名不存在,邮件无法送达。 No Mx Record Found 解决方案 | 请联系您的收...
--------------------------------------------------
From: =?UTF-8?B?5Y2O55ub6K+B5Yi4?= <service@mailservice.hstong.com>
Subject: 【美股投资必读】中概股逆市反弹!11月初还有政策大礼包?
Content Summary: ![](https://r.hstong.com/public/mail/image/top-cn.png) --- | ** ** 尊敬的客户: 上周美债收益率飙升致避险情绪升温,美股由高位回落。**但中国资产却逆势上扬,** 中国金龙ETF上周涨超1%,本周一更是一举大涨超4%,强势跑赢美股大盘!市场都在翘首以待11月初的增量政策,中国资产的潜力不容小觑。 本周,Q3财报季进入高潮,**苹果、...
--------------------------------------------------
From: =?UTF-8?B?6KeC5rWL5LqR?= <noreply@notice.guance.com>
Subject: 观测云产品升级通知 / Guance Product Upgrade Notification
Content Summary: | | | --- | | | | ![](https://qiniu.ifaxin.com/88965/2021/12/21/1b3d45c7706c4fe9975f2b28f95b6ed2.gif) --- | | | | **尊敬的观测云用户:****您好!** 感谢您对「观测云」一直以来的信任和支持,为了进一步提高观测云的产品和服务,观测云计划于 **2024 年 10 月 30 日晚上 ...
--------------------------------------------------
From: "=?utf-8?B?6IW+6K6v6KeG6aKR?=" <film@tencent.com>
Subject: 会员服务到期提醒
Content Summary: 您的会员服务即将到期 尊敬的用户,您微信账号(热血的青春)的会员服务已过期。极速缓存、1080p大片等特权都将无法享受,积分已被冻结。快来开通会员,重享特权吧~ -20/天 V力值正在下降 0天后降为V0 1 积分已被冻结 续费即可使用积分兑换好礼 VIP会员新片 锦绣安宁 好团圆 吞噬星空...
--------------------------------------------------
From: =?utf-8?B?5reY5a6d572R?= <taobao@mc.mail.taobao.com>
Subject: 淘宝提醒您:退款已经成功
Content Summary: <html> <head> <title></title> <base target="_blank"/> </head> <body> <p> 您好, 您的退款订单 300303219535783764 申请已经达成退款。 宝贝:兽无人机旗舰店8000Wmax数字图传高清专业航拍2024年新款黑科技高端智能超长续航追蜂兽4兽3大强大江无人机 退款金额:1099.00 点此查看<a href="h...
--------------------------------------------------
From: Start =?utf-8?b?5q+P5pel?= <microsoft.start@email2.microsoft.com>
Subject: 同框亮相!神舟十九号航天员乘组简历来了
Content Summary: <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><title>Start Daily</title></head><body bgcolor="#f0f0f0"><table align="...
--------------------------------------------------
From: Alethea AI <contact@alethea.ai>
Subject: Say Hello to ALI Token Staking!
Content Summary: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-t...
--------------------------------------------------
From: ChessBase <chessletter@chessbase.com>
Subject: Enhance Your Chess Skills with Guess the Move, New Courses & More!
Content Summary: Discover ChessBase’s powerful training tools like 'Guess the Move' and 'Assisted Calculation' to boost your visualization and strategy. ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ...
--------------------------------------------------
From: =?UTF-8?B?6Zi/6YeM5LqR?= <system@notice.aliyun.com>
Subject: 云解析解析记录修改通知
Content Summary: 此邮件由阿里云发送,由系统自动发出,请勿直接回复,谢谢! ![阿里云 logo](https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png) 产品 解决方案 文档与社区 免费试用 定价 云市场 了解阿里云 尊敬的用户:haisheng11a --- 您于2024-10-29 02:51:28(UTC+8)对域名haishen...
--------------------------------------------------
From: Virt-A-Mate Hub <noreply@virtamate.com>
Subject: Virt-A-Mate Hub - See what you have missed
Content Summary: Virt-A-Mate Hub (https://hub.virtamate.com/) A summary of what you missed recently Latest threads 108 Latest posts 352 Alerts 10 Members 756 Latest threads Benchmark Result Discussion (https://hub.vir...
--------------------------------------------------
From: Start =?utf-8?b?5q+P5pel?= <microsoft.start@email2.microsoft.com>
Subject: 林诗栋0-4惨败小勒布伦!国乒法国冠军赛0冠收场
Content Summary: <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><title>Start Daily</title></head><body bgcolor="#f0f0f0"><table align="...
--------------------------------------------------
From: Arm <arm.emails@arm.com>
Subject: 火热报名中 | Arm Tech Symposia 年度技术大会
Content Summary: [Arm](https://www.arm.com?utm_source=arm&utm_medium=email) Arm Tech Symposia 年度技术大会即将开启,精彩全揭晓 速速报名! [Arm Tech Symposia 年度技术大会](https://www.armevent.com.cn/TechSymposia-2024/register?utm_source=marketo...
--------------------------------------------------
From: ts@isc.org.cn
Subject: 发送投诉编码
Content Summary: 您的投诉材料提交成功。本次投诉编码为:2410BWJ,请妥善保管。(互联网信息服务投诉平台)...
--------------------------------------------------
From: Cursor <no-reply@cursor.sh>
Subject: Verify your email address
Content Summary: Verify your email You need to verify your email address 821058392@qq.com before you can access your account. Enter the code below in your open browser window. 297347 This code expires in 10 minutes. -...
--------------------------------------------------
From: =?UTF-8?B?6Zi/6YeM5LqR?= <system@notice.aliyun.com>
Subject: 云解析解析记录修改通知
Content Summary: 此邮件由阿里云发送,由系统自动发出,请勿直接回复,谢谢! ![阿里云 logo](https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png) 产品 解决方案 文档与社区 免费试用 定价 云市场 了解阿里云 尊敬的用户:haisheng11a --- 您于2024-10-28 02:54:47(UTC+8)对域名haishen...
--------------------------------------------------
From: ts@isc.org.cn
Subject: 发送投诉编码
Content Summary: 您的投诉材料提交成功。本次投诉编码为:2410gx,请妥善保管。(互联网信息服务投诉平台)...
--------------------------------------------------
From: Start =?utf-8?b?5q+P5pel?= <microsoft.start@email2.microsoft.com>
Subject: 2024年国家医保谈判正式开启 162个品种参与竞价
Content Summary: <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><title>Start Daily</title></head><body bgcolor="#f0f0f0"><table align="...
--------------------------------------------------
From: "=?utf-8?B?6IW+6K6v6KeG6aKR?=" <film@tencent.com>
Subject: 会员服务即将到期提醒
Content Summary: 您的会员服务即将到期 尊敬的用户热血的青春(微信账号),您的腾讯视频VIP服务明天即将到期。极速缓存、1080p大片等特权都将无法享受,习惯了享受,怎么能将就,现在就去续期 >> VIP会员新片 锦绣安宁 斗破苍穹年番 好团圆...
--------------------------------------------------
From: =?UTF-8?B?6Zi/6YeM5LqR?= <system@notice.aliyun.com>
Subject: 云解析解析记录修改通知
Content Summary: 此邮件由阿里云发送,由系统自动发出,请勿直接回复,谢谢! ![阿里云 logo](https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png) 产品 解决方案 文档与社区 免费试用 定价 云市场 了解阿里云 尊敬的用户:haisheng11a --- 您于2024-10-27 02:53:11(UTC+8)对域名haishen...
--------------------------------------------------
From: "Microsoft Rewards" <MicrosoftRewards@customermail.microsoft.com>
Subject: Our million dollar sweeps is here-claim your free entry
Content Summary: <!DOCTYPE HTML> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml" dir="ltr" lang="en-us"> <head> <!--[if gte mso 9]> ...
--------------------------------------------------
From: Start =?utf-8?b?5q+P5pel?= <microsoft.start@email2.microsoft.com>
Subject: 扩散提醒!中央气象台发布台风大雾双预警
Content Summary: <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><title>Start Daily</title></head><body bgcolor="#f0f0f0"><table align="...
--------------------------------------------------
From: =?UTF-8?B?6Zi/6YeM5LqR?= <system@notice.aliyun.com>
Subject: 云解析解析记录修改通知
Content Summary: 此邮件由阿里云发送,由系统自动发出,请勿直接回复,谢谢! ![阿里云 logo](https://img.alicdn.com/tfs/TB13DzOjXP7gK0jSZFjXXc5aXXa-212-48.png) 产品 解决方案 文档与社区 免费试用 定价 云市场 了解阿里云 尊敬的用户:haisheng11a --- 您于2024-10-26 02:51:30(UTC+8)对域名haishen...
--------------------------------------------------
From: Streamlit Community <streamlitcommunity@snowflake.com>
Subject: See what’s new in Release 1.39 and the Quarterly Showcase
Content Summary: Hey Streamlitters! October is upon us, and you’re in for a treat—release 1.39 brings new functionalities that let you do even more with your apps. Keep reading to see highlights from the release, how ...
--------------------------------------------------
From: ChessBase <chessletter@chessbase.com>
Subject: 📹 How to play the Caro- Kann Defence: Ein Kurs vonÀlvar Alonso Rosell
Content Summary: Master the Caro-Kann defence and secure control of the game 🏰 with our video course on strategic advantage and clever moves. ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏...
--------------------------------------------------
From: Start =?utf-8?b?5q+P5pel?= <microsoft.start@email2.microsoft.com>
Subject: 死刑!余华英拐卖儿童案宣判
Content Summary: <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><title>Start Daily</title></head><body bgcolor="#f0f0f0"><table align="...
--------------------------------------------------
==================================================
End of email summaries.[0m[32;1m[1;3mHere is a categorized summary of your latest 30 emails:

### News and Updates
1. **Microsoft Start**: Various news updates including topics like 雷军回应小米产品, 神舟十九号航天员, 国乒法国冠军赛, 国家医保谈判, and 台风大雾预警.
2. **阿里云**: Multiple notifications about 云解析解析记录修改 and security updates.
3. **Arm**: Announcement for the Arm Tech Symposia annual technology conference.
4. **Streamlit Community**: Updates on new features in Release 1.39.

### Financial and Verification
1. **Vvacard**: Verification code for user login.
2. **淘宝**: Notification about a successful refund.
3. **Microsoft Rewards**: Information about a million-dollar sweepstakes.

### Services and Memberships
1. **腾讯视频**: Reminder about the expiration of VIP membership services.
2. **Alethea AI**: Introduction to ALI Token Staking.
3. **Virt-A-Mate Hub**: Summary of recent activities on the platform.

### Technical and Product Updates
1. **观测云**: Notification about product upgrades.
2. **ChessBase**: Information on new chess courses and training tools.

### Miscellaneous
1. **PostMaster**: Notification about a returned email due to a non-existent domain.
2. **Internet Information Service Complaint Platform**: Confirmation of complaint submission with a unique code.

These emails cover a range of topics from news and updates, financial transactions, service reminders, technical updates, to miscellaneous notifications.[0m

[1m> Finished chain.[0m

{'input': '显示我最近的 30 封电子邮件并且做分类总结',
 'output': 'Here is a categorized summary of your latest 30 emails:\n\n### News and Updates\n1. **Microsoft Start**: Various news updates including topics like 雷军回应小米产品, 神舟十九号航天员, 国乒法国冠军赛, 国家医保谈判, and 台风大雾预警.\n2. **阿里云**: Multiple notifications about 云解析解析记录修改 and security updates.\n3. **Arm**: Announcement for the Arm Tech Symposia annual technology conference.\n4. **Streamlit Community**: Updates on new features in Release 1.39.\n\n### Financial and Verification\n1. **Vvacard**: Verification code for user login.\n2. **淘宝**: Notification about a successful refund.\n3. **Microsoft Rewards**: Information about a million-dollar sweepstakes.\n\n### Services and Memberships\n1. **腾讯视频**: Reminder about the expiration of VIP membership services.\n2. **Alethea AI**: Introduction to ALI Token Staking.\n3. **Virt-A-Mate Hub**: Summary of recent activities on the platform.\n\n### Technical and Product Updates\n1. **观测云**: Notification about product upgrades.\n2. **ChessBase**: Information on new chess courses and training tools.\n\n### Miscellaneous\n1. **PostMaster**: Notification about a returned email due to a non-existent domain.\n2. **Internet Information Service Complaint Platform**: Confirmation of complaint submission with a unique code.\n\nThese emails cover a range of topics from news and updates, financial transactions, service reminders, technical updates, to miscellaneous notifications.'}

注意事项

  1. QQ邮箱密码需使用授权码而非登录密码
  2. 确保所有环境变量正确配置
  3. 附件路径需要使用绝对路径或相对于执行文件的正确路径
  4. 代理设置可选,但在某些网络环境下可能需要配置

错误处理

  • 邮件发送失败:检查网络连接和邮箱配置
  • 附件读取错误:确认文件路径和权限
  • API调用失败:验证OpenAI API key的有效性

后续优化方向

  1. 支持更多邮件服务商
  2. 增强邮件分析能力
  3. 添加定时发送功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值