Recherche dans le journal des courriels

OCI Email Delivery s'intègre au service de journalisation OCI pour fournir des journaux d'activité détaillés. Les journaux sont associés à chaque domaine d'envoi de courriel (domaine de courriel) et doivent être activés. Nous recommandons fortement d'activer les journaux de transmission de messages pour suivre les soumissions, les activités de relais et les événements post-livraison tels que les plaintes liées à des pourriels, les désabonnements, les ouvertures et les clics.

Pour activer et accéder aux journaux de transmission de messages :
  1. Configurez des politiques de journalisation pour que votre location puisse gérer, écrire et accéder aux journaux.
  2. Pour activer la journalisation pour tous les domaines ou pour les domaines sélectionnés, utilisez le tableau de bord sur la possibilité d'envoi. Pour activer un seul domaine, ouvrez sa page de détails, sélectionnez le menu de la barre latérale Journaux et activez une ou les deux options : Journalisation Sortie acceptée et Sortie relayée.
  3. Après avoir activé la journalisation pour un domaine, vous pouvez parcourir et rechercher les journaux d'activité à l'aide de la page Recherche de journaux de la console Web OCI.

Types de journal du service de transmission de messages

Le service de journalisation OCI assure le suivi de toutes les activités sur les interfaces telles que la console Web, l'API et l'interface de ligne de commande. Outre les journaux de vérification par défaut, le service de transmission de messages fournit deux types de journal pour l'activité d'envoi :

  • OutboundAccepted : Enregistre l'activité de soumission de courriels entrants (réussite ou échec).
    • Soumissions réussies (acceptées par le service de transmission de messages)
    • Accepté mais supprimé, car le destinataire figure sur la liste de suppression
    • Destinataire ou expéditeur non valide (y compris les expéditeurs qui ne figurent pas dans la liste des expéditeurs approuvés)
  • OutboundRelayed : Suivi de la livraison sortante et de l'engagement de l'utilisateur.
    • Livraisons réussies
    • rebonds, plaintes liées à des pourriels et désabonnements
    • Ouvre et clique

Vous pouvez activer un ou les deux types de journal pour chaque domaine de courriel, au besoin.

Filtres et événements de journal de domaine de courriel communs

Le tableau suivant résume les événements de journal et les filtres typiques. Pour des enregistrements détaillés, voir Détails de journalisation pour le service de transmission de messages.

Événement Type de journal Filtre(s) de journal (supposer ET pour plusieurs) Notes
Courriel accepté pour transmission par courriel OCI OutboundAccepted data.action = 'accept'
Courriel rejeté ou bloqué (destinataire sur la liste d'exclusion) OutboundAccepted data.action = 'accept' et data.errorType = 'Recipient suppressed' Le champ data.smtpStatus contient le motif formel
Courriel remis au fournisseur de destinataires OutboundRelayed data.action = 'relay'
Courriels reportés pour une valeur d'en-tête personnalisée spécifique OutboundRelayed data.action = 'relay' et data.headers."x-campaignid" = '999' Utiliser des guillemets doubles pour les noms d'en-tête personnalisés avec des caractères non alphanumériques
Courriel transmis (problème de livraison : destinataire inconnu, pourriel, etc.) OutboundRelayed data.action = 'bounce' Filtre supplémentaire avec data.errorType (hard ou soft). Voir les champs supplémentaires : data.bounceCategory, data.bounceCode, data.smtpStatus, data.message
Le destinataire a enregistré une plainte de pourriel OutboundRelayed data.action = 'complaint'
Destinataire ouvert un courriel OutboundRelayed data.action = 'open'

Le champ supplémentaire peut contenir des informations sur le client de messagerie et le système d'exploitation du destinataire :

data.userAgent
S'ouvre pour une valeur d'en-tête personnalisée spécifique OutboundRelayed data.action = 'open' et data.headers.region = 'Northeast'
Le destinataire a cliqué sur un lien dans un courriel OutboundRelayed data.action = 'click'

Recherche dans les journaux du service de transmission de messages

Vous pouvez rechercher des journaux d'activité détaillés du service de transmission de messages à l'aide du langage d'interrogation du service de journalisation, comme vous utilisez les mesures OCI. Au lieu d'accéder simplement au nombre d'activités préagrégées, les interrogations de journal vous aident à définir la portée et à filtrer les résultats de recherche.

Par exemple, l'interrogation suivante recherche tous les journaux du service de transmission de messages pour chaque domaine d'un compartiment spécifié (à l'aide de l'OCID du compartiment) et retourne toutes les soumissions de courriel, les livraisons sortantes et les activités connexes. Les résultats sont triés par date, les entrées les plus récentes étant listées en premier :

search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq"
| type='com.oraclecloud.emaildelivery.emaildomain.outbound*'
| sort by datetime desc

Vous pouvez affiner votre recherche en utilisant des filtres supplémentaires. Voici quelques exemples :

Données requises Filtre de recherche
Nombre de courriels acceptés pour une valeur d'en-tête personnalisé donnée
search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq/Default_Group/mydomain_com_outboundaccepted"
| data.action = 'accept' and data.headers.region = 'Europe'
| count
Soumissions en échec pour le domaine d'expéditeur mycompany.com (peu importe le motif)
search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq/Default_Group/mydomain_com_outboundaccepted" 
| data.errorType!='' and source='mycompany.com'
| sort by datetime desc

Le champ errorType n'apparaît que pour les soumissions ayant échoué et n'est pas présent pour les soumissions réussies. Toutes les candidatures ayant échoué sont enregistrées dans le journal OutboundAccepted. Pour effectuer une recherche dans plusieurs domaines, utilisez uniquement l'OCID du compartiment et appliquez la même clause de filtrage.

Soumissions supprimées dans tous les domaines d'expéditeur
search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq" 
| data.errorType='Recipient suppressed' 
| sort by datetime desc

Cette interrogation vous aide à identifier les soumissions de courriel bloquées ou supprimées, car le destinataire figure sur la liste de suppression. Supprimez ces destinataires de vos listes de diffusion ou mettez à jour leurs informations au besoin.

Courriel relayé avec succès (c'est-à-dire accepté par le fournisseur de courriel du destinataire pour la livraison), éventuellement par le domaine d'envoi
search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq" 
| data.action='relay' 
| sort by datetime desc

Cette interrogation affiche tous les courriels relayés avec succès pour chaque domaine d'envoi dans le compartiment spécifié. Pour afficher les résultats uniquement pour le domaine d'envoi mycompany.com, ajoutez le champ source à votre filtre :

search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq/Default_Group/mycompany_com_outboundrelayed" 
| data.action='relay' and source='mycompany.com' 
| sort by datetime desc

Vous pouvez filtrer par champ source pour rechercher un domaine d'envoi spécifique sans spécifier le groupe de journaux et le nom de journal dans la clause de recherche. Toutefois, lorsque vous avez plusieurs domaines d'envoi, la recherche dans un journal spécifique, comme illustré ici, est généralement plus rapide et plus efficace.

Non-transmissions de courriel pour un fournisseur de courriels de destinataire particulier, triées par type de non-transmissions définitives ou temporaires
search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq/Default_Group/mycompany_com_outboundrelayed" 
| data.action='bounce' and data.receivingDomain='hotmail.com' 
| sort by data.errorType
Toutes les non-transmissions définitives dans tous les domaines d'envoi
search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq" 
|   data.action='bounce' and data.errorType='hard' 
| sort by datetime desc
Nombre d'ouvertures pour une valeur d'en-tête personnalisée donnée
search "ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq" 
|   data.action='open' and data.headers."x-subscriberid"='83725371' 
| count

Recherche dans les journaux du service de transmission de messages à l'aide de l'API

OCI fournit des trousses SDK dans plusieurs principaux langages de programmation, notamment des méthodes de trousse SDK pour chaque service. Pour effectuer des recherches dans les journaux par programmation, utilisez la méthode SearchLogs de l'API de journalisation OCI. Cette méthode accepte un intervalle de dates et d'heures et un objet d'interrogation qui utilise la même syntaxe que la console Web. Vous pouvez également spécifier quelques champs facultatifs.

Note

Les API de liste telles que SearchLogs retournent un nombre maximal d'enregistrements par défaut par demande. Si la réponse contient le nombre maximal d'enregistrements, elle inclut un champ opc-next-page. Pour extraire d'autres enregistrements, envoyez la même demande avec la valeur opc-next-page dans le paramètre page. Vous pouvez également augmenter le nombre d'enregistrements par page en définissant le paramètre limit. Pour plus de détails, voir Pagination de liste d'API OCI.

Pour plus d'exemples, voir la page Utilisation de l'API de journalisation OCI. Voici quelques recherches réelles dans les journaux du service de transmission de messages en Python :

Données requises Exemple de code (Python)
Avis de non-livraison pendant une période de trois jours, envoyés par les expéditeurs mycompany.com
import oci
from datetime import datetime
config = oci.config.from_file()
loggingsearch_client = oci.loggingsearch.LogSearchClient(config)
search_logs_response = loggingsearch_client.search_logs(search_logs_details=oci.loggingsearch.models.SearchLogsDetails(time_start=datetime.strptime("2023-03-01T00:00:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), time_end=datetime.strptime("2023-03-04T00:00:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), search_query="search \"ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq/Default_Group/mycompany_com_outboundrelayed\" | where data.action='bounce'", is_return_field_info=False))
print(search_logs_response.data)
Les courriels ont été relayés pour tous les domaines d'envoi d'un compartiment sur une période d'une heure
import oci
from datetime import datetime
config = oci.config.from_file()
loggingsearch_client = oci.loggingsearch.LogSearchClient(config)
search_logs_response = loggingsearch_client.search_logs(search_logs_details=oci.loggingsearch.models.SearchLogsDetails(time_start=datetime.strptime("2023-03-03T08:55:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), time_end=datetime.strptime("2023-03-03T09:55:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), search_query="search \"ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq\" | where data.action='relay'", is_return_field_info=False))
print(search_logs_response.data)
Tous les destinataires Gmail et Comcast ont été relayés avec succès pendant une période de 24 heures
import oci
from datetime import datetime
config = oci.config.from_file()
loggingsearch_client = oci.loggingsearch.LogSearchClient(config)
search_logs_response = loggingsearch_client.search_logs(search_logs_details=oci.loggingsearch.models.SearchLogsDetails(time_start=datetime.strptime("2023-03-03T08:55:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), time_end=datetime.strptime("2023-03-03T09:55:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), search_query="search \"ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq\" | where data.action='relay' and (data.receivingDomain='gmail.com' or data.receivingDomain='comcast.net') | sort by datetime DESC", is_return_field_info=False))
print(search_logs_response.data)
Nombre de courriels transmis par domaine de destinataire pour une valeur d'en-tête personnalisée donnée
import oci
from datetime import datetime
config = oci.config.from_file()
loggingsearch_client = oci.loggingsearch.LogSearchClient(config)

search_logs_response = loggingsearch_client.search_logs(search_logs_details=oci.loggingsearch.models.SearchLogsDetails(time_start=datetime.strptime("2023-05-12T17:30:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), time_end=datetime.strptime("2023-05-12T18:00:00.000Z", "%Y-%m-%dT%H:%M:%S.%fZ"), search_query="search \"ocid1.compartment.oc1..aaaaaaaawqhwudf3pag5gohpzslu7tn4rl2d32bufkgmfzzr4wq7aznylpeq\" | data.action = 'relay' and data.headers.\"x-campaignid\" = '999' | summarize count(data.receivingDomain) as Count by data.receivingDomain as RecipientDomain", is_return_field_info=False))

print(search_logs_response.data)

Result:

{
    "fields": null,
    "results": [
        {
            "data": {
            "Count": 2,
            "RecipientDomain": "gmail.com"
           }
        },
        {
            "data": {
            "Count": 1,
            "RecipientDomain": "yahoo.com"
           }
        }
    ],
      "summary": {
        "field_count": null,
        "result_count": 2
    }
}