Frage

Ist es möglich, 4 Automatisierung für Outlook 2003 mit Silverlight zu benutzen? Oder vielleicht gibt es einige andere Art und Weise Outlook 2003 MAPI in Silverlight-Anwendung zu verwenden?

Ich bin mit Silverlight 4 und ich versuche, interact mit Outlook auf diese Weise:

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

Für Outlook 2007/2010 alles funktioniert gut.

Aber wenn ich versuche, jeden Bereich der dynamischen Instanz (zB outlook.Session) von Outlook 2003 dann habe ich get NotSupportedException. Es ist nur Outlook 2003 Problem.

fand ich Artikel http: // msdn. microsoft.com/en-us/library/aa159619%28office.11%29.aspx aber es ist nutzlos für die Silverlight-Anwendung (unmöglich Bezug auf Büro zu bekommen Montage oder COM direkt).

Type.GetTypeFromProgID nutzlos ist auch nicht Silverlight nicht unterstützt.

War es hilfreich?

Lösung

Ich habe endlich eine Antwort. Die meisten Aktionen können unter Verwendung von Standard-Outlook 2003-Objektmodell durchgeführt werden. Alle diese Aktionen beschrieben in diesem Microsoft-Artikel . Hauptunterschied zwischen den Beispielen in Artikel und Silverlight-Code - wir können nicht Interop Outlook verweisen Montage, so dass wir die Dynamik verwenden müssen. So ist es ziemlich einfach ist, alle Kontakte aus der Kontaktliste oder allen Posteingang E-Mail zu erhalten (siehe Artikel). Schwierigste Teil ist der Erhalt Liste der erstellten Benutzer-Konten. Outlook 2003-Objektmodell Möglichkeit bietet nur einen (Standard) Konto zu erhalten:

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

Aber es ist immer noch nicht geeignet für mich. Es ist sehr traurig, aber es gibt keine Session.Accounts Eigenschaft in Outlook 2003-Objektmodell. Also ich habe nur eine perfide Weise zu erhalten Liste der Konten.

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

Haupt Trick ist, im Gebrauch von AutomationFactory.CreateObject ( "WScript.Shell"). Jetzt ist es möglich, Kontoinformationen direkt aus der Registrierung mit RegRead Methode zu erhalten. Durch die Art und Weise funktioniert dieser Code gut auch für Outlook 2007/2010. Und für mich ist es am meisten bevorzugte Art und Weise, wenn Konten sollten still gesammelt werden (es gibt keine Notwendigkeit, Outlook zu starten, bevor die Erhebung von Daten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top