Outlook - 查找邮件发送到的帐户的电子邮件

Posted

技术标签:

【中文标题】Outlook - 查找邮件发送到的帐户的电子邮件【英文标题】:Outlook - Find email of account the message was sent to 【发布时间】:2015-05-31 22:01:53 【问题描述】:

我的客户有问题,这意味着我有问题:

如果电子邮件收件人在 Outlook 中配置了多封电子邮件 - 我有一个 yahoo 电子邮件帐户和 2 个来自不同 Exchange 服务器的 Exchange 帐户。

在 ProcessItemAdd 事件处理程序(Add-In Express)中处理传入电子邮件时 我试图找出这封电子邮件发送到的 3 个帐户中的哪个帐户:

所以我的第一个方法是:

                         Outlook.MailItem re = ((Outlook._MailItem)mail).Reply();
                        if (re != null)
                        
                            var thisEmail = "";
                            Outlook.Account account = re.SendUsingAccount;
                            if (account != null)
                            
                                thisEmail = account.SmtpAddress;
                                Log.VerboseFormat("thisEmail = 0", thisEmail);

                                Marshal.ReleaseComObject(re);
                                re = null;

                                Marshal.ReleaseComObject(account);
                                account = null;

它在装有 Outlook 2010 32 位的机器上完美运行,但在装有 Outlook 2010 的客户端机器上无法正常运行,返回空字符串。 所以我的第二种(备份方法)是:

                                if (String.IsNullOrEmpty(thisEmail))
                                
                                    // This requires that in the case of Exchange account it should be cached Exchange account.
                                    thisEmail = (string)mail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/id/00062008-0000-0000-C000-000000000046/8580001F");
                                    Log.VerboseFormat("Got receiver account email address from schema: 0", thisEmail);
                                
                            
                        

这再次在我的机器上完美运行,但在客户端机器上不起作用,返回空字符串。 我确实验证了在我的客户的情况下,发件人是带有缓存的 Exchange 帐户...

顺便说一句,当发件人不是 Exchange 而收件人是 Exchange 帐户时,它在客户端计算机上工作正常...

是否有任何其他方法可以可靠地确定电子邮件发送到哪个帐户(如果有多个收件人)。

这是我最新的代码,适用于 2010/2013 但不适用于 2007。在后一个帐户上为 null 并且 x-header 返回为空:

                            Outlook.MailItem re = ((Outlook._MailItem)mail).Reply();
                        if (re != null)
                        
                            var thisEmail = "";
                            Outlook.Account account = re.SendUsingAccount;
                            if (account != null)
                            
                                thisEmail = account.SmtpAddress;
                                Log.VerboseFormat("thisEmail = 0", thisEmail);

                                Marshal.ReleaseComObject(re);
                                re = null;

                                Marshal.ReleaseComObject(account);
                                account = null;
                                if (String.IsNullOrEmpty(thisEmail))
                                
                                    string x_headers = (string)mail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001F");
                                    thisEmail = FindTargetEmail(x_headers);
                                    Log.Verbose("Extracted target email address from MIME x-headers: 0", thisEmail);

                                 
                            
                            else 
                            
                                Log.Verbose("account is null...");

                                if (String.IsNullOrEmpty(thisEmail))
                                
                                    string x_headers = (string)mail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001F");
                                    thisEmail = FindTargetEmail(x_headers);
                                    Log.Verbose("Extracted target email address from MIME x-headers: 0", thisEmail);
                                

                             

编辑: 好吧,这还没有结束。尽管它在我有客户在 2010 年报告问题的所有机器上都运行良好。这是一个非常奇怪的问题。 用户 user1@domain1.com(缓存的 Exchange 帐户)向用户 user2@domain2.com(gmail 帐户)发送电子邮件。当我使用上述代码解析接收方的 MIME 标头以获取此电子邮件发送到的地址时...我返回 user1@domain1.com 而不是 user2@domain2.com !!这怎么可能?我知道我正在解析标头的正确部分(是吗?)并且在我的机器上它返回了正确的结果......为什么它不会在我客户的某些机器上发生??

专家,有什么想法吗?

【问题讨论】:

你试过在你客户的机器上调试它吗?是因为 Account.SmtpAddress 为空吗?还是因为 MailItem.SendUsingAccount 为空?您应该能够在不使用 OutlookSpy 安装任何调试工具的情况下查看对象 - 选择邮件,单击 OutlookSpy 工具栏上的项目按钮,选择 SendUsingAccount 属性,单击浏览。 accountSmtpAddress 返回空字符串。正如我所提到的,它可以在我的机器上运行,但在我客户的某些机器上 accountSmtpAddress 返回空字符串。使用 PropertyAccessor 的第二种方法也没有返回任何内容...我的客户端不是技术人员,我无法开始安装 OutlookSpy - 除此之外我没有它...我正在尝试解析 MIME x-headers 的第三种也是最有前途的方法。 有问题的账号是什么? 我相信这是 Gmail 帐户。 同样在 2007 年,帐户返回 null,x-header 返回空。 【参考方案1】:

通常,Outlook 配置文件中的 Store 代表一个单独的帐户。您可以在每个商店中处理 Items 类的 ItemAdd 事件(ADX 术语中的 ProcessItemAdd),以识别电子邮件发送到的帐户。

【讨论】:

不幸的是,它不起作用...我有 ProcessItemAdd 并且它传递的唯一参数是对象项目,在我的情况下是 Outlook.MailItem 从这里你可以找到文件夹: Outlook.MAPIFolder folder = FolderObj作为 Outlook.MAPIFolder; 不幸的是,它不起作用...我有 ProcessItemAdd 并且它传递的唯一参数是对象项目,在我的情况下是 Outlook.MailItem 从这里你可以找到文件夹: Outlook.MAPIFolder folder = FolderObj作为 Outlook.MAPI 文件夹;然后甚至是 store = folder.Store;但是商店没有邮件发送到的电子邮件地址-有时商店名称是电子邮件地址,但这不一定是电子邮件地址-可能只是文本...我的最新消息-我介绍的代码在 Outlook 2010 / 2013 上运行良好,但是不是在 2007 年 - 从 PropertyAssessor 返回的 x_header 是空的...

以上是关于Outlook - 查找邮件发送到的帐户的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

MS Access / Outlook 2010 - 如何选择从哪个帐户发送电子邮件?

[Office一般性操作] 关闭Outlook重定向

通过Outlook上的适当帐户发送VBA生成的个性化电子邮件

outlook发送邮件为啥老显示错误

扫描非默认 Outlook 收件箱以查找电子邮件?

outlook收不到邮件了,说超过了为该用户设立的大小值.