{"record":{"id":"2e70bd8e5e95722b","repo":"TryGhost/Ghost","slug":"no-sign-in-email-found-for-member-email","errorCode":null,"errorMessage":"No sign-in email found for ${member.email}","messagePattern":"No sign-in email found for (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"e2e/helpers/playwright/flows/sign-in.ts","lineNumber":44,"sourceCode":" *\n * @param page - The Playwright page\n * @param member - The member to sign in as (must have been created already)\n */\nexport async function signInAsMember(page: Page, member: Member): Promise<void> {\n    const emailClient: EmailClient = new MailPit();\n\n    const homePage = new HomePage(page);\n    await homePage.goto();\n    await homePage.openPortalViaSignInLink();\n\n    const signInPage = new SignInPage(page);\n    await signInPage.emailInput.fill(member.email);\n    await signInPage.continueButton.click();\n\n    // Wait for magic link email\n    const messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 10000});\n    if (messages.length === 0) {\n        throw new Error(`No sign-in email found for ${member.email}`);\n    }\n    const latestMessage = await emailClient.getMessageDetailed(messages[0]);\n    const magicLink = extractMagicLink(latestMessage.Text, 'signin');\n\n    const publicPage = new PublicPage(page);\n    await publicPage.goto(magicLink);\n    await homePage.waitUntilLoaded();\n}\n","sourceCodeStart":26,"sourceCodeEnd":53,"githubUrl":"https://github.com/TryGhost/Ghost/blob/47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe/e2e/helpers/playwright/flows/sign-in.ts#L26-L53","documentation":"Thrown in the `signInAsMember` flow when `emailClient.searchByRecipient(member.email, {timeoutMs: 10000})` returns an empty array within 10 seconds. Ghost sends a magic-link signin email; if none is captured by the email service (Mailpit) in the window, the flow cannot extract a token and aborts.","triggerScenarios":"A member submits the signin form, but no email arrives in Mailpit within 10 seconds. The magic-link email was either never sent by Ghost, sent to a different address, or not yet captured.","commonSituations":"Ghost email/SMTP transport is misconfigured so magic links are not dispatched; Mailpit is not running or reachable; the member email does not match a known member so Ghost silently drops the send; high load causing >10s email delivery latency.","solutions":["Verify Mailpit is running and the Ghost instance is configured to send mail to it.","Increase the `timeoutMs` passed to `searchByRecipient` if the environment is slow.","Confirm `member.email` corresponds to an existing member record (Ghost only sends for known members).","Check Ghost server logs for magic-link dispatch errors or SMTP connection failures."],"exampleFix":"// before\nconst messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 10000});\nif (messages.length === 0) {\n    throw new Error(`No sign-in email found for ${member.email}`);\n}\n\n// after\nconst messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 30000});\nif (messages.length === 0) {\n    throw new Error(`No sign-in email found for ${member.email} — check Mailpit connectivity and Ghost mail config`);\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"let messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 30000});\nif (messages.length === 0) {\n    throw new Error(`No sign-in email found for ${member.email}`);\n}","preventionTips":["Confirm Mailpit is running and Ghost SMTP points to it.","Verify `member.email` exists as a member record (Ghost only sends magic links to known members).","Use a generous `timeoutMs` in slower CI environments."],"tags":["email","e2e","magic-link","mailpit","authentication"],"backgroundTag":null,"analyzedSha":"47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe","analyzedAt":"2026-08-13T01:25:26.651Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}