是否可以使用Windows服务访问outlook add的兑换方法

时间:2015-02-03 08:13:26

标签: c# windows-services outlook-addin outlook-redemption

我在C#中创建了outlook addin,用于使用兑换(背景)在SQLite数据库中存储邮件主题。我们可以访问兑换方法/ Outlook类添加到Windows服务中。

无法从服务中使用Outlook对象模型。

3 个答案:

答案 0 :(得分:1)

不要在服务中使用Outlook对象模型。其次,假设您在文件夹中只有ContactItem对象,如果那里有分发列表,您的代码将会中断。

RDO family of Redemption objects可用于服务

答案 1 :(得分:0)

您是对的,您不应该使用Windows服务中的Outlook对象模型。 Considerations for server-side Automation of Office文章声明如下:

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。

Redemption是低级API(扩展MAPI)的包装。但加载项是Office应用程序的一项功能。扩展MAPI并不知道有关它们的信息。因此,扩展MAPI周围的任何包装器(在您的情况下为Redemption)都不提供对加载项的访问。

考虑将任何其他通信方法与您的加载项一起使用,例如.NET Remoting(WCF)。您可以将托管加载项视为常规.Net应用程序。

答案 2 :(得分:0)

using Microsoft.Office.Interop.Outlook;
using OutLook = Microsoft.Office.Interop.Outlook;

,代码将是

 object missing = System.Reflection.Missing.Value;
        try
        {
            OutLook.MAPIFolder fldContacts = null;;
            OutLook._Application outlookObj = new OutLook.Application();
            string folderName = "Default";

            fldContacts = (OutLook.MAPIFolder)outlookObj.Session.GetDefaultFolder(OutLook.OlDefaultFolders.olFolderContacts);

            //LOOPIN G THROUGH CONTACTS IN THAT FOLDER.
            foreach (Microsoft.Office.Interop.Outlook._ContactItem contactItem in fldContacts.Items)
            {

                    StringBuilder strb = new StringBuilder();
                    strb.AppendLine((contactItem.FirstName == null) ? string.Empty : contactItem.FirstName);
                    strb.AppendLine((contactItem.LastName == null) ? string.Empty : contactItem.LastName);
                    strb.AppendLine(contactItem.Email1Address);
                    strb.AppendLine(contactItem.Business2TelephoneNumber);
                    strb.AppendLine(contactItem.BusinessAddress);
                    //write to text file
                    StreamWriter sw = null;
                    sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
                    sw.WriteLine(DateTime.Now.ToString() + ": " + strb.ToString());
                    sw.Flush();
                    sw.Close();

            }
        }
        catch (System.Exception ex)
        {
            throw new ApplicationException(ex.Message);
        }