[{"data":1,"prerenderedAt":786},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fguides\u002Fe2e\u002F":72,"\u002Fdocs\u002Fguides\u002Fe2e\u002F-surround":781},[4,8,22,26,43],{"title":5,"path":6,"stem":7},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started",{"title":9,"path":10,"stem":11,"children":12,"page":21},"Setup","\u002Fdocs\u002Fsetup","1.docs\u002F2.setup",[13,17],{"title":14,"path":15,"stem":16},"Domain","\u002Fdocs\u002Fsetup\u002Fdomain","1.docs\u002F2.setup\u002F2.domain",{"title":18,"path":19,"stem":20},"Email","\u002Fdocs\u002Fsetup\u002Faccount","1.docs\u002F2.setup\u002F3.account",false,{"title":23,"path":24,"stem":25},"Email Testing API","\u002Fdocs\u002Fapi","1.docs\u002F3.api",{"title":27,"path":28,"stem":29,"children":30,"page":21},"Features","\u002Fdocs\u002Ffeatures","1.docs\u002F4.features",[31,35,39],{"title":32,"path":33,"stem":34},"Account","\u002Fdocs\u002Ffeatures\u002Faccount","1.docs\u002F4.features\u002F1.account",{"title":36,"path":37,"stem":38},"Mailbox","\u002Fdocs\u002Ffeatures\u002Fmailbox","1.docs\u002F4.features\u002F2.mailbox",{"title":40,"path":41,"stem":42},"Messages","\u002Fdocs\u002Ffeatures\u002Fmessage","1.docs\u002F4.features\u002F3.message",{"title":44,"path":45,"stem":46,"children":47,"page":21},"Guides","\u002Fdocs\u002Fguides","1.docs\u002F5.guides",[48,52,56,60,64,68],{"title":49,"path":50,"stem":51},"CI","\u002Fdocs\u002Fguides\u002Fci","1.docs\u002F5.guides\u002F1.ci",{"title":53,"path":54,"stem":55},"Catch-All","\u002Fdocs\u002Fguides\u002Fcatch-all","1.docs\u002F5.guides\u002F2.catch-all",{"title":57,"path":58,"stem":59},"SPF, DKIM, DMARC","\u002Fdocs\u002Fguides\u002Fspf-dkim-dmarc","1.docs\u002F5.guides\u002F3.spf-dkim-dmarc",{"title":61,"path":62,"stem":63},"E2E Flows","\u002Fdocs\u002Fguides\u002Fe2e","1.docs\u002F5.guides\u002F4.e2e",{"title":65,"path":66,"stem":67},"Email Clients","\u002Fdocs\u002Fguides\u002Femail-clients","1.docs\u002F5.guides\u002F5.email-clients",{"title":69,"path":70,"stem":71},"AI Agents","\u002Fdocs\u002Fguides\u002Fagents","1.docs\u002F5.guides\u002F6.agents",{"id":73,"title":74,"body":75,"description":775,"extension":776,"meta":777,"navigation":778,"path":62,"seo":779,"stem":63,"__hash__":780},"docs\u002F1.docs\u002F5.guides\u002F4.e2e.md","Testing Password Reset Emails End-to-End",{"type":76,"value":77,"toc":771},"minimark",[78,82,99,104,116,697,713,717,767],[79,80,81],"p",{},"The reset email is the step most E2E suites skip or mock. With the app's outbound mail landing in the sandbox, the test follows the real link instead.",[79,83,84,85,89,90,94,95,98],{},"Two ways to get the mail there: point the app's SMTP transport at ",[86,87,88],"code",{},"send.smtp.dev"," with a sandbox account's credentials (shown in the ",[91,92,93],"a",{"href":50},"CI guide","), or let the app send through its normal provider to an address on a ",[91,96,97],{"href":15},"domain whose MX points at the sandbox",".",[100,101,103],"h2",{"id":102},"the-test","The Test",[79,105,106,109,110,113,114,98],{},[86,107,108],{},"inboxOf"," and ",[86,111,112],{},"waitForMessage"," are the polling helpers from the ",[91,115,93],{"href":50},[117,118,123],"pre",{"className":119,"code":120,"language":121,"meta":122,"style":122},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { expect, test } from '@playwright\u002Ftest'\n\ntest('password reset', async ({ page }) => {\n  const address = 'reset-user@example.com'\n\n  await page.goto('\u002Fforgot-password')\n  await page.getByLabel('Email').fill(address)\n  await page.getByRole('button', { name: 'Send reset link' }).click()\n\n  const message = await waitForMessage(\n    await inboxOf(address),\n    m => m.subject === 'Reset your password',\n  )\n\n  const body = message.text || (message.html ?? []).join('')\n  const link = body.match(\u002Fhttps?:\\\u002F\\\u002F\\S*reset\\S*\u002F)?.[0]\n  expect(link).toBeTruthy()\n\n  await page.goto(link)\n  await page.getByLabel('New password').fill('correct-horse-battery')\n  await page.getByRole('button', { name: 'Set password' }).click()\n  await expect(page).toHaveURL(\u002Fsignin\u002F)\n})\n","ts","",[86,124,125,164,171,211,230,235,261,296,346,351,370,388,416,422,427,476,536,556,561,578,615,659,689],{"__ignoreMap":122},[126,127,130,134,138,142,145,148,151,154,157,161],"span",{"class":128,"line":129},"line",1,[126,131,133],{"class":132},"s7zQu","import",[126,135,137],{"class":136},"sMK4o"," {",[126,139,141],{"class":140},"sTEyZ"," expect",[126,143,144],{"class":136},",",[126,146,147],{"class":140}," test",[126,149,150],{"class":136}," }",[126,152,153],{"class":132}," from",[126,155,156],{"class":136}," '",[126,158,160],{"class":159},"sfazB","@playwright\u002Ftest",[126,162,163],{"class":136},"'\n",[126,165,167],{"class":128,"line":166},2,[126,168,170],{"emptyLinePlaceholder":169},true,"\n",[126,172,174,178,181,184,187,189,191,195,198,202,205,208],{"class":128,"line":173},3,[126,175,177],{"class":176},"s2Zo4","test",[126,179,180],{"class":140},"(",[126,182,183],{"class":136},"'",[126,185,186],{"class":159},"password reset",[126,188,183],{"class":136},[126,190,144],{"class":136},[126,192,194],{"class":193},"spNyl"," async",[126,196,197],{"class":136}," ({",[126,199,201],{"class":200},"sHdIc"," page",[126,203,204],{"class":136}," })",[126,206,207],{"class":193}," =>",[126,209,210],{"class":136}," {\n",[126,212,214,217,220,223,225,228],{"class":128,"line":213},4,[126,215,216],{"class":193},"  const",[126,218,219],{"class":140}," address",[126,221,222],{"class":136}," =",[126,224,156],{"class":136},[126,226,227],{"class":159},"reset-user@example.com",[126,229,163],{"class":136},[126,231,233],{"class":128,"line":232},5,[126,234,170],{"emptyLinePlaceholder":169},[126,236,238,241,243,245,248,251,253,256,258],{"class":128,"line":237},6,[126,239,240],{"class":132},"  await",[126,242,201],{"class":140},[126,244,98],{"class":136},[126,246,247],{"class":176},"goto",[126,249,180],{"class":250},"swJcz",[126,252,183],{"class":136},[126,254,255],{"class":159},"\u002Fforgot-password",[126,257,183],{"class":136},[126,259,260],{"class":250},")\n",[126,262,264,266,268,270,273,275,277,279,281,284,286,289,291,294],{"class":128,"line":263},7,[126,265,240],{"class":132},[126,267,201],{"class":140},[126,269,98],{"class":136},[126,271,272],{"class":176},"getByLabel",[126,274,180],{"class":250},[126,276,183],{"class":136},[126,278,18],{"class":159},[126,280,183],{"class":136},[126,282,283],{"class":250},")",[126,285,98],{"class":136},[126,287,288],{"class":176},"fill",[126,290,180],{"class":250},[126,292,293],{"class":140},"address",[126,295,260],{"class":250},[126,297,299,301,303,305,308,310,312,315,317,319,321,324,327,329,332,334,336,338,340,343],{"class":128,"line":298},8,[126,300,240],{"class":132},[126,302,201],{"class":140},[126,304,98],{"class":136},[126,306,307],{"class":176},"getByRole",[126,309,180],{"class":250},[126,311,183],{"class":136},[126,313,314],{"class":159},"button",[126,316,183],{"class":136},[126,318,144],{"class":136},[126,320,137],{"class":136},[126,322,323],{"class":250}," name",[126,325,326],{"class":136},":",[126,328,156],{"class":136},[126,330,331],{"class":159},"Send reset link",[126,333,183],{"class":136},[126,335,150],{"class":136},[126,337,283],{"class":250},[126,339,98],{"class":136},[126,341,342],{"class":176},"click",[126,344,345],{"class":250},"()\n",[126,347,349],{"class":128,"line":348},9,[126,350,170],{"emptyLinePlaceholder":169},[126,352,354,356,359,361,364,367],{"class":128,"line":353},10,[126,355,216],{"class":193},[126,357,358],{"class":140}," message",[126,360,222],{"class":136},[126,362,363],{"class":132}," await",[126,365,366],{"class":176}," waitForMessage",[126,368,369],{"class":250},"(\n",[126,371,373,376,379,381,383,385],{"class":128,"line":372},11,[126,374,375],{"class":132},"    await",[126,377,378],{"class":176}," inboxOf",[126,380,180],{"class":250},[126,382,293],{"class":140},[126,384,283],{"class":250},[126,386,387],{"class":136},",\n",[126,389,391,394,396,399,401,404,407,409,412,414],{"class":128,"line":390},12,[126,392,393],{"class":200},"    m",[126,395,207],{"class":193},[126,397,398],{"class":140}," m",[126,400,98],{"class":136},[126,402,403],{"class":140},"subject",[126,405,406],{"class":136}," ===",[126,408,156],{"class":136},[126,410,411],{"class":159},"Reset your password",[126,413,183],{"class":136},[126,415,387],{"class":136},[126,417,419],{"class":128,"line":418},13,[126,420,421],{"class":250},"  )\n",[126,423,425],{"class":128,"line":424},14,[126,426,170],{"emptyLinePlaceholder":169},[126,428,430,432,435,437,439,441,444,447,450,453,455,458,461,464,466,469,471,474],{"class":128,"line":429},15,[126,431,216],{"class":193},[126,433,434],{"class":140}," body",[126,436,222],{"class":136},[126,438,358],{"class":140},[126,440,98],{"class":136},[126,442,443],{"class":140},"text",[126,445,446],{"class":136}," ||",[126,448,449],{"class":250}," (",[126,451,452],{"class":140},"message",[126,454,98],{"class":136},[126,456,457],{"class":140},"html",[126,459,460],{"class":136}," ??",[126,462,463],{"class":250}," [])",[126,465,98],{"class":136},[126,467,468],{"class":176},"join",[126,470,180],{"class":250},[126,472,473],{"class":136},"''",[126,475,260],{"class":250},[126,477,479,481,484,486,488,490,493,495,498,501,504,506,509,512,515,518,521,523,526,529,533],{"class":128,"line":478},16,[126,480,216],{"class":193},[126,482,483],{"class":140}," link",[126,485,222],{"class":136},[126,487,434],{"class":140},[126,489,98],{"class":136},[126,491,492],{"class":176},"match",[126,494,180],{"class":250},[126,496,497],{"class":136},"\u002F",[126,499,500],{"class":159},"https",[126,502,503],{"class":136},"?",[126,505,326],{"class":159},[126,507,508],{"class":140},"\\\u002F\\\u002F",[126,510,511],{"class":159},"\\S",[126,513,514],{"class":136},"*",[126,516,517],{"class":159},"reset\\S",[126,519,520],{"class":136},"*\u002F",[126,522,283],{"class":250},[126,524,525],{"class":136},"?.",[126,527,528],{"class":250},"[",[126,530,532],{"class":531},"sbssI","0",[126,534,535],{"class":250},"]\n",[126,537,539,542,544,547,549,551,554],{"class":128,"line":538},17,[126,540,541],{"class":176},"  expect",[126,543,180],{"class":250},[126,545,546],{"class":140},"link",[126,548,283],{"class":250},[126,550,98],{"class":136},[126,552,553],{"class":176},"toBeTruthy",[126,555,345],{"class":250},[126,557,559],{"class":128,"line":558},18,[126,560,170],{"emptyLinePlaceholder":169},[126,562,564,566,568,570,572,574,576],{"class":128,"line":563},19,[126,565,240],{"class":132},[126,567,201],{"class":140},[126,569,98],{"class":136},[126,571,247],{"class":176},[126,573,180],{"class":250},[126,575,546],{"class":140},[126,577,260],{"class":250},[126,579,581,583,585,587,589,591,593,596,598,600,602,604,606,608,611,613],{"class":128,"line":580},20,[126,582,240],{"class":132},[126,584,201],{"class":140},[126,586,98],{"class":136},[126,588,272],{"class":176},[126,590,180],{"class":250},[126,592,183],{"class":136},[126,594,595],{"class":159},"New password",[126,597,183],{"class":136},[126,599,283],{"class":250},[126,601,98],{"class":136},[126,603,288],{"class":176},[126,605,180],{"class":250},[126,607,183],{"class":136},[126,609,610],{"class":159},"correct-horse-battery",[126,612,183],{"class":136},[126,614,260],{"class":250},[126,616,618,620,622,624,626,628,630,632,634,636,638,640,642,644,647,649,651,653,655,657],{"class":128,"line":617},21,[126,619,240],{"class":132},[126,621,201],{"class":140},[126,623,98],{"class":136},[126,625,307],{"class":176},[126,627,180],{"class":250},[126,629,183],{"class":136},[126,631,314],{"class":159},[126,633,183],{"class":136},[126,635,144],{"class":136},[126,637,137],{"class":136},[126,639,323],{"class":250},[126,641,326],{"class":136},[126,643,156],{"class":136},[126,645,646],{"class":159},"Set password",[126,648,183],{"class":136},[126,650,150],{"class":136},[126,652,283],{"class":250},[126,654,98],{"class":136},[126,656,342],{"class":176},[126,658,345],{"class":250},[126,660,662,664,666,668,671,673,675,678,680,682,685,687],{"class":128,"line":661},22,[126,663,240],{"class":132},[126,665,141],{"class":176},[126,667,180],{"class":250},[126,669,670],{"class":140},"page",[126,672,283],{"class":250},[126,674,98],{"class":136},[126,676,677],{"class":176},"toHaveURL",[126,679,180],{"class":250},[126,681,497],{"class":136},[126,683,684],{"class":159},"signin",[126,686,497],{"class":136},[126,688,260],{"class":250},[126,690,692,695],{"class":128,"line":691},23,[126,693,694],{"class":136},"}",[126,696,260],{"class":140},[79,698,699,700,702,703,705,706,709,710,98],{},"The message's ",[86,701,443],{}," field is the plain text part; ",[86,704,457],{}," is an array of HTML parts. If your template only wraps the URL in a button, match the ",[86,707,708],{},"href"," instead: ",[86,711,712],{},"body.match(\u002Fhref=\"([^\"]+)\"\u002F)?.[1]",[100,714,716],{"id":715},"keeping-it-stable","Keeping It Stable",[718,719,720,743,753],"ul",{},[721,722,723,727,728,727,731,727,735,738,739,742],"li",{},[724,725,726],"strong",{},"One address per worker."," ",[86,729,730],{},"reset+worker1@example.com",[91,732,734],{"href":733},"\u002Fdocs\u002Ffeatures\u002Faccount#plus-sign-aliasing","delivers to",[86,736,737],{},"reset@example.com"," with the alias intact in ",[86,740,741],{},"to",", so parallel workers never read each other's mail. Match on recipient and subject, not arrival order.",[721,744,745,748,749,98],{},[724,746,747],{},"Poll tight."," One-second intervals across a few workers sit nowhere near the ",[91,750,752],{"href":751},"\u002Fdocs\u002Fapi#rate-limiting","4096 requests per minute limit",[721,754,755,727,758,762,763,766],{},[724,756,757],{},"Or skip polling.",[91,759,761],{"href":760},"\u002Fdocs\u002Fapi#real-time-updates","Subscribe over SSE"," and resolve when a ",[86,764,765],{},"Message"," event for the account arrives.",[768,769,770],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":122,"searchDepth":166,"depth":166,"links":772},[773,774],{"id":102,"depth":166,"text":103},{"id":715,"depth":166,"text":716},"A Playwright test that triggers a reset, polls the API for the email, extracts the link, and finishes the flow. Same pattern for signup confirmations.","md",{},{"title":61},{"title":74,"description":775},"cZgQIQrJR2fbIIzKfKdHc5KzQi372nxbrxlvB2xxt_0",[782,784],{"title":57,"path":58,"stem":59,"description":783,"children":-1},"Send from staging to a sandbox address and read the SPF, DKIM, and DMARC results on the received message before you change production DNS.",{"title":65,"path":66,"stem":67,"description":785,"children":-1},"Connect a real client over IMAP to see how multipart emails render outside the browser. Host, port, and login settings for any client.",1784164786389]