Question

Est-il possible d'utiliser Automation pour Outlook 2003 avec Silverlight 4? Ou peut-être il y a une autre façon d'utiliser MAPI Outlook 2003 en application Silverlight?

J'utilise Silverlight 4 et je suis en train d'interagir avec Outlook ainsi:

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

Pour Outlook 2007/2010 tout fonctionne très bien.

Mais quand j'essaie d'utiliser à partir d'Outlook 2003 un champ d'instance dynamique (par exemple outlook.Session) alors j'ai get NotSupportedException. Il est seul problème Outlook 2003.

Je trouve l'article http: // msdn. microsoft.com/en-us/library/aa159619%28office.11%29.aspx mais il est inutile pour une application Silverlight (impossible de référence à l'assemblage bureau ou COM directement).

Type.GetTypeFromProgID est trop inutile, Silverlight ne le supporte pas.

Était-ce utile?

La solution

Je l'ai finalement trouvé une réponse. La plupart des actions peuvent être effectuées en utilisant le modèle standard objet Outlook 2003. Toutes ces actions décrites dans cet article Microsoft . La principale différence entre les exemples de l'article et le code Silverlight - nous ne pouvons pas consulter l'ensemble Interop Outlook, donc nous avons besoin d'utiliser la dynamique. Il est donc assez facile d'obtenir tous les contacts de la liste de contacts ou tous les e-mails de la boîte de réception (voir l'article). La partie la plus difficile est d'obtenir la liste des comptes de l'utilisateur créé. modèle objet Outlook 2003 offre la possibilité d'obtenir un seul (par défaut) compte:

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

Mais il est fait toujours pas convenable pour moi. Il est très triste, mais il n'y a pas de propriété Session.Accounts dans le modèle d'objet Outlook 2003. Donc, je l'ai trouvé qu'une seule façon difficile à obtenir la liste des comptes.

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

trick principal est utilisé de AutomationFactory.CreateObject ( "WScript.Shell"). il est maintenant possible d'obtenir des informations de compte directement à partir du Registre en utilisant la méthode RegRead. Soit dit en passant ce code fonctionne bien, même pour Outlook 2007/2010. Et comme pour moi, il est moyen le plus préférable que les comptes doivent être recueillis en silence (il n'y a pas besoin de lancer Outlook avant la collecte de données).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top