当前位置:首页>python>第342讲:分别用Python和VBA实现: 邮件自动收取与附件下载解析——用代码把供应商报价从“人工搬运”变成“自动入库”

第342讲:分别用Python和VBA实现: 邮件自动收取与附件下载解析——用代码把供应商报价从“人工搬运”变成“自动入库”

  • 2026-08-18 23:11:47
第342讲:分别用Python和VBA实现: 邮件自动收取与附件下载解析——用代码把供应商报价从“人工搬运”变成“自动入库”

做采购、供应链或者财务的同学,大概率都经历过这种“机械劳动”:每天早上打开Outlook,盯着几十封来自不同供应商的报价邮件,一封一封点开、核对主题、找到附件、下载到“报价单/2024-06”文件夹,再打开Excel一个个把价格、交期抄进去。要是哪天漏了一封,或者下错了附件位置,后面对账、比价全得返工。

其实这件事完全可以交给代码。今天我们就把“自动收取供应商报价邮件+下载附件+汇总信息”这个高频场景拆透,分别用Python和VBA实现,重点对比两者的底层逻辑差异——为什么Python适合跨环境、批量化的邮件自动化,而VBA更适合“就在本地Outlook里快速跑个小工具”。


一、先理清场景:我们要解决什么具体问题?

先给场景“画像”,避免代码脱离实际:

  • 邮件特征:供应商发件人固定(比如@supplierA.com@supplierB.com),主题包含关键词(比如“202406报价单”“Q3价格更新”),附件为Excel/PDF格式(命名规则类似SupplierA_202406_Price.xlsx)。

  • 核心需求

    1. 自动登录邮箱,筛选符合条件的未读邮件;

    2. 下载附件到指定文件夹(按日期/供应商分类);

    3. 提取邮件关键信息(发件人、主题、接收时间)和附件数据(比如Excel里的产品单价),汇总到一个总表;

    4. 标记邮件为“已处理”,避免重复操作。

  • 隐性需求:如果公司邮箱不是Outlook(比如用腾讯企业邮、阿里云邮),或者服务器在Linux上跑定时任务,方案还能不能用?

接下来我们分别用Python和VBA落地,你会清楚看到两者的适用边界。


二、Python实现:基于标准邮件协议的“通用解法”

Python处理邮件的核心是直接对接邮件服务器的标准协议(IMAP/POP3),不依赖本地客户端。这意味着:哪怕你没有安装Outlook,只要知道邮箱的IMAP/POP3服务器地址和端口,就能在Windows、macOS甚至Linux服务器上运行——这也是为什么Python更适合做“后台定时任务”(比如每天凌晨自动跑一次)。

2.1 准备工作:选对库,搞懂协议差异

Python有两个常用库:poplib(处理POP3协议)和imaplib(处理IMAP协议)。这里优先推荐IMAP,因为POP3默认会把邮件从服务器删除(除非手动设置保留),而IMAP支持“同步状态”(比如你在代码里标记邮件为“已读”,服务器也会同步这个状态),更适合需要长期存档报价的场景。为了更优雅地处理编码和文件夹操作,我们还会用到IMAPClient(第三方库,比原生imaplib更易用)。

安装依赖

pip install imapclient pyzmail36 pandas openpyxl
  • imapclient:简化IMAP操作;

  • pyzmail36:解析邮件内容(处理中文编码、附件提取);

  • pandas:汇总附件数据到Excel;

  • openpyxl:支持Excel读写。

2.2 核心步骤1:连接邮箱服务器(以QQ企业邮为例)

先明确邮箱的IMAP配置(不同邮箱服务商参数不同,比如腾讯企业邮IMAP服务器是imap.exmail.qq.com,端口993,SSL加密):

from imapclient import IMAPClientimport pyzmail36import osfrom datetime import datetimeimport pandas as pd# ---------------------- 配置区(根据实际情况修改) ----------------------EMAIL = "your_email@company.com"       # 邮箱账号PASSWORD = "your_authorization_code"   # 注意:这里是邮箱授权码,不是登录密码!IMAP_SERVER = "imap.exmail.qq.com"     # IMAP服务器地址IMAP_PORT = 993                        # SSL端口SAVE_DIR = r"./报价附件/{date}"        # 附件保存路径,按日期分类KEYWORDS = ["报价单""Q3价格"]         # 主题关键词SENDERS = ["@supplierA.com""@supplierB.com"]  # 允许的发件人后缀TARGET_FOLDER = "INBOX"                # 收件箱(IMAP中文件夹用名称标识)# ----------------------------------------------------------------------# 创建附件保存目录(按当天日期)today = datetime.now().strftime("%Y-%m-%d")save_path = SAVE_DIR.format(date=today)os.makedirs(save_path, exist_ok=True)# 连接IMAP服务器(SSL加密)with IMAPClient(IMAP_SERVER, port=IMAP_PORT, ssl=Trueas client:    # 登录邮箱    client.login(EMAIL, PASSWORD)    print(f"✅ 成功登录邮箱:{EMAIL}")

⚠️ 避坑点:这里的PASSWORD不是邮箱的登录密码,而是SMTP/IMAP授权码。以QQ邮箱为例,需要在“设置→账户→开启IMAP/SMTP服务”,生成授权码(网易邮箱、企业邮同理)。这是很多新手卡壳的地方——用登录密码会一直报“认证失败”。

2.3 核心步骤2:筛选目标邮件(IMAP的强大之处)

IMAP支持服务器端搜索,不用把所有邮件拉到本地再过滤,效率极高。比如我们要筛选:“未读+主题含关键词+发件人是指定供应商”。

# 选择收件箱(只读模式=False,允许修改邮件状态)    client.select_folder(TARGET_FOLDER, readonly=False)    # 构建搜索条件(IMAP搜索语法)    # 未读邮件:b'UNSEEN'    # 主题含关键词:b'SUBJECT "报价单"'(多个关键词用OR连接)    # 发件人后缀:b'FROM "@supplierA.com"'(多个发件人用OR连接)    search_criteria = []    # 未读条件    search_criteria.append(b'UNSEEN')    # 主题关键词(OR连接)    subject_conditions = [f'SUBJECT "{kw}"'.encode() for kw in KEYWORDS]    if len(subject_conditions) > 1:        subject_conditions.insert(0b'OR')    search_criteria.extend(subject_conditions)    # 发件人条件(OR连接)    sender_conditions = [f'FROM "{sender}"'.encode() for sender in SENDERS]    if len(sender_conditions) > 1:        sender_conditions.insert(0b'OR')    search_criteria.extend(sender_conditions)    # 执行搜索,返回符合条件的邮件ID列表    messages = client.search(search_criteria)    print(f"📩 找到 {len(messages)} 封符合条件的未读邮件")

💡 IMAP搜索语法小课堂:IMAP的搜索条件是用字节串(b'')传递的,常见条件有:

  • ALL:所有邮件;

  • UNSEEN:未读;

  • SEEN:已读;

  • FROM "xxx@supplier.com":发件人;

  • SUBJECT "报价单":主题含关键词;

  • SINCE "01-Jun-2024":指定日期之后(日期格式必须是日-月-年,英文月份缩写)。

如果是多个条件,用AND(默认)、ORNOT组合。比如“未读且主题含‘报价单’或‘Q3价格’”,就是UNSEEN OR SUBJECT "报价单" SUBJECT "Q3价格"

2.4 核心步骤3:解析邮件,下载附件

拿到邮件ID后,需要拉取邮件原始内容,用pyzmail36解析(它能自动处理中文乱码,比原生email模块友好太多)。

# 存储汇总数据的列表(最后写入Excel)    summary_data = []    for msg_id in messages:        # 获取邮件的原始内容(RFC822格式)        raw_message = client.fetch([msg_id], ['RFC822'])[msg_id][b'RFC822']        # 解析邮件        message = pyzmail36.PyzMessage.factory(raw_message)        # 提取邮件基本信息        subject = message.get_subject()  # 主题(自动解码中文)        sender = message.get_addresses('from')[0][1]  # 发件人邮箱        date = message.get_decoded_header('date')  # 发送时间        print(f"\n📧 处理邮件:{subject}(发件人:{sender})")        # 提取附件        attachment_count = 0        for part in message.mailparts:            if part.filename:  # 有文件名的才是附件                filename = part.filename  # 附件名(自动解码中文)                # 附件保存路径(避免重名,加时间戳前缀)                timestamp = datetime.now().strftime("%H%M%S")                safe_filename = f"{timestamp}_{filename}"                file_path = os.path.join(save_path, safe_filename)                # 写入附件文件                with open(file_path, 'wb'as f:                    f.write(part.get_payload())                attachment_count += 1                print(f"   ✅ 下载附件:{safe_filename}")                # 如果附件是Excel,提取数据(示例:读取第一个Sheet的A1:C10)                if filename.endswith(('.xlsx''.xls')):                    try:                        df = pd.read_excel(file_path, sheet_name=0, usecols="A:C", nrows=10)                        # 把邮件信息和附件数据合并(比如添加“来源邮件”列)                        df['来源邮件'] = subject                        df['发件人'] = sender                        df['接收时间'] = date                        summary_data.append(df)                    except Exception as e:                        print(f"   ❌ Excel解析失败:{e}")        # 标记邮件为“已读”(避免下次重复处理)        client.add_flags([msg_id], [b'\\Seen'])        print(f"   📌 标记邮件为已读,共处理 {attachment_count} 个附件")

⚠️ 附件名乱码问题:早期Python处理邮件时,附件名经常是=?UTF-8?B?xxxx?=这种编码格式,pyzmail36会自动解码,不用自己写decode_header的逻辑,省心很多。

2.5 核心步骤4:汇总数据到总表

把所有附件里的Excel数据合并,生成一个“报价汇总表”,方便后续比价:

# 合并所有附件的数据    if summary_data:        total_df = pd.concat(summary_data, ignore_index=True)        # 保存汇总表(按日期命名)        summary_path = f"./报价汇总_{today}.xlsx"        total_df.to_excel(summary_path, index=False)        print(f"\n📊 汇总完成!共合并 {len(total_df)} 条数据,保存至:{summary_path}")    else:        print("\n⚠️ 没有可汇总的附件数据")

2.6 Python方案的“通用性优势”

到这里,Python的完整流程就跑通了。它的核心优势在于不依赖本地客户端

  • 你可以在公司服务器上部署这个脚本,用crontab(Linux)或“任务计划程序”(Windows)设置每天早上8点自动运行,不用开电脑;

  • 如果供应商用的是阿里云邮、网易企业邮,只要IMAP服务开启,代码几乎不用改;

  • 甚至可以扩展功能:比如附件是PDF时,用pdfplumber提取表格数据;或者用smtplib自动回复“报价已收到”的确认邮件。

但缺点也很明显:对新手来说,IMAP协议的学习成本略高,需要处理编码、搜索语法等问题。如果你的需求只是“在自己电脑上,快速处理Outlook里的邮件”,那VBA可能更顺手。


三、VBA实现:基于Outlook对象的“本地快捷解法”

VBA的优势是和Outlook深度绑定——不需要了解IMAP协议,直接调用Outlook的对象模型(比如Outlook.ApplicationMAPIFolder),代码更短,调试更直观。但它有个硬限制:必须安装Outlook,且邮箱已经配置在Outlook中(因为它本质是操作本地Outlook客户端,而不是直接连邮箱服务器)。

3.1 准备工作:启用Outlook对象库

  1. 打开Excel,按Alt+F11进入VBA编辑器;

  2. 点击“工具→引用”,勾选“Microsoft Outlook XX.X Object Library”(XX.X是版本号,比如16.0对应Office 2016+);

  3. 插入→模块,准备写代码。

3.2 核心步骤1:获取Outlook应用和收件箱

VBA里用GetObjectCreateObject获取Outlook应用实例,然后通过GetFolderFromID定位文件夹(这是题目要求的重点——VBA通过文件夹ID精准定位,比按名称找更可靠,尤其是当文件夹有中文或嵌套层级深时)。

Sub 自动收取报价邮件并下载附件()    Dim olApp As Outlook.Application    Dim olNamespace As Outlook.Namespace    Dim inboxFolder As Outlook.MAPIFolder    Dim targetFolder As Outlook.MAPIFolder    Dim mailItem As Outlook.MailItem    Dim attachment As Outlook.Attachment    Dim savePath As String    Dim today As String    Dim summarySheet As Worksheet    Dim rowNum As Integer    Dim folderID As String    Dim storeID As String    ' ---------------------- 配置区(根据实际情况修改) ----------------------    savePath = ThisWorkbook.Path & "\报价附件\"  ' 附件保存路径(和Excel同目录)    today = Format(Date, "yyyy-mm-dd")           ' 当天日期    ' 收件箱文件夹ID(如何获取?见下文“避坑点”)    folderID = "00000000ABCDEF..."  ' 替换为你的收件箱FolderID    storeID = "00000000XYZ123..."   ' 替换为你的StoreID(邮箱账户的ID)    ' ----------------------------------------------------------------------    ' 创建附件保存目录    If Dir(savePath & today, vbDirectory) = "" Then        MkDir savePath & today    End If    ' 获取Outlook应用实例    On Error Resume Next    Set olApp = GetObject(, "Outlook.Application")    If olApp Is Nothing Then        Set olApp = CreateObject("Outlook.Application")    End If    On Error GoTo 0    ' 获取命名空间(MAPI是Outlook的默认消息接口)    Set olNamespace = olApp.GetNamespace("MAPI")    ' 通过FolderID和StoreID获取收件箱(比用名称更精准!)    Set targetFolder = olNamespace.GetFolderFromID(folderID, storeID)    If targetFolder Is Nothing Then        MsgBox "未找到目标文件夹!", vbExclamation        Exit Sub    End If    ' 定位汇总表(假设当前Excel的第一个Sheet是汇总表)    Set summarySheet = ThisWorkbook.Sheets(1)    rowNum = summarySheet.Cells(summarySheet.Rows.Count, 1).End(xlUp).Row + 1  ' 下一行空行    Debug.Print "开始处理邮件..."

⚠️ 如何获取FolderID和StoreID?

这是VBA里最容易被忽略的步骤。GetFolderFromID需要两个参数:FolderID(文件夹的唯一标识)和StoreID(邮箱账户的标识)。获取方法:

  1. 在VBA编辑器里新建一个临时宏,输入以下代码运行:

    Sub 获取文件夹ID()    Dim olApp As Outlook.Application    Dim olNamespace As Outlook.Namespace    Dim folder As Outlook.MAPIFolder    Set olApp = Outlook.Application    Set olNamespace = olApp.GetNamespace("MAPI")    Set folder = olNamespace.PickFolder  ' 弹出文件夹选择框,选择你的收件箱    Debug.Print "FolderID: " & folder.EntryID    Debug.Print "StoreID: " & folder.StoreIDEnd Sub
  2. 运行后,在“立即窗口”(按Ctrl+G打开)里复制打印出的FolderIDStoreID,粘贴到上面的配置区即可。

3.3 核心步骤2:筛选邮件,下载附件

VBA里遍历邮件用For Each循环,筛选条件和Python类似(未读、主题关键词、发件人),但逻辑更“直白”——因为Outlook已经帮你做好了邮件解析,直接调用属性就行。

' 遍历目标文件夹中的所有邮件    For Each mailItem In targetFolder.Items        ' 只处理“未读”邮件(UnRead属性)        If mailItem.UnRead Then            ' 筛选主题含关键词(这里示例“报价单”或“Q3价格”)            Dim subject As String            subject = mailItem.Subject            If InStr(subject, "报价单") > 0 Or InStr(subject, "Q3价格") > 0 Then                ' 筛选发件人(示例:@supplierA.com或@supplierB.com)                Dim sender As String                sender = mailItem.SenderEmailAddress                If InStr(sender, "@supplierA.com") > 0 Or InStr(sender, "@supplierB.com") > 0 Then                    Debug.Print "处理邮件:" & subject & "(发件人:" & sender & ")"                    ' 下载附件                    Dim attCount As Integer                    attCount = 0                    For Each attachment In mailItem.Attachments                        ' 避免系统附件(比如outlook的签名图片,通常很小或无文件名)                        If attachment.Size > 1024 Then  ' 大于1KB才处理                            Dim fileName As String                            fileName = Format(Now, "HHMMSS") & "_" & attachment.FileName                            Dim filePath As String                            filePath = savePath & today & "\" & fileName                            attachment.SaveAsFile filePath                            attCount = attCount + 1                            Debug.Print "  下载附件:" & fileName                            ' 如果附件是Excel,提取数据到汇总表(示例:读取A1:C10)                            If Right(fileName, 5= ".xlsx" Or Right(fileName, 4= ".xls" Then                                Dim attWorkbook As Workbook                                Set attWorkbook = Workbooks.Open(filePath)                                Dim attSheet As Worksheet                                Set attSheet = attWorkbook.Sheets(1)                                ' 复制A1:C10到汇总表(从rowNum行开始)                                summarySheet.Cells(rowNum, 1).Resize(10, 3).Value = attSheet.Range("A1:C10").Value                                ' 添加邮件信息(来源邮件、发件人、接收时间)                                summarySheet.Cells(rowNum, 4).Resize(101).Value = subject                                summarySheet.Cells(rowNum, 5).Resize(101).Value = sender                                summarySheet.Cells(rowNum, 6).Resize(101).Value = mailItem.ReceivedTime                                rowNum = rowNum + 10  ' 下移10行(因为复制了10行数据)                                attWorkbook.Close False  ' 关闭附件工作簿,不保存                            End If                        End If                    Next attachment                    ' 标记邮件为“已读”                    mailItem.UnRead = False                    Debug.Print "  标记邮件为已读,共处理 " & attCount & " 个附件"                End If            End If        End If    Next mailItem    ' 清理对象    Set olApp = Nothing    Set olNamespace = Nothing    Set targetFolder = Nothing    Set mailItem = Nothing    Set attachment = Nothing    MsgBox "邮件处理完成!", vbInformationEnd Sub

3.4 VBA方案的“便捷性优势”

VBA的代码量明显比Python少,而且逻辑更符合“桌面操作”的直觉:

  • 不需要处理IMAP连接、邮件编码这些底层细节,Outlook已经封装好了;

  • 调试方便:可以在VBA编辑器里逐行运行(F8键),实时查看变量值;

  • 和Excel无缝集成:数据直接写到当前工作表,不用额外导入导出。

但它的局限性也很突出:

  • 强依赖Outlook:如果公司用的是Foxmail,或者服务器上没有安装Outlook,代码直接报废;

  • 只能在Windows上运行:Mac版Excel的VBA不支持Outlook对象库;

  • 性能瓶颈:如果邮件数量特别多(比如上千封),VBA遍历速度会比Python慢,因为它是单线程且依赖本地客户端响应。


四、Python vs VBA:核心差异对比(划重点)

我们把两种方案的核心差异整理成表格,你可以根据场景选:

对比维度

Python(IMAPClient/poplib)

VBA(Outlook.Application)

依赖环境

仅需邮箱IMAP服务,无需Outlook

必须安装Outlook,且邮箱已配置

适用系统

Windows/macOS/Linux

仅Windows(Mac Excel VBA不支持Outlook对象)

协议支持

标准IMAP/POP3协议,兼容所有邮箱服务商

依赖Outlook的MAPI接口,仅支持Outlook配置的邮箱

部署方式

可部署到服务器,定时任务自动运行

仅能在本地Excel中手动/快捷键触发

学习成本

较高(需了解IMAP协议、邮件编码)

较低(VBA语法简单,Outlook对象模型直观)

扩展性

极强(可结合PDF解析、数据库存储、自动回复等)

较弱(主要局限于Office生态内)

适合场景

跨环境、大批量、后台自动化(如服务器定时收报价)

本地快速处理、小批量、临时需求(如个人日常整理)

一句话总结:要“通用、后台、扩展”,选Python;要“本地、快捷、省心”,选VBA


五、避坑指南(都是实战踩过的坑)

  1. Python的IMAP连接失败

    • 检查授权码是否正确(不是邮箱登录密码!);

    • 确认IMAP服务器地址和端口(比如Gmail的IMAP服务器是imap.gmail.com,端口993,且需要开启“不太安全的应用访问”或用OAuth2认证);

    • 公司防火墙可能屏蔽IMAP端口,需要联系IT开放。

  2. VBA的GetFolderFromID报错

    • 确保FolderIDStoreID是从当前Outlook账户获取的(换个电脑或重装Outlook后ID会变);

    • 如果文件夹有子文件夹,需要先获取父文件夹ID,再逐级定位(或直接用PickFolder手动选择测试)。

  3. 附件名乱码

    • Python用pyzmail36基本能解决;VBA如果遇到乱码,尝试用StrConv函数转码(比如fileName = StrConv(attachment.FileName, vbUnicode))。

  4. 邮件重复处理

    • Python记得用client.add_flags([msg_id], [b'\\Seen'])标记已读;VBA设置mailItem.UnRead = False,否则下次运行会重复处理。


六、进阶思路:让自动化更“智能”

如果你已经跑通了基础流程,可以尝试这些优化:

  • Python:用watchdog库监控附件文件夹,新增Excel文件时自动触发数据汇总;用logging模块记录运行日志,方便排查问题;对接企业微信/钉钉机器人,处理完成后发送通知。

  • VBA:添加“白名单”功能(只允许特定发件人的邮件);用正则表达式匹配主题中的日期(比如2024-06-\d{2}),自动按日期分类附件;处理完成后自动压缩附件文件夹,节省空间。

七、练习题(答案在文末)

  1. Python中使用IMAP协议收取邮件时,若需要标记邮件为“已读”,以下哪个是正确的标志?( )

    A. b'\Recent'

    B. b'\Seen'

    C. b'\Deleted'

    D. b'\Answered'

  2. VBA中通过GetFolderFromID获取Outlook文件夹时,必须传入的两个参数是?( )

    A. 文件夹名称和邮箱地址

    B. FolderID和StoreID

    C. 文件夹路径和账户密码

    D. 邮件主题和发件人

  3. 以下关于Python的IMAP和POP3协议的描述,错误的是?( )

    A. IMAP支持服务器端搜索,POP3不支持

    B. POP3默认会删除服务器上的邮件,IMAP不会

    C. IMAP可以同步邮件状态(如已读/未读),POP3不能

    D. POP3的连接速度比IMAP更快,适合大附件下载

  4. VBA代码中,mailItem.UnRead = False的作用是?( )

    A. 删除邮件

    B. 标记邮件为已读

    C. 转发邮件

    D. 下载附件

  5. 当需要在一台没有安装Outlook的Linux服务器上自动收取供应商报价邮件时,应选择哪种方案?( )

    A. VBA+Outlook

    B. Python+IMAPClient

    C. Excel宏+Foxmail

    D. 无法实现


练习题答案

  1. B(\Seen是IMAP中标记已读的 flag,\Recent是新邮件,\Deleted是删除,\Answered是已回复)

  2. B(GetFolderFromID的语法是GetFolderFromID(FolderID, StoreID)

  3. D(IMAP和POP3的速度差异不大,POP3不适合大附件是因为它不支持断点续传,且默认删除服务器邮件)

  4. B(UnRead是邮件的“未读”属性,设为False即标记为已读)

  5. B(Python的IMAPClient不依赖Outlook,可在Linux服务器运行)


最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 18:55:03 HTTP/2.0 GET : https://f.mffb.com.cn/a/509242.html
  2. 运行时间 : 0.258189s [ 吞吐率:3.87req/s ] 内存消耗:4,632.96kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d4b9099cab01e191fe4ba6bafdbeee22
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000720s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000529s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.010509s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.012944s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000624s ]
  6. SELECT * FROM `set` [ RunTime:0.002037s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000531s ]
  8. SELECT * FROM `article` WHERE `id` = 509242 LIMIT 1 [ RunTime:0.009264s ]
  9. UPDATE `article` SET `lasttime` = 1787309703 WHERE `id` = 509242 [ RunTime:0.017212s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000239s ]
  11. SELECT * FROM `article` WHERE `id` < 509242 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.011107s ]
  12. SELECT * FROM `article` WHERE `id` > 509242 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.015824s ]
  13. SELECT * FROM `article` WHERE `id` < 509242 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.008269s ]
  14. SELECT * FROM `article` WHERE `id` < 509242 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002479s ]
  15. SELECT * FROM `article` WHERE `id` < 509242 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002176s ]
0.261815s