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
- 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.
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
- 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.
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
- Timeout after ${timeoutMs}ms waiting for search results
- Failed to ${callType}: ${response.statusText}
- Magic link missing token parameter
- Failed to send magic link email
- Failed to create ${entityType}: ${response.status()} ${error
AI-assisted analysis of TryGhost/Ghost@47d8b0e2ad (2026-08-13).
Data as JSON: /api/errors/2e70bd8e5e95722b.
Report an issue: GitHub.