移动对象后获取 EntryID

Posted

技术标签:

【中文标题】移动对象后获取 EntryID【英文标题】:Getting an EntryID after an object is moved 【发布时间】:2015-07-24 13:46:57 【问题描述】:

总结

我正在尝试将超链接添加到从已移动到另一个文件夹的电子邮件中创建的任务。

目标是让任务包含指向已移动到“已处理电子邮件”文件夹的 Outlook 项目的超链接。

问题

我不明白如何移动 MailItem 并在移动后获取其新的 EntryID。

“幼稚”的方式行不通。使用 Move 方法移动 MailItem 对象后,EntryID 属性不会反映 ID 的变化。

详情

如果 Outlook 项目保留在收件箱中,那么使用 outlook:<EntryID> 格式创建指向 Outlook 项目的超链接就足够简单了,因为我可以只获取要链接到的对象的 EntryID。但是,当对象移动时,Outlook 会更改 EntryID。

我想了解如何获取更新后的 ID,以便构建准确的链接。

示例

消息框显示 objMail 的 EntryID 属性返回相同的值,尽管对象已移动。但是,在目标文件夹中的邮件上运行单独的宏可确认 EntryID 已随移动而更改。

Sub MoveObject(objItem As Object)
  
Select Case objItem.Class
Case olMail

    Dim objMail As MailItem
    Set objMail = objItem

    MsgBox (objMail.EntryID)
        
    Dim inBox As Outlook.MAPIFolder
    Set inBox = Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
    Dim destFolder As Outlook.MAPIFolder
    Set destFolder = inBox.Folders("Processed Email")
    If (Application.ActiveExplorer().CurrentFolder.Name <> destFolder.Name) Then 
        objMail.Move destFolder
    End If
    MsgBox (objMail.EntryID)
End Select
End Sub

【问题讨论】:

【参考方案1】:

MailItem 类的Move 方法返回一个对象,该对象表示已移动到指定文件夹的项目。您需要检查返回对象的 EntryID 值,而不是源对象。

无论如何,您可以考虑处理目标文件夹的ItemAdd 事件,以确保始终使用更新的条目 ID 值。

 Sub MoveItems() 
  Dim myNameSpace As Outlook.NameSpace 
  Dim myInbox As Outlook.Folder 
  Dim myDestFolder As Outlook.Folder 
  Dim myItems As Outlook.Items 
  Dim myItem As Object  
  Set myNameSpace = Application.GetNamespace("MAPI") 
  Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox) 
  Set myItems = myInbox.Items 
  Set myDestFolder = myInbox.Folders("Personal Mail") 
  Set myItem = myItems.Find("[SenderName] = 'Eugene Astafiev'") 
  While TypeName(myItem) <> "Nothing" 
   myItem.Move myDestFolder 
   Set myItem = myItems.FindNext 
  Wend 
 End Sub

【讨论】:

再次感谢您的帮助 - 我会尝试一下。 完美运行 - 感谢您阐明 MailItem.Move 的返回值的使用。【参考方案2】:

您好,请详细说明您的答案我无法理解。

无论如何,您可以考虑处理目标文件夹的ItemAdd 事件,以确保始终使用更新的条目 ID 值。

这是我的代码,移动后我需要EntryID

Sub Movetest1()


    Dim olApp As Outlook.Application
    Dim olns As Outlook.NameSpace


    Dim Fld As Folder
    Dim ofSubO As Outlook.MAPIFolder
    Dim myDestFolder As Outlook.Folder
    Dim ofolders As Outlook.Folders


    Dim objItems As Outlook.Items



    Dim myRestrictItems As Outlook.Items
    Dim i As Long


    Dim myitem As Object

'    Dim MailItem As Microsoft.Office.Interop.Outlook.MailItem

    Dim MailItem, moveditem As Outlook.MailItem




    Dim eid As String
    Dim sid As Variant
    Dim newEID As String


'---------------------------------------------------------------------------------------------------------


    Set olApp = New Outlook.Application
    Set olns = olApp.GetNamespace("MAPI")


    For Each Fld In olns.Folders
        If Fld.Name = "GSS Payables" Then

'
'            MsgBox Fld.Name
'            Debug.Print " - "; Fld.EntryID

            Set Fld = olns.GetFolderFromID("000000009DA6D76FBE7A58489450CDF6094F592A0100A2457DC435B22448A832DB721D8185B1000000B6207D0000").Folders("Inbox")
            Exit For
        End If
      Next



Set objItems = Fld.Items


eid = "000000009DA6D76FBE7A58489450CDF6094F592A0700A2457DC435B22448A832DB721D8185B1000000B620800000A2457DC435B22448A832DB721D8185B100007FF773270000"
sid = "000000009DA6D76FBE7A58489450CDF6094F592A0100A2457DC435B22448A832DB721D8185B1000000B6207D0000"



Set myDestFolder = Fld.Folders("Bhagyashri")

'Set myitem = objItems.Find("[SenderName]='Microsoft Outlook '")

Set MailItem = olns.GetItemFromID(eid)




Set moveditem = MailItem.Move(myDestFolder)

"giving error here
 newID = moveditem.entryid




Debug.Print "newID -"; newID



' get mailitem.parent.storeid

MsgBox "done"


End

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review @user1438038 - 它确实提供了答案。在目标文件夹上使用 Items.ItemAdd 事件是一个很好的解决方法。【参考方案3】:

使用以下语法:

Dim MoveToFolder As outlook.MAPIFolder
Dim MyItem As outlook.MailItem
Dim NewEntryID As String

NewEntryID = MyItem.Move(MoveToFolder).ENTRYID

MyItem.Move 执行后,新的ENTRYID 将返回到NewEntryID 变量。

【讨论】:

以上是关于移动对象后获取 EntryID的主要内容,如果未能解决你的问题,请参考以下文章

使用 EntryID 引用时的 MailItem.SaveAs

前端压缩图片代码,支持移动端和pc 端,还有拍照后获取到的照片

重新排序单元格后如何更改获取结果控制器数组中对象的顺序

UnityHTCSteamVR怎么获取左右手柄

JDBC——ResultSet结果集对象

如何在游标对象保持第一行并移动以获取第二行时中断游标处理?