Domanda

E 'possibile utilizzare l'automazione per Outlook 2003 con Silverlight 4? O forse ci sono un modo diverso di utilizzare Outlook 2003 MAPI in applicazione Silverlight?

Sto utilizzando Silverlight 4 e sto cercando interagiscono con Outlook in questo modo:

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

Per Outlook 2007/2010 tutto funziona bene.

Ma quando cerco di utilizzare ogni campo di istanza dinamica (ad esempio outlook.Session) da Outlook 2003, quindi ho l'get NotSupportedException. E 'solo problema di Outlook 2003.

Ho trovato un articolo http: // MSDN. microsoft.com/en-us/library/aa159619%28office.11%29.aspx ma è inutile per l'applicazione Silverlight (impossibile ottenere riferimento alla sede di montaggio o COM direttamente).

Type.GetTypeFromProgID è inutile troppo, Silverlight non la supporta.

È stato utile?

Soluzione

ho finalmente trovato una risposta. La maggior parte delle azioni possono essere eseguite utilizzando il modello oggetto standard di Outlook 2003. Tutte queste azioni descritte in questo articolo Microsoft . differenza principale tra esempi in un articolo e il codice di Silverlight - non possiamo fare riferimento Interop Outlook di montaggio, quindi abbiamo bisogno di usare la dinamica. Quindi è abbastanza facile da ottenere tutti i contatti dalla lista dei contatti o tutte le email di posta in arrivo (vedi articolo). La maggior parte difficile è ottenere elenco di account creati dell'utente. Outlook modello di oggetti 2003 forniscono possibilità di ottenere un solo (default) conto:

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

Ma è ancora non lo fa adatto a me. E 'molto triste, ma non v'è alcuna proprietà Session.Accounts nel modello a oggetti di Outlook 2003. Così ho trovato solo un modo difficile da ottenere un elenco di conti.

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; }
}

trucco principale è in uso di AutomationFactory.CreateObject ( "WScript.Shell"). Ora è possibile ottenere informazioni sul conto direttamente dal Registro di sistema utilizzando il metodo RegRead. Dal modo in cui questo codice funziona bene anche per Outlook 2007/2010. E per quanto riguarda me è modo più preferibile se gli account devono essere raccolti in silenzio (non c'è bisogno di lanciare Outlook prima di raccogliere i dati).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top