【问题标题】:Outlook 2016 VBA to save attachments from folder to specific loctionOutlook 2016 VBA 将附件从文件夹保存到特定位置
【发布时间】:2019-03-17 20:42:37
【问题描述】:

我在网上找到了这段代码,并试图改变它以适应我的目的。我需要的只是将来自 test@noreplay.com 的附件保存到我的测试文件夹(它是收件箱的子文件夹)。我不知道如何更改它,需要您的帮助!

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
saveFolder = "C:\Attachments"
    For Each objAtt In itm.Attachments
        objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
        Set objAtt = Nothing
    Next
End Sub

我的 VBA 看起来像这样(希望对您有所帮助)。

再次尝试将附件从 Outlook 保存到特定文件夹,来自特定发件人的同名(因此新附件将覆盖现有附件)。

【问题讨论】:

  • 您将代码作为文本包含在内,因此图像无用且难以阅读。我建议你删除它。
  • 你的问题不清楚。您在保存名称中有一个额外的“\”(一个在 saveFolder 的末尾,一个在 SaveAsFile 语句中添加),但这不会造成问题。您希望覆盖附件的先前副本,因此代码不检查重复文件并不重要。我能看到的唯一问题是您没有检查 itm.SenderEmailAddress 以获得所需的值。
  • 我已经更新了我的查询,但仍然没有运气。
  • 你贴的代码是一个子程序。是调用此子例程的宏找到itm 并检查它是否来自正确的发件人。您需要发布主宏并解释它没有做什么您希望它做的事情。
  • @托尼。这是我唯一的宏。你有没有机会指出我的解决方案?

标签: vba outlook


【解决方案1】:

我给了你很多阅读和做的事情。慢慢地完成这一切,如有必要,再提出问题。

您的 cmets 表明您对 Outlook VBA 的了解非常有限,因此我将从简要介绍开始。如果您的知识比我怀疑的要好,我深表歉意,但我宁愿侮辱您的知识,让您对我的代码完全困惑。

Outlook VBA简介

本机 VBA 是一种相当有限的语言。它带有许多语句和一些标准函数,但它的大部分功能来自库。打开 VBA 编辑器,单击工具,然后单击参考,您将看到一长串库。列表顶部的一些已经被勾选。如果您需要其他人提供的功能,您可以向下滚动列表并勾选其他人。正是“Microsoft Outlook nn.n 对象库”告诉编译器有关文件夹、邮件项目和任务的信息。正是“Microsoft Excel nn.n 对象库”告诉编译器有关工作簿、工作表和范围的信息。 (注意,nn.n 取决于您使用的 Office 版本。)因此,要在 Outlook VBA 中编程,您需要了解 VBA(对于 Excel、Word 和 PowerPoint 来说都是一样的)和 Outlook 对象模型。

Outlook 将您的所有电子邮件、日历项目、任务等保存在它称为 商店 的文件中。您可能会看到这些文件被称为“PST 文件”,因为大多数文件的扩展名为“PST”。但是,扩展名为“OST”的 Outlook 文件也是存储。您可能会看到它们被称为“帐户”,因为默认情况下,Outlook 每个电子邮件帐户都有一个商店。但是,您可以拥有未链接到帐户的商店;例如,我的安装有一个名为“Archive”的商店和另一个名为“Outlook Data File”的商店,它们都不是帐户。

如果您查看可能位于 Outlook 窗口左侧的文件夹窗格,您可能会看到如下内容:

DoeJA@Gmail.com
   :    :    :    :
   Inbox
   :    :    :    :
  Sent Items
   :    :    :    :
JohnDoe@HotMail.com
   :    :    :    :
   Inbox
   :    :    :    :
  Sent Items
   :    :    :    :
Outlook Data File
   :    :    :    :
   Inbox
   :    :    :    :
  Sent Items
   :    :    :    :

“DoeJA@Gmail.com”、“JohnDoe@HotMail.com”和“Outlook 数据文件”是商店的名称。文件名可能是“DoeJA@Gmail.com.OST”、“JohnDoe@HotMail.com.PST”和“Outlook Data File.PST”。但是,VBA 程序员对文件名不感兴趣。出现在文件夹窗格中的名称是重要的名称。

VBA 的一个令人讨厌的特性是,通常有不止一种方法可以达到相同的效果。考虑:

Option Explicit
Sub DsplSingleEmail1()

  Dim NS As NameSpace
  Dim FldrSrc As Folder

  Set NS = Application.GetNamespace("MAPI")
  Set FldrSrc = NS.Folders("DoeJA@Gmail.com").Folders("Inbox")

  With FldrSrc.Items(1)
    Debug.Print .ReceivedTime & " " & .Subject
  End With

End Sub
Sub DsplSingleEmail 2()

  Dim FldrSrc As Folder

  Set FldrSrc = Session.Folders("DoeJA@Gmail.com").Folders("Inbox")

  With FldrSrc.Items(1)
    Debug.Print .ReceivedTime & " " & .Subject
  End With

End Sub
Sub DsplSingleEmail 3()

  Dim FldrSrc As Folder

  Set FldrSrc = CreateObject("Outlook.Application"). _
                        GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)

  With FldrSrc.Items(1)
    Debug.Print .ReceivedTime & " " & .Subject
  End With

End Sub

所有三个宏都输出收到的日期和时间以及几乎可以肯定是收件箱中最旧电子邮件的主题。如果您想在您的系统上试用它们,您必须将“DoeJA@Gmail.com”替换为您系统上具有活动收件箱的商店的名称。

在宏DsplSingleEmail1 中,我使用了方法GetNamespace。在宏DsplSingleEmail2 中,我使用了方法Session。文档说这两种方法是等效的,但我没有找到解释为什么有两种等效方法。如果您编写自己的代码,这无关紧要;选择您喜欢的任何方法。但是,如果您打算在线查找代码的 sn-ps,则必须为程序员 A 使用一种方法和程序员 B 使用另一种方法做好准备。当您合并使用不同方法的 sn-ps 时,您必须充分了解所有方法才能调整代码以使用您喜欢的方法。

GetNamespaceSession 都是 Application 的方法。在一个宏中,我已经告诉编译器这一点,而在另一个宏中,我让编译器自己解决这个问题。

在宏DsplSingleEmail3 中,我使用了方法Namespace,但我的语句以CreateObject("Outlook.Application") 开始。如果我从 Excel 运行此代码,这将是必要的,但在这里不是必需的,因为我已经在 Outlook 中。我还使用了带有参数olFolderInbox 的方法GetDefaultFolder。 Outlook 默认将其所有标准文件夹存储在“Outlook 数据文件”中。但是,在我的系统上,安装向导已安排将我的电子邮件导入到另外两个商店。毫无疑问,某处有更改默认值的功能,但我从来没有费心去看,因为我不知道我会将哪个商店的收件箱设为默认值。 DsplSingleEmail3 在我的系统上工作的唯一原因是因为我已将一些垃圾邮件复制到“Outlook 数据文件”中的收件箱中。我包含Debug.Print FldrSrc.Parent.Name,因为它输出包含默认收件箱的商店名称。

上面的目的是为了演示在没有背景理解上下文的情况下寻找代码sn-ps的一些问题。您发现的 sn-p 的作者似乎假设读者会理解如何使用它。我从一本书中学习了 Excel VBA。我参观了一个大型图书馆,并借了他们所有的 Excel VBA 入门书。在家里我都试过了,然后买了一个符合我学习风格的。我通过实验学习了 Outlook VBA,因为我找不到 Outlook VBA 的良好入门。我怀疑是否可以通过在线查找有用的代码来学习 Excel 或 Outlook VBA。如果您想编写宏来帮助您的雇主,您必须安排一些减轻您的正常工作量的工作,以便您有不间断的时间来学习 VBA 和 Outlook 对象模型。这种缓解将很快回报您的雇主,因为您将能够编写宏来节省您的同事和您自己的时间。

满足您的要求

我发现编写宏来处理电子邮件分为两个部分。第 1 部分是决定如何最好地选择要处理的电子邮件。第 2 部分是决定如何通过处理选定的电子邮件来实现您希望达到的任何效果。我将描述四种不同的电子邮件选择方法,并展示如何使用这些方法。但是,我将只提供一个宏来处理选定的电子邮件。四种选择方法中的每一种都将调用相同的处理宏。这表明确实有两个部分,将向您展示不同的选择方法是如何工作的,并决定哪种方法最适合您当前和未来的要求。

我的处理宏比你的要复杂一点。您的宏是专门为使用规则而设计的。我的宏将与用户选择、扫描文件夹、新项目事件和规则一起使用。

我对您的要求的理解是:来自“test@noreplay.com”的电子邮件有附件。附件将被保存到“C:\Attachments”,用相同的DisplayName 覆盖任何以前的附件。已处理的电子邮件将被移至收到电子邮件的收件箱下的“测试”文件夹。您已使用规则移动电子邮件,但不知道如何使用规则保存附件。

我的处理宏的第一部分与您的相似,尽管我做了一些更改。由于 Outlook 宏必须与 Outlook 文件夹一起使用,因此我为 Outlook 保留了“文件夹”一词。当我需要引用光盘文件夹时,我使用“路径”。当MailItemAttachment 可以时,我不会写Outlook.MailItemOutlook.Attachment。如果编译器不知道哪个库定义了MailItemAttachment,则需要前缀“Outlook”;这不适用于这里。我不知道哪个商店包含您要检查的收件箱,因此将其称为“DoeJA@Gmail.com”。将此名称替换为您的商店名称。我是With 声明的忠实用户,其中包括两个。

请注意,存在不同类型的附件。我从未见过某些类型,所以不知道它们是否有DisplayName,但您的电子邮件很可能只有最常见的附件类型。如果您在保存附件时遇到问题,请描述问题,我会建议如何避免该问题。 SaveAsFile 覆盖任何现有的同名文件而不发出警告。这不是问题,因为这符合您的要求。

您使用规则将电子邮件移动到所需文件夹,但我的选择宏中只有一个使用规则,因此处理宏必须在必要时移动电子邮件。如果电子邮件已经在“收件箱”文件夹中的“测试”文件夹中,则不需要移动它。

所有邮件项目都有包含它们的文件夹作为父项。文件夹要么在另一个文件夹内,要么在商店内。包含文件夹或存储是文件夹的父级。商店没有父代。在我的处理宏中,你会发现:

With ItemCrnt
  If .Parent.Name = "Test" And .Parent.Parent.Name = "Inbox" Then
    ' MailItem is already in destination folder
  Else
    .Move FldrDest
  End If
End With

ItemCrnt.Parent.Name 是包含邮件项目的文件夹的名称。如果邮件项目在所需的文件夹中,则此名称将为“Test”。 ItemCrnt.Parent.Parent.Name 是文件夹的名称,该文件夹包含包含邮件项目的文件夹。如果邮件项目在所需文件夹中,则此名称将为“收件箱”。因此,如果邮件项目不在目标文件夹中,此代码会将邮件项移动到目标文件夹。请注意我如何将属性与点串在一起。小心使用此功能。商店没有父级,因此如果ItemCrnt 在文件夹“Test”中,ItemCrnt.Parent.Parent.Parent.Name 将给出错误。

第一个选择宏SelectEmailsUser 要求用户在运行处理宏之前选择一个或多个电子邮件。我从未在现场安装中使用过这种方法,但在开发过程中发现它非常宝贵。通过这种方法,我可以从一封易于处理的电子邮件开始。当我测试处理宏时,我可以在一次运行中慢慢引入越来越多的复杂电子邮件和几封电子邮件。没有其他方法能够对电子邮件呈现给宏的顺序提供相同的控制。

第二个选择宏,SelectEmailsScan,使用了我最常用的方法。使用这种方法,我向上或向下阅读一个文件夹,检查每封电子邮件的属性并决定我希望处理哪些。

如果您使用简单的 For-Loop,您希望移动已处理的电子邮件,这会带来麻烦。文件夹是集合的一个示例。对于集合,您通常按位置访问其成员:1、2、3、4 等等。如果您将邮件项目 5 移动到另一个文件夹,您将从该文件夹中删除该邮件项目并将其添加到另一个文件夹。当您删除邮件项 5 时,邮件项 6 变为邮件项 5,邮件项 7 变为邮件项 6,依此类推。如果您的 For-Loop 现在检查邮件项目 6,则您正在检查旧邮件项目 7 并忽略旧邮件项目 6。有许多解决方法,但最简单的是以相反的顺序检查电子邮件:1000, 999、998 等等。现在,如果您删除电子邮件 998,您不会介意电子邮件 1000 和 999 改变位置,因为您已经检查过它们。

第三个选择宏,InboxItems_ItemAdd 使用一个新的项目事件。您可以要求 Outlook 在每次发生某些事情时运行宏。当新电子邮件添加到文件夹收件箱时,我的代码要求 Outlook 运行宏。如果电子邮件是由特定发件人发送的,则此宏调用我的处理宏。这符合您的规则,除了我的宏将电子邮件移动到文件夹“测试”并保存附件。

第四种选择方法涉及将“脚本”链接到规则。此规则必须选择“test@noreplay.com”发送的电子邮件。或者,此规则可以将选定的电子邮件移动到文件夹“测试”。如果没有,我的处理宏将移动它。规则选项是“运行脚本”,这令人困惑。有几种脚本语言,包括 VBscript。 “脚本”不能使用任何这些脚本语言;它必须是 Outlook VBA 宏。

规则选项“运行脚本”也由于信息冲突而令人困惑。一些网站称微软已禁用它,并提供了有关如何取消禁用它的复杂说明。其他网站没有提到任何此类问题。规则选项“运行脚本”适用于我的系统,所以我只能希望它适用于您的系统。如果它不起作用,您将不得不选择其他方法之一。

安装和测试

我已经尽可能地模拟了你的系统。我有两个电子邮件地址,分别称为 Address1 和 Address2。地址 1 是我的主要地址,我的家人、朋友和选定的供应商都知道。地址 2 是我公开发布的地址,如果被骗子太多,我将丢弃它。

我在 Address1 的“收件箱”下创建了一个 Outlook 文件夹“Test”。我创建了一个光盘文件夹“C:\Attachments”。我监视从 Address2 到达 Address1 的电子邮件。您将不得不更改我的商店名称,否则我的宏应该在您的系统上保持不变。

请删除您现有的规则。我需要您删除您的规则,因为 (1) 它会干扰选择方法 1 到 3,以及 (2) 我无法发现如何将脚本添加到现有规则。请删除您不需要的现有代码。

您的图片显示您已将代码放置在 Module1 中。当您开始新项目时,您可以添加 Module2、Module3 等。找到包含您今天要查看的代码的模块很快就会变得很痛苦。您打开了“属性”窗口。 (如果现在关闭,F4 打开属性窗口。)模块的唯一属性是它的名称,您可以从默认的 ModuleNN 更改它。我建议你将“Module1”重命名为“ModXxxxx”,其中“Xxxxx”是一个对你有意义的名字。 “Mod”不是必需的,但我觉得它很有帮助。如果模块“Xxxxx”中有宏“Xxxxx”,则无法访问该宏。通过使用前缀“Mod”命名我的所有模块,我避免了这个问题。

在每个模块的顶部都有Option Explicit。查看此声明以了解它提供的好处。在我的代码中查找您不认识的任何语句。如有必要,请提出问题,但您自己研究的越多,您的发展速度就越快。

如果您想尝试使用 DsplSingleEmail1 到 DsplSingleEmail3 的宏,您可以将此答案复制并粘贴到您的模块中。如果您想尝试 Experiment3,可能需要复制一些垃圾邮件来存储“Outlook 数据文件”。

选择方法一

将以下代码复制到您的模块中:

Public Sub SaveAttachAndMoveEmail(ByRef ItemCrnt As MailItem)

  Dim Attach As Attachment
  Dim FldrDest As Folder
  Dim PathSave As String

  PathSave = "C:\Attachments"
  Set FldrDest = Session.Folders("Address1").Folders("Inbox").Folders("Test")

  With ItemCrnt
    For Each Attach In .Attachments
      With Attach
        .SaveAsFile PathSave & "\" & .DisplayName
      End With
    Next

    If .Parent.Name = "Test" And .Parent.Parent.Name = "Inbox" Then
      ' MailItem is already in destination folder
    Else
      .Move FldrDest
    End If

  End With


End Sub
Sub SelectEmailsUser()

  Dim Exp As Explorer
  Dim ItemCrnt As MailItem

  Set Exp = Outlook.Application.ActiveExplorer

  If Exp.Selection.Count = 0 Then
    Call MsgBox("Pleaase select one or more emails then try again", vbOKOnly)
    Exit Sub
  Else
    For Each ItemCrnt In Exp.Selection
      With ItemCrnt
        Debug.Print .ReceivedTime & "|" & .Subject & "|" & .SenderEmailAddress
      End With
      Call SaveAttachAndMoveEmail(ItemCrnt)
    Next
  End If

End Sub 

Macro SaveAttachAndMoveEmail 是我在上面解释过的处理宏。将“Address1”替换为包含您要监控的收件箱的商店名称。宏 SelectEmailsUser 使用 ActiveExplorer 访问用户选择的电子邮件。宏将每封电子邮件的一些属性输出到即时窗口。为了测试宏,我选择了一些带有和不带附件的电子邮件,以及文件夹“Test”的内部和外部。我假设您的电子邮件都在“测试”中。为什么不将一些内容移回收件箱,然后选择并运行宏 SelectEmailsUser

选择方法二

将以下代码添加到您的模块中:

Sub SelectEmailsScan()

  Dim FldrSrc As Folder
  Dim InxItemCrnt As Long

  Set FldrSrc = Session.Folders("myemail@gmail.com").Folders("Inbox")

  For InxItemCrnt = FldrSrc.Items.Count To 1 Step -1
    With FldrSrc.Items.Item(InxItemCrnt)
      If .Class = olMail Then
        If .SenderEmailAddress = "myemail@gmail.com" Then
          Call SaveAttachAndMoveEmail(FldrSrc.Items.Item(InxItemCrnt))
        End If
      End If
    End With
  Next

End Sub

将“Address1”替换为包含您要监控的收件箱的商店名称。

我通过从我的第二个帐户向我的第一个帐户发送电子邮件来测试此代码(以及后来的代码)。您可以通过将“test@noreplay.com”以前发送的电子邮件从文件夹“Test”移动到文件夹“Inbox”来测试此代码。正如我所说,这是我使用最多的方法。让 Outlook 监控有趣的电子邮件似乎更容易,但当我希望更符合我的生活时,我发现能够控制运行宏。

选择方法三

在 VBA 编辑器中,项目资源管理器窗口通常位于左侧下方。最上面一行是“Microsoft Outlook 对象”。如果此行有“+”号,请单击“+”号展开“Microsoft Outlook 对象”。下一行是“ThisOutlookSession”。单击“ThisOutlookSession”将其选中。代码区域变为空白。以前您在模块中看到代码。 “ThisOutlookSession”是另一个可以放置代码的区域。您可以在此处放置任何代码,但我将其保留为必须放置在此处的代码。将以下代码复制到“ThisOutlookSession”中:

Option Explicit
Private WithEvents InboxItems As Items
Private Sub Application_Startup()
  Set InboxItems = Session.Folders("Address1").Folders("Inbox").Items
End Sub
Private Sub InboxItems_ItemAdd(ByVal ItemCrnt As Object)
  With ItemCrnt
    If .Class = olMail Then
      If .SenderEmailAddress = "test@noreplay.com" Then
        Call SaveAttachAndMoveEmail(ItemCrnt)
      End If
    End If
  End With
End Sub   

Private WithEvents InboxItems As Items 定义了对象InboxItems

Private Sub Application_Startup() … End Sub 指定启动 Outlook 时要运行的子例程。拥有这样的子例程意味着 Outlook 将立即询问您是否要启用宏。如果您想要监控事件,您必须回答“是”。

Set InboxItems = Session.Folders("Address1").Folders("Inbox").Items 标识您要监控的文件夹。当一个项目被添加到这个文件夹时,子程序Xxxxx_ItemAdd 被执行。 Xxxxx 是您定义的对象的名称 Private WithEvents …。只要为每个文件夹指定一个单独的 WithEvents 对象,您就可以监控任意数量的文件夹。

InboxItems_ItemAdd 中的代码检查该项目是邮件项目并且是由“test@noreplay.com”发送的。如果这些是真的,它会调用我的处理宏。您需要退出 Outlook(不要忘记保存“VbaProject.OTM”),然后重新启动它以激活收件箱的监控。

如果您正在查看“test@noreplay.com”的邮件到达时收件箱,您会看到它短暂出现,然后在移动到文件夹“Test”时消失。我通过从我的第二个电子邮件地址发送电子邮件来测试事件监控。您将不得不等待来自 test@noreplay.com 的电子邮件。

选择方法四

在设置方法 4 之前,您需要禁用方法 3。您可以从“ThisOutlookSession”中删除代码,但我将引号放在左边缘以将所有语句转换为 cmets,以便下次需要时参考监视事件。禁用方法 3 后,关闭 Outlook 并重新打开。

您需要创建一个新规则来替换我让您删除的规则。我为测试这种方法而创建的规则从我的 Address2 中选择了电子邮件。它没有将这些电子邮件移动到“测试”,因为我的处理宏就是这样做的。我的规则包括运行你没有的脚本。我创建此规则的步骤是:

  • 将其中一封目标电子邮件从“测试”移至“收件箱”。
  • 选择目标电子邮件。
  • 在主页选项卡上,点击“规则”。
  • 单击“创建规则”。将出现“创建规则”窗口。
  • 勾选“来自 test@noreplay.com”。
  • 检查没有勾选其他内容。
  • 单击“高级”。将出现一个“规则向导”窗口。
  • 勾选“来自 test@noreplay.com”,但未勾选其他内容。
  • 单击“下一步”。将出现另一个“规则向导”窗口。
  • 单击列表底部附近的“运行脚本”。
  • 检查没有勾选其他内容。
  • 在底部的第 2 步框中单击“脚本”。如果您在此 Outlook 运行之前没有这样做过,系统会要求您启用宏。将出现“选择脚本”窗口。
  • 选择“Project1.SaveAttachAndMoveEmail”并单击“确定”。注 1:宏名称可能会被截断。注意 2:此选项可能已被选中,并且是您唯一的选择。
  • 单击“下一步”。出现另一个“规则向导”窗口。
  • 检查没有打勾。
  • 单击“下一步”。出现最终的“规则向导”窗口。
  • 如果您不喜欢 Outlook 的默认名称,请为规则输入其他名称。
  • 您可能希望勾选“立即对收件箱中的邮件运行此规则”以删除您从“测试”中移出的电子邮件。
  • 单击“完成”。如果您勾选“现在对收件箱中的邮件运行此规则”,您将在规则运行时看到一个进度窗口。

我找不到关于“运行脚本”选项的任何好的文档。我的实验表明“选择脚本”窗口中列出的宏必须是Public,并且必须有一个符合此类宏规则的参数列表。我读过这样的宏可以有四个参数。第一个参数是强制性的,但其他参数可以省略。第一个参数必须是“ByRef itm As MailItem”或一些合理的变体。

【讨论】:

  • 哇。谢谢你。我只有一个问题和评论。正在观看电子邮件的选择方法 2 在编译时给了我一个错误。当我在没有方法 2 的情况下手动运行代码时,它可以工作(我的意思是当我从开发人员 - > Macors 运行时。所以我想知道我做错了什么 Sub SelectEmailsS​​can ( ) 以黄色突出显示。另外,我在方法 2 中添加了 End Sub,现在它突出显示 Set ItemCrnt 行?
  • @Kalenji 添加End Sub 是正确的。对不起,我没有注意到它已经丢失了。 “类型不匹配”通常是运行时错误。最可能的原因是您的收件箱包含不是邮件项目的内容。我已经修改了SelectEmailsScan 以允许这样做。我无法测试我的新代码,因为我的收件箱中只有电子邮件。如果新代码不起作用,请明确报告错误的时间和方式。我会在一两分钟内发布新代码。
  • @Kalenji 您已将此问题作为新问题发布。我看不出这会有什么帮助,所以我建议你删除新问题。你报告了一个不同的陈述,因为在新问题中给出了错误。报什么错误\?
  • 谢谢托尼。我很想让它工作!反正别的话题就没有了。现在我更新了方法 2,错误消失了。但是,当电子邮件到达时,它不会复制附件。当我手动运行它时很好。它将电子邮件移动到测试并复制附件。请问还有什么想法吗?
  • @Kalenji 看来我对这四种方法的解释不够充分。方法 1 和 2 处理已在收件箱中的电子邮件。方法 3 和 4 在电子邮件到达时对其进行处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2023-02-02
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多