كيف يمكنني الحصول على بيانات Outlook 2003 في تطبيق Silverlight 4

StackOverflow https://stackoverflow.com/questions/3118211

سؤال

هل من الممكن استخدام الأتمتة لـ Outlook 2003 مع Silverlight 4؟ أو ربما هناك طريقة مختلفة لاستخدام Outlook 2003 MAPI في تطبيق Silverlight؟

أنا أستخدم Silverlight 4 وأحاول التفاعل مع Outlook بهذه الطريقة:

dynamic outlook = AutomationFactory.GetObject("Outlook.Application"); 

لـ Outlook 2007/2010 يعمل كل شيء بشكل جيد.

ولكن عندما أحاول استخدام أي حقل من مثيل ديناميكي (على سبيل المثال Outlook.Session) من Outlook 2003 ، فإنني لا أحصل على NotsupportedException. إنها مشكلة Outlook 2003 فقط.

لقد وجدت مقالة http://msdn.microsoft.com/en-us/library/aa159619٪28office.11٪29.aspx لكن من غير المجدي تطبيق Silverlight (من المستحيل الحصول على الإشارة إلى Assembly أو COM مباشرة).

Type.GetTypeFromProgID هل هو عديمة الفائدة أيضًا ، Silverlight لا تدعمه.

هل كانت مفيدة؟

المحلول

لقد وجدت أخيرًا إجابة. يمكن تنفيذ معظم الإجراءات باستخدام نموذج كائن Outlook 2003. كل هذه الإجراءات الموضحة في هذه المقالة Microsoft. الفرق الرئيسي بين الأمثلة في المقالة ورمز Silverlight - لا يمكننا الرجوع إلى مجموعة Outlook ، لذلك نحن بحاجة إلى استخدام الديناميات. لذلك من السهل جدًا الحصول على جميع جهات الاتصال من قائمة جهات الاتصال أو جميع رسائل البريد الإلكتروني للوارد (انظر المقالة). الجزء الأكثر صعوبة هو الحصول على قائمة بحسابات المستخدم التي تم إنشاؤها. يوفر نموذج كائن Outlook 2003 إمكانية الحصول على حساب واحد فقط (افتراضي):

dynamic outlook = AutomationFactory.CreateObject("Outlook.Application");
var ns = outlook.GetNamespace("MAPI");
var defaultAccount = ns.CurrentUser;

لكن هذا لا يزال غير مناسب بالنسبة لي. إنه لأمر محزن للغاية ، ولكن لا توجد جلسة. خاصية COCCOUNTS في نموذج كائن Outlook 2003. لذلك وجدت طريقة واحدة صعبة فقط للحصول على قائمة بالحسابات.

public class Ol11ImportStrategy 
    {
        const string registryPath = @"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\{0}\{1}";
        const string constAccountName = "Account Name";
        const string constEmail = "Email";
        const string constSMTPServer = "SMTP Server";
        const string constName = "Display Name";
        const string constIMAPServer = "IMAP Server";
        const string constPOP3Server = "POP3 Server";
        const string constValueClsid = "clsid";
        const string constContentsAccountClsid_POP3 = "{ED475411-B0D6-11D2-8C3B-00104B2A6676}";
        const string constContentsAccountClsid_IMAP = "{ED475412-B0D6-11D2-8C3B-00104B2A6676}";

        public IEnumerable<AccountEntity> GetAccountsInFriendlyFormat()
        {
            List<AccountEntity> accounts = new List<AccountEntity>();

            using (dynamic WShell = AutomationFactory.CreateObject("WScript.Shell"))
            {
                for (int i = 1; i < 1000; i++)
                {
                    try
                    {
                        string classId = WShell.RegRead(String.Format(registryPath, i.ToString().PadLeft(8, '0'), constValueClsid));

                        if (StringComparer.InvariantCultureIgnoreCase.Compare(classId, constContentsAccountClsid_POP3) == 0)
                        {
                            accounts.Add(new AccountEntity
                            {
                                FriendlyName = GetRegisterElementValue(WShell, i.ToString(), constAccountName),
                                IncomingMailServer = GetRegisterElementValue(WShell, i.ToString(), constPOP3Server),
                                Email = GetRegisterElementValue(WShell, i.ToString(), constEmail),
                                UserName = GetRegisterElementValue(WShell, i.ToString(), constName)
                            });
                            continue;
                        }

                        if (StringComparer.InvariantCultureIgnoreCase.Compare(classId, constContentsAccountClsid_IMAP) == 0)
                        {
                            accounts.Add(new AccountEntity
                            {
                                FriendlyName = GetRegisterElementValue(WShell, i.ToString(), constAccountName),
                                IncomingMailServer = GetRegisterElementValue(WShell, i.ToString(), constIMAPServer),
                                Email = GetRegisterElementValue(WShell, i.ToString(), constEmail),
                                UserName = GetRegisterElementValue(WShell, i.ToString(), constName)
                            });
                            continue;
                        }

                        //it isn't POP3 either IMAP
                    }
                    catch (FileNotFoundException e)
                    {
                        //classId isn't found - we can break iterations because we already iterate through all elements
                        break;
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show("Unknown exception");
                    }
                }
            }

            return accounts;
        }

        private string GetRegisterElementValue(object scriptShell, string elementNumber, string elementName)
        {
            dynamic shell = scriptShell;
            string currentElement = elementNumber.PadLeft(8, '0');

            object[] currentElementData = shell.RegRead(String.Format(registryPath, currentElement, elementName));

            byte[] dataBytes = currentElementData.Cast<byte>().ToArray();
            return Encoding.Unicode.GetString(dataBytes, 0, dataBytes.Count()).Trim('\0');
        }
    }

public class AccountEntity
{
    public string FriendlyName { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string AccountType { get; set; }
    public string IncomingMailServer { get; set; }
}

الخدعة الرئيسية هي استخدام AutomationFactory.createBject ("wscript.shell"). الآن من الممكن الحصول على معلومات الحساب مباشرة من السجل باستخدام طريقة Regread. بالمناسبة ، يعمل هذا الرمز بشكل جيد حتى في Outlook 2007/2010. بالنسبة لي ، فمن الأفضل أن يتم جمع الحسابات بصمت (ليست هناك حاجة لإطلاق Outlook قبل جمع البيانات).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top