Ir para o conteúdo

Usando atributos e filtros de e-mail

Conforme mostrado anteriormente na seção buscando mensagens de e-mail, podemos usar diferentes atributos em um filtro ao buscar por alguns e-mails.

Utilizando a API do Microsoft Graph, os filtros são baseados no Open Data Protocol (OData). A string de filtro nos permite basicamente criar filtros avançados combinando diferentes atributos e operações.

Nos exemplos abaixo mostraremos algumas formas de como criar filtros avançados e também algumas comparações ao utilizar direto uma string de filtro baseada no OData.

Construindo uma string de filtro

No geral, a string de filtro é complexa e pode ficar confusa dependendo das operações a serem realizadas. Com base nisso, através do plugin é possível criar filtros de uma maneira mais simplificada através da classe Query. Dessa forma, conseguimos criar as mesmas strings de filtro porém de uma forma mais facilitada e intuitiva.

Para começarmos a construir a string de filtro, vamos utilizar a própria instância do plugin do Outlook.

Através do método new_query_filter vamos obter o objeto Query que será utilizado como base na construção de um novo filtro.

outlook = MS365OutlookPlugin(service_account=service)

# Criando um novo filtro através do objeto Query
query_filter = outlook.new_query_filter()

# Filtro utilizando o assunto do email
query_filter.on_attribute("subject").equals("Test Message")

Utilizando atributos da mensagem

Basicamente, esse objeto Query nos permite definir o atributo que pretendemos utilizar no filtro, em seguida podemos definir a operação que será feita considerando esse atributo.

Podemos por exemplo procurar por um e-mail que tenha um assunto específico, ou que contenha um determinado conteúdo no assunto.

# Filtro para buscar todos os emails que tenham como assunto "Test Message"
query_filter.on_attribute("subject").equals("Test Message")

# Filtro para buscar todos os emails que contenham "Test" no assunto
query_filter.on_attribute("subject").contains("Test")

# Filtro considerando apenas o endereço que enviou o email
query_filter.on_attribute("from").equals("test@email.com")

Utilizando múltiplos atributos no filtro

Além de usar atributos individualmente, também é possível combinar vários atributos na mesma sequência de filtros.

Basicamente, isso seria equivalente a uma operação AND. Somente mensagens que correspondem a todos os filtros serão retornadas.

# Filtra apenas mensagens que correspondem a todos esses atributos:
#
# "Test Message" como assunto
# Enviado por: test@email.com
query_filter = outlook.new_query_filter()

query_filter.on_attribute("subject").equals("Test Message").on_attribute("from").equals("test@email.com")

Também é possível fazer operações OR, para filtrar mensagens por um atributo ou outro. Nesse caso, basta utilizar o método chain indicando o operador OR.

# Filtra apenas mensagens que correspondem a um desses atributos:
# 
# "Filter this message" como assunto
#  OR
# "Message to filter" como assunto
query_filter = outlook.new_query_filter()

query_filter.on_attribute("subject").equals("Filter this message").chain("or").\
             on_attribute("subject").equals("Message to filter")

Utilizando a string de filtro ao buscar as mensagens

Após construir a string de filtro, basta utilizá-la como parâmetro do método search_messages.

outlook = MS365OutlookPlugin(service_account=service)

# Criando um novo filtro através do objeto Query
query_filter = outlook.new_query_filter()

# Filtro utilizando o assunto do email
query_filter.on_attribute("subject").equals("Test Message")

# Buscando todos os emails que tenham como assunto "Test Message"
messages = outlook.search_messages(criteria=query_filter)

# Esse mesmo filtro também poderia ser escrito dessa forma (OData)
messages = outlook.search_messages(criteria="subject eq 'Test Message'")

Comparando as strings de filtro

Em um primeiro momento pode parecer que as strings no formato OData não são tão confusas.

Porém, dependendo da complexidade e da quantidade de operações necessárias no filtro, a construção da string dessa forma pode ficar inviável.

Nos exemplos abaixo são exibidos alguns filtros criados utilizando o guia acima, e a versão da string OData equivalente.

Dica

Se você já utiliza ou tem familiaridade com o padrão Open Data Protocol (OData), pode continuar construindo as strings de filtro dessa maneira sem nenhum problema.

O método search_messages também suporta a string de filtro nesse modelo, desde que a sintaxe esteja correta.

A classe Query é somente um facilitador e uma forma mais prática na hora de criar filtros para buscar por mensagens específicas.

  • Filtro utilizando o assunto do e-mail
query_filter.on_attribute("subject").equals("Test Message")
"subject eq 'Test Message'"
  • Filtro utilizando o endereço que enviou o e-mail
query_filter.on_attribute("from").equals("test@email.com")
"from/emailAddress/address eq 'test@email.com'"
  • Filtro utilizando múltiplos atributos do e-mail
query_filter.on_attribute("subject").equals("Test Message").on_attribute("from").equals("test@email.com")
"subject eq 'Test Message' and from/emailAddress/address eq 'test@email.com'"
  • Filtro realizando uma operação de 'OR'
query_filter.on_attribute("subject").equals("Filter this message").chain("or").\
             on_attribute("subject").equals("Message to filter")
"subject eq 'Filter this message' or subject eq 'Message to filter'"
  • Filtros utilizando a data de criação do e-mail

Dica

Utilizando o atributo created_date_time você pode realizar diversas operações utilizando uma data específica como base.

É possível criar um filtro para buscar e-mails que foram recebidos nessa data, assim como em uma data maior ou menor do que essa.

from datetime import datetime
...

# Buscando e-mails recebidos na data 26/04/2023
query_filter.on_attribute('created_date_time').equals(datetime(2023, 4, 26))

# Buscando e-mails com a data maior ou igual do que 26/04/2023
query_filter.on_attribute('created_date_time').greater_equal(datetime(2023, 4, 26))

# Buscando e-mails com a data menor ou igual do que 26/04/2023
query_filter.on_attribute('created_date_time').less_equal(datetime(2023, 4, 26))
# Buscando e-mails recebidos na data 26/04/2023
"createdDateTime eq 2023-04-26T03:00:00+00:00"

# Buscando e-mails com a data maior ou igual do que 26/04/2023
"createdDateTime ge 2023-04-26T03:00:00+00:00"

# Buscando e-mails com a data menor ou igual do que 26/04/2023
"createdDateTime le 2023-04-26T03:00:00+00:00"

Tabela de atributos

Veja na tabela abaixo os atributos mais comuns que podem ser utilizados na construção dos filtros através do objeto Query.

Atributo Descrição Tipo de valor
subject o assunto do e-mail str
from o endereço do remetente do e-mail str
created_date_time a data de recebimento do e-mail date
body contém o texto no corpo do e-mail str
isRead o e-mail possui a flag "lido" ou não bool