如何获得与会议请求相关联的帐户?

时间:2016-02-29 11:10:32

标签: c# outlook vsto outlook-addin

我需要知道与会议请求相关联的帐户电子邮件地址(会议请求发送到的电子邮件地址):

string GetAssociatedAccountEmailAddress(Outlook.MeetingItem meetingItem)
{
    //TODO: implement this method:
    throw new NotImplementedException();
}

这就是我的尝试:

string GetAssociatedAccountEmailAddress1(Outlook.MeetingItem meetingItem)
{
    Outlook.MAPIFolder folder = meetingItem.Parent;
    Debug.WriteLine("Folder Name: {0}, Folder Path: {1}", folder.Name, folder.FolderPath);

    Outlook.MAPIFolder folderParent = folder.Parent;
    Debug.WriteLine("Folder Parent Name: {0}, Folder Parent Path: {1}", folderParent.Name, folderParent.FolderPath);

    return folderParent.FolderPath.Replace("\\", "");
}

调试输出:

Folder Name: Inbox, Folder Path: \\\\foo@foo.com\Inbox
Folder Parent Name: foo@foo.com, Folder Parent Path: \\\\foo@foo.com

此实现的问题是我不确定文件夹路径是否始终包含电子邮件地址。

我也尝试了以下内容:

string GetAssociatedAccountEmailAddress2(Outlook.MeetingItem meetingItem)
{
    Outlook.MAPIFolder folder = meetingItem.Parent;

    Outlook.MAPIFolder folderParent = folder.Parent;

    Outlook.NameSpace ns = folderParent.Parent;
    return ns.Accounts.Cast<Outlook.Account>()
        .FirstOrDefault(x => meetingItem.Recipients.Cast<Outlook.Recipient>().Any(r => r.Address == x.SmtpAddress))
        .SmtpAddress;
}

问题在于,如果我有两个帐户(foo@foo.com和bar@bar.com)并且会议请求被发送给两者,那么我有两个会议请求,但GetAssociatedAccountEmailAddress2返回相同的电子邮件地址。

仅供参考:我正在使用VS 2015开发Outlook 2013的Outlook加载项。

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到 -

  1. 使用PR_RECEIVED_BY_ENTRYID读取http://schemas.microsoft.com/mapi/proptag/0x003F0102属性(不保证存在,DASL名称MeetingItem.PropertyAccessor.GetProperty),使用PropertyAccessor.BinaryToString将其转换为十六进制字符串,使用它来致电Application.Session.GetAddressEntryFromID。请注意,如果项目是从其他商店复制的,则该属性可能与实际商店所有者不匹配。使用OutlookSpy(点击IMessage按钮)查看会议请求以查看该属性。

  2. 使用PR_MAILBOX_OWNER_ENTRYID从父商店(http://schemas.microsoft.com/mapi/proptag/0x661B0102)读取MeetingItem.Parent.Store属性(DASL名称Store.PropertyAccessor.GetProperty)。酒店无法保证满足客人的需求。如果使用Redemption是一个选项,它会公开具有Owner属性的RDOExchangeMailboxStore对象(返回RDOAddressEntry obejcy)。