Compartilhar via


Adicionar capacidades de e-mail a aplicações Java com o Microsoft Graph

s

Neste artigo, vai expandir a aplicação que criou em Criar aplicações Java com o Microsoft Graph com as APIs de correio do Microsoft Graph. Utilize o Microsoft Graph para listar a caixa de entrada do utilizador e enviar um e-mail.

Listar a caixa de entrada do utilizador

Comece por listar mensagens na caixa de entrada do e-mail do utilizador.

  1. Abra Graph.java e adicione a seguinte função à Graph classe .

    public static MessageCollectionResponse getInbox() throws Exception {
        // Ensure client isn't null
        if (_userClient == null) {
            throw new Exception("Graph has not been initialized for user auth");
        }
    
        return _userClient.me()
            .mailFolders()
            .byMailFolderId("inbox")
            .messages()
            .get(requestConfig -> {
                requestConfig.queryParameters.select = new String[] { "from", "isRead", "receivedDateTime", "subject" };
                requestConfig.queryParameters.top = 25;
                requestConfig.queryParameters.orderby = new String[] { "receivedDateTime DESC" };
            });
    }
    
  2. Substitua a função empty listInbox no App.java pelo seguinte.

    private static void listInbox() {
        try {
            final MessageCollectionResponse messages = Graph.getInbox();
    
            // Output each message's details
            for (Message message: messages.getValue()) {
                System.out.println("Message: " + message.getSubject());
                System.out.println("  From: " + message.getFrom().getEmailAddress().getName());
                System.out.println("  Status: " + (message.getIsRead() ? "Read" : "Unread"));
                System.out.println("  Received: " + message.getReceivedDateTime()
                    // Values are returned in UTC, convert to local time zone
                    .atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime()
                    .format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)));
            }
    
            final Boolean moreMessagesAvailable = messages.getOdataNextLink() != null;
            System.out.println("\nMore messages available? " + moreMessagesAvailable);
        } catch (Exception e) {
            System.out.println("Error getting inbox");
            System.out.println(e.getMessage());
        }
    }
    
  3. Execute a aplicação, inicie sessão e selecione a opção 2 para listar a sua caixa de entrada.

    Please choose one of the following options:
    0. Exit
    1. Display access token
    2. List my inbox
    3. Send mail
    4. Make a Graph call
    2
    Message: Updates from Ask HR and other communities
      From: Contoso Demo on Yammer
      Status: Read
      Received: 12/30/2021, 4:54:54 AM
    Message: Employee Initiative Thoughts
      From: Patti Fernandez
      Status: Read
      Received: 12/28/2021, 5:01:10 PM
    Message: Voice Mail (11 seconds)
      From: Alex Wilber
      Status: Unread
      Received: 12/28/2021, 5:00:46 PM
    Message: Our Spring Blog Update
      From: Alex Wilber
      Status: Unread
      Received: 12/28/2021, 4:49:46 PM
    Message: Atlanta Flight Reservation
      From: Alex Wilber
      Status: Unread
      Received: 12/28/2021, 4:35:42 PM
    Message: Atlanta Trip Itinerary - down time
      From: Alex Wilber
      Status: Unread
      Received: 12/28/2021, 4:22:04 PM
    
    ...
    
    More messages available? true
    

getInbox explicado

Considere o código na getInbox função .

Aceder a pastas de correio conhecidas

A função utiliza o _userClient.me().mailFolders().byMailFolderId("inbox").messages() construtor de pedidos, que cria um pedido para a API Listar mensagens . Uma vez que inclui o byMailFolderId("inbox") construtor de pedidos, a API só devolve mensagens na pasta de correio pedida. Neste caso, uma vez que a caixa de entrada é uma pasta predefinida e conhecida dentro da caixa de correio de um utilizador, é acessível através do nome conhecido. As pastas não predefinidas são acedidas da mesma forma ao substituir o nome conhecido pela propriedade ID da pasta de correio. Para obter detalhes sobre os nomes de pastas conhecidos disponíveis, consulte mailFolder resource type (Tipo de recurso mailFolder).

Aceder a uma coleção

Ao contrário da getUser função da secção anterior, que devolve um único objeto, este método devolve uma coleção de mensagens. A maioria das APIs no Microsoft Graph que devolvem uma coleção não devolve todos os resultados disponíveis numa única resposta. Em vez disso, utilizam a paginação para devolver uma parte dos resultados ao fornecer um método para os clientes solicitarem a página seguinte.

Tamanhos de página predefinidos

As APIs que utilizam a paginação implementam um tamanho de página predefinido. Para mensagens, o valor predefinido é 10. Os clientes podem pedir mais (ou menos) através do parâmetro de consulta $top . No getInbox, a adição $top é efetuada com a top propriedade na configuração do pedido.

Observação

O valor definido em top é um limite superior e não um número explícito. A API devolve um número de mensagens até ao valor especificado.

Obter páginas subsequentes

Se existirem mais resultados disponíveis no servidor, as respostas da coleção incluem uma @odata.nextLink propriedade com um URL de API para aceder à página seguinte. A biblioteca de cliente Java fornece o getOdataNextLink método em objetos de resposta de coleção. Se este método devolver não nulo, existem mais resultados disponíveis.

Classificando coleções

A função utiliza a orderBy propriedade na configuração do pedido para pedir resultados ordenados quando a mensagem é recebida (receivedDateTime propriedade). Inclui o DESC palavra-chave para que as mensagens recebidas mais recentemente sejam listadas em primeiro lugar. Esta propriedade adiciona o parâmetro de consulta $orderby à chamada à API.

Enviar email

Agora, adicione a capacidade de enviar uma mensagem de e-mail como o utilizador autenticado.

  1. Abra Graph.java e adicione a seguinte função à Graph classe .

    public static void sendMail(String subject, String body, String recipient) throws Exception {
        // Ensure client isn't null
        if (_userClient == null) {
            throw new Exception("Graph has not been initialized for user auth");
        }
    
        // Create a new message
        final Message message = new Message();
        message.setSubject(subject);
        final ItemBody itemBody = new ItemBody();
        itemBody.setContent(body);
        itemBody.setContentType(BodyType.Text);
        message.setBody(itemBody);
    
        final EmailAddress emailAddress = new EmailAddress();
        emailAddress.setAddress(recipient);
        final Recipient toRecipient = new Recipient();
        toRecipient.setEmailAddress(emailAddress);
        message.setToRecipients(List.of(toRecipient));
    
        final SendMailPostRequestBody postRequest = new SendMailPostRequestBody();
        postRequest.setMessage(message);
    
        // Send the message
        _userClient.me()
            .sendMail()
            .post(postRequest);
    }
    
  2. Substitua a função empty sendMail no App.java pelo seguinte.

    private static void sendMail() {
        try {
            // Send mail to the signed-in user
            // Get the user for their email address
            final User user = Graph.getUser();
            final String email = user.getMail() == null ? user.getUserPrincipalName() : user.getMail();
    
            Graph.sendMail("Testing Microsoft Graph", "Hello world!", email);
            System.out.println("\nMail sent.");
        } catch (Exception e) {
            System.out.println("Error sending mail");
            System.out.println(e.getMessage());
        }
    }
    
  3. Execute a aplicação, inicie sessão e selecione a opção 3 para enviar um e-mail para si próprio.

    Please choose one of the following options:
    0. Exit
    1. Display access token
    2. List my inbox
    3. Send mail
    4. Make a Graph call
    3
    
    Mail sent.
    

    Observação

    Se estiver a testar com um inquilino de programador do Programa para Programadores do Microsoft 365, o e-mail que enviar poderá não ser entregue e poderá receber um relatório não dinâmico. Se quiser desbloquear o envio de correio do seu inquilino, contacte o suporte através do Centro de administração do Microsoft 365.

  4. Para verificar se a mensagem foi recebida, selecione a opção 2 para listar a sua caixa de entrada.

sendMail explicado

Considere o código na sendMail função .

Enviar correio

A função utiliza o _userClient.me().sendMail() construtor de pedidos, que cria um pedido para a API enviar correio . O construtor de pedidos utiliza um SendMailPostRequestBody objeto que contém a mensagem a enviar.

Criar objetos

Ao contrário das chamadas anteriores para o Microsoft Graph que só leem dados, esta chamada cria dados. Para criar itens com a biblioteca de cliente, crie uma instância da classe que representa os dados (neste caso, com.microsoft.graph.models.Message) com o new palavra-chave, defina as propriedades pretendidas e, em seguida, envie-as na chamada à API. Uma vez que a chamada está a enviar dados, o post método é utilizado em vez de get.

Próxima etapa