Cette page explique comment trouver les messages conservés dans vos quarantaines d'administration Google Workspace à l'aide de l'API Mail Admin Quarantine.
L'API propose deux méthodes sur la ressource customers.quarantinedMessages :
- La méthode
listrenvoie les messages mis en quarantaine sans aucun filtrage. Utilisez-le pour parcourir tous les éléments de vos quarantaines. - La méthode
searchaffine les résultats à l'aide d'un filtre structuré, d'une requête de recherche Gmail ou des deux. Utilisez-le pour les workflows de tri, par exemple pour ne récupérer que les messages entrants en attente d'examen.
Les deux méthodes renvoient les messages des 30 derniers jours, ainsi que les mêmes métadonnées de base pour chaque message. Pour récupérer les en-têtes, le corps, les pièces jointes ou le message brut, consultez Obtenir les détails d'un message.
Prérequis
- Vous avez suivi les étapes de la section Configurer l'API.
- Un jeton d'accès qui emprunte l'identité d'un administrateur disposant d'un droit de mise en quarantaine d'administrateur et inclut le champ d'application
https://www.googleapis.com/auth/gmail.admin.quarantineouhttps://www.googleapis.com/auth/gmail.admin.quarantine.readonly. Consultez Autoriser avec la délégation au niveau du domaine.
Lister les messages mis en quarantaine
Pour lister les messages mis en quarantaine, envoyez une requête GET à la méthode list sur la ressource customers.quarantinedMessages de votre client :
GET https://mailadminquarantine.googleapis.com/v1/customers/CUSTOMER_ID/quarantinedMessages?pageSize=50
Authorization: Bearer ACCESS_TOKEN
Remplacez CUSTOMER_ID par votre numéro client.
La méthode list accepte les paramètres de requête suivants :
| Paramètre | Description |
|---|---|
pageSize |
Nombre maximal de messages à renvoyer par page, de 1 à 300. Définissez toujours ce paramètre explicitement. |
pageToken |
Valeur nextPageToken d'une réponse précédente. Utilisez-le pour récupérer la page suivante. |
Rechercher des messages mis en quarantaine
Pour rechercher des messages mis en quarantaine, envoyez une requête POST à la méthode personnalisée :search sur la ressource customers.quarantinedMessages avec un corps 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
}
Le corps de la requête accepte les champs suivants. Tous les champs sont facultatifs :
| Champ | Description |
|---|---|
filter |
Filtre structuré dans la syntaxe AIP-160. Consultez Syntaxe des filtres. |
query |
Requête de recherche Gmail, par exemple has:attachment ou from:suspicious@example.com. La requête utilise les mêmes opérateurs que le champ de recherche Gmail. Consultez Opérateurs de recherche compatibles avec Gmail. |
pageSize |
Nombre maximal de messages à renvoyer par page, de 1 à 300. Définissez toujours ce champ explicitement. |
pageToken |
Valeur nextPageToken d'une réponse précédente. |
Lorsque vous définissez à la fois filter et query, l'API ne renvoie que les messages qui correspondent aux deux.
Syntaxe de filtre
Le champ filter accepte les champs suivants. Combinez-les avec l'opérateur AND. Les autres opérateurs, tels que OR et NOT, ne sont pas compatibles.
| Champ | Comparaisons acceptées | Valeurs |
|---|---|---|
status |
= |
PENDING_TRIAGE, RELEASED ou DENIED. |
direction |
=, != |
INBOUND ou OUTBOUND. |
quarantine_name (ou quarantineName) |
= |
Nom à afficher d'une quarantaine, tel qu'il apparaît dans la console d'administration Google, par exemple "Default". |
Les exemples suivants montrent des filtres valides :
status = PENDING_TRIAGE
status = PENDING_TRIAGE AND direction = INBOUND
direction != OUTBOUND AND quarantine_name = "Default"
Un filtre non valide renvoie une erreur 400 INVALID_ARGUMENT.
Réponse
Les deux méthodes renvoient une liste de ressources QuarantinedMessage avec des métadonnées de base, ainsi qu'un nextPageToken si d'autres résultats sont disponibles :
{
"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..."
}
| Champ | Description |
|---|---|
name |
Nom de ressource du message. Utilisez-le dans les appels get, release et deny suivants sur la ressource customers.quarantinedMessages. |
messageId |
ID de message Gmail immuable. |
messageOwner |
Adresse e-mail de la boîte aux lettres propriétaire du message. |
quarantines |
Noms de ressources des quarantaines qui contiennent le message. Appelez la méthode get de la ressource customers.quarantines pour obtenir le nom à afficher d'une quarantaine. |
receiveTime |
Date et heure de réception du message par Gmail. |
direction |
INBOUND si un utilisateur a reçu le message ou OUTBOUND s'il l'a envoyé. |
state |
PENDING_TRIAGE, RELEASED ou DENIED. |
retentionExpireTime |
Lorsque la quarantaine cesse de conserver le message. |
triggeredRules |
Règles ayant causé la mise en quarantaine du message. |
unreachable |
Comptes pour lesquels le service n'a pas pu récupérer les messages mis en quarantaine. Si elle est présente, réessayez la requête ultérieurement. |
Parcourir les résultats
Pour récupérer tous les messages correspondants :
- Envoyez la première requête avec un
pageSize. - Si la réponse contient un
nextPageToken, répétez la requête avec les mêmes paramètres et définissezpageTokensur cette valeur. - Arrêtez-vous lorsque la réponse ne contient pas de
nextPageToken.
L'exemple Python suivant parcourt tous les messages entrants en attente de tri :
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.')