Acessar um calendário como um delegado usando o EWS no Exchange
Saiba como acessar um calendário como um delegado usando a API Gerenciada do EWS ou o EWS no Exchange.
Você pode usar a API Gerenciada do EWS ou o EWS para dar a um usuário acesso delegado à pasta Calendário de um proprietário de caixa de correio. Em seguida, o representante pode criar solicitações de reunião em nome do proprietário da caixa de correio, criar compromissos, responder a solicitações de reunião e recuperar, atualizar e excluir reuniões da pasta Calendário do proprietário da caixa de correio, dependendo de suas permissões.
Como representante, você usa os mesmos métodos e operações para acessar a pasta Calendário de um proprietário de caixa de correio que você usa para acessar sua própria pasta Calendário. A principal diferença é que você precisa usar acesso explicito para localizar ou criar um item de calendário ou uma subpasta de calendário, e depois de identificar a ID do item ou a ID da pasta, você pode usar acesso implícito para obter, atualizar ou excluir o item.
Tabela 1. Métodos de API Gerenciada do EWS e operações EWS para acessar um calendário como delegado
Se você quiser... | Use este método de API Gerenciada do EWS… | Use esta operação do EWS… |
---|---|---|
Criar uma reunião ou compromisso como representante |
Appointment.Save onde o parâmetro FolderId fornece acesso explícito à pasta Calendário do proprietário da caixa de correio |
CreateItem em que o elemento Mailbox especifica o EmailAddress do proprietário da caixa de correio |
Criar várias reuniões ou compromissos como representante |
ExchangeService.CreateItems em que o parâmetro FolderId fornece acesso explícito à pasta Calendário do proprietário da caixa de correio |
CreateItem em que o elemento Mailbox especifica o EmailAddress do proprietário da caixa de correio |
Pesquise ou localize um compromisso ou reunião como representante |
ExchangeService.FindItems em que o parâmetro FolderId fornece acesso explícito à pasta Calendário do proprietário da caixa de correio |
FindItem em que o elemento Caixa de Correio especifica o EmailAddress do proprietário da caixa de correio |
Obter um compromisso ou reunião como representante |
Appointment.Bind |
GetItem |
Atualizar um compromisso ou reunião como representante |
Appointment.Bind seguido por Appointment.Update |
GetItem seguido por UpdateItem |
Excluir um compromisso ou reunião como representante |
Appointment.Bind seguido por Appointment.Delete |
GetItem seguido por DeleteItem |
Observação
Nos exemplos de código deste artigo, primary@contoso.com está o proprietário da caixa de correio.
Tarefas de pré-requisito
Antes que um usuário possa acessar a pasta Calendário de um proprietário de caixa de correio como representante, o usuário deve estar adicionado como um delegado com permissões para a pasta Calendário do proprietário da caixa de correio.
Um representante deve ter uma caixa de correio anexada à conta para atualizar o calendário de um proprietário de caixa de correio.
Se um representante precisar trabalhar apenas com solicitações de reunião e respostas, você poderá adicionar o representante à pasta Calendário, e use o valor de enumeração da API Gerenciada do EWS MeetingRequestsDeliveryScope.DelegatesAndSendInformationToMe padrão ou o valor do elemento EWS DeliverMeetingRequests de DelegatesAndSendInformationToMe para enviar as solicitações para o representante e mensagens informativas para o proprietário da caixa de correio. Em seguida, o delegado não precisa ter acesso à pasta caixa de entrada do proprietário da caixa de correio.
Criar uma reunião ou compromisso como representante usando a API Gerenciada do EWS
A API Gerenciada do EWS permite que você use o objeto de serviço do usuário delegado para criar itens de calendário para o proprietário da caixa de correio. Este exemplo mostra como usar o método Salvar para criar uma reunião e enviar solicitações de reunião aos participantes.
Este exemplo pressupõe que serviço é um objeto válido ExchangeService para o representante e que o representante recebeu as permissões apropriadas para a pasta Calendário do proprietário da caixa de correio.
private static void DelegateAccessCreateMeeting(ExchangeService service)
{
Appointment meeting = new Appointment(service);
// Set the properties on the meeting object to create the meeting.
meeting.Subject = "Team building exercise";
meeting.Body = "Let's learn to really work as a team and then have lunch!";
meeting.Start = DateTime.Now.AddDays(2);
meeting.End = meeting.Start.AddHours(4);
meeting.Location = "Conference Room 12";
meeting.RequiredAttendees.Add("sadie@contoso.com");
meeting.ReminderMinutesBeforeStart = 60;
// Save the meeting to the Calendar folder for
// the mailbox owner and send the meeting request.
// This method call results in a CreateItem call to EWS.
meeting.Save(new FolderId(WellKnownFolderName.Calendar,
"primary@contoso.com"),
SendInvitationsMode.SendToAllAndSaveCopy);
// Verify that the meeting was created.
Item item = Item.Bind(service, meeting.Id, new PropertySet(ItemSchema.Subject));
Console.WriteLine("\nMeeting created: " + item.Subject + "\n");
}
Observe que, quando você salva o item, a chamada de método Salvar deve identificar a pasta Calendário do proprietário da caixa de correio. Se a pasta Calendário do proprietário da caixa de correio não for especificada, a solicitação de reunião será salva no calendário do representante e não na pasta Calendário do proprietário da caixa de correio. Você pode incluir a pasta Calendário do proprietário da caixa de correio na chamada de método Salvar de duas maneiras. Recomendamos que você crie uma instância do objeto FolderId usando o WellKnownFolderName e o endereço SMTP do proprietário da caixa de correio.
meeting.Save(new FolderId(WellKnownFolderName.Calendar,
"primary@contoso.com"), SendInvitationsMode.SendToAllAndSaveCopy);
No entanto, você também pode Associar à pasta Calendário primeiro e, em seguida, usar a ID da pasta na chamada de método Salvar. No entanto, lembre-se de que isso cria uma chamada EWS extra.
// Identify the mailbox owner's SMTP address
// and bind to their Calendar folder.
Mailbox primary = new Mailbox("primary@contoso.com");
Folder primaryCalendar = Folder.Bind(service,
new FolderId(WellKnownFolderName.Calendar, primary));
…
// Save the meeting to the Calendar folder for the mailbox owner and send the meeting request.
meeting.Save(primaryCalendar.Id,
SendInvitationsMode.SendToAllAndSaveCopy);
Criar uma reunião ou compromisso como representante usando o EWS
O EWS permite que você use o objeto de serviço para o usuário delegado criar itens de calendário para o proprietário da caixa de correio. Este exemplo mostra como usar a operação CreateItem para criar uma reunião e enviar solicitações de reunião aos participantes.
Essa também é a solicitação XML que a API Gerenciada do EWS envia quando você usa o método Salvar para criar uma reunião ou compromisso como representante.
O cabeçalho SOAP foi removido do exemplo a seguir para fins de brevidade.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
…
<soap:Body>
<m:CreateItem SendMeetingInvitations="SendToAllAndSaveCopy">
<m:SavedItemFolderId>
<t:DistinguishedFolderId Id="calendar">
<t:Mailbox>
<t:EmailAddress>primary@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:DistinguishedFolderId>
</m:SavedItemFolderId>
<m:Items>
<t:CalendarItem>
<t:Subject>Team building exercise</t:Subject>
<t:Body BodyType="HTML">Let's learn to really work as a
team and then have lunch!</t:Body>
<t:ReminderMinutesBeforeStart>60</t:ReminderMinutesBeforeStart>
<t:Start>2014-03-09T23:26:33.756-05:00</t:Start>
<t:End>2014-03-10T03:26:33.756-05:00</t:End>
<t:Location>Conference Room 12</t:Location>
<t:RequiredAttendees>
<t:Attendee>
<t:Mailbox>
<t:EmailAddress>sadie@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:Attendee>
</t:RequiredAttendees>
</t:CalendarItem>
</m:Items>
</m:CreateItem>
</soap:Body>
</soap:Envelope>
O servidor responde à solicitação CreateItem com uma mensagem CreateItemResponse que inclui um valor de elemento ResponseCode de NoError, que indica que a reunião foi criada com êxito. A resposta também contém a ID do item da reunião recém-criada.
Pesquisar uma reunião ou compromisso como representante usando a API Gerenciada do EWS
Para pesquisar uma reunião, você deve usar um dos métodos ExchangeService.FindItems que inclui um parâmetro FolderId para que você possa especificar a pasta Calendário do proprietário da caixa de correio.
static void DelegateAccessSearchWithFilter
(ExchangeService service, SearchFilter filter)
{
// Limit the result set to 10 items.
ItemView view = new ItemView(10);
view.PropertySet = new PropertySet(ItemSchema.Subject,
ItemSchema.DateTimeReceived,
EmailMessageSchema.IsRead);
// Item searches do not support deep traversal.
view.Traversal = ItemTraversal.Shallow;
// Define the sort order.
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
try
{
// Call FindItems to find matching calendar items.
// The FindItems parameters must denote the mailbox owner,
// mailbox, and Calendar folder.
// This method call results in a FindItem call to EWS.
FindItemsResults<Item> results = service.FindItems(
new FolderId(WellKnownFolderName.Calendar,
"primary@contoso.com"),
filter,
view);
foreach (Item item in results.Items)
{
Console.WriteLine("Subject: {0}", item.Subject);
Console.WriteLine("Id: {0}", item.Id.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine("Exception while
enumerating results: {0}", ex.Message);
}
}
Depois que chamada FindItems retornar uma resposta com uma ID, você poderá obter, atualizar ou excluir essa reunião usando o ID e acesso implícito e você não precisa especificar o endereço SMTP do proprietário da caixa de correio.
Pesquisar uma reunião ou compromisso como representante usando o EWS
O EWS permite que você use o objeto de serviço para que o usuário delegado pesquise compromissos e reuniões que atendam a um conjunto de critérios de pesquisa. Este exemplo mostra como usar a operação FindItem para localizar reuniões na pasta Calendário do proprietário da caixa de correio que contém a palavra "compilando" no assunto.
Essa também é a solicitação XML que a API Gerenciada do EWS envia quando você usa o método FindItem para buscar uma reunião ou compromisso como representante.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
</soap:Header>
<soap:Body>
<m:FindItem Traversal="Shallow">
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:Subject" />
<t:FieldURI FieldURI="item:DateTimeReceived" />
<t:FieldURI FieldURI="message:IsRead" />
</t:AdditionalProperties>
</m:ItemShape>
<m:IndexedPageItemView MaxEntriesReturned="10"
Offset="0"
BasePoint="Beginning" />
<m:Restriction>
<t:Contains ContainmentMode="Substring"
ContainmentComparison="IgnoreCase">
<t:FieldURI FieldURI="item:Subject" />
<t:Constant Value="building" />
</t:Contains>
</m:Restriction>
<m:SortOrder>
<t:FieldOrder Order="Descending">
<t:FieldURI FieldURI="item:DateTimeReceived" />
</t:FieldOrder>
</m:SortOrder>
<m:ParentFolderIds>
<t:DistinguishedFolderId Id="calendar">
<t:Mailbox>
<t:EmailAddress>primary@contoso.com</t:EmailAddress>
</t:Mailbox>
</t:DistinguishedFolderId>
</m:ParentFolderIds>
</m:FindItem>
</soap:Body>
</soap:Envelope>
O servidor responde à solicitação FindItem com uma FindItemResponse mensagem que inclui um valor de elemento ResponseCode de NoError, que indica que a pesquisa foi concluída com êxito. A resposta contém um CalendarItem para todos os compromissos ou reuniões que atenderam aos critérios de pesquisa. Nesse caso, apenas uma reunião é encontrada.
O valor do elemento ItemId foi reduzido para legibilidade.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="893"
MinorBuildNumber="10"
Version="V2_10"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body>
<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder IndexedPagingOffset="1"
TotalItemsInView="1"
IncludesLastItemInRange="true">
<t:Items>
<t:CalendarItem>
<t:ItemId Id="IJpUAAA="
ChangeKey="DwAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAAAIKhS" />
<t:Subject>Team building exercise</t:Subject>
<t:DateTimeReceived>2014-03-04T21:27:22Z</t:DateTimeReceived>
</t:CalendarItem>
</t:Items>
</m:RootFolder>
</m:FindItemResponseMessage>
</m:ResponseMessages>
</m:FindItemResponse>
</s:Body>
</s:Envelope>
Agora que você tem itemId para a reunião que atende aos seus critérios, você pode obter, atualizar ou excluir essa reunião usando o itemId e de acesso implícito e não precisa especificar o endereço SMTP do proprietário da caixa de correio.
Obter, atualizar ou excluir itens de calendário como um delegado usando a API Gerenciada do EWS
Você pode usar a API Gerenciada do EWS para obter, atualizar ou excluir uma reunião ou compromisso da mesma maneira que executa essas ações quando não estiver usando o acesso de representante. A única diferença é que o objeto de serviço é para o usuário delegado. A ID do item incluída na chamada de método Bind identifica exclusivamente o item no repositório de caixas de correio, na pasta Calendário do proprietário da caixa de correio.
Tabela 2. Métodos de API Gerenciada do EWS para trabalhar com compromissos e reuniões como delegado
Tarefa | Método da API Gerenciada do EWS | Exemplo de código |
---|---|---|
Obter um compromisso ou uma reunião |
Vincular |
Gerenciar um item usando a API Gerenciada do EWS |
Atualizar um compromisso ou uma reunião |
Bind seguido por Update |
Atualizar uma reunião usando a API Gerenciada do EWS |
Excluir um compromisso ou uma reunião |
Bind seguido por Delete |
Excluir uma reunião usando a API Gerenciada do EWS |
Obter, atualizar ou excluir itens de calendário como um delegado usando o EWS
Você pode usar o EWS para obter, atualizar ou excluir uma reunião ou compromisso da mesma maneira que executa essas ações quando não estiver usando o acesso de representante. A única diferença é que o objeto de serviço é para o usuário delegado. A ID do item incluída na chamada de método GetItem identifica exclusivamente o item no repositório de caixas de correio, na pasta Calendário do proprietário da caixa de correio.
Tabela 3. Operações EWS para trabalhar com compromissos e reuniões como delegado
Tarefa | Operação do EWS | Exemplo de código |
---|---|---|
Obter um compromisso ou uma reunião |
GetItem |
Get um item usando EWS |
Atualizar um compromisso ou uma reunião |
GetItem seguido por UpdateItem |
Atualizar uma pasta usando o EWS |
Excluir um compromisso ou uma reunião |
GetItem seguido por DeleteItem |
Excluir uma reunião usando o EWS |