如何使用 Python 访问联机存档邮箱?

How do I access Online Archive mailbox using Python?

已解决! :) 在下面提到的一些重要帮助下,我使用以下方法将我的邮件从收件箱中的某个位置移动到在线档案中:

import win32com
import os
import sys

outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")
src = mapi.GetDefaultFolder(6).Folders["tobemoved"]
target = mapi.Folders["Online Archive - XXX"].Folders['Archive']

messages = src.Items


i = range(messages.count, 1, -1)
for x in i:
     print(x)
     messages(x).Move(target)
`

我还有一个名为 'Online-Archive-Same email address as "inbox" email ' 我目前找不到它试图使用这个 link 来找出它的枚举。但没有运气..

因为我必须释放一些磁盘 space 非常感谢您提供的任何帮助。 P.S 尝试了传统方式 - outlook 在连接问题上苦苦挣扎,22k 电子邮件被移动到存档 outlook 只是放弃了我:)随时提出任何可以解决这个问题的建议。

您可以像这样访问 Office 365 在线存档文件夹:

将示例电子邮件替换为您在 Outlook 中看到的确切电子邮件地址。


import win32com.client
import win32com

app = win32com.client.gencache.EnsureDispatch("Outlook.Application")
outlook = app.GetNamespace("MAPI")
outlook_folder = outlook.Folders['Online Archive - Example@email.com'].Folders['Inbox']

item_count = outlook_folder.Items.Count
print(item_count)


180923

在低(扩展 MAPI)级别(仅限 C++ 或 Delphi),联机存档只是另一个委托 Exchange 邮箱。将存档邮箱与某个 Exchange 用户拥有的另一个委托邮箱区分开来的唯一方法是阅读存档存储配置文件部分中的 PR_PROFILE_ALTERNATE_STORE_TYPE 属性 - 检索存储条目 ID (PR_ENTRYID) ,然后在会话存储 table (IMAPISession::GetMsgStoresTable) 中找到匹配的行。对于匹配行(使用 IMAPISession::CompareEntryIDs),检索 PR_PROVIDER_UID 属性。使用它的值来调用 IMAPISession.OpenProfileSection。从 IProfSect 对象中读取 PR_PROFILE_ALTERNATE_STORE_TYPE 属性 并检查其值是否为 "Archive"(与商店名称不同,未本地化)。

如果 C++ 中的扩展 MAPI 或 Delphi 不是一个选项,您可以

  1. 尝试在 Namespace.Stores 集合中找到名称以 "Online Archive - " 开头且用户的 SMTP 地址匹配的商店。由于该前缀是特定于语言环境的,因此我不会在生产代码中使用它。

  2. 使用Redemption (I am its author) - it exposes RDOExchangeMailboxStore.IsArchive property. If the archive store is not already opened in Outlook, you can also use RDOSession.GetArchiveMailbox。在 VB 脚本中:

set rSession = CreateObject("Redemption.RDOSession")
rSession.MAPIOBJECT = Application.Session.MAPIOBJECT
userAddress =  rSession.CurrentUser.SMTPAddress
set store = GetOpenArchiveMailboxForUser(userAddress)
if not store is Nothing Then
  MsgBox "Found archive store for " & userAddress
Else
  MsgBox "Could not find archive store for " & userAddress
End If

function GetOpenArchiveMailboxForUser(SmtpAddress)
  set GetOpenArchiveMailboxForUser = Nothing
  for each store in rSession.Stores
    if TypeName(store) = "RDOExchangeMailboxStore" Then
      Debug.Print store.Name & " - " & store.Owner.SMTPAddress & " - " &  store.IsArchive
      if store.IsArchive and LCase(store.Owner.SMTPAddress) = LCase(SmtpAddress) Then
        set GetOpenArchiveMailboxForUser = store
        exit for
      End If
    End If
  next

结束函数