Compartilhar via


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

Neste artigo, vai expandir a aplicação que criou na compilação de aplicações Python 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. Adicione a seguinte função ao graph.py.

    async def get_inbox(self):
        query_params = MessagesRequestBuilder.MessagesRequestBuilderGetQueryParameters(
            # Only request specific properties
            select=['from', 'isRead', 'receivedDateTime', 'subject'],
            # Get at most 25 results
            top=25,
            # Sort by received time, newest first
            orderby=['receivedDateTime DESC']
        )
        request_config = MessagesRequestBuilder.MessagesRequestBuilderGetRequestConfiguration(
            query_parameters= query_params
        )
    
        messages = await self.user_client.me.mail_folders.by_mail_folder_id('inbox').messages.get(
                request_configuration=request_config)
        return messages
    
  2. Substitua a função empty list_inbox no main.py pelo seguinte.

    async def list_inbox(graph: Graph):
        message_page = await graph.get_inbox()
        if message_page and message_page.value:
            # Output each message's details
            for message in message_page.value:
                print('Message:', message.subject)
                if (
                    message.from_ and
                    message.from_.email_address
                ):
                    print('  From:', message.from_.email_address.name or 'NONE')
                else:
                    print('  From: NONE')
                print('  Status:', 'Read' if message.is_read else 'Unread')
                print('  Received:', message.received_date_time)
    
            # If @odata.nextLink is present
            more_available = message_page.odata_next_link is not None
            print('\nMore messages available?', more_available, '\n')
    
  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: 2022-04-26T19:19:05Z
    Message: Employee Initiative Thoughts
      From: Patti Fernandez
      Status: Read
      Received: 2022-04-25T19:43:57Z
    Message: Voice Mail (11 seconds)
      From: Alex Wilber
      Status: Unread
      Received: 2022-04-22T19:43:23Z
    Message: Our Spring Blog Update
      From: Alex Wilber
      Status: Unread
      Received: 2022-04-19T22:19:02Z
    Message: Atlanta Flight Reservation
      From: Alex Wilber
      Status: Unread
      Received: 2022-04-19T15:15:56Z
    Message: Atlanta Trip Itinerary - down time
      From: Alex Wilber
      Status: Unread
      Received: 2022-04-18T14:24:16Z
    
    ...
    
    More messages available? True
    

get_inbox explicado

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

Aceder a pastas de correio conhecidas

A função cria um pedido para a API Listar mensagens . Uma vez que inclui o mail_folders.by_mail_folder_id('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 get_user 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 get_inbox, a adição $top é efetuada com o top parâmetro no MessagesRequestBuilderGetQueryParameters objeto .

Observação

O valor transmitido $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. O SDK python fornece a odata_next_link propriedade em objetos de página de coleção. Se esta propriedade estiver presente, existem mais resultados disponíveis.

Classificando coleções

A função utiliza o parâmetro de consulta $orderby 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. No get_inbox, a adição $orderby é efetuada com o orderby parâmetro no MessagesRequestBuilderGetQueryParameters objeto .

Enviar email

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

  1. Adicione a seguinte função ao graph.py.

    async def send_mail(self, subject: str, body: str, recipient: str):
        message = Message()
        message.subject = subject
    
        message.body = ItemBody()
        message.body.content_type = BodyType.Text
        message.body.content = body
    
        to_recipient = Recipient()
        to_recipient.email_address = EmailAddress()
        to_recipient.email_address.address = recipient
        message.to_recipients = []
        message.to_recipients.append(to_recipient)
    
        request_body = SendMailPostRequestBody()
        request_body.message = message
    
        await self.user_client.me.send_mail.post(body=request_body)
    
  2. Substitua a função empty send_mail no main.py pelo seguinte.

    async def send_mail(graph: Graph):
        # Send mail to the signed-in user
        # Get the user for their email address
        user = await graph.get_user()
        if user:
            user_email = user.mail or user.user_principal_name
    
            await graph.send_mail('Testing Microsoft Graph', 'Hello world!', user_email or '')
            print('Mail sent.\n')
    
  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.

send_mail explicado

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

Enviar correio

A função utiliza o user_client.me.send_mail construtor de pedidos, que cria um pedido para a API enviar correio .

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 um dicionário que represente o payload do pedido, defina as propriedades pretendidas e, em seguida, envie-o na chamada à API. Uma vez que a chamada está a enviar dados, o post método é utilizado em vez de get.

Próxima etapa