[{"data":1,"prerenderedAt":1935},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fguides\u002Fcypress\u002F":109,"\u002Fdocs\u002Fguides\u002Fcypress\u002F-surround":1930},[4,8,22,26,43,92],{"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,72,76,80,84,88],{"title":49,"path":50,"stem":51},"SMTP Test","\u002Fdocs\u002Fguides\u002Fsend-test-email","1.docs\u002F5.guides\u002F01.send-test-email",{"title":53,"path":54,"stem":55},"API Quickstart","\u002Fdocs\u002Fguides\u002Femail-testing-api","1.docs\u002F5.guides\u002F02.email-testing-api",{"title":57,"path":58,"stem":59},"CI","\u002Fdocs\u002Fguides\u002Fci","1.docs\u002F5.guides\u002F03.ci",{"title":61,"path":62,"stem":63},"Catch-All","\u002Fdocs\u002Fguides\u002Fcatch-all","1.docs\u002F5.guides\u002F04.catch-all",{"title":65,"path":66,"stem":67},"SPF, DKIM, DMARC","\u002Fdocs\u002Fguides\u002Fspf-dkim-dmarc","1.docs\u002F5.guides\u002F05.spf-dkim-dmarc",{"title":69,"path":70,"stem":71},"Playwright","\u002Fdocs\u002Fguides\u002Fe2e","1.docs\u002F5.guides\u002F06.e2e",{"title":73,"path":74,"stem":75},"Cypress","\u002Fdocs\u002Fguides\u002Fcypress","1.docs\u002F5.guides\u002F07.cypress",{"title":77,"path":78,"stem":79},"Email Clients","\u002Fdocs\u002Fguides\u002Femail-clients","1.docs\u002F5.guides\u002F08.email-clients",{"title":81,"path":82,"stem":83},"AI Agents","\u002Fdocs\u002Fguides\u002Fagents","1.docs\u002F5.guides\u002F09.agents",{"title":85,"path":86,"stem":87},"Local Development","\u002Fdocs\u002Fguides\u002Flocal-development","1.docs\u002F5.guides\u002F10.local-development",{"title":89,"path":90,"stem":91},"Size Limits","\u002Fdocs\u002Fguides\u002Femail-size-limits","1.docs\u002F5.guides\u002F11.email-size-limits",{"title":93,"path":94,"stem":95,"children":96,"page":21},"Alternatives","\u002Fdocs\u002Falternatives","1.docs\u002F6.alternatives",[97,101,105],{"title":98,"path":99,"stem":100},"Mailtrap","\u002Fdocs\u002Falternatives\u002Fmailtrap","1.docs\u002F6.alternatives\u002F1.mailtrap",{"title":102,"path":103,"stem":104},"Mailosaur","\u002Fdocs\u002Falternatives\u002Fmailosaur","1.docs\u002F6.alternatives\u002F2.mailosaur",{"title":106,"path":107,"stem":108},"Mailinator","\u002Fdocs\u002Falternatives\u002Fmailinator","1.docs\u002F6.alternatives\u002F3.mailinator",{"id":110,"title":111,"body":112,"description":1924,"extension":1925,"meta":1926,"navigation":1927,"path":74,"seo":1928,"stem":75,"__hash__":1929},"docs\u002F1.docs\u002F5.guides\u002F07.cypress.md","Email Testing with Cypress",{"type":113,"value":114,"toc":1916},"minimark",[115,125,143,148,151,1028,1061,1071,1075,1548,1560,1564,1710,1714,1728,1828,1832,1892,1896,1912],[116,117,118,119,124],"p",{},"Cypress runs your test in the browser, and the email lands in the sandbox. A task bridges the two. It runs in Node, polls the ",[120,121,123],"a",{"href":122},"\u002Fdocs\u002Fapi\u002F","API"," until the message arrives, and hands it to the test as JSON.",[116,126,127,128,132,133,137,138,142],{},"Get the app's mail into the sandbox first. Point its SMTP settings at ",[129,130,131],"code",{},"send.smtp.dev"," (",[120,134,136],{"href":135},"\u002Fdocs\u002Fguides\u002Fsend-test-email\u002F#from-your-app","settings per framework","), or let it send through its usual provider to an address on a ",[120,139,141],{"href":140},"\u002Fdocs\u002Fsetup\u002Fdomain\u002F","domain whose MX points at the sandbox",".",[144,145,147],"h2",{"id":146},"the-task","The Task",[116,149,150],{},"Register it in your Cypress config:",[152,153,158],"pre",{"className":154,"code":155,"language":156,"meta":157,"style":157},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineConfig } from 'cypress'\n\nconst API = 'https:\u002F\u002Fapi.smtp.dev'\nconst headers = { 'X-API-KEY': process.env.SMTP_DEV_API_KEY }\n\nasync function api(path) {\n  const res = await fetch(API + path, { headers })\n  if (!res.ok)\n    throw new Error(`${path} returned ${res.status}`)\n  return res.json()\n}\n\nasync function waitForEmail({ inbox, to, timeout = 30_000 }) {\n  const { member: accounts } = await api(`\u002Faccounts?address=${encodeURIComponent(inbox)}`)\n  const account = accounts.find(a => a.address === inbox)\n  const { mailboxes } = await api(`\u002Faccounts\u002F${account.id}`)\n  const messages = `\u002Faccounts\u002F${account.id}\u002Fmailboxes\u002F${mailboxes.find(m => m.path === 'INBOX').id}\u002Fmessages`\n\n  const deadline = Date.now() + timeout\n  while (Date.now() \u003C deadline) {\n    const { member } = await api(messages)\n    const found = member.find(m => m.to.some(t => t.address === to))\n    if (found)\n      return api(`${messages}\u002F${found.id}`)\n    await new Promise(resolve => setTimeout(resolve, 1000))\n  }\n  throw new Error(`no email to ${to} after ${timeout}ms`)\n}\n\nexport default defineConfig({\n  e2e: {\n    baseUrl: 'http:\u002F\u002Flocalhost:3000',\n    setupNodeEvents(on) {\n      on('task', { waitForEmail })\n    },\n  },\n})\n","js","",[129,159,160,193,200,220,260,265,291,332,353,393,409,414,419,456,499,538,577,653,658,685,713,738,793,806,837,870,876,916,921,926,941,951,969,984,1009,1015,1021],{"__ignoreMap":157},[161,162,165,169,173,177,180,183,186,190],"span",{"class":163,"line":164},"line",1,[161,166,168],{"class":167},"s7zQu","import",[161,170,172],{"class":171},"sMK4o"," {",[161,174,176],{"class":175},"sTEyZ"," defineConfig",[161,178,179],{"class":171}," }",[161,181,182],{"class":167}," from",[161,184,185],{"class":171}," '",[161,187,189],{"class":188},"sfazB","cypress",[161,191,192],{"class":171},"'\n",[161,194,196],{"class":163,"line":195},2,[161,197,199],{"emptyLinePlaceholder":198},true,"\n",[161,201,203,207,210,213,215,218],{"class":163,"line":202},3,[161,204,206],{"class":205},"spNyl","const",[161,208,209],{"class":175}," API ",[161,211,212],{"class":171},"=",[161,214,185],{"class":171},[161,216,217],{"class":188},"https:\u002F\u002Fapi.smtp.dev",[161,219,192],{"class":171},[161,221,223,225,228,230,232,234,238,241,244,247,249,252,254,257],{"class":163,"line":222},4,[161,224,206],{"class":205},[161,226,227],{"class":175}," headers ",[161,229,212],{"class":171},[161,231,172],{"class":171},[161,233,185],{"class":171},[161,235,237],{"class":236},"swJcz","X-API-KEY",[161,239,240],{"class":171},"'",[161,242,243],{"class":171},":",[161,245,246],{"class":175}," process",[161,248,142],{"class":171},[161,250,251],{"class":175},"env",[161,253,142],{"class":171},[161,255,256],{"class":175},"SMTP_DEV_API_KEY ",[161,258,259],{"class":171},"}\n",[161,261,263],{"class":163,"line":262},5,[161,264,199],{"emptyLinePlaceholder":198},[161,266,268,271,274,278,281,285,288],{"class":163,"line":267},6,[161,269,270],{"class":205},"async",[161,272,273],{"class":205}," function",[161,275,277],{"class":276},"s2Zo4"," api",[161,279,280],{"class":171},"(",[161,282,284],{"class":283},"sHdIc","path",[161,286,287],{"class":171},")",[161,289,290],{"class":171}," {\n",[161,292,294,297,300,303,306,309,311,313,316,319,322,324,327,329],{"class":163,"line":293},7,[161,295,296],{"class":205},"  const",[161,298,299],{"class":175}," res",[161,301,302],{"class":171}," =",[161,304,305],{"class":167}," await",[161,307,308],{"class":276}," fetch",[161,310,280],{"class":236},[161,312,123],{"class":175},[161,314,315],{"class":171}," +",[161,317,318],{"class":175}," path",[161,320,321],{"class":171},",",[161,323,172],{"class":171},[161,325,326],{"class":175}," headers",[161,328,179],{"class":171},[161,330,331],{"class":236},")\n",[161,333,335,338,340,343,346,348,351],{"class":163,"line":334},8,[161,336,337],{"class":167},"  if",[161,339,132],{"class":236},[161,341,342],{"class":171},"!",[161,344,345],{"class":175},"res",[161,347,142],{"class":171},[161,349,350],{"class":175},"ok",[161,352,331],{"class":236},[161,354,356,359,362,365,367,370,372,375,378,381,383,385,388,391],{"class":163,"line":355},9,[161,357,358],{"class":167},"    throw",[161,360,361],{"class":171}," new",[161,363,364],{"class":276}," Error",[161,366,280],{"class":236},[161,368,369],{"class":171},"`${",[161,371,284],{"class":175},[161,373,374],{"class":171},"}",[161,376,377],{"class":188}," returned ",[161,379,380],{"class":171},"${",[161,382,345],{"class":175},[161,384,142],{"class":171},[161,386,387],{"class":175},"status",[161,389,390],{"class":171},"}`",[161,392,331],{"class":236},[161,394,396,399,401,403,406],{"class":163,"line":395},10,[161,397,398],{"class":167},"  return",[161,400,299],{"class":175},[161,402,142],{"class":171},[161,404,405],{"class":276},"json",[161,407,408],{"class":236},"()\n",[161,410,412],{"class":163,"line":411},11,[161,413,259],{"class":171},[161,415,417],{"class":163,"line":416},12,[161,418,199],{"emptyLinePlaceholder":198},[161,420,422,424,426,429,432,435,437,440,442,445,447,451,454],{"class":163,"line":421},13,[161,423,270],{"class":205},[161,425,273],{"class":205},[161,427,428],{"class":276}," waitForEmail",[161,430,431],{"class":171},"({",[161,433,434],{"class":283}," inbox",[161,436,321],{"class":171},[161,438,439],{"class":283}," to",[161,441,321],{"class":171},[161,443,444],{"class":283}," timeout",[161,446,302],{"class":171},[161,448,450],{"class":449},"sbssI"," 30_000",[161,452,453],{"class":171}," })",[161,455,290],{"class":171},[161,457,459,461,463,466,468,471,473,475,477,479,481,484,487,489,492,495,497],{"class":163,"line":458},14,[161,460,296],{"class":205},[161,462,172],{"class":171},[161,464,465],{"class":236}," member",[161,467,243],{"class":171},[161,469,470],{"class":175}," accounts",[161,472,179],{"class":171},[161,474,302],{"class":171},[161,476,305],{"class":167},[161,478,277],{"class":276},[161,480,280],{"class":236},[161,482,483],{"class":171},"`",[161,485,486],{"class":188},"\u002Faccounts?address=",[161,488,380],{"class":171},[161,490,491],{"class":276},"encodeURIComponent",[161,493,494],{"class":175},"(inbox)",[161,496,390],{"class":171},[161,498,331],{"class":236},[161,500,502,504,507,509,511,513,516,518,520,523,526,528,531,534,536],{"class":163,"line":501},15,[161,503,296],{"class":205},[161,505,506],{"class":175}," account",[161,508,302],{"class":171},[161,510,470],{"class":175},[161,512,142],{"class":171},[161,514,515],{"class":276},"find",[161,517,280],{"class":236},[161,519,120],{"class":283},[161,521,522],{"class":205}," =>",[161,524,525],{"class":175}," a",[161,527,142],{"class":171},[161,529,530],{"class":175},"address",[161,532,533],{"class":171}," ===",[161,535,434],{"class":175},[161,537,331],{"class":236},[161,539,541,543,545,548,550,552,554,556,558,560,563,565,568,570,573,575],{"class":163,"line":540},16,[161,542,296],{"class":205},[161,544,172],{"class":171},[161,546,547],{"class":175}," mailboxes",[161,549,179],{"class":171},[161,551,302],{"class":171},[161,553,305],{"class":167},[161,555,277],{"class":276},[161,557,280],{"class":236},[161,559,483],{"class":171},[161,561,562],{"class":188},"\u002Faccounts\u002F",[161,564,380],{"class":171},[161,566,567],{"class":175},"account",[161,569,142],{"class":171},[161,571,572],{"class":175},"id",[161,574,390],{"class":171},[161,576,331],{"class":236},[161,578,580,582,585,587,590,592,594,596,598,600,602,605,607,610,612,614,616,619,621,624,626,629,632,634,637,639,641,643,645,647,650],{"class":163,"line":579},17,[161,581,296],{"class":205},[161,583,584],{"class":175}," messages",[161,586,302],{"class":171},[161,588,589],{"class":171}," `",[161,591,562],{"class":188},[161,593,380],{"class":171},[161,595,567],{"class":175},[161,597,142],{"class":171},[161,599,572],{"class":175},[161,601,374],{"class":171},[161,603,604],{"class":188},"\u002Fmailboxes\u002F",[161,606,380],{"class":171},[161,608,609],{"class":175},"mailboxes",[161,611,142],{"class":171},[161,613,515],{"class":276},[161,615,280],{"class":175},[161,617,618],{"class":283},"m",[161,620,522],{"class":205},[161,622,623],{"class":175}," m",[161,625,142],{"class":171},[161,627,628],{"class":175},"path ",[161,630,631],{"class":171},"===",[161,633,185],{"class":171},[161,635,636],{"class":188},"INBOX",[161,638,240],{"class":171},[161,640,287],{"class":175},[161,642,142],{"class":171},[161,644,572],{"class":175},[161,646,374],{"class":171},[161,648,649],{"class":188},"\u002Fmessages",[161,651,652],{"class":171},"`\n",[161,654,656],{"class":163,"line":655},18,[161,657,199],{"emptyLinePlaceholder":198},[161,659,661,663,666,668,671,673,676,679,682],{"class":163,"line":660},19,[161,662,296],{"class":205},[161,664,665],{"class":175}," deadline",[161,667,302],{"class":171},[161,669,670],{"class":175}," Date",[161,672,142],{"class":171},[161,674,675],{"class":276},"now",[161,677,678],{"class":236},"() ",[161,680,681],{"class":171},"+",[161,683,684],{"class":175}," timeout\n",[161,686,688,691,693,696,698,700,702,705,707,710],{"class":163,"line":687},20,[161,689,690],{"class":167},"  while",[161,692,132],{"class":236},[161,694,695],{"class":175},"Date",[161,697,142],{"class":171},[161,699,675],{"class":276},[161,701,678],{"class":236},[161,703,704],{"class":171},"\u003C",[161,706,665],{"class":175},[161,708,709],{"class":236},") ",[161,711,712],{"class":171},"{\n",[161,714,716,719,721,723,725,727,729,731,733,736],{"class":163,"line":715},21,[161,717,718],{"class":205},"    const",[161,720,172],{"class":171},[161,722,465],{"class":175},[161,724,179],{"class":171},[161,726,302],{"class":171},[161,728,305],{"class":167},[161,730,277],{"class":276},[161,732,280],{"class":236},[161,734,735],{"class":175},"messages",[161,737,331],{"class":236},[161,739,741,743,746,748,750,752,754,756,758,760,762,764,767,769,772,774,777,779,782,784,786,788,790],{"class":163,"line":740},22,[161,742,718],{"class":205},[161,744,745],{"class":175}," found",[161,747,302],{"class":171},[161,749,465],{"class":175},[161,751,142],{"class":171},[161,753,515],{"class":276},[161,755,280],{"class":236},[161,757,618],{"class":283},[161,759,522],{"class":205},[161,761,623],{"class":175},[161,763,142],{"class":171},[161,765,766],{"class":175},"to",[161,768,142],{"class":171},[161,770,771],{"class":276},"some",[161,773,280],{"class":236},[161,775,776],{"class":283},"t",[161,778,522],{"class":205},[161,780,781],{"class":175}," t",[161,783,142],{"class":171},[161,785,530],{"class":175},[161,787,533],{"class":171},[161,789,439],{"class":175},[161,791,792],{"class":236},"))\n",[161,794,796,799,801,804],{"class":163,"line":795},23,[161,797,798],{"class":167},"    if",[161,800,132],{"class":236},[161,802,803],{"class":175},"found",[161,805,331],{"class":236},[161,807,809,812,814,816,818,820,822,825,827,829,831,833,835],{"class":163,"line":808},24,[161,810,811],{"class":167},"      return",[161,813,277],{"class":276},[161,815,280],{"class":236},[161,817,369],{"class":171},[161,819,735],{"class":175},[161,821,374],{"class":171},[161,823,824],{"class":188},"\u002F",[161,826,380],{"class":171},[161,828,803],{"class":175},[161,830,142],{"class":171},[161,832,572],{"class":175},[161,834,390],{"class":171},[161,836,331],{"class":236},[161,838,840,843,845,849,851,854,856,859,861,863,865,868],{"class":163,"line":839},25,[161,841,842],{"class":167},"    await",[161,844,361],{"class":171},[161,846,848],{"class":847},"sBMFI"," Promise",[161,850,280],{"class":236},[161,852,853],{"class":283},"resolve",[161,855,522],{"class":205},[161,857,858],{"class":276}," setTimeout",[161,860,280],{"class":236},[161,862,853],{"class":175},[161,864,321],{"class":171},[161,866,867],{"class":449}," 1000",[161,869,792],{"class":236},[161,871,873],{"class":163,"line":872},26,[161,874,875],{"class":171},"  }\n",[161,877,879,882,884,886,888,890,893,895,897,899,902,904,907,909,912,914],{"class":163,"line":878},27,[161,880,881],{"class":167},"  throw",[161,883,361],{"class":171},[161,885,364],{"class":276},[161,887,280],{"class":236},[161,889,483],{"class":171},[161,891,892],{"class":188},"no email to ",[161,894,380],{"class":171},[161,896,766],{"class":175},[161,898,374],{"class":171},[161,900,901],{"class":188}," after ",[161,903,380],{"class":171},[161,905,906],{"class":175},"timeout",[161,908,374],{"class":171},[161,910,911],{"class":188},"ms",[161,913,483],{"class":171},[161,915,331],{"class":236},[161,917,919],{"class":163,"line":918},28,[161,920,259],{"class":171},[161,922,924],{"class":163,"line":923},29,[161,925,199],{"emptyLinePlaceholder":198},[161,927,929,932,935,937,939],{"class":163,"line":928},30,[161,930,931],{"class":167},"export",[161,933,934],{"class":167}," default",[161,936,176],{"class":276},[161,938,280],{"class":175},[161,940,712],{"class":171},[161,942,944,947,949],{"class":163,"line":943},31,[161,945,946],{"class":236},"  e2e",[161,948,243],{"class":171},[161,950,290],{"class":171},[161,952,954,957,959,961,964,966],{"class":163,"line":953},32,[161,955,956],{"class":236},"    baseUrl",[161,958,243],{"class":171},[161,960,185],{"class":171},[161,962,963],{"class":188},"http:\u002F\u002Flocalhost:3000",[161,965,240],{"class":171},[161,967,968],{"class":171},",\n",[161,970,972,975,977,980,982],{"class":163,"line":971},33,[161,973,974],{"class":236},"    setupNodeEvents",[161,976,280],{"class":171},[161,978,979],{"class":283},"on",[161,981,287],{"class":171},[161,983,290],{"class":171},[161,985,987,990,992,994,997,999,1001,1003,1005,1007],{"class":163,"line":986},34,[161,988,989],{"class":276},"      on",[161,991,280],{"class":236},[161,993,240],{"class":171},[161,995,996],{"class":188},"task",[161,998,240],{"class":171},[161,1000,321],{"class":171},[161,1002,172],{"class":171},[161,1004,428],{"class":175},[161,1006,179],{"class":171},[161,1008,331],{"class":236},[161,1010,1012],{"class":163,"line":1011},35,[161,1013,1014],{"class":171},"    },\n",[161,1016,1018],{"class":163,"line":1017},36,[161,1019,1020],{"class":171},"  },\n",[161,1022,1024,1026],{"class":163,"line":1023},37,[161,1025,374],{"class":171},[161,1027,331],{"class":175},[116,1029,1030,1033,1034,1036,1037,1041,1042,1045,1046,1045,1049,1045,1051,1045,1054,1057,1058,142],{},[129,1031,1032],{},"inbox"," is the account that receives the mail. ",[129,1035,766],{}," is the exact address the test typed into the form. The task resolves with the full ",[120,1038,1040],{"href":1039},"\u002Fdocs\u002Fapi\u002F#get-a-message","message",": ",[129,1043,1044],{},"subject",", ",[129,1047,1048],{},"from",[129,1050,766],{},[129,1052,1053],{},"text",[129,1055,1056],{},"html"," as an array of HTML parts, and ",[129,1059,1060],{},"attachments",[116,1062,1063,1066,1067,1070],{},[129,1064,1065],{},"cy.task"," waits up to ",[129,1068,1069],{},"taskTimeout",", 60 seconds by default, so the 30-second poll fails first, with a message that says which address never got mail.",[144,1072,1074],{"id":1073},"password-reset","Password Reset",[152,1076,1078],{"className":154,"code":1077,"language":156,"meta":157,"style":157},"describe('password reset', () => {\n  it('emails a working reset link', () => {\n    const address = `reset+${crypto.randomUUID()}@test.example.com`\n\n    cy.visit('\u002Fforgot-password')\n    cy.get('input[type=email]').type(address)\n    cy.contains('button', 'Send reset link').click()\n\n    cy.task('waitForEmail', { inbox: 'reset@test.example.com', to: address })\n      .then((message) => {\n        expect(message.subject).to.equal('Reset your password')\n        cy.visit(message.text.match(\u002Fhttps?:\\\u002F\\\u002F\\S*reset\\S*\u002F)[0])\n      })\n\n    cy.get('input[name=password]').type('correct-horse-battery')\n    cy.contains('button', 'Set password').click()\n    cy.location('pathname').should('eq', '\u002Fsignin')\n  })\n})\n",[129,1079,1080,1103,1125,1159,1163,1184,1215,1251,1255,1299,1319,1354,1412,1419,1423,1457,1490,1535,1542],{"__ignoreMap":157},[161,1081,1082,1085,1087,1089,1092,1094,1096,1099,1101],{"class":163,"line":164},[161,1083,1084],{"class":276},"describe",[161,1086,280],{"class":175},[161,1088,240],{"class":171},[161,1090,1091],{"class":188},"password reset",[161,1093,240],{"class":171},[161,1095,321],{"class":171},[161,1097,1098],{"class":171}," ()",[161,1100,522],{"class":205},[161,1102,290],{"class":171},[161,1104,1105,1108,1110,1112,1115,1117,1119,1121,1123],{"class":163,"line":195},[161,1106,1107],{"class":276},"  it",[161,1109,280],{"class":236},[161,1111,240],{"class":171},[161,1113,1114],{"class":188},"emails a working reset link",[161,1116,240],{"class":171},[161,1118,321],{"class":171},[161,1120,1098],{"class":171},[161,1122,522],{"class":205},[161,1124,290],{"class":171},[161,1126,1127,1129,1132,1134,1136,1139,1141,1144,1146,1149,1152,1154,1157],{"class":163,"line":202},[161,1128,718],{"class":205},[161,1130,1131],{"class":175}," address",[161,1133,302],{"class":171},[161,1135,589],{"class":171},[161,1137,1138],{"class":188},"reset+",[161,1140,380],{"class":171},[161,1142,1143],{"class":175},"crypto",[161,1145,142],{"class":171},[161,1147,1148],{"class":276},"randomUUID",[161,1150,1151],{"class":175},"()",[161,1153,374],{"class":171},[161,1155,1156],{"class":188},"@test.example.com",[161,1158,652],{"class":171},[161,1160,1161],{"class":163,"line":222},[161,1162,199],{"emptyLinePlaceholder":198},[161,1164,1165,1168,1170,1173,1175,1177,1180,1182],{"class":163,"line":262},[161,1166,1167],{"class":175},"    cy",[161,1169,142],{"class":171},[161,1171,1172],{"class":276},"visit",[161,1174,280],{"class":236},[161,1176,240],{"class":171},[161,1178,1179],{"class":188},"\u002Fforgot-password",[161,1181,240],{"class":171},[161,1183,331],{"class":236},[161,1185,1186,1188,1190,1193,1195,1197,1200,1202,1204,1206,1209,1211,1213],{"class":163,"line":267},[161,1187,1167],{"class":175},[161,1189,142],{"class":171},[161,1191,1192],{"class":276},"get",[161,1194,280],{"class":236},[161,1196,240],{"class":171},[161,1198,1199],{"class":188},"input[type=email]",[161,1201,240],{"class":171},[161,1203,287],{"class":236},[161,1205,142],{"class":171},[161,1207,1208],{"class":276},"type",[161,1210,280],{"class":236},[161,1212,530],{"class":175},[161,1214,331],{"class":236},[161,1216,1217,1219,1221,1224,1226,1228,1231,1233,1235,1237,1240,1242,1244,1246,1249],{"class":163,"line":293},[161,1218,1167],{"class":175},[161,1220,142],{"class":171},[161,1222,1223],{"class":276},"contains",[161,1225,280],{"class":236},[161,1227,240],{"class":171},[161,1229,1230],{"class":188},"button",[161,1232,240],{"class":171},[161,1234,321],{"class":171},[161,1236,185],{"class":171},[161,1238,1239],{"class":188},"Send reset link",[161,1241,240],{"class":171},[161,1243,287],{"class":236},[161,1245,142],{"class":171},[161,1247,1248],{"class":276},"click",[161,1250,408],{"class":236},[161,1252,1253],{"class":163,"line":334},[161,1254,199],{"emptyLinePlaceholder":198},[161,1256,1257,1259,1261,1263,1265,1267,1270,1272,1274,1276,1278,1280,1282,1285,1287,1289,1291,1293,1295,1297],{"class":163,"line":355},[161,1258,1167],{"class":175},[161,1260,142],{"class":171},[161,1262,996],{"class":276},[161,1264,280],{"class":236},[161,1266,240],{"class":171},[161,1268,1269],{"class":188},"waitForEmail",[161,1271,240],{"class":171},[161,1273,321],{"class":171},[161,1275,172],{"class":171},[161,1277,434],{"class":236},[161,1279,243],{"class":171},[161,1281,185],{"class":171},[161,1283,1284],{"class":188},"reset@test.example.com",[161,1286,240],{"class":171},[161,1288,321],{"class":171},[161,1290,439],{"class":236},[161,1292,243],{"class":171},[161,1294,1131],{"class":175},[161,1296,179],{"class":171},[161,1298,331],{"class":236},[161,1300,1301,1304,1307,1309,1311,1313,1315,1317],{"class":163,"line":395},[161,1302,1303],{"class":171},"      .",[161,1305,1306],{"class":276},"then",[161,1308,280],{"class":236},[161,1310,280],{"class":171},[161,1312,1040],{"class":283},[161,1314,287],{"class":171},[161,1316,522],{"class":205},[161,1318,290],{"class":171},[161,1320,1321,1324,1326,1328,1330,1332,1334,1336,1338,1340,1343,1345,1347,1350,1352],{"class":163,"line":411},[161,1322,1323],{"class":276},"        expect",[161,1325,280],{"class":236},[161,1327,1040],{"class":175},[161,1329,142],{"class":171},[161,1331,1044],{"class":175},[161,1333,287],{"class":236},[161,1335,142],{"class":171},[161,1337,766],{"class":175},[161,1339,142],{"class":171},[161,1341,1342],{"class":276},"equal",[161,1344,280],{"class":236},[161,1346,240],{"class":171},[161,1348,1349],{"class":188},"Reset your password",[161,1351,240],{"class":171},[161,1353,331],{"class":236},[161,1355,1356,1359,1361,1363,1365,1367,1369,1371,1373,1376,1378,1380,1383,1386,1388,1391,1394,1397,1400,1403,1406,1409],{"class":163,"line":416},[161,1357,1358],{"class":175},"        cy",[161,1360,142],{"class":171},[161,1362,1172],{"class":276},[161,1364,280],{"class":236},[161,1366,1040],{"class":175},[161,1368,142],{"class":171},[161,1370,1053],{"class":175},[161,1372,142],{"class":171},[161,1374,1375],{"class":276},"match",[161,1377,280],{"class":236},[161,1379,824],{"class":171},[161,1381,1382],{"class":188},"https",[161,1384,1385],{"class":171},"?",[161,1387,243],{"class":188},[161,1389,1390],{"class":175},"\\\u002F\\\u002F",[161,1392,1393],{"class":188},"\\S",[161,1395,1396],{"class":171},"*",[161,1398,1399],{"class":188},"reset\\S",[161,1401,1402],{"class":171},"*\u002F",[161,1404,1405],{"class":236},")[",[161,1407,1408],{"class":449},"0",[161,1410,1411],{"class":236},"])\n",[161,1413,1414,1417],{"class":163,"line":421},[161,1415,1416],{"class":171},"      }",[161,1418,331],{"class":236},[161,1420,1421],{"class":163,"line":458},[161,1422,199],{"emptyLinePlaceholder":198},[161,1424,1425,1427,1429,1431,1433,1435,1438,1440,1442,1444,1446,1448,1450,1453,1455],{"class":163,"line":501},[161,1426,1167],{"class":175},[161,1428,142],{"class":171},[161,1430,1192],{"class":276},[161,1432,280],{"class":236},[161,1434,240],{"class":171},[161,1436,1437],{"class":188},"input[name=password]",[161,1439,240],{"class":171},[161,1441,287],{"class":236},[161,1443,142],{"class":171},[161,1445,1208],{"class":276},[161,1447,280],{"class":236},[161,1449,240],{"class":171},[161,1451,1452],{"class":188},"correct-horse-battery",[161,1454,240],{"class":171},[161,1456,331],{"class":236},[161,1458,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1480,1482,1484,1486,1488],{"class":163,"line":540},[161,1460,1167],{"class":175},[161,1462,142],{"class":171},[161,1464,1223],{"class":276},[161,1466,280],{"class":236},[161,1468,240],{"class":171},[161,1470,1230],{"class":188},[161,1472,240],{"class":171},[161,1474,321],{"class":171},[161,1476,185],{"class":171},[161,1478,1479],{"class":188},"Set password",[161,1481,240],{"class":171},[161,1483,287],{"class":236},[161,1485,142],{"class":171},[161,1487,1248],{"class":276},[161,1489,408],{"class":236},[161,1491,1492,1494,1496,1499,1501,1503,1506,1508,1510,1512,1515,1517,1519,1522,1524,1526,1528,1531,1533],{"class":163,"line":579},[161,1493,1167],{"class":175},[161,1495,142],{"class":171},[161,1497,1498],{"class":276},"location",[161,1500,280],{"class":236},[161,1502,240],{"class":171},[161,1504,1505],{"class":188},"pathname",[161,1507,240],{"class":171},[161,1509,287],{"class":236},[161,1511,142],{"class":171},[161,1513,1514],{"class":276},"should",[161,1516,280],{"class":236},[161,1518,240],{"class":171},[161,1520,1521],{"class":188},"eq",[161,1523,240],{"class":171},[161,1525,321],{"class":171},[161,1527,185],{"class":171},[161,1529,1530],{"class":188},"\u002Fsignin",[161,1532,240],{"class":171},[161,1534,331],{"class":236},[161,1536,1537,1540],{"class":163,"line":655},[161,1538,1539],{"class":171},"  }",[161,1541,331],{"class":236},[161,1543,1544,1546],{"class":163,"line":660},[161,1545,374],{"class":171},[161,1547,331],{"class":175},[116,1549,1550,1553,1554,1556,1557,1559],{},[129,1551,1552],{},"reset+…@test.example.com"," delivers to the ",[129,1555,1284],{}," account, and the full alias stays in ",[129,1558,766],{},". That's what the task matches on, so every test reads its own email.",[144,1561,1563],{"id":1562},"one-time-codes","One-Time Codes",[152,1565,1567],{"className":154,"code":1566,"language":156,"meta":157,"style":157},"cy.task('waitForEmail', { inbox: 'signup@test.example.com', to: address })\n  .its('text')\n  .then((text) => {\n    cy.get('input[name=code]').type(text.match(\u002F\\b\\d{6}\\b\u002F)[0])\n  })\n",[129,1568,1569,1614,1632,1650,1704],{"__ignoreMap":157},[161,1570,1571,1574,1576,1578,1580,1582,1584,1586,1588,1590,1592,1594,1596,1599,1601,1603,1605,1607,1610,1612],{"class":163,"line":164},[161,1572,1573],{"class":175},"cy",[161,1575,142],{"class":171},[161,1577,996],{"class":276},[161,1579,280],{"class":175},[161,1581,240],{"class":171},[161,1583,1269],{"class":188},[161,1585,240],{"class":171},[161,1587,321],{"class":171},[161,1589,172],{"class":171},[161,1591,434],{"class":236},[161,1593,243],{"class":171},[161,1595,185],{"class":171},[161,1597,1598],{"class":188},"signup@test.example.com",[161,1600,240],{"class":171},[161,1602,321],{"class":171},[161,1604,439],{"class":236},[161,1606,243],{"class":171},[161,1608,1609],{"class":175}," address ",[161,1611,374],{"class":171},[161,1613,331],{"class":175},[161,1615,1616,1619,1622,1624,1626,1628,1630],{"class":163,"line":195},[161,1617,1618],{"class":171},"  .",[161,1620,1621],{"class":276},"its",[161,1623,280],{"class":175},[161,1625,240],{"class":171},[161,1627,1053],{"class":188},[161,1629,240],{"class":171},[161,1631,331],{"class":175},[161,1633,1634,1636,1638,1640,1642,1644,1646,1648],{"class":163,"line":202},[161,1635,1618],{"class":171},[161,1637,1306],{"class":276},[161,1639,280],{"class":175},[161,1641,280],{"class":171},[161,1643,1053],{"class":283},[161,1645,287],{"class":171},[161,1647,522],{"class":205},[161,1649,290],{"class":171},[161,1651,1652,1654,1656,1658,1660,1662,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1688,1691,1694,1696,1698,1700,1702],{"class":163,"line":222},[161,1653,1167],{"class":175},[161,1655,142],{"class":171},[161,1657,1192],{"class":276},[161,1659,280],{"class":236},[161,1661,240],{"class":171},[161,1663,1664],{"class":188},"input[name=code]",[161,1666,240],{"class":171},[161,1668,287],{"class":236},[161,1670,142],{"class":171},[161,1672,1208],{"class":276},[161,1674,280],{"class":236},[161,1676,1053],{"class":175},[161,1678,142],{"class":171},[161,1680,1375],{"class":276},[161,1682,280],{"class":236},[161,1684,824],{"class":171},[161,1686,1687],{"class":167},"\\b",[161,1689,1690],{"class":188},"\\d",[161,1692,1693],{"class":171},"{6}",[161,1695,1687],{"class":167},[161,1697,824],{"class":171},[161,1699,1405],{"class":236},[161,1701,1408],{"class":449},[161,1703,1411],{"class":236},[161,1705,1706,1708],{"class":163,"line":262},[161,1707,1539],{"class":171},[161,1709,331],{"class":175},[144,1711,1713],{"id":1712},"html-only-emails","HTML-Only Emails",[116,1715,1716,1717,1719,1720,1723,1724,1727],{},"When the template has no plain text part, ",[129,1718,1053],{}," can be empty. The ",[129,1721,1722],{},".then"," callback runs in the browser, so parse the HTML with ",[129,1725,1726],{},"DOMParser"," and read the button's link:",[152,1729,1731],{"className":154,"code":1730,"language":156,"meta":157,"style":157},"const doc = new DOMParser().parseFromString(message.html.join(''), 'text\u002Fhtml')\nconst link = doc.querySelector('a[href*=\"\u002Freset\"]').getAttribute('href')\n",[129,1732,1733,1784],{"__ignoreMap":157},[161,1734,1735,1737,1740,1742,1744,1747,1749,1751,1754,1757,1759,1761,1763,1766,1768,1771,1773,1775,1777,1780,1782],{"class":163,"line":164},[161,1736,206],{"class":205},[161,1738,1739],{"class":175}," doc ",[161,1741,212],{"class":171},[161,1743,361],{"class":171},[161,1745,1746],{"class":276}," DOMParser",[161,1748,1151],{"class":175},[161,1750,142],{"class":171},[161,1752,1753],{"class":276},"parseFromString",[161,1755,1756],{"class":175},"(message",[161,1758,142],{"class":171},[161,1760,1056],{"class":175},[161,1762,142],{"class":171},[161,1764,1765],{"class":276},"join",[161,1767,280],{"class":175},[161,1769,1770],{"class":171},"''",[161,1772,287],{"class":175},[161,1774,321],{"class":171},[161,1776,185],{"class":171},[161,1778,1779],{"class":188},"text\u002Fhtml",[161,1781,240],{"class":171},[161,1783,331],{"class":175},[161,1785,1786,1788,1791,1793,1796,1798,1801,1803,1805,1808,1810,1812,1814,1817,1819,1821,1824,1826],{"class":163,"line":195},[161,1787,206],{"class":205},[161,1789,1790],{"class":175}," link ",[161,1792,212],{"class":171},[161,1794,1795],{"class":175}," doc",[161,1797,142],{"class":171},[161,1799,1800],{"class":276},"querySelector",[161,1802,280],{"class":175},[161,1804,240],{"class":171},[161,1806,1807],{"class":188},"a[href*=\"\u002Freset\"]",[161,1809,240],{"class":171},[161,1811,287],{"class":175},[161,1813,142],{"class":171},[161,1815,1816],{"class":276},"getAttribute",[161,1818,280],{"class":175},[161,1820,240],{"class":171},[161,1822,1823],{"class":188},"href",[161,1825,240],{"class":171},[161,1827,331],{"class":175},[144,1829,1831],{"id":1830},"keeping-it-stable","Keeping It Stable",[1833,1834,1835,1853,1869,1882],"ul",{},[1836,1837,1838,1842,1843,1847,1848,1852],"li",{},[1839,1840,1841],"strong",{},"A fresh address per test."," ",[120,1844,1846],{"href":1845},"\u002Fdocs\u002Ffeatures\u002Faccount\u002F#plus-sign-aliasing","Plus aliases"," give every test its own address without creating accounts, on every plan. On Pro and Max, a ",[120,1849,1851],{"href":1850},"\u002Fdocs\u002Fguides\u002Fcatch-all\u002F","catch-all account"," accepts any address on the domain.",[1836,1854,1855,1842,1858,1861,1862,1865,1866,142],{},[1839,1856,1857],{},"Keep the key in Node.",[129,1859,1860],{},"cy.request"," can call the API too, but the key would have to sit in ",[129,1863,1864],{},"Cypress.env",", which the browser can read. The task keeps it in ",[129,1867,1868],{},"process.env",[1836,1870,1871,1874,1875,1878,1879,142],{},[1839,1872,1873],{},"Links to another origin."," If the link opens a different origin than ",[129,1876,1877],{},"baseUrl",", run the steps that follow inside ",[129,1880,1881],{},"cy.origin",[1836,1883,1884,1887,1888,142],{},[1839,1885,1886],{},"Rate limits."," One request a second per waiting test stays far below the ",[120,1889,1891],{"href":1890},"\u002Fdocs\u002Fapi\u002F#rate-limiting","4096 requests per minute limit",[144,1893,1895],{"id":1894},"in-ci","In CI",[116,1897,1898,1899,1902,1903,1906,1907,1911],{},"Add ",[129,1900,1901],{},"SMTP_DEV_API_KEY"," as a secret and expose it to the step that runs ",[129,1904,1905],{},"cypress run",". The app under test needs its own SMTP settings pointed at the sandbox. The ",[120,1908,1910],{"href":1909},"\u002Fdocs\u002Fguides\u002Fci\u002F","CI guide"," has a GitHub Actions workflow with both.",[1913,1914,1915],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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":157,"searchDepth":195,"depth":195,"links":1917},[1918,1919,1920,1921,1922,1923],{"id":146,"depth":195,"text":147},{"id":1073,"depth":195,"text":1074},{"id":1562,"depth":195,"text":1563},{"id":1712,"depth":195,"text":1713},{"id":1830,"depth":195,"text":1831},{"id":1894,"depth":195,"text":1895},"Wait for a signup or password reset email in a Cypress test, pull the link or code out of it, and finish the flow. The API key stays in Node.","md",{},{"title":73},{"title":111,"description":1924},"7aQI_b8i2kX96aBkoTD7qC9zfr-vsT1tWdmfQaml8Co",[1931,1933],{"title":69,"path":70,"stem":71,"description":1932,"children":-1},"Playwright tests that trigger a password reset or signup, wait for the real email with expect.poll, follow its link or read its code, and finish the flow.",{"title":77,"path":78,"stem":79,"description":1934,"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.",1794185301158]