Nesta página, explicamos como encontrar as mensagens retidas nas quarentenas de admin do Google Workspace usando a API Mail Admin Quarantine.
A API oferece dois métodos no recurso
customers.quarantinedMessages:
- O método
listretorna mensagens em quarentena sem filtragem. Use-o para navegar por tudo o que está em quarentena. - O método
searchrestringe os resultados com um filtro estruturado, uma consulta de pesquisa do Gmail ou ambos. Use-o para fluxos de trabalho de triagem, como recuperar apenas mensagens recebidas que estão aguardando revisão.
Os dois métodos retornam mensagens dos últimos 30 dias e os mesmos metadados básicos para cada mensagem. Para recuperar cabeçalhos, corpo, anexos ou a mensagem bruta, consulte Ver detalhes da mensagem.
Pré-requisitos
- Você concluiu as etapas em Configurar a API.
- Um token de acesso que personifica um administrador com um privilégio de quarentena de administrador e inclui o escopo
https://www.googleapis.com/auth/gmail.admin.quarantineouhttps://www.googleapis.com/auth/gmail.admin.quarantine.readonly. Consulte Autorizar com delegação em todo o domínio.
Listar mensagens em quarentena
Para listar as mensagens em quarentena, envie uma solicitação GET ao método list no recurso customers.quarantinedMessages do seu cliente:
GET https://mailadminquarantine.googleapis.com/v1/customers/CUSTOMER_ID/quarantinedMessages?pageSize=50
Authorization: Bearer ACCESS_TOKEN
Substitua CUSTOMER_ID pelo seu ID de cliente.
O método list aceita os seguintes parâmetros de consulta:
| Parâmetro | Descrição |
|---|---|
pageSize |
O número máximo de mensagens a serem retornadas por página, de 1 a 300. Sempre defina esse parâmetro explicitamente. |
pageToken |
O valor nextPageToken de uma resposta anterior. Use-o para recuperar a próxima página. |
Pesquisar mensagens em quarentena
Para pesquisar mensagens em quarentena, envie uma solicitação POST ao método personalizado :search no recurso customers.quarantinedMessages com um corpo JSON:
POST https://mailadminquarantine.googleapis.com/v1/customers/CUSTOMER_ID/quarantinedMessages:search
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"filter": "status = PENDING_TRIAGE AND direction = INBOUND",
"query": "from:suspicious@example.com",
"pageSize": 50
}
O corpo da solicitação aceita os campos a seguir. Todos os campos são opcionais:
| Campo | Descrição |
|---|---|
filter |
Um filtro estruturado na sintaxe AIP-160. Consulte Sintaxe do filtro. |
query |
Uma consulta de pesquisa no Gmail, como has:attachment ou from:suspicious@example.com. A consulta usa os mesmos operadores da caixa de pesquisa do Gmail. Consulte Operadores de pesquisa que podem ser usados com o Gmail. |
pageSize |
O número máximo de mensagens a serem retornadas por página, de 1 a 300. Sempre defina esse campo explicitamente. |
pageToken |
O valor nextPageToken de uma resposta anterior. |
Quando você define filter e query, a API retorna apenas as mensagens que
correspondem a ambos.
Sintaxe do filtro
O campo filter é compatível com os campos a seguir. Combine-os com o
operador AND. Outros operadores, como OR e NOT, não são compatíveis.
| Campo | Comparações aceitas | Valores |
|---|---|---|
status |
= |
PENDING_TRIAGE, RELEASED ou DENIED. |
direction |
=, != |
INBOUND ou OUTBOUND. |
quarantine_name (ou quarantineName) |
= |
O nome de exibição de uma quarentena, como mostrado no Google Admin Console, por exemplo, "Default". |
Os exemplos a seguir mostram filtros válidos:
status = PENDING_TRIAGE
status = PENDING_TRIAGE AND direction = INBOUND
direction != OUTBOUND AND quarantine_name = "Default"
Um filtro inválido retorna um erro 400 INVALID_ARGUMENT.
Resposta
Os dois métodos retornam uma lista de recursos QuarantinedMessage com metadados básicos, além de um nextPageToken se houver mais resultados disponíveis:
{
"quarantinedMessages": [
{
"name": "customers/01abc23de/quarantinedMessages/user@example.com:18d3ef45a8b2c1d0",
"messageId": "18d3ef45a8b2c1d0",
"messageOwner": "user@example.com",
"quarantines": [
"customers/01abc23de/quarantines/0"
],
"receiveTime": "2026-09-22T10:15:30Z",
"direction": "INBOUND",
"state": "PENDING_TRIAGE",
"retentionExpireTime": "2026-10-22T10:15:30Z",
"triggeredRules": [
{
"policyId": "123",
"ruleId": "456",
"displayName": "Inbound phishing protection"
}
]
}
],
"nextPageToken": "CAESBAgBEA..."
}
| Campo | Descrição |
|---|---|
name |
O nome do recurso da mensagem. Use-o nas chamadas subsequentes de get, release e deny no recurso customers.quarantinedMessages. |
messageId |
O ID imutável da mensagem do Gmail. |
messageOwner |
O endereço de e-mail da caixa de correio que é proprietária da mensagem. |
quarantines |
Os nomes de recursos das quarentenas que contêm a mensagem. Chame o método get do recurso customers.quarantines para receber o nome de exibição de uma quarentena. |
receiveTime |
Quando o Gmail recebeu a mensagem. |
direction |
INBOUND se um usuário recebeu a mensagem ou OUTBOUND se um usuário a enviou. |
state |
PENDING_TRIAGE, RELEASED ou DENIED. |
retentionExpireTime |
Quando a quarentena para de reter a mensagem. |
triggeredRules |
As regras que fizeram a mensagem ser colocada em quarentena. |
unreachable |
Contas em que o serviço não conseguiu recuperar mensagens em quarentena. Se estiver presente, tente fazer a solicitação novamente mais tarde. |
Navegar pelos resultados
Para recuperar todas as mensagens correspondentes:
- Envie a primeira solicitação com um
pageSize. - Se a resposta contiver um
nextPageToken, repita a solicitação com os mesmos parâmetros e definapageTokencomo esse valor. - Interrompa quando a resposta não tiver um
nextPageToken.
O exemplo de Python a seguir mostra todas as mensagens recebidas que estão pendentes de triagem:
import requests
BASE_URL = 'https://mailadminquarantine.googleapis.com/v1'
CUSTOMER_ID = '01abc23de' # Your customer ID without the leading 'C'.
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json',
}
search_url = f'{BASE_URL}/customers/{CUSTOMER_ID}/quarantinedMessages:search'
body = {
'filter': 'status = PENDING_TRIAGE AND direction = INBOUND',
'pageSize': 100,
}
messages = []
while True:
response = requests.post(search_url, headers=headers, json=body)
response.raise_for_status()
result = response.json()
messages.extend(result.get('quarantinedMessages', []))
page_token = result.get('nextPageToken')
if not page_token:
break
body['pageToken'] = page_token
print(f'Found {len(messages)} messages pending triage.')