[{"data":1,"prerenderedAt":2249},["ShallowReactive",2],{"versions":3,"plugin-litestar-email":6,"readme-litestar-email":48},{"v3":4,"v4":5},"3.21.0","4.3.0",{"id":7,"title":8,"body":9,"category":10,"changelog":11,"compatibility":12,"created_at":14,"description":15,"documentation":16,"extension":17,"github":18,"icon":19,"issues":20,"key":21,"latest_version":22,"license":9,"maintainers":23,"meta":28,"monthly_downloads":29,"name":8,"navigation":30,"path":31,"pypi":21,"python_compatibility":32,"python_compatibility_raw":33,"repo":40,"seo":41,"sponsor":42,"stars":43,"stem":44,"type":45,"updated_at":46,"website":18,"__hash__":47},"plugins/plugins/litestar-email.yml","Litestar Email",null,"Others","https://github.com/litestar-org/litestar-email/releases/",{"litestar":13},">=2.0.0","2026-01-04T21:35:28","Email plugin for litestar","https://litestar-org.github.io/litestar-email/","yml","https://github.com/litestar-org/litestar-email","_default_icon.svg","https://github.com/litestar-org/litestar-email/issues/","litestar-email","0.3.0",[24],{"name":25,"github":26,"avatar":27},"Cody Fincher","cofin","https://https://avatars.githubusercontent.com/u/204685?v=4",{},1204,true,"/plugins/litestar-email",{"raw":33,"specifier_set":33,"compatible":34},">=3.10",[35,36,37,38,39],"3.10","3.11","3.12","3.13","3.14","litestar-org/litestar-email",{"description":15},false,8,"plugins/litestar-email","official","2026-01-07T21:25:05","n1rxgm7CelgBEMA7qkO-n7cPdXKm6ahjyguYemt8m38",{"id":49,"extension":50,"meta":51,"stem":2247,"__hash__":2248},"readme/readmes/litestar-email.md","md",{"body":52},{"type":53,"value":54,"toc":2233},"minimark",[55,58,62,67,93,96,159,173,177,339,342,471,476,613,628,632,639,856,859,870,874,877,1336,1350,1354,1357,1540,1543,1598,1602,1698,1702,1808,1811,1906,1910,1917,2035,2041,2173,2177,2222,2226,2229],[56,57,21],"h1",{"id":21},[59,60,61],"p",{},"Email support for Litestar applications. This plugin provides a pluggable email backend\nsystem for sending transactional emails with support for multiple providers.",[63,64,66],"h2",{"id":65},"installation","Installation",[68,69,74],"pre",{"className":70,"code":71,"language":72,"meta":73,"style":73},"language-bash shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","pip install litestar-email\n","bash","",[75,76,77],"code",{"__ignoreMap":73},[78,79,82,86,90],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"s52Pk","pip",[78,87,89],{"class":88},"sGFVr"," install",[78,91,92],{"class":88}," litestar-email\n",[59,94,95],{},"For production backends, install with the appropriate extra:",[68,97,99],{"className":70,"code":98,"language":72,"meta":73,"style":73},"# SMTP backend\npip install litestar-email[smtp]\n\n# aiohttp transport (alternative to httpx for API backends)\npip install litestar-email[aiohttp]\n\n# All optional dependencies\npip install litestar-email[all]\n",[75,100,101,107,117,123,129,139,144,150],{"__ignoreMap":73},[78,102,103],{"class":80,"line":81},[78,104,106],{"class":105},"sWuyu","# SMTP backend\n",[78,108,110,112,114],{"class":80,"line":109},2,[78,111,85],{"class":84},[78,113,89],{"class":88},[78,115,116],{"class":88}," litestar-email[smtp]\n",[78,118,120],{"class":80,"line":119},3,[78,121,122],{"emptyLinePlaceholder":30},"\n",[78,124,126],{"class":80,"line":125},4,[78,127,128],{"class":105},"# aiohttp transport (alternative to httpx for API backends)\n",[78,130,132,134,136],{"class":80,"line":131},5,[78,133,85],{"class":84},[78,135,89],{"class":88},[78,137,138],{"class":88}," litestar-email[aiohttp]\n",[78,140,142],{"class":80,"line":141},6,[78,143,122],{"emptyLinePlaceholder":30},[78,145,147],{"class":80,"line":146},7,[78,148,149],{"class":105},"# All optional dependencies\n",[78,151,152,154,156],{"class":80,"line":43},[78,153,85],{"class":84},[78,155,89],{"class":88},[78,157,158],{"class":88}," litestar-email[all]\n",[160,161,162],"blockquote",{},[59,163,164,168,169,172],{},[165,166,167],"strong",{},"Note",": API backends (Resend, SendGrid, Mailgun) use ",[75,170,171],{},"httpx"," which is bundled with Litestar.\nNo extra installation is needed for these backends.",[63,174,176],{"id":175},"usage","Usage",[68,178,182],{"className":179,"code":180,"language":181,"meta":73,"style":73},"language-python shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","from litestar import Litestar\nfrom litestar_email import EmailConfig, EmailPlugin\n\n# Development: console output\nconfig = EmailConfig(\n    backend=\"console\",\n    from_email=\"noreply@example.com\",\n    from_name=\"My App\",\n)\n\napp = Litestar(plugins=[EmailPlugin(config=config)])\n","python",[75,183,184,200,219,223,228,242,261,277,293,299,304],{"__ignoreMap":73},[78,185,186,190,194,197],{"class":80,"line":81},[78,187,189],{"class":188},"s8R28","from",[78,191,193],{"class":192},"sZSNi"," litestar ",[78,195,196],{"class":188},"import",[78,198,199],{"class":192}," Litestar\n",[78,201,202,204,207,209,212,216],{"class":80,"line":109},[78,203,189],{"class":188},[78,205,206],{"class":192}," litestar_email ",[78,208,196],{"class":188},[78,210,211],{"class":192}," EmailConfig",[78,213,215],{"class":214},"sDfIl",",",[78,217,218],{"class":192}," EmailPlugin\n",[78,220,221],{"class":80,"line":119},[78,222,122],{"emptyLinePlaceholder":30},[78,224,225],{"class":80,"line":125},[78,226,227],{"class":105},"# Development: console output\n",[78,229,230,233,236,239],{"class":80,"line":131},[78,231,232],{"class":192},"config ",[78,234,235],{"class":214},"=",[78,237,211],{"class":238},"s3cPz",[78,240,241],{"class":214},"(\n",[78,243,244,248,250,253,256,258],{"class":80,"line":141},[78,245,247],{"class":246},"s1nJG","    backend",[78,249,235],{"class":214},[78,251,252],{"class":214},"\"",[78,254,255],{"class":88},"console",[78,257,252],{"class":214},[78,259,260],{"class":214},",\n",[78,262,263,266,268,270,273,275],{"class":80,"line":146},[78,264,265],{"class":246},"    from_email",[78,267,235],{"class":214},[78,269,252],{"class":214},[78,271,272],{"class":88},"noreply@example.com",[78,274,252],{"class":214},[78,276,260],{"class":214},[78,278,279,282,284,286,289,291],{"class":80,"line":43},[78,280,281],{"class":246},"    from_name",[78,283,235],{"class":214},[78,285,252],{"class":214},[78,287,288],{"class":88},"My App",[78,290,252],{"class":214},[78,292,260],{"class":214},[78,294,296],{"class":80,"line":295},9,[78,297,298],{"class":214},")\n",[78,300,302],{"class":80,"line":301},10,[78,303,122],{"emptyLinePlaceholder":30},[78,305,307,310,312,315,318,321,324,327,329,332,334,336],{"class":80,"line":306},11,[78,308,309],{"class":192},"app ",[78,311,235],{"class":214},[78,313,314],{"class":238}," Litestar",[78,316,317],{"class":214},"(",[78,319,320],{"class":246},"plugins",[78,322,323],{"class":214},"=[",[78,325,326],{"class":238},"EmailPlugin",[78,328,317],{"class":214},[78,330,331],{"class":246},"config",[78,333,235],{"class":214},[78,335,331],{"class":238},[78,337,338],{"class":214},")])\n",[59,340,341],{},"For production, pass a backend config object directly:",[68,343,345],{"className":179,"code":344,"language":181,"meta":73,"style":73},"from litestar_email import EmailConfig, EmailPlugin, SMTPConfig\n\nconfig = EmailConfig(\n    backend=SMTPConfig(host=\"smtp.example.com\", port=587, use_tls=True),\n    from_email=\"noreply@example.com\",\n)\n\napp = Litestar(plugins=[EmailPlugin(config=config)])\n",[75,346,347,367,371,381,423,437,441,445],{"__ignoreMap":73},[78,348,349,351,353,355,357,359,362,364],{"class":80,"line":81},[78,350,189],{"class":188},[78,352,206],{"class":192},[78,354,196],{"class":188},[78,356,211],{"class":192},[78,358,215],{"class":214},[78,360,361],{"class":192}," EmailPlugin",[78,363,215],{"class":214},[78,365,366],{"class":192}," SMTPConfig\n",[78,368,369],{"class":80,"line":109},[78,370,122],{"emptyLinePlaceholder":30},[78,372,373,375,377,379],{"class":80,"line":119},[78,374,232],{"class":192},[78,376,235],{"class":214},[78,378,211],{"class":238},[78,380,241],{"class":214},[78,382,383,385,387,390,392,395,397,399,402,404,406,409,411,415,417,420],{"class":80,"line":125},[78,384,247],{"class":246},[78,386,235],{"class":214},[78,388,389],{"class":238},"SMTPConfig",[78,391,317],{"class":214},[78,393,394],{"class":246},"host",[78,396,235],{"class":214},[78,398,252],{"class":214},[78,400,401],{"class":88},"smtp.example.com",[78,403,252],{"class":214},[78,405,215],{"class":214},[78,407,408],{"class":246}," port",[78,410,235],{"class":214},[78,412,414],{"class":413},"sYRBq","587",[78,416,215],{"class":214},[78,418,419],{"class":246}," use_tls",[78,421,422],{"class":214},"=True),\n",[78,424,425,427,429,431,433,435],{"class":80,"line":131},[78,426,265],{"class":246},[78,428,235],{"class":214},[78,430,252],{"class":214},[78,432,272],{"class":88},[78,434,252],{"class":214},[78,436,260],{"class":214},[78,438,439],{"class":80,"line":141},[78,440,298],{"class":214},[78,442,443],{"class":80,"line":146},[78,444,122],{"emptyLinePlaceholder":30},[78,446,447,449,451,453,455,457,459,461,463,465,467,469],{"class":80,"line":43},[78,448,309],{"class":192},[78,450,235],{"class":214},[78,452,314],{"class":238},[78,454,317],{"class":214},[78,456,320],{"class":246},[78,458,323],{"class":214},[78,460,326],{"class":238},[78,462,317],{"class":214},[78,464,331],{"class":246},[78,466,235],{"class":214},[78,468,331],{"class":238},[78,470,338],{"class":214},[472,473,475],"h3",{"id":474},"sending-email","Sending Email",[68,477,479],{"className":179,"code":478,"language":181,"meta":73,"style":73},"from litestar_email import EmailMessage\n\nmessage = EmailMessage(\n    subject=\"Welcome!\",\n    body=\"Thanks for signing up.\",\n    to=[\"user@example.com\"],\n)\n\nasync with config.provide_service() as mailer:\n    await mailer.send_message(message)\n",[75,480,481,492,496,508,524,540,557,561,565,594],{"__ignoreMap":73},[78,482,483,485,487,489],{"class":80,"line":81},[78,484,189],{"class":188},[78,486,206],{"class":192},[78,488,196],{"class":188},[78,490,491],{"class":192}," EmailMessage\n",[78,493,494],{"class":80,"line":109},[78,495,122],{"emptyLinePlaceholder":30},[78,497,498,501,503,506],{"class":80,"line":119},[78,499,500],{"class":192},"message ",[78,502,235],{"class":214},[78,504,505],{"class":238}," EmailMessage",[78,507,241],{"class":214},[78,509,510,513,515,517,520,522],{"class":80,"line":125},[78,511,512],{"class":246},"    subject",[78,514,235],{"class":214},[78,516,252],{"class":214},[78,518,519],{"class":88},"Welcome!",[78,521,252],{"class":214},[78,523,260],{"class":214},[78,525,526,529,531,533,536,538],{"class":80,"line":131},[78,527,528],{"class":246},"    body",[78,530,235],{"class":214},[78,532,252],{"class":214},[78,534,535],{"class":88},"Thanks for signing up.",[78,537,252],{"class":214},[78,539,260],{"class":214},[78,541,542,545,547,549,552,554],{"class":80,"line":141},[78,543,544],{"class":246},"    to",[78,546,323],{"class":214},[78,548,252],{"class":214},[78,550,551],{"class":88},"user@example.com",[78,553,252],{"class":214},[78,555,556],{"class":214},"],\n",[78,558,559],{"class":80,"line":146},[78,560,298],{"class":214},[78,562,563],{"class":80,"line":43},[78,564,122],{"emptyLinePlaceholder":30},[78,566,567,570,573,576,579,582,585,588,591],{"class":80,"line":295},[78,568,569],{"class":188},"async",[78,571,572],{"class":188}," with",[78,574,575],{"class":192}," config",[78,577,578],{"class":214},".",[78,580,581],{"class":238},"provide_service",[78,583,584],{"class":214},"()",[78,586,587],{"class":188}," as",[78,589,590],{"class":192}," mailer",[78,592,593],{"class":214},":\n",[78,595,596,599,601,603,606,608,611],{"class":80,"line":301},[78,597,598],{"class":188},"    await",[78,600,590],{"class":192},[78,602,578],{"class":214},[78,604,605],{"class":238},"send_message",[78,607,317],{"class":214},[78,609,610],{"class":238},"message",[78,612,298],{"class":214},[59,614,615,616,619,620,623,624,627],{},"If ",[75,617,618],{},"message.from_email"," is omitted, the service uses ",[75,621,622],{},"config.from_email"," and\n",[75,625,626],{},"config.from_name"," as defaults.",[472,629,631],{"id":630},"dependency-injection","Dependency Injection",[59,633,634,635,638],{},"The plugin registers a ",[75,636,637],{},"mailer"," dependency for handlers by default:",[68,640,642],{"className":179,"code":641,"language":181,"meta":73,"style":73},"from litestar import get\nfrom litestar_email import EmailMessage, EmailService\n\n@get(\"/welcome/{email:str}\")\nasync def send_welcome(email: str, mailer: EmailService) -> dict[str, str]:\n    message = EmailMessage(\n        subject=\"Welcome!\",\n        body=\"Thanks for signing up.\",\n        to=[email],\n    )\n    await mailer.send_message(message)\n    return {\"status\": \"sent\"}\n",[75,643,644,655,670,674,703,754,765,780,795,806,811,827],{"__ignoreMap":73},[78,645,646,648,650,652],{"class":80,"line":81},[78,647,189],{"class":188},[78,649,193],{"class":192},[78,651,196],{"class":188},[78,653,654],{"class":192}," get\n",[78,656,657,659,661,663,665,667],{"class":80,"line":109},[78,658,189],{"class":188},[78,660,206],{"class":192},[78,662,196],{"class":188},[78,664,505],{"class":192},[78,666,215],{"class":214},[78,668,669],{"class":192}," EmailService\n",[78,671,672],{"class":80,"line":119},[78,673,122],{"emptyLinePlaceholder":30},[78,675,676,679,682,684,686,689,692,696,699,701],{"class":80,"line":125},[78,677,678],{"class":214},"@",[78,680,681],{"class":238},"get",[78,683,317],{"class":214},[78,685,252],{"class":214},[78,687,688],{"class":88},"/welcome/",[78,690,691],{"class":413},"{email",[78,693,695],{"class":694},"smZ93",":",[78,697,698],{"class":413},"str}",[78,700,252],{"class":214},[78,702,298],{"class":214},[78,704,705,707,710,713,715,718,720,723,725,727,729,732,735,738,741,744,747,749,751],{"class":80,"line":131},[78,706,569],{"class":694},[78,708,709],{"class":694}," def",[78,711,712],{"class":238}," send_welcome",[78,714,317],{"class":214},[78,716,717],{"class":246},"email",[78,719,695],{"class":214},[78,721,722],{"class":84}," str",[78,724,215],{"class":214},[78,726,590],{"class":246},[78,728,695],{"class":214},[78,730,731],{"class":192}," EmailService",[78,733,734],{"class":214},")",[78,736,737],{"class":214}," ->",[78,739,740],{"class":192}," dict",[78,742,743],{"class":214},"[",[78,745,746],{"class":84},"str",[78,748,215],{"class":214},[78,750,722],{"class":84},[78,752,753],{"class":214},"]:\n",[78,755,756,759,761,763],{"class":80,"line":141},[78,757,758],{"class":192},"    message ",[78,760,235],{"class":214},[78,762,505],{"class":238},[78,764,241],{"class":214},[78,766,767,770,772,774,776,778],{"class":80,"line":146},[78,768,769],{"class":246},"        subject",[78,771,235],{"class":214},[78,773,252],{"class":214},[78,775,519],{"class":88},[78,777,252],{"class":214},[78,779,260],{"class":214},[78,781,782,785,787,789,791,793],{"class":80,"line":43},[78,783,784],{"class":246},"        body",[78,786,235],{"class":214},[78,788,252],{"class":214},[78,790,535],{"class":88},[78,792,252],{"class":214},[78,794,260],{"class":214},[78,796,797,800,802,804],{"class":80,"line":295},[78,798,799],{"class":246},"        to",[78,801,323],{"class":214},[78,803,717],{"class":238},[78,805,556],{"class":214},[78,807,808],{"class":80,"line":301},[78,809,810],{"class":214},"    )\n",[78,812,813,815,817,819,821,823,825],{"class":80,"line":306},[78,814,598],{"class":188},[78,816,590],{"class":192},[78,818,578],{"class":214},[78,820,605],{"class":238},[78,822,317],{"class":214},[78,824,610],{"class":238},[78,826,298],{"class":214},[78,828,830,833,836,838,841,843,845,848,851,853],{"class":80,"line":829},12,[78,831,832],{"class":188},"    return",[78,834,835],{"class":214}," {",[78,837,252],{"class":214},[78,839,840],{"class":88},"status",[78,842,252],{"class":214},[78,844,695],{"class":214},[78,846,847],{"class":214}," \"",[78,849,850],{"class":88},"sent",[78,852,252],{"class":214},[78,854,855],{"class":214},"}\n",[59,857,858],{},"This works for both router handlers and controller methods the same way, since the dependency is registered on the app.",[59,860,861,862,865,866,869],{},"If you need a service outside of Litestar (e.g., for a worker), use\n",[75,863,864],{},"config.get_service()"," for a one-off instance or ",[75,867,868],{},"config.provide_service()","\nfor batch sending.",[472,871,873],{"id":872},"events-and-listeners","Events and Listeners",[59,875,876],{},"Event listeners in Litestar execute outside request context and cannot receive\nDI-injected dependencies. Pass the mailer explicitly:",[68,878,880],{"className":179,"code":879,"language":181,"meta":73,"style":73},"from litestar import Litestar, get\nfrom litestar.events import listener\nfrom litestar_email import EmailConfig, EmailMessage, EmailPlugin, EmailService, SMTPConfig\n\nconfig = EmailConfig(\n    backend=SMTPConfig(host=\"localhost\", port=1025),\n    from_email=\"noreply@example.com\",\n    from_name=\"My App\",\n)\n\n@get(\"/register/{email:str}\")\nasync def register(email: str, mailer: EmailService) -> dict[str, str]:\n    # Pass the DI-injected mailer to the event\n    request.app.emit(\"user.registered\", email, mailer=mailer)\n    return {\"status\": \"queued\"}\n\n@listener(\"user.registered\")\nasync def on_user_registered(email: str, mailer: EmailService) -> None:\n    # mailer is passed explicitly from emit(), not injected via DI\n    await mailer.send_message(\n        EmailMessage(subject=\"Welcome!\", body=\"Thanks for signing up.\", to=[email]),\n    )\n\napp = Litestar(\n    plugins=[EmailPlugin(config=config)],\n    listeners=[on_user_registered],\n)\n",[75,881,882,896,913,939,943,953,986,1000,1014,1018,1022,1045,1086,1092,1133,1157,1162,1180,1213,1219,1232,1276,1281,1286,1297,1318,1331],{"__ignoreMap":73},[78,883,884,886,888,890,892,894],{"class":80,"line":81},[78,885,189],{"class":188},[78,887,193],{"class":192},[78,889,196],{"class":188},[78,891,314],{"class":192},[78,893,215],{"class":214},[78,895,654],{"class":192},[78,897,898,900,903,905,908,910],{"class":80,"line":109},[78,899,189],{"class":188},[78,901,902],{"class":192}," litestar",[78,904,578],{"class":214},[78,906,907],{"class":192},"events ",[78,909,196],{"class":188},[78,911,912],{"class":192}," listener\n",[78,914,915,917,919,921,923,925,927,929,931,933,935,937],{"class":80,"line":119},[78,916,189],{"class":188},[78,918,206],{"class":192},[78,920,196],{"class":188},[78,922,211],{"class":192},[78,924,215],{"class":214},[78,926,505],{"class":192},[78,928,215],{"class":214},[78,930,361],{"class":192},[78,932,215],{"class":214},[78,934,731],{"class":192},[78,936,215],{"class":214},[78,938,366],{"class":192},[78,940,941],{"class":80,"line":125},[78,942,122],{"emptyLinePlaceholder":30},[78,944,945,947,949,951],{"class":80,"line":131},[78,946,232],{"class":192},[78,948,235],{"class":214},[78,950,211],{"class":238},[78,952,241],{"class":214},[78,954,955,957,959,961,963,965,967,969,972,974,976,978,980,983],{"class":80,"line":141},[78,956,247],{"class":246},[78,958,235],{"class":214},[78,960,389],{"class":238},[78,962,317],{"class":214},[78,964,394],{"class":246},[78,966,235],{"class":214},[78,968,252],{"class":214},[78,970,971],{"class":88},"localhost",[78,973,252],{"class":214},[78,975,215],{"class":214},[78,977,408],{"class":246},[78,979,235],{"class":214},[78,981,982],{"class":413},"1025",[78,984,985],{"class":214},"),\n",[78,987,988,990,992,994,996,998],{"class":80,"line":146},[78,989,265],{"class":246},[78,991,235],{"class":214},[78,993,252],{"class":214},[78,995,272],{"class":88},[78,997,252],{"class":214},[78,999,260],{"class":214},[78,1001,1002,1004,1006,1008,1010,1012],{"class":80,"line":43},[78,1003,281],{"class":246},[78,1005,235],{"class":214},[78,1007,252],{"class":214},[78,1009,288],{"class":88},[78,1011,252],{"class":214},[78,1013,260],{"class":214},[78,1015,1016],{"class":80,"line":295},[78,1017,298],{"class":214},[78,1019,1020],{"class":80,"line":301},[78,1021,122],{"emptyLinePlaceholder":30},[78,1023,1024,1026,1028,1030,1032,1035,1037,1039,1041,1043],{"class":80,"line":306},[78,1025,678],{"class":214},[78,1027,681],{"class":238},[78,1029,317],{"class":214},[78,1031,252],{"class":214},[78,1033,1034],{"class":88},"/register/",[78,1036,691],{"class":413},[78,1038,695],{"class":694},[78,1040,698],{"class":413},[78,1042,252],{"class":214},[78,1044,298],{"class":214},[78,1046,1047,1049,1051,1054,1056,1058,1060,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084],{"class":80,"line":829},[78,1048,569],{"class":694},[78,1050,709],{"class":694},[78,1052,1053],{"class":238}," register",[78,1055,317],{"class":214},[78,1057,717],{"class":246},[78,1059,695],{"class":214},[78,1061,722],{"class":84},[78,1063,215],{"class":214},[78,1065,590],{"class":246},[78,1067,695],{"class":214},[78,1069,731],{"class":192},[78,1071,734],{"class":214},[78,1073,737],{"class":214},[78,1075,740],{"class":192},[78,1077,743],{"class":214},[78,1079,746],{"class":84},[78,1081,215],{"class":214},[78,1083,722],{"class":84},[78,1085,753],{"class":214},[78,1087,1089],{"class":80,"line":1088},13,[78,1090,1091],{"class":105},"    # Pass the DI-injected mailer to the event\n",[78,1093,1095,1098,1100,1104,1106,1109,1111,1113,1116,1118,1120,1123,1125,1127,1129,1131],{"class":80,"line":1094},14,[78,1096,1097],{"class":192},"    request",[78,1099,578],{"class":214},[78,1101,1103],{"class":1102},"sRlkE","app",[78,1105,578],{"class":214},[78,1107,1108],{"class":238},"emit",[78,1110,317],{"class":214},[78,1112,252],{"class":214},[78,1114,1115],{"class":88},"user.registered",[78,1117,252],{"class":214},[78,1119,215],{"class":214},[78,1121,1122],{"class":238}," email",[78,1124,215],{"class":214},[78,1126,590],{"class":246},[78,1128,235],{"class":214},[78,1130,637],{"class":238},[78,1132,298],{"class":214},[78,1134,1136,1138,1140,1142,1144,1146,1148,1150,1153,1155],{"class":80,"line":1135},15,[78,1137,832],{"class":188},[78,1139,835],{"class":214},[78,1141,252],{"class":214},[78,1143,840],{"class":88},[78,1145,252],{"class":214},[78,1147,695],{"class":214},[78,1149,847],{"class":214},[78,1151,1152],{"class":88},"queued",[78,1154,252],{"class":214},[78,1156,855],{"class":214},[78,1158,1160],{"class":80,"line":1159},16,[78,1161,122],{"emptyLinePlaceholder":30},[78,1163,1165,1167,1170,1172,1174,1176,1178],{"class":80,"line":1164},17,[78,1166,678],{"class":214},[78,1168,1169],{"class":238},"listener",[78,1171,317],{"class":214},[78,1173,252],{"class":214},[78,1175,1115],{"class":88},[78,1177,252],{"class":214},[78,1179,298],{"class":214},[78,1181,1183,1185,1187,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210],{"class":80,"line":1182},18,[78,1184,569],{"class":694},[78,1186,709],{"class":694},[78,1188,1189],{"class":238}," on_user_registered",[78,1191,317],{"class":214},[78,1193,717],{"class":246},[78,1195,695],{"class":214},[78,1197,722],{"class":84},[78,1199,215],{"class":214},[78,1201,590],{"class":246},[78,1203,695],{"class":214},[78,1205,731],{"class":192},[78,1207,734],{"class":214},[78,1209,737],{"class":214},[78,1211,1212],{"class":214}," None:\n",[78,1214,1216],{"class":80,"line":1215},19,[78,1217,1218],{"class":105},"    # mailer is passed explicitly from emit(), not injected via DI\n",[78,1220,1222,1224,1226,1228,1230],{"class":80,"line":1221},20,[78,1223,598],{"class":188},[78,1225,590],{"class":192},[78,1227,578],{"class":214},[78,1229,605],{"class":238},[78,1231,241],{"class":214},[78,1233,1235,1238,1240,1243,1245,1247,1249,1251,1253,1256,1258,1260,1262,1264,1266,1269,1271,1273],{"class":80,"line":1234},21,[78,1236,1237],{"class":238},"        EmailMessage",[78,1239,317],{"class":214},[78,1241,1242],{"class":246},"subject",[78,1244,235],{"class":214},[78,1246,252],{"class":214},[78,1248,519],{"class":88},[78,1250,252],{"class":214},[78,1252,215],{"class":214},[78,1254,1255],{"class":246}," body",[78,1257,235],{"class":214},[78,1259,252],{"class":214},[78,1261,535],{"class":88},[78,1263,252],{"class":214},[78,1265,215],{"class":214},[78,1267,1268],{"class":246}," to",[78,1270,323],{"class":214},[78,1272,717],{"class":238},[78,1274,1275],{"class":214},"]),\n",[78,1277,1279],{"class":80,"line":1278},22,[78,1280,810],{"class":214},[78,1282,1284],{"class":80,"line":1283},23,[78,1285,122],{"emptyLinePlaceholder":30},[78,1287,1289,1291,1293,1295],{"class":80,"line":1288},24,[78,1290,309],{"class":192},[78,1292,235],{"class":214},[78,1294,314],{"class":238},[78,1296,241],{"class":214},[78,1298,1300,1303,1305,1307,1309,1311,1313,1315],{"class":80,"line":1299},25,[78,1301,1302],{"class":246},"    plugins",[78,1304,323],{"class":214},[78,1306,326],{"class":238},[78,1308,317],{"class":214},[78,1310,331],{"class":246},[78,1312,235],{"class":214},[78,1314,331],{"class":238},[78,1316,1317],{"class":214},")],\n",[78,1319,1321,1324,1326,1329],{"class":80,"line":1320},26,[78,1322,1323],{"class":246},"    listeners",[78,1325,323],{"class":214},[78,1327,1328],{"class":238},"on_user_registered",[78,1330,556],{"class":214},[78,1332,1334],{"class":80,"line":1333},27,[78,1335,298],{"class":214},[59,1337,1338,1339,1342,1343,1346,1347,578],{},"You can override the dependency and state keys via ",[75,1340,1341],{},"EmailConfig"," if needed:\n",[75,1344,1345],{},"email_service_dependency_key=\"email_service\""," and ",[75,1348,1349],{},"email_service_state_key=\"email_service\"",[472,1351,1353],{"id":1352},"standalone-no-litestar","Standalone (No Litestar)",[59,1355,1356],{},"Use the config helpers directly without Litestar:",[68,1358,1360],{"className":179,"code":1359,"language":181,"meta":73,"style":73},"from litestar_email import EmailConfig, EmailMessage, SMTPConfig\n\nconfig = EmailConfig(\n    backend=SMTPConfig(host=\"localhost\", port=1025),\n    from_email=\"noreply@example.com\",\n)\nmessage = EmailMessage(\n    subject=\"Hello!\",\n    body=\"This is a standalone send.\",\n    to=[\"user@example.com\"],\n)\n\nasync with config.provide_service() as mailer:\n    await mailer.send_message(message)\n",[75,1361,1362,1380,1384,1394,1424,1438,1442,1452,1467,1482,1496,1500,1504,1524],{"__ignoreMap":73},[78,1363,1364,1366,1368,1370,1372,1374,1376,1378],{"class":80,"line":81},[78,1365,189],{"class":188},[78,1367,206],{"class":192},[78,1369,196],{"class":188},[78,1371,211],{"class":192},[78,1373,215],{"class":214},[78,1375,505],{"class":192},[78,1377,215],{"class":214},[78,1379,366],{"class":192},[78,1381,1382],{"class":80,"line":109},[78,1383,122],{"emptyLinePlaceholder":30},[78,1385,1386,1388,1390,1392],{"class":80,"line":119},[78,1387,232],{"class":192},[78,1389,235],{"class":214},[78,1391,211],{"class":238},[78,1393,241],{"class":214},[78,1395,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422],{"class":80,"line":125},[78,1397,247],{"class":246},[78,1399,235],{"class":214},[78,1401,389],{"class":238},[78,1403,317],{"class":214},[78,1405,394],{"class":246},[78,1407,235],{"class":214},[78,1409,252],{"class":214},[78,1411,971],{"class":88},[78,1413,252],{"class":214},[78,1415,215],{"class":214},[78,1417,408],{"class":246},[78,1419,235],{"class":214},[78,1421,982],{"class":413},[78,1423,985],{"class":214},[78,1425,1426,1428,1430,1432,1434,1436],{"class":80,"line":131},[78,1427,265],{"class":246},[78,1429,235],{"class":214},[78,1431,252],{"class":214},[78,1433,272],{"class":88},[78,1435,252],{"class":214},[78,1437,260],{"class":214},[78,1439,1440],{"class":80,"line":141},[78,1441,298],{"class":214},[78,1443,1444,1446,1448,1450],{"class":80,"line":146},[78,1445,500],{"class":192},[78,1447,235],{"class":214},[78,1449,505],{"class":238},[78,1451,241],{"class":214},[78,1453,1454,1456,1458,1460,1463,1465],{"class":80,"line":43},[78,1455,512],{"class":246},[78,1457,235],{"class":214},[78,1459,252],{"class":214},[78,1461,1462],{"class":88},"Hello!",[78,1464,252],{"class":214},[78,1466,260],{"class":214},[78,1468,1469,1471,1473,1475,1478,1480],{"class":80,"line":295},[78,1470,528],{"class":246},[78,1472,235],{"class":214},[78,1474,252],{"class":214},[78,1476,1477],{"class":88},"This is a standalone send.",[78,1479,252],{"class":214},[78,1481,260],{"class":214},[78,1483,1484,1486,1488,1490,1492,1494],{"class":80,"line":301},[78,1485,544],{"class":246},[78,1487,323],{"class":214},[78,1489,252],{"class":214},[78,1491,551],{"class":88},[78,1493,252],{"class":214},[78,1495,556],{"class":214},[78,1497,1498],{"class":80,"line":306},[78,1499,298],{"class":214},[78,1501,1502],{"class":80,"line":829},[78,1503,122],{"emptyLinePlaceholder":30},[78,1505,1506,1508,1510,1512,1514,1516,1518,1520,1522],{"class":80,"line":1088},[78,1507,569],{"class":188},[78,1509,572],{"class":188},[78,1511,575],{"class":192},[78,1513,578],{"class":214},[78,1515,581],{"class":238},[78,1517,584],{"class":214},[78,1519,587],{"class":188},[78,1521,590],{"class":192},[78,1523,593],{"class":214},[78,1525,1526,1528,1530,1532,1534,1536,1538],{"class":80,"line":1094},[78,1527,598],{"class":188},[78,1529,590],{"class":192},[78,1531,578],{"class":214},[78,1533,605],{"class":238},[78,1535,317],{"class":214},[78,1537,610],{"class":238},[78,1539,298],{"class":214},[59,1541,1542],{},"For batch sends, use the context manager to reuse the connection:",[68,1544,1546],{"className":179,"code":1545,"language":181,"meta":73,"style":73},"async with config.provide_service() as mailer:\n    await mailer.send_messages([message1, message2, message3])\n",[75,1547,1548,1568],{"__ignoreMap":73},[78,1549,1550,1552,1554,1556,1558,1560,1562,1564,1566],{"class":80,"line":81},[78,1551,569],{"class":188},[78,1553,572],{"class":188},[78,1555,575],{"class":192},[78,1557,578],{"class":214},[78,1559,581],{"class":238},[78,1561,584],{"class":214},[78,1563,587],{"class":188},[78,1565,590],{"class":192},[78,1567,593],{"class":214},[78,1569,1570,1572,1574,1576,1579,1582,1585,1587,1590,1592,1595],{"class":80,"line":109},[78,1571,598],{"class":188},[78,1573,590],{"class":192},[78,1575,578],{"class":214},[78,1577,1578],{"class":238},"send_messages",[78,1580,1581],{"class":214},"([",[78,1583,1584],{"class":238},"message1",[78,1586,215],{"class":214},[78,1588,1589],{"class":238}," message2",[78,1591,215],{"class":214},[78,1593,1594],{"class":238}," message3",[78,1596,1597],{"class":214},"])\n",[472,1599,1601],{"id":1600},"html-email","HTML Email",[68,1603,1605],{"className":179,"code":1604,"language":181,"meta":73,"style":73},"from litestar_email import EmailMultiAlternatives\n\nmessage = EmailMultiAlternatives(\n    subject=\"Welcome!\",\n    body=\"Thanks for signing up.\",  # Plain text fallback\n    html_body=\"\u003Ch1>Welcome!\u003C/h1>\u003Cp>Thanks for signing up.\u003C/p>\",\n    to=[\"user@example.com\"],\n)\n",[75,1606,1607,1618,1622,1633,1647,1664,1680,1694],{"__ignoreMap":73},[78,1608,1609,1611,1613,1615],{"class":80,"line":81},[78,1610,189],{"class":188},[78,1612,206],{"class":192},[78,1614,196],{"class":188},[78,1616,1617],{"class":192}," EmailMultiAlternatives\n",[78,1619,1620],{"class":80,"line":109},[78,1621,122],{"emptyLinePlaceholder":30},[78,1623,1624,1626,1628,1631],{"class":80,"line":119},[78,1625,500],{"class":192},[78,1627,235],{"class":214},[78,1629,1630],{"class":238}," EmailMultiAlternatives",[78,1632,241],{"class":214},[78,1634,1635,1637,1639,1641,1643,1645],{"class":80,"line":125},[78,1636,512],{"class":246},[78,1638,235],{"class":214},[78,1640,252],{"class":214},[78,1642,519],{"class":88},[78,1644,252],{"class":214},[78,1646,260],{"class":214},[78,1648,1649,1651,1653,1655,1657,1659,1661],{"class":80,"line":131},[78,1650,528],{"class":246},[78,1652,235],{"class":214},[78,1654,252],{"class":214},[78,1656,535],{"class":88},[78,1658,252],{"class":214},[78,1660,215],{"class":214},[78,1662,1663],{"class":105},"  # Plain text fallback\n",[78,1665,1666,1669,1671,1673,1676,1678],{"class":80,"line":141},[78,1667,1668],{"class":246},"    html_body",[78,1670,235],{"class":214},[78,1672,252],{"class":214},[78,1674,1675],{"class":88},"\u003Ch1>Welcome!\u003C/h1>\u003Cp>Thanks for signing up.\u003C/p>",[78,1677,252],{"class":214},[78,1679,260],{"class":214},[78,1681,1682,1684,1686,1688,1690,1692],{"class":80,"line":146},[78,1683,544],{"class":246},[78,1685,323],{"class":214},[78,1687,252],{"class":214},[78,1689,551],{"class":88},[78,1691,252],{"class":214},[78,1693,556],{"class":214},[78,1695,1696],{"class":80,"line":43},[78,1697,298],{"class":214},[63,1699,1701],{"id":1700},"available-backends","Available Backends",[1703,1704,1705,1721],"table",{},[1706,1707,1708],"thead",{},[1709,1710,1711,1715,1718],"tr",{},[1712,1713,1714],"th",{},"Backend",[1712,1716,1717],{},"Config Class",[1712,1719,1720],{},"Use Case",[1722,1723,1724,1737,1749,1763,1778,1793],"tbody",{},[1709,1725,1726,1731,1734],{},[1727,1728,1729],"td",{},[75,1730,255],{},[1727,1732,1733],{},"-",[1727,1735,1736],{},"Development (prints to stdout)",[1709,1738,1739,1744,1746],{},[1727,1740,1741],{},[75,1742,1743],{},"memory",[1727,1745,1733],{},[1727,1747,1748],{},"Testing (stores in memory)",[1709,1750,1751,1756,1760],{},[1727,1752,1753],{},[75,1754,1755],{},"smtp",[1727,1757,1758],{},[75,1759,389],{},[1727,1761,1762],{},"Production SMTP servers",[1709,1764,1765,1770,1775],{},[1727,1766,1767],{},[75,1768,1769],{},"resend",[1727,1771,1772],{},[75,1773,1774],{},"ResendConfig",[1727,1776,1777],{},"Resend HTTP API",[1709,1779,1780,1785,1790],{},[1727,1781,1782],{},[75,1783,1784],{},"sendgrid",[1727,1786,1787],{},[75,1788,1789],{},"SendGridConfig",[1727,1791,1792],{},"SendGrid HTTP API",[1709,1794,1795,1800,1805],{},[1727,1796,1797],{},[75,1798,1799],{},"mailgun",[1727,1801,1802],{},[75,1803,1804],{},"MailgunConfig",[1727,1806,1807],{},"Mailgun HTTP API",[59,1809,1810],{},"API backends (Resend, SendGrid, Mailgun) support configurable HTTP transports:",[68,1812,1814],{"className":179,"code":1813,"language":181,"meta":73,"style":73},"from litestar_email import ResendConfig\n\n# Default: uses httpx (bundled with Litestar)\nconfig = ResendConfig(api_key=\"re_xxx...\")\n\n# Alternative: use aiohttp\nconfig = ResendConfig(api_key=\"re_xxx...\", http_transport=\"aiohttp\")\n",[75,1815,1816,1827,1831,1836,1861,1865,1870],{"__ignoreMap":73},[78,1817,1818,1820,1822,1824],{"class":80,"line":81},[78,1819,189],{"class":188},[78,1821,206],{"class":192},[78,1823,196],{"class":188},[78,1825,1826],{"class":192}," ResendConfig\n",[78,1828,1829],{"class":80,"line":109},[78,1830,122],{"emptyLinePlaceholder":30},[78,1832,1833],{"class":80,"line":119},[78,1834,1835],{"class":105},"# Default: uses httpx (bundled with Litestar)\n",[78,1837,1838,1840,1842,1845,1847,1850,1852,1854,1857,1859],{"class":80,"line":125},[78,1839,232],{"class":192},[78,1841,235],{"class":214},[78,1843,1844],{"class":238}," ResendConfig",[78,1846,317],{"class":214},[78,1848,1849],{"class":246},"api_key",[78,1851,235],{"class":214},[78,1853,252],{"class":214},[78,1855,1856],{"class":88},"re_xxx...",[78,1858,252],{"class":214},[78,1860,298],{"class":214},[78,1862,1863],{"class":80,"line":131},[78,1864,122],{"emptyLinePlaceholder":30},[78,1866,1867],{"class":80,"line":141},[78,1868,1869],{"class":105},"# Alternative: use aiohttp\n",[78,1871,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1895,1897,1899,1902,1904],{"class":80,"line":146},[78,1873,232],{"class":192},[78,1875,235],{"class":214},[78,1877,1844],{"class":238},[78,1879,317],{"class":214},[78,1881,1849],{"class":246},[78,1883,235],{"class":214},[78,1885,252],{"class":214},[78,1887,1856],{"class":88},[78,1889,252],{"class":214},[78,1891,215],{"class":214},[78,1893,1894],{"class":246}," http_transport",[78,1896,235],{"class":214},[78,1898,252],{"class":214},[78,1900,1901],{"class":88},"aiohttp",[78,1903,252],{"class":214},[78,1905,298],{"class":214},[63,1907,1909],{"id":1908},"testing","Testing",[59,1911,1912,1913,1916],{},"The ",[75,1914,1915],{},"InMemoryBackend"," is designed for testing:",[68,1918,1920],{"className":179,"code":1919,"language":181,"meta":73,"style":73},"from litestar_email.backends import InMemoryBackend\n\ndef test_sends_welcome_email():\n    InMemoryBackend.clear()\n\n    # ... code that sends email ...\n\n    assert len(InMemoryBackend.outbox) == 1\n    assert InMemoryBackend.outbox[0].subject == \"Welcome!\"\n",[75,1921,1922,1939,1943,1954,1967,1971,1976,1980,2005],{"__ignoreMap":73},[78,1923,1924,1926,1929,1931,1934,1936],{"class":80,"line":81},[78,1925,189],{"class":188},[78,1927,1928],{"class":192}," litestar_email",[78,1930,578],{"class":214},[78,1932,1933],{"class":192},"backends ",[78,1935,196],{"class":188},[78,1937,1938],{"class":192}," InMemoryBackend\n",[78,1940,1941],{"class":80,"line":109},[78,1942,122],{"emptyLinePlaceholder":30},[78,1944,1945,1948,1951],{"class":80,"line":119},[78,1946,1947],{"class":694},"def",[78,1949,1950],{"class":238}," test_sends_welcome_email",[78,1952,1953],{"class":214},"():\n",[78,1955,1956,1959,1961,1964],{"class":80,"line":125},[78,1957,1958],{"class":192},"    InMemoryBackend",[78,1960,578],{"class":214},[78,1962,1963],{"class":238},"clear",[78,1965,1966],{"class":214},"()\n",[78,1968,1969],{"class":80,"line":131},[78,1970,122],{"emptyLinePlaceholder":30},[78,1972,1973],{"class":80,"line":141},[78,1974,1975],{"class":105},"    # ... code that sends email ...\n",[78,1977,1978],{"class":80,"line":146},[78,1979,122],{"emptyLinePlaceholder":30},[78,1981,1982,1985,1988,1990,1992,1994,1997,1999,2002],{"class":80,"line":43},[78,1983,1984],{"class":188},"    assert",[78,1986,1987],{"class":238}," len",[78,1989,317],{"class":214},[78,1991,1915],{"class":238},[78,1993,578],{"class":214},[78,1995,1996],{"class":1102},"outbox",[78,1998,734],{"class":214},[78,2000,2001],{"class":214}," ==",[78,2003,2004],{"class":413}," 1\n",[78,2006,2007,2009,2012,2014,2016,2018,2021,2024,2026,2028,2030,2032],{"class":80,"line":295},[78,2008,1984],{"class":188},[78,2010,2011],{"class":192}," InMemoryBackend",[78,2013,578],{"class":214},[78,2015,1996],{"class":1102},[78,2017,743],{"class":214},[78,2019,2020],{"class":413},"0",[78,2022,2023],{"class":214},"].",[78,2025,1242],{"class":1102},[78,2027,2001],{"class":214},[78,2029,847],{"class":214},[78,2031,519],{"class":88},[78,2033,2034],{"class":214},"\"\n",[59,2036,2037,2038,695],{},"If you need direct backend access in tests, use ",[75,2039,2040],{},"config.get_backend()",[68,2042,2044],{"className":179,"code":2043,"language":181,"meta":73,"style":73},"from litestar_email import EmailConfig, EmailMessage\n\nconfig = EmailConfig(backend=\"memory\")\nbackend = config.get_backend()\n\nmessage = EmailMessage(subject=\"Hello\", body=\"Body\", to=[\"user@example.com\"])\nawait backend.send_messages([message])\n",[75,2045,2046,2060,2064,2087,2103,2107,2155],{"__ignoreMap":73},[78,2047,2048,2050,2052,2054,2056,2058],{"class":80,"line":81},[78,2049,189],{"class":188},[78,2051,206],{"class":192},[78,2053,196],{"class":188},[78,2055,211],{"class":192},[78,2057,215],{"class":214},[78,2059,491],{"class":192},[78,2061,2062],{"class":80,"line":109},[78,2063,122],{"emptyLinePlaceholder":30},[78,2065,2066,2068,2070,2072,2074,2077,2079,2081,2083,2085],{"class":80,"line":119},[78,2067,232],{"class":192},[78,2069,235],{"class":214},[78,2071,211],{"class":238},[78,2073,317],{"class":214},[78,2075,2076],{"class":246},"backend",[78,2078,235],{"class":214},[78,2080,252],{"class":214},[78,2082,1743],{"class":88},[78,2084,252],{"class":214},[78,2086,298],{"class":214},[78,2088,2089,2092,2094,2096,2098,2101],{"class":80,"line":125},[78,2090,2091],{"class":192},"backend ",[78,2093,235],{"class":214},[78,2095,575],{"class":192},[78,2097,578],{"class":214},[78,2099,2100],{"class":238},"get_backend",[78,2102,1966],{"class":214},[78,2104,2105],{"class":80,"line":131},[78,2106,122],{"emptyLinePlaceholder":30},[78,2108,2109,2111,2113,2115,2117,2119,2121,2123,2126,2128,2130,2132,2134,2136,2139,2141,2143,2145,2147,2149,2151,2153],{"class":80,"line":141},[78,2110,500],{"class":192},[78,2112,235],{"class":214},[78,2114,505],{"class":238},[78,2116,317],{"class":214},[78,2118,1242],{"class":246},[78,2120,235],{"class":214},[78,2122,252],{"class":214},[78,2124,2125],{"class":88},"Hello",[78,2127,252],{"class":214},[78,2129,215],{"class":214},[78,2131,1255],{"class":246},[78,2133,235],{"class":214},[78,2135,252],{"class":214},[78,2137,2138],{"class":88},"Body",[78,2140,252],{"class":214},[78,2142,215],{"class":214},[78,2144,1268],{"class":246},[78,2146,323],{"class":214},[78,2148,252],{"class":214},[78,2150,551],{"class":88},[78,2152,252],{"class":214},[78,2154,1597],{"class":214},[78,2156,2157,2160,2163,2165,2167,2169,2171],{"class":80,"line":146},[78,2158,2159],{"class":188},"await",[78,2161,2162],{"class":192}," backend",[78,2164,578],{"class":214},[78,2166,1578],{"class":238},[78,2168,1581],{"class":214},[78,2170,610],{"class":238},[78,2172,1597],{"class":214},[63,2174,2176],{"id":2175},"development","Development",[68,2178,2180],{"className":70,"code":2179,"language":72,"meta":73,"style":73},"make install    # Install dependencies\nmake test       # Run tests\nmake lint       # Run linting\nmake check-all  # Run all checks\n",[75,2181,2182,2192,2202,2212],{"__ignoreMap":73},[78,2183,2184,2187,2189],{"class":80,"line":81},[78,2185,2186],{"class":84},"make",[78,2188,89],{"class":88},[78,2190,2191],{"class":105},"    # Install dependencies\n",[78,2193,2194,2196,2199],{"class":80,"line":109},[78,2195,2186],{"class":84},[78,2197,2198],{"class":88}," test",[78,2200,2201],{"class":105},"       # Run tests\n",[78,2203,2204,2206,2209],{"class":80,"line":119},[78,2205,2186],{"class":84},[78,2207,2208],{"class":88}," lint",[78,2210,2211],{"class":105},"       # Run linting\n",[78,2213,2214,2216,2219],{"class":80,"line":125},[78,2215,2186],{"class":84},[78,2217,2218],{"class":88}," check-all",[78,2220,2221],{"class":105},"  # Run all checks\n",[63,2223,2225],{"id":2224},"license","License",[59,2227,2228],{},"MIT",[2230,2231,2232],"style",{},"html pre.shiki code .s52Pk, html code.shiki .s52Pk{--shiki-light:#E2931D;--shiki-default:#E2931D;--shiki-dark:#FFCB6B}html pre.shiki code .sGFVr, html code.shiki .sGFVr{--shiki-light:#91B859;--shiki-default:#91B859;--shiki-dark:#C3E88D}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);}html pre.shiki code .sWuyu, html code.shiki .sWuyu{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s8R28, html code.shiki .s8R28{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#39ADB5;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sZSNi, html code.shiki .sZSNi{--shiki-light:#90A4AE;--shiki-default:#90A4AE;--shiki-dark:#BABED8}html pre.shiki code .sDfIl, html code.shiki .sDfIl{--shiki-light:#39ADB5;--shiki-default:#39ADB5;--shiki-dark:#89DDFF}html pre.shiki code .s3cPz, html code.shiki .s3cPz{--shiki-light:#6182B8;--shiki-default:#6182B8;--shiki-dark:#82AAFF}html pre.shiki code .s1nJG, html code.shiki .s1nJG{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sYRBq, html code.shiki .sYRBq{--shiki-light:#F76D47;--shiki-default:#F76D47;--shiki-dark:#F78C6C}html pre.shiki code .smZ93, html code.shiki .smZ93{--shiki-light:#9C3EDA;--shiki-default:#9C3EDA;--shiki-dark:#C792EA}html pre.shiki code .sRlkE, html code.shiki .sRlkE{--shiki-light:#E53935;--shiki-default:#E53935;--shiki-dark:#F07178}",{"title":73,"searchDepth":109,"depth":109,"links":2234},[2235,2236,2243,2244,2245,2246],{"id":65,"depth":109,"text":66},{"id":175,"depth":109,"text":176,"children":2237},[2238,2239,2240,2241,2242],{"id":474,"depth":119,"text":475},{"id":630,"depth":119,"text":631},{"id":872,"depth":119,"text":873},{"id":1352,"depth":119,"text":1353},{"id":1600,"depth":119,"text":1601},{"id":1700,"depth":109,"text":1701},{"id":1908,"depth":109,"text":1909},{"id":2175,"depth":109,"text":2176},{"id":2224,"depth":109,"text":2225},"readmes/litestar-email","40OeVx1njjJhqkkR_OEp2gkL9AbJMHfbUlfszqsPnXc",1769173971699]