请协助解决无法将脱机 Outlook 地址导入 WF 的问题

Please assist with Unable to Import Offline Outlook Addresses to WF

我正在尝试将电子邮件地址列表从离线地址列表导入组合框,它似乎可以很好地找到列表,但是,每次我尝试提取数据时,它都会冻结整个应用程序,并且放入Form_Load时,应用程序拒绝启动。

我尝试更改为文本框,但问题仍然存在。 尝试使用虚假地址列表时,应用会遇到无法找到列表的错误

    private void button1_Click(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
        Microsoft.Office.Interop.Outlook.Accounts accounts = app.Session.Accounts;
        Microsoft.Office.Interop.Outlook.NameSpace oNS = app.GetNamespace("mapi");
        Microsoft.Office.Interop.Outlook.AddressLists oDLs = oNS.AddressLists;
        Microsoft.Office.Interop.Outlook.AddressList oGAL = oDLs["Offline Global Address List"];
        foreach (AddressEntry item in oGAL.AddressEntries)
        {
            comboBox1.Items.Add(item.Address);
        }
    }

GAL contains around 80K contacts

遍历地址簿中的所有项目并不是一个好主意:

foreach (AddressEntry item in oGAL.AddressEntries)
{
   comboBox1.Items.Add(item.Address);
}

Outlook 对象不提供任何搜索地址条目的方法。但你能做的最好的事情就是尝试 Resolve 名字或地址对照地址簿。

收件人的姓名可以是表示收件人的显示名称、别名或完整 SMTP 电子邮件地址的字符串。

总结评论中的讨论:

  1. 永远不要遍历地址簿容器(或 文件夹)。

  2. 如果需要解析名称,使用Namespace.CreateRecipient / Recipient.Resolve.

  3. 一旦解析了收件人,就不要使用ToString()方法——它是由.Net包装器实现的,而不是由对象本身实现的。使用将 return 您需要的 属性 - Recipient.Name。或者Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress,等等