Pour les développeurs · v2.7 · GPLv2
Tout ce qui suit est vérifiable dans le code source. Cette page existe pour que le détail technique n’ait pas à se déduire d’une liste de fonctionnalités, et pour que vous puissiez décider en cinq minutes si tout cela a sa place dans votre stack.
Surface d’intégration
Le chemin d’envoi et le chemin de journalisation sont séparés. La journalisation est un observateur passif de wp_mail(), elle continue donc de fonctionner quel que soit le transport que vous finissez par utiliser, y compris aucun des nôtres.
| Hook | Priorité | Ce qui s’y passe |
|---|---|---|
| wp_mail_from wp_mail_from_name | PHP_INT_MAX | Identité de l’expéditeur, appliquée en dernier pour qu’un thème ou une autre extension ne puisse pas gagner l’arbitrage en silence. |
| phpmailer_init | PHP_INT_MAX | Configuration du transport : hôte, port, chiffrement, authentification, Return-Path. |
| pre_wp_mail | 10 | Court-circuite tout le chemin PHPMailer quand le mailer API SES est sélectionné, et construit le MIME brut à la place. |
| wp_mail | PHP_INT_MAX | Capture le destinataire, l’objet, les en-têtes et le nombre de pièces jointes en mémoire. Rien n’est encore écrit. |
| wp_mail_succeeded wp_mail_failed | défaut, puis 20 | Le logger écrit la ligne, puis le moniteur met ses compteurs à jour. Une seule écriture, une fois le résultat connu. |
| custom_smtp_purge_logs | cron quotidien | Un unique DELETE préparé pour tout ce qui dépasse votre fenêtre de rétention. |
| custom_smtp_alert_check | cron 15 min | Seuils de volume uniquement, et seulement quand les alertes sont actives. Les séries d’échecs, elles, sont comptées en ligne. |
| after_password_reset filtres de notification | plugins_loaded | Interrupteurs facultatifs pour les emails de notification que WordPress envoie à l’administrateur : mot de passe changé, nouveau compte, résultat des mises à jour automatiques, commentaires. Rien n’est coupé par défaut. |
| custom_smtp_skip_log | filtre | À vous. Renvoyez true pour exclure l’envoi courant du journal et des compteurs d’alerte. |
Ce que ça coûte
Autant l’énoncer précisément, parce que la « journalisation des emails » est le genre de fonctionnalité qui se transforme discrètement en incident de performance deux ans plus tard.
date_sent, status, et un index de préfixe sur 100 caractères pour recipient. Ce sont les trois colonnes sur lesquelles l’écran de journal filtre réellement.Les réglages dans wp_options sous forme d’un tableau unique, les journaux dans une table dédiée, les compteurs d’alerte dans les options, les exports CSV diffusés vers le navigateur plutôt qu’écrits sur le disque. Rien n’est écrit dans le répertoire du plugin à l’exécution, un système de fichiers en lecture seule et DISALLOW_FILE_MODS passent donc tous les deux sans histoire.
Amazon SES · API · rôle IAM
Sur ECS Fargate, EC2 ou App Runner, Custom SMTP envoie par l’API SESv2 en utilisant le rôle de la tâche ou de l’instance. Rien n’est collé dans wp-admin, rien n’est écrit en base, rien à faire tourner.
pre_wp_mail et soumet du MIME brut, donc le HTML, les pièces jointes, les CC, les CCI, le Reply-To et les en-têtes personnalisés survivent tous. Les CCI restent cachés.Environnement du conteneur
# mailer choisi pour tout le réseau, aucun réglage par site CUSTOM_SMTP_MAILER_TYPE=ses_api SES_REGION=eu-west-3 SES_FROM_EMAIL=no-reply@example.com SES_CONFIG_SET=transactional # n'importe quel réglage se force de la même façon CUSTOM_SMTP_LOG_RETENTION=90 CUSTOM_SMTP_STORE_CONTENT=0
Tout ce qui vient de l’environnement apparaît en lecture seule dans wp-admin, avec un badge nommant la variable dont il provient. Un administrateur voit ainsi ce que la plateforme contrôle et cesse d’ouvrir des tickets sur des champs qui refusent de s’enregistrer. Les mêmes valeurs peuvent être définies en constantes PHP danswp-config.phpsi vous préférez garder la configuration dans le code plutôt que dans l’environnement.
Multisite
Configurez le réseau une fois et chaque site en hérite. Un site peut surcharger ce que vous l’autorisez à surcharger, et ne peut pas toucher à ce que l’environnement a déjà figé.
La précédence va dans un sens, et un seul : les variables d’environnement et les constantes PHP l’emportent, puis viennent les réglages du réseau, puis les options propres à chaque site. C’est cet ordre qui rend un parc prévisible, parce qu’un administrateur client qui explore son tableau de bord ne peut pas défaire une décision de plateforme.
Le journal, lui, reste par site, ce qui est presque toujours ce que l’on veut : la personne qui le consulte cherche un message, sur un site, envoyé à une personne.
Posture de sécurité
Une extension qui détient des identifiants SMTP et une copie de votre courrier sortant se doit d’être explicite sur la façon dont elle traite les deux.
esc_like() et sont liées, jamais concaténées.Les signalements de sécurité passent par la page du plugin sur WordPress.org plutôt que par un fil de forum public. La fiche du dépôt porte le contact à jour et le journal des versions complet, version par version.
L’étendre
Du trafic transactionnel à haut volume dont vous ne voulez pas dans le journal, ou une classe de messages que vous n’avez pas le droit de conserver, se ramènent au même hook.
Exclure un envoi du journal et des compteurs
// Garder le trafic de la file d'attente hors du journal. add_filter( 'custom_smtp_skip_log', function ( $skip ) { if ( wp_doing_cron() && defined( 'MY_BULK_RUN' ) ) { return true; } return $skip; } );
Le plugin déclare deux abilities pour l’Abilities API de WordPress, pour qu’un agent ou un outil d’orchestration puisse vérifier le chemin du courrier sans scraper wp-admin : custom-smtp/connection-health etcustom-smtp/send-test-email. Les deux respectent les mêmes contrôles de capacité que les écrans d’administration.
Domaine de texte custom-smtp, français et anglais livrés intégralement, y compris les messages d’erreur SMTP traduits, c’est-à-dire justement la partie qui reste d’habitude en anglais et qui compte le plus pour la personne qui la lit.
Compatibilité
Testé contre le WordPress courant, et écrit pour la version de PHP sur laquelle votre plus vieux client est encore.
| Prérequis | Pris en charge | Notes |
|---|---|---|
| WordPress | 6.0 à 7.0 | Utilise la gestion Envelope-From et Return-Path de WP 6.9 quand elle est disponible. |
| PHP | 7.4 et plus | Propriétés et types de retour typés, aucune syntaxe réservée à PHP 8. |
| PHPMailer | 7.0.2 | Configuré sur phpmailer_init, jamais remplacé ni embarqué. |
| Multisite | oui | Réglages réseau avec surcharges par site. |
| Fichiers en lecture seule | oui | Rien n’est écrit en dehors de la base. Exports en flux. |
| Cache objet | oui | Les réglages sont lus une fois par requête et gardés en mémoire. |
| OpenSSL | requis | Uniquement pour chiffrer les mots de passe stockés au repos. |
La page de présentation couvre ce que fait le plugin sans rien de tout ceci. C’est celle que l’on envoie à un client qui demande ce que vous venez d’installer sur son site.
C’est du GPLv2 sur le dépôt WordPress.org : le code est à un téléchargement d’ici, et il n’y a aucun compte entre vous et lui.