我正在使用VS 2008和C#创建Outlook插件。为了运行此插件,使用Redemption遍历所有电子邮件并解析它。
我最近遇到了一个没有网络连接打开Outlook的问题(网络离线,拔掉电源,或像笔记本电脑一样移动,而且恰好没有连接)。这似乎是在获取收件人列表。
System.Runtime.InteropServices.COMException (0x80040115): Error in IAddrBook::OpenEntry: MAPI_E_NETWORK_ERROR Error: The connection to Microsoft Exchange is unavailable. Your network adapter does not have a default gateway. Component: Microsoft Exchange Address Book at Redemption.RDOAddressEntryClass.get_SMTPAddress()
这在以下代码中发生:
/// <summary>
/// Retrieves a list of recipient addresses from an RDOMail object
/// </summary>
/// <param name="rdoItem">The email to analyze</param>
/// <returns>A list of e-mail addresses</returns>
protected List<string> GetRecipients(RDOMail rdoItem)
{
RDORecipients recipients = rdoItem.Recipients;
List<string> recipientList = new List<string>();
if (recipients != null && recipients.Count > 0)
{
for (int i = 1; i <= recipients.Count; i++)
{
RDOAddressEntry addressEntry = recipients[i].AddressEntry;
if (addressEntry != null)
{
string recipient = addressEntry.SMTPAddress;
recipient = recipient.Trim();
if (recipient != null && recipient != String.Empty)
{
recipientList.Add(recipient);
}
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(addressEntry);
addressEntry = null;
}
}
}
if (recipients != null)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(recipients);
recipients = null;
}
return recipientList;
}
所以问题是,如何获取电子邮件的收件人而无需对Exchange进行身份验证或解析,并且因为没有网络连接而导致死亡?
编辑:或者 - 有没有办法在Outlook中缓存smtp电子邮件地址,这样如果它以后脱机,它不必解析电子邮件地址?
答案 0 :(得分:1)
我认为一些商店提供商是基础PST商店的包装。因此,在访问某些属性时,提供程序将尝试与远程服务器同步。您应该可以通过从提供程序中解开存储来阻止此操作。
注意:例如,向未拆包商店添加商品不应该保留对服务器的更改(如果是IMAP4)。
了解有关UnwrapStore属性的更多信息答案 1 :(得分:1)
在大多数情况下,PR_SMTP_ADDRESS属性应该在收件人表中可用。您可以使用RDORecipient.Fields []访问该属性 - 没有理由使用RDORecipient.AddressEntry(这会导致Redemption调用IAddrbook :: OpenEntry,并且调用可能会在脱机模式下失败)。
使用OutlookSpy查看收件人表(单击IMessage,转至GetRecipientTable选项卡)以确保存在PR_SMTP_ADDRESS属性。