How to retrieve all contacts from Microsoft Exchange using EWS Managed API?

ぃ、小莉子 提交于 2020-01-06 02:29:05

问题


all I need to do is to retrieve all contacts from Microsoft Exchange. I did some research and the best possible option for me should be to use EWS Managed API. I am using Visual Studio and C# programming leanguage.

I think I am able to connect to Office365 account, because I am able to send a message in a program to specific email. But I am not able to retrieve the contacts.

If I create a contact directly in source code, the contact will be created in Office365->People aplication. But I don't know why! I thought I was working with Exchange aplication.

Summarize: Is there any possibility how to get all contacts from Office365->Admin->Exchange->Acceptencers->Contacts ?

Here is my code:

class Program
{
    static void Main(string[] args)
    {
        // connecting to my Exchange account
        ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
        service.Credentials = new WebCredentials("office365email@test.com", "password123");

        /*
        // debugging
        service.TraceEnabled = true;
        service.TraceFlags = TraceFlags.All;
        */

        service.AutodiscoverUrl("office365email@test.com", RedirectionUrlValidationCallback);

        // send a message works good
        EmailMessage email = new EmailMessage(service);
        email.ToRecipients.Add("matoskok1@gmail.com");
        email.Subject = "HelloWorld";
        email.Body = new MessageBody("Toto je testovaci mail");
        email.Send();

        // Create the contact creates a contact in Office365 -> People application..Don't know why there and not in Office365 -> Exchange
        /*Contact contact = new Contact(service);

        // Specify the name and how the contact should be filed.
        contact.GivenName = "Brian";
        contact.MiddleName = "David";
        contact.Surname = "Johnson";
        contact.FileAsMapping = FileAsMapping.SurnameCommaGivenName;

        // Specify the company name.
        contact.CompanyName = "Contoso";

        // Specify the business, home, and car phone numbers.
        contact.PhoneNumbers[PhoneNumberKey.BusinessPhone] = "425-555-0110";
        contact.PhoneNumbers[PhoneNumberKey.HomePhone] = "425-555-0120";
        contact.PhoneNumbers[PhoneNumberKey.CarPhone] = "425-555-0130";

        // Specify two email addresses.
        contact.EmailAddresses[EmailAddressKey.EmailAddress1] = new EmailAddress("brian_1@contoso.com");
        contact.EmailAddresses[EmailAddressKey.EmailAddress2] = new EmailAddress("brian_2@contoso.com");

        // Specify two IM addresses.
        contact.ImAddresses[ImAddressKey.ImAddress1] = "brianIM1@contoso.com";
        contact.ImAddresses[ImAddressKey.ImAddress2] = " brianIM2@contoso.com";

        // Specify the home address.
        PhysicalAddressEntry paEntry1 = new PhysicalAddressEntry();
        paEntry1.Street = "123 Main Street";
        paEntry1.City = "Seattle";
        paEntry1.State = "WA";
        paEntry1.PostalCode = "11111";
        paEntry1.CountryOrRegion = "United States";
        contact.PhysicalAddresses[PhysicalAddressKey.Home] = paEntry1;

        // Specify the business address.
        PhysicalAddressEntry paEntry2 = new PhysicalAddressEntry();
        paEntry2.Street = "456 Corp Avenue";
        paEntry2.City = "Seattle";
        paEntry2.State = "WA";
        paEntry2.PostalCode = "11111";
        paEntry2.CountryOrRegion = "United States";
        contact.PhysicalAddresses[PhysicalAddressKey.Business] = paEntry2;

        // Save the contact.
        contact.Save();
        */


        // msdn.microsoft.com/en-us/library/office/jj220498(v=exchg.80).aspx
        // Get the number of items in the Contacts folder.
        ContactsFolder contactsfolder = ContactsFolder.Bind(service, WellKnownFolderName.Contacts);
        Console.WriteLine(contactsfolder.TotalCount);

        // Set the number of items to the number of items in the Contacts folder or 50, whichever is smaller.
        int numItems = contactsfolder.TotalCount < 50 ? contactsfolder.TotalCount : 50;

        // Instantiate the item view with the number of items to retrieve from the Contacts folder.
        ItemView view = new ItemView(numItems);

        // To keep the request smaller, request only the display name property.
        view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ContactSchema.DisplayName);

        // Retrieve the items in the Contacts folder that have the properties that you selected.
        FindItemsResults<Item> contactItems = service.FindItems(WellKnownFolderName.Contacts, view);

        // Display the list of contacts. 
        foreach (Item item in contactItems)
        {
            if (item is Contact)
            {
                Contact contact1 = item as Contact;
                Console.WriteLine(contact1.DisplayName);
            }
        }

        Console.ReadLine();
    } // end of Main() method
    /*===========================================================================================================*/

    private static bool CertificateValidationCallBack(
    object sender,
    System.Security.Cryptography.X509Certificates.X509Certificate certificate,
    System.Security.Cryptography.X509Certificates.X509Chain chain,
    System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        // If the certificate is a valid, signed certificate, return true.
        if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
        {
            return true;
        }

        // If there are errors in the certificate chain, look at each error to determine the cause.
        if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
        {
            if (chain != null && chain.ChainStatus != null)
            {
                foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
                {
                    if ((certificate.Subject == certificate.Issuer) &&
                       (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
                    {
                        // Self-signed certificates with an untrusted root are valid. 
                        continue;
                    }
                    else
                    {
                        if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
                        {
                            // If there are any other errors in the certificate chain, the certificate is invalid,
                            // so the method returns false.
                            return false;
                        }
                    }
                }
            }

            // When processing reaches this line, the only errors in the certificate chain are 
            // untrusted root errors for self-signed certificates. These certificates are valid
            // for default Exchange server installations, so return true.
            return true;
        }
        else
        {
            // In all other cases, return false.
            return false;
        }
    }

    private static bool RedirectionUrlValidationCallback(string redirectionUrl)
    {
        // The default for the validation callback is to reject the URL.
        bool result = false;

        Uri redirectionUri = new Uri(redirectionUrl);

        // Validate the contents of the redirection URL. In this simple validation
        // callback, the redirection URL is considered valid if it is using HTTPS
        // to encrypt the authentication credentials. 
        if (redirectionUri.Scheme == "https")
        {
            result = true;
        }
        return result;
    }
}

回答1:


seems like you are already doing a good job doing a FindItems() method.

In order to get all contacts all you need to add is a SearchFilter, in this case I'd recommend doing the Exists() filter as you can simply say Find All contacts with an id.

See my example below if you need an example of a Full Windows Application dealing with contacts see my github page github.com/rojobo

    Dim oFilter As New SearchFilter.Exists(ItemSchema.Id)
    Dim oResults As FindItemsResults(Of Item) = Nothing
    Dim oContact As Contact

        Dim blnMoreAvailable As Boolean = True
        Dim intSearchOffset As Integer = 0
        Dim oView As New ItemView(conMaxChangesReturned, intSearchOffset, OffsetBasePoint.Beginning)
        oView.PropertySet = BasePropertySet.IdOnly

        Do While blnMoreAvailable
            oResults = pService.FindItems(WellKnownFolderName.Contacts, oFilter, oView)
            blnMoreAvailable = oResults.MoreAvailable
            If Not IsNothing(oResults) AndAlso oResults.Items.Count > 0 Then
                For Each oExchangeItem As Item In oResults.Items
                    Dim oExchangeContactId As ItemId = oExchangeItem.Id
                    //do something else
                Next
                If blnMoreAvailable Then oView.Offset = oView.Offset + conMaxChangesReturned
            End If
        Loop



回答2:


How to retrieve all contacts from Microsoft Exchange using EWS Managed API?

If your question is how to retrieve the Exchange Contacts using EWS, you're already done with it.

Office365->People is just the right app to manipulate your Exchange contacts. If you check out the People app URL, it's something similar to https://outlook.office365.com/owa/?realm=xxxxxx#exsvurl=1&ll-cc=1033&modurl=2, owa is the synonym for outlook web app.



来源:https://stackoverflow.com/questions/37207972/how-to-retrieve-all-contacts-from-microsoft-exchange-using-ews-managed-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!