Je suis actuellement en train de faire une recherche de réunion et pour cela je veux lire les agendas des gens.

J'ai cet extrait de code pour obtenir le gestionnaire de l'utilisateur actuel, mais je souhaite obtenir l'ExchangeUser par son adresse e-mail (pas l'utilisateur actuel lui-même).

Outlook.ExchangeUser manager = oApp.Session.CurrentUser.AddressEntry.GetExchangeUser().GetExchangeUserManager();

Comment puis je faire ça?

Modifier: C'est le code qui a fonctionné pour moi (pas encore optimisé):

    private static Outlook.Application _oApp;

    static void Main(string[] args)
    {
        _oApp = GetApplicationObject();

        if (_oApp == null) {
            Console.WriteLine("Unable to connect to a running Outlook instance or create a new one");
            return;
        }

        Outlook.NameSpace oNamespace = _oApp.GetNamespace("MAPI");

        try
        {
            var user1Recipient = GetUserByEmailAddress("user1@example.tld");
            var user1 = user1Recipient.AddressEntry.GetExchangeUser();

            Console.WriteLine($"{user1.PrimarySmtpAddress}: {user1.Name}");

            try
            {
                Outlook.Folder folder = _oApp.Session.GetSharedDefaultFolder(user1Recipient, Outlook.OlDefaultFolders.olFolderCalendar) as Outlook.Folder;
                folder.Display();
            }
            catch
            {
                Console.WriteLine($"Could not open {user1.Name}'s calendar!");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error {ex}");
        }
        finally
        {
            oNamespace.Logoff();
        }

        Console.ReadLine();
    }

    private static Outlook.Recipient GetUserByEmailAddress(string email)
    {
        Outlook.Recipient recipient = null;

        try
        {
            Outlook._MailItem mailItem = _oApp.CreateItem(Outlook.OlItemType.olMailItem) as Outlook._MailItem;

            recipient = mailItem.Recipients.Add(email);

            recipient.Resolve();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex);
        }

        return recipient;
    }

    private static Outlook.Application GetApplicationObject()
    {
        Outlook.Application oApp = null;
        if (Process.GetProcessesByName("OUTLOOK").Any())
        {
            oApp = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
        }
        else
        {
            oApp = new Outlook.Application();
            Outlook.NameSpace oNamespace = oApp.GetNamespace("MAPI");
            oNamespace.Logon("", "", Missing.Value, Missing.Value);
        }

        return oApp;
    }
0
Steven2105 3 sept. 2020 à 15:35

2 réponses

Meilleure réponse

Cela pourrait-il fonctionner pour vous?

En C #:

public static Outlook.Recipient GetUserByMail(string mailAddress)
{
    Outlook.Recipient r = null;

    try
    {
        // TO DO: re-use existing application, if possible
        Outlook.Application OL = new Outlook.Application();

        Outlook._MailItem mail = 
           OL.CreateItem(Outlook.OlItemType.olMailItem) 
           as Outlook._MailItem;

        r = mail.Recipients.Add(mailAddress);

        r.Resolve();
    }
    catch (Exception)
    {
    }

    return r;
}

En VBA:

Function GetUserByMail(mailAddress As String) As Recipient
    Dim myItem As mailItem
    Dim myRecipient As Recipient
    
    On Error GoTo ErrHandler
    
    Set myItem = Application.CreateItem(olMailItem)
 
    Set myRecipient = myItem.recipients.Add(mailAddress)
    
    myItem.recipients.ResolveAll
    
    Set GetUserByMail = myItem.recipients.item(1)
    On Error GoTo 0
    Exit Function
    
ErrHandler:
    Set GetUserByMail = Nothing
    Err.Clear
    On Error GoTo 0
End Function
1
Axel Kemper 3 sept. 2020 à 17:40

Transmettez l'adresse e-mail à oApp.Session.CreateRecipient, appelez Recipient.Resolve, puis appelez Recipient.AddressEntry.GetExchangeUser(). Soyez prêt à gérer les valeurs nulles et les exceptions.

1
Dmitry Streblechenko 4 sept. 2020 à 02:59