import { ImapFlow } from "imapflow"; const required = (name) => { const value = process.env[name]; if (!value) throw new Error(`Variable ${name} manquante`); return value; }; const tenantId = required("AZURE_AD_TENANT_ID"); const clientId = required("AZURE_AD_CLIENT_ID"); const clientSecret = required("AZURE_AD_CLIENT_SECRET"); const email = required("IMAP_TEST_EMAIL"); const host = process.env.IMAP_TEST_HOST || "outlook.office365.com"; const response = await fetch( `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ client_id: clientId, client_secret: clientSecret, scope: "https://outlook.office365.com/.default", grant_type: "client_credentials", }), }, ); const tokenResponse = await response.json(); if (!response.ok || !tokenResponse.access_token) { throw new Error(`Échec OAuth2 : ${tokenResponse.error || response.status}`); } const client = new ImapFlow({ host, port: 993, secure: true, auth: { user: email, accessToken: tokenResponse.access_token }, tls: { servername: host, rejectUnauthorized: true }, verifyOnly: true, logger: false, }); try { await client.connect(); console.log(`Authentification ImapFlow OAuth2 réussie pour ${email}`); } finally { if (client.usable) await client.logout().catch(() => client.close()); else client.close(); }