Tests et CI
Des tests d’inscription qui attendent le vrai e-mail.
Vos tests de bout en bout s’inscrivent comme un vrai utilisateur, puis obtiennent le code ou le lien en un seul appel. Vérifiez l’e-mail lui-même, donnez à vos tests parallèles leurs propres comptes, et consultez les e-mails de chaque exécution sur la pull request.
Formule Free · npm, Python et REST · Playwright, Cypress, Selenium et plus
Fonctionnement
Un seul appel là où le test bloquait.
Créer une adresse
Un appel crée une adresse de test avec un persona fictif et un mot de passe, ou fournit la valeur de chaque champ de votre formulaire. Dans CI, une adresse peut servir à toute une exécution, avec un plus-tag par test.
Inscrivez-vous dans votre application
Votre test remplit le formulaire avec Playwright, Cypress, Selenium ou tout autre outil, et note l’heure de l’envoi.
Attendez le code ou le lien
L’attente se termine dès l’arrivée de l’e-mail, avec uniquement le code ou le lien. Les e-mails antérieurs à l’envoi du test sont ignorés.
Terminez le parcours
Saisissez le code ou ouvrez le lien, et vérifiez que l’utilisateur est connecté. Si rien n’est arrivé, l’erreur en donne la raison, dans la mesure du possible.
Dans vos tests
Quelques lignes dans le test que vous avez déjà.
Le package npm pour Node.js, un helper Python sans rien à installer, et l’REST API pour tout le reste. Des exemples complets pour chaque outil figurent dans la documentation développeur.
Playwright avec le paquet npm
import { test, expect } from '@playwright/test';
import { ProxyMailQA } from 'proxymail-qa';
const qa = new ProxyMailQA(); // reads PROXYMAIL_QA_API_KEY
test('sign-up sends a working code', async ({ page }) => {
const { address, password } = await qa.createAddress({ password: true });
await page.goto('/sign-up');
await page.getByLabel('Email').fill(address);
await page.getByLabel('Password').fill(password);
const submitted = new Date();
await page.getByRole('button', { name: 'Sign up' }).click();
const { value: code } = await qa.waitForCode(address, { since: submitted });
await page.getByLabel('Code').fill(code);
await expect(page.getByText('Welcome')).toBeVisible();
});pytest avec l’utilitaire Python
import re
from playwright.sync_api import expect
from proxymail_qa import create_address, now, wait_for_link
def test_sign_up_verifies_the_email(page):
account = create_address()
page.goto("/signup")
page.get_by_label("Email").fill(account["address"])
page.get_by_label("Password").fill(account["password"])
submitted = now()
page.get_by_role("button", name="Sign up").click()
page.goto(wait_for_link(account["address"], since=submitted))
expect(page).to_have_url(re.compile("verified"))Ce que les tests peuvent vérifier
Plus que « le code est-il arrivé ».
Codes et liens
Codes de vérification et de connexion, et liens de vérification, de connexion magique, d’invitation et de réinitialisation, uniquement parmi les e-mails envoyés après l’envoi du test.
Rien n’est arrivé, ou un seul
Prouvez qu’un utilisateur désabonné n’a reçu aucune newsletter, et repérez une inscription qui envoie deux e-mails de vérification au lieu d’un.
L’envoi et la construction de l’e-mail
SPF, DKIM et DMARC, les liens vers localhost ou en http simple, un lien qui pointe vers la production au lieu de la préproduction, une expiration manquante, l’affichage sur téléphone, et le texte et la langue attendus.
Un pool de comptes
Taguez les comptes selon leur état et laissez chaque test en emprunter un. Vos propres hooks en créent un quand aucun n’est libre, confirment son état et le rendent. Les tests parallèles n’en partagent jamais.
Un rapport sur la pull request
Quels e-mails sont arrivés et à quelle vitesse, de quel test chacun provient, les codes et liens, ce qui a échoué, et ce qui a changé depuis les dernières exécutions : e-mails plus lents, e-mails en trop, tests instables.
Pourquoi un e-mail manque
Quand une attente revient vide, l’erreur en donne la raison dans la mesure du possible, par exemple un fournisseur d’e-mails en mode sandbox qui n’envoie qu’aux adresses vérifiées.
Sur la pull request
Les e-mails de chaque exécution, là où vous relisez le code.
Ajoutez l’action Proxy Mail QA avant vos tests. Le package npm et le helper Python ajoutent à l’exécution ce qu’ils observent, et l’action publie le rapport à la fin du job, réussi ou non. Avec la fixture et le reporter Playwright, ou les hooks pytest, elle indique aussi de quel test provient chaque e-mail et quels tests ont échoué.
jobs:
e2e:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v7
- uses: aaquib90/proxymail-qa-action@v1
with:
api-key: ${{ secrets.PROXYMAIL_QA_API_KEY }}
- run: npm ci
- run: npx playwright test
env:
PROXYMAIL_QA_API_KEY: ${{ secrets.PROXYMAIL_QA_API_KEY }}Conçu pour la CI
Sans risque à chaque push.
-
Sa propre clé
Donnez à la CI son propre projet ou sa propre clé, conservée dans les secrets de votre système CI. La révoquer n’affecte rien d’autre.
-
Une adresse par exécution
Les e-mails envoyés à nom+nimportequoi@ arrivent à nom@, et une attente sur une adresse taguée ne trouve que ses propres e-mails : un pipeline chargé reste bien en deçà des limites quotidiennes.
-
Workers en parallèle
Une attente compte pour une requête, quelle que soit sa durée. Les clés peuvent faire 60 requêtes par minute avec Free et 600 avec Team.
-
Le rapport ne conserve aucun texte d’e-mail
Une exécution conserve les adresses, codes, durées, résultats de vérification, noms et erreurs des tests échoués, ainsi que le site et le chemin de chaque lien, avec les parties ressemblant à des jetons masquées. Jamais le texte ni l’objet d’un e-mail, ni la query d’un lien. Les exécutions sont conservées 90 jours.
-
Les forks n’ont pas accès aux secrets
Sur une pull request issue d’un fork, l’action affiche un avertissement et ne lance aucune exécution : votre clé n’atteint jamais du code que vous n’avez pas relu.
-
Sites de test uniquement
Proxy Mail QA sert aux versions de développement, de staging, de QA, de prévisualisation et locales d’apps que vous créez ou êtes autorisé à tester, jamais aux versions en production.
FAQ
Questions
Les tests peuvent-ils vérifier les coupons et le désabonnement ?
Oui. Attendez un coupon avec sa remise et sa date de fin, enregistrez ce que le paiement en a fait, vérifiez qu’une même personne ne peut pas profiter deux fois d’une offre, et marquez une adresse comme désabonnée pour que tout marketing ultérieur échoue. Voir e-mails marketing et d’offres.
Avec quels outils de test fonctionne-t-il ?
Tout ce qui peut faire une requête HTTP. Le package npm couvre les test runners Node.js comme Playwright, Cypress et Puppeteer, le helper Python couvre pytest avec Selenium ou Playwright, et de petits helpers pour XCUITest, Espresso, Flutter, Maestro, Detox et Appium vérifient les e-mails, utilisent le pool de comptes et alimentent aussi le rapport de l’exécution. Tout le reste utilise l’REST API.
Ai-je besoin de la formule Team ?
Non. Le package npm, le helper Python, l’REST API, l’Action GitHub, les exécutions et le pool de comptes sont disponibles avec chaque formule. Les clés Free font 60 requêtes par minute, un compte Free dispose de 500 adresses au total (jusqu’à 50 par jour), et les plus-tags permettent à une adresse de servir toute une exécution. Team n’a pas de limite d’adresses et porte la limite de requêtes à 600 par minute.
Le rapport fonctionne-t-il en dehors de GitHub Actions ?
Oui. Lancez une exécution avec l’API (qa.startRun() dans le package npm, start_run() dans Python), envoyez son id avec chaque appel, terminez-la, et récupérez le rapport en Markdown pour le publier là où vous relisez le code.
Qu’est-ce qui fait échouer une exécution ?
Un e-mail attendu par un test qui n’est jamais arrivé, un e-mail arrivé alors qu’aucun ne devait arriver, une vérification d’e-mail échouée, un test échoué enregistré par le reporter, du marketing après désabonnement, une personne recevant une offre deux fois, un coupon accepté alors qu’il ne devrait pas l’être, ou une note qui l’indique. L’action peut alors aussi faire échouer le job, même si les tests ont réussi, avec fail-job réglé sur true.
Mon agent de codage peut-il utiliser le même pool de comptes ?
Oui. Les agents connectés au MCP server empruntent et rendent des comptes du pool du même projet : un agent et votre suite de tests n’utilisent jamais le même compte en même temps.
Autres fonctionnalités
- Tableau de bord des boîtes de réceptionChaque compte de test et son code ou lien, en direct
- Projets et équipesUn par client ou application, avec ses propres clés et membres
- Agents d'IALes agents s’inscrivent et récupèrent le code eux-mêmes
- Marketing et offresDans Labs · coupons, désinscriptions et règles de consentement
- DélivrabilitéUn score de spam, les fichiers bloqués et les e-mails rejetés
- Extension ChromeRemplissez les formulaires d’inscription et voyez le code dans la page
- MCP server et pluginsClaude, Cursor, Copilot, Codex, ChatGPT et plus
Faites attendre le vrai e-mail à votre prochain test d’inscription.
Créez un compte gratuit, générez une clé d'API dans les paramètres du projet, et ajoutez une attente à un test existant.
Créer un compte gratuitOuvrir l'application