TryGhost/Ghost · error · Error

No sign-in email found for ${member.email}

Error message

No sign-in email found for ${member.email}

What it means

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.

Source

Thrown at e2e/helpers/playwright/flows/sign-in.ts:44

 *
 * @param page - The Playwright page
 * @param member - The member to sign in as (must have been created already)
 */
export async function signInAsMember(page: Page, member: Member): Promise<void> {
    const emailClient: EmailClient = new MailPit();

    const homePage = new HomePage(page);
    await homePage.goto();
    await homePage.openPortalViaSignInLink();

    const signInPage = new SignInPage(page);
    await signInPage.emailInput.fill(member.email);
    await signInPage.continueButton.click();

    // Wait for magic link email
    const messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 10000});
    if (messages.length === 0) {
        throw new Error(`No sign-in email found for ${member.email}`);
    }
    const latestMessage = await emailClient.getMessageDetailed(messages[0]);
    const magicLink = extractMagicLink(latestMessage.Text, 'signin');

    const publicPage = new PublicPage(page);
    await publicPage.goto(magicLink);
    await homePage.waitUntilLoaded();
}

View on GitHub (pinned to 47d8b0e2ad)

Solutions

  1. Verify Mailpit is running and the Ghost instance is configured to send mail to it.
  2. Increase the `timeoutMs` passed to `searchByRecipient` if the environment is slow.
  3. Confirm `member.email` corresponds to an existing member record (Ghost only sends for known members).
  4. Check Ghost server logs for magic-link dispatch errors or SMTP connection failures.

Example fix

// before
const messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 10000});
if (messages.length === 0) {
    throw new Error(`No sign-in email found for ${member.email}`);
}

// after
const messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 30000});
if (messages.length === 0) {
    throw new Error(`No sign-in email found for ${member.email} — check Mailpit connectivity and Ghost mail config`);
}
Defensive patterns

Strategy: retry

Try / catch

let messages = await emailClient.searchByRecipient(member.email, {timeoutMs: 30000});
if (messages.length === 0) {
    throw new Error(`No sign-in email found for ${member.email}`);
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of TryGhost/Ghost@47d8b0e2ad (2026-08-13). Data as JSON: /api/errors/2e70bd8e5e95722b. Report an issue: GitHub.