{"id":"c2373a07-e409-4712-a647-2ac5931d3667","shortId":"ufZv7t","kind":"skill","title":"litestar-email","tagline":"Auto-activate for litestar_email imports, EmailPlugin, EmailConfig, EmailService, EmailMessage, SMTPConfig, ResendConfig, SendGridConfig, MailgunConfig, or InMemoryConfig. Use when sending transactional email from Litestar, choosing an email backend, testing email flows, or injec","description":"# litestar-email\n\n`litestar-email` provides a pluggable email-sending abstraction for Litestar. One config + plugin, swap backends without touching call sites.\n\nBackends:\n\n- `SMTPConfig` — generic SMTP via `aiosmtplib`\n- `ResendConfig` — Resend HTTP API\n- `SendGridConfig` — SendGrid HTTP API\n- `MailgunConfig` — Mailgun HTTP API\n- `InMemoryConfig` — for tests; captures messages in an `outbox` list\n\n## Code Style Rules\n\n- PEP 604 unions: `T | None`, never `Optional[T]`\n- Consumer Litestar app modules MAY use `from __future__ import annotations`\n- Async all I/O — `EmailService.send_message` is `async`\n\n## Quick Reference\n\n### Install\n\n```bash\npip install litestar-email\n# Optional extras for specific backends:\npip install litestar-email[resend]\npip install litestar-email[sendgrid]\npip install litestar-email[mailgun]\n```\n\n### Basic Setup\n\n```python\nfrom litestar import Litestar\nfrom litestar_email import EmailPlugin, EmailConfig, SMTPConfig\n\napp = Litestar(plugins=[EmailPlugin(config=EmailConfig(\n    backend=SMTPConfig(\n        host=\"smtp.example.com\",\n        port=587,\n        use_tls=True,\n        username=\"user@example.com\",\n        password=\"secret\",\n    ),\n    from_email=\"noreply@example.com\",\n    from_name=\"My App\",\n))])\n```\n\n### EmailConfig\n\n| Option | Type | Description |\n| --- | --- | --- |\n| `backend` | `BackendConfig` | One of `SMTPConfig`, `ResendConfig`, `SendGridConfig`, `MailgunConfig`, `InMemoryConfig` |\n| `from_email` | `str` | Default sender address |\n| `from_name` | `str \\| None` | Optional display name |\n\n### Backend Configs\n\n#### SMTPConfig\n\n```python\nfrom litestar_email import SMTPConfig\n\nSMTPConfig(\n    host=\"smtp.gmail.com\",\n    port=587,\n    use_tls=True,           # STARTTLS\n    use_ssl=False,          # Implicit SSL (port 465)\n    username=\"you@gmail.com\",\n    password=\"app-password\",\n    timeout=10,\n)\n```\n\n#### ResendConfig\n\n```python\nfrom litestar_email import ResendConfig\nResendConfig(api_key=\"re_xxxxxxxxxx\")\n```\n\n#### SendGridConfig\n\n```python\nfrom litestar_email import SendGridConfig\nSendGridConfig(api_key=\"SG.xxxxxxxxxx\")\n```\n\n#### MailgunConfig\n\n```python\nfrom litestar_email import MailgunConfig\nMailgunConfig(api_key=\"key-xxxxxxxxxx\", domain=\"mg.example.com\", region=\"us\")\n```\n\n#### InMemoryConfig (testing)\n\n```python\nfrom litestar_email import InMemoryConfig\nInMemoryConfig()\n# Stores sent messages in memory; inspect via email_service.outbox\n```\n\n### Dependency Injection\n\n`EmailPlugin.on_app_init` registers `EmailService` automatically.\n\n```python\nfrom litestar import post\nfrom litestar_email import EmailService, EmailMessage\n\n@post(\"/send-notification\")\nasync def send_notification(\n    email_service: EmailService,\n    data: NotificationRequest,\n) -> dict:\n    await email_service.send_message(EmailMessage(\n        to=[data.recipient],\n        subject=\"Notification\",\n        body=\"You have a new notification.\",\n        html_body=\"<p>You have a new notification.</p>\",\n    ))\n    return {\"sent\": True}\n```\n\n### EmailMessage\n\n```python\nfrom litestar_email import EmailMessage\n\nEmailMessage(\n    to=[\"recipient@example.com\"],         # required\n    subject=\"Hello\",                       # required\n    body=\"Plain text body\",                # optional\n    html_body=\"<p>HTML body</p>\",          # optional\n    cc=[\"cc@example.com\"],\n    bcc=[\"bcc@example.com\"],\n    reply_to=\"reply@example.com\",\n    from_email=\"override@example.com\",     # overrides EmailConfig default\n    from_name=\"Override Name\",\n    headers={\"X-Custom\": \"value\"},\n    attachments=[(\"/path/to/file.pdf\", \"application/pdf\")],\n)\n```\n\n### EmailMultiAlternatives\n\n```python\nfrom litestar_email import EmailMultiAlternatives\n\nmsg = EmailMultiAlternatives(\n    to=[\"user@example.com\"],\n    subject=\"Welcome\",\n    body=\"Welcome to our platform.\",\n)\nmsg.attach_alternative(\"<p>Welcome to our platform.</p>\", \"text/html\")\nawait email_service.send_message(msg)\n```\n\n### EmailService Methods\n\n| Method | Description |\n| --- | --- |\n| `send_message(msg)` | Send a single `EmailMessage` |\n| `send_messages(msgs)` | Batch send |\n\nBoth are `async`.\n\n### Connection Pooling (SMTP)\n\n```python\nasync with email_service as svc:\n    await svc.send_message(msg1)\n    await svc.send_message(msg2)\n```\n\n### Standalone Usage (no DI)\n\n```python\nfrom litestar_email import EmailConfig, SMTPConfig, EmailMessage\n\nconfig = EmailConfig(\n    backend=SMTPConfig(host=\"smtp.example.com\", port=587, use_tls=True),\n    from_email=\"noreply@example.com\",\n)\n\nasync def main():\n    async with config.provide_service() as email_service:\n        await email_service.send_message(EmailMessage(\n            to=[\"user@example.com\"], subject=\"Hello\", body=\"World\",\n        ))\n```\n\n### Templating\n\n`litestar-email` does not ship a templating engine. Use Litestar's Jinja2 integration to render `body` / `html_body` strings before constructing `EmailMessage`:\n\n```python\nfrom litestar.template import TemplateEngineProtocol\n\nasync def send_welcome(\n    email_service: EmailService,\n    template_engine: TemplateEngineProtocol,\n    user: User,\n) -> None:\n    html = template_engine.render(\"emails/welcome.html\", {\"user\": user})\n    text = template_engine.render(\"emails/welcome.txt\", {\"user\": user})\n    await email_service.send_message(EmailMessage(\n        to=[user.email],\n        subject=\"Welcome!\",\n        body=text,\n        html_body=html,\n    ))\n```\n\n<workflow>\n\n## Workflow\n\n### Step 1: Install + Pick Backend\n\n| Need | Backend |\n| --- | --- |\n| Generic SMTP / corporate mail | `SMTPConfig` |\n| Modern transactional API | `ResendConfig` (preferred for new projects) |\n| Existing SendGrid contract | `SendGridConfig` |\n| Mailgun account | `MailgunConfig` |\n| Any test environment | `InMemoryConfig` |\n\n### Step 2: Configure Plugin\n\nBuild `EmailConfig(backend=..., from_email=..., from_name=...)` and wrap in `EmailPlugin`. Add to `Litestar(plugins=[...])`.\n\n### Step 3: Inject EmailService\n\nIn handlers / services, declare `email_service: EmailService` parameter. Litestar's DI provides it.\n\n### Step 4: Construct EmailMessage\n\nUse `EmailMessage` for simple sends. Use `EmailMultiAlternatives` if you need multiple HTML parts. Render templates separately if needed.\n\n### Step 5: Background Send (recommended for slow ops)\n\nFor non-interactive flows, enqueue email sending via `litestar-saq` rather than blocking the request. See `../litestar-saq/SKILL.md`.\n\n```python\nawait task_queues.get(\"default\").enqueue(\n    \"send_welcome_email\",\n    user_id=user.id,\n    timeout=30,\n    retries=2,\n    key=f\"welcome-{user.id}\",\n)\n```\n\n### Step 6: Test with InMemoryConfig\n\nIn test config, swap `backend=InMemoryConfig()`. Assert against `email_service.outbox`.\n\n</workflow>\n\n<guardrails>\n\n## Guardrails\n\n- **Use `InMemoryConfig` in all test environments** — no real network calls; provides an `outbox` for assertions.\n- **Background-queue email sends** — use `litestar-saq` for transactional email. SMTP can be slow; blocking handlers degrades p99.\n- **Set `from_email` at the plugin level** — overriding per message is for exceptions, not the default.\n- **Use `Resend` or `SendGrid` for high-volume transactional** — direct SMTP scales poorly past ~100/s.\n- **Never log passwords/API keys** — sanitize `EmailConfig.backend` before structlog dumps.\n- **Validate recipient addresses at the API boundary** — invalid addresses cause backend errors and waste retries.\n- **Set timeouts** — `SMTPConfig.timeout` defaults are usually fine; tune if your SMTP host is slow.\n- **Don't ship `[resend]` / `[sendgrid]` extras you don't use** — they pull in HTTP client deps.\n\n</guardrails>\n\n<validation>\n\n### Validation Checkpoint\n\nBefore delivering email-sending code, verify:\n\n- [ ] `EmailPlugin` is in `app.plugins`\n- [ ] Backend is appropriate for env (`InMemoryConfig` in tests, real backend in dev/prod)\n- [ ] `from_email` is configured at the `EmailConfig` level\n- [ ] Handler injects `EmailService` via DI (no module-level instance)\n- [ ] `EmailMessage` is constructed with required `to` and `subject`\n- [ ] Slow / retry-able sends are queued via `litestar-saq` instead of blocking the request\n- [ ] Tests assert against `email_service.outbox`\n- [ ] Secrets (`password`, `api_key`) come from env / settings, not hard-coded\n\n</validation>\n\n<example>\n\n## Example\n\n**Task:** Welcome-email flow that queues a SAQ task to send via Resend; test asserts via InMemoryConfig.\n\n```python\n# app/config/email.py\nfrom litestar_email import EmailConfig, ResendConfig, InMemoryConfig\nfrom app.lib.settings import get_settings\n\ndef get_email_config() -> EmailConfig:\n    settings = get_settings()\n    if settings.env == \"test\":\n        return EmailConfig(backend=InMemoryConfig(), from_email=\"test@example.com\")\n    return EmailConfig(\n        backend=ResendConfig(api_key=settings.resend.api_key),\n        from_email=settings.email.from_email,\n        from_name=settings.email.from_name,\n    )\n```\n\n```python\n# app/server/plugins.py\nfrom litestar_email import EmailPlugin\nfrom app.config.email import get_email_config\n\nemail = EmailPlugin(config=get_email_config())\n```\n\n```python\n# app/domain/accounts/tasks.py\nfrom litestar_email import EmailMessage\n\nasync def send_welcome_email(ctx: dict, *, user_id: int, email: str, name: str) -> None:\n    \"\"\"Send welcome email as a SAQ background task.\"\"\"\n    email_service = ctx[\"state\"][\"email_service\"]\n    template_engine = ctx[\"state\"][\"template_engine\"]\n    html = template_engine.render(\"emails/welcome.html\", {\"name\": name})\n    await email_service.send_message(EmailMessage(\n        to=[email],\n        subject=f\"Welcome, {name}!\",\n        body=f\"Welcome, {name}!\",\n        html_body=html,\n    ))\n```\n\n```python\n# app/domain/accounts/controllers.py\nfrom litestar import Controller, post\nfrom litestar_saq import TaskQueues\n\nclass AccountController(Controller):\n    path = \"/api/accounts\"\n\n    @post(\"/\")\n    async def create_account(self, data: AccountCreate, task_queues: TaskQueues) -> Account:\n        user = await self.create(data)\n        await task_queues.get(\"default\").enqueue(\n            \"send_welcome_email\",\n            user_id=user.id, email=user.email, name=user.name,\n            timeout=30, retries=2, key=f\"welcome-{user.id}\",\n        )\n        return user\n```\n\n```python\n# tests/test_accounts.py\nasync def test_account_creation_queues_welcome_email(client, email_service):\n    resp = await client.post(\"/api/accounts\", json={\"email\": \"alice@example.com\", \"name\": \"Alice\"})\n    assert resp.status_code == 201\n    # After SAQ flush in test:\n    assert len(email_service.outbox) == 1\n    assert email_service.outbox[0].subject == \"Welcome, Alice!\"\n```\n\n</example>\n\n---\n\n## Cross-References\n\n- **[litestar](../litestar/SKILL.md)** — DI, plugin lifecycle.\n- **[litestar-saq](../litestar-saq/SKILL.md)** — Background-queue email sends.\n- **[litestar-testing](../litestar-testing/SKILL.md)** — Testing flows that send email.\n\n## Official References\n\n- <https://github.com/litestar-org/litestar-email>\n\n## Shared Styleguide Baseline\n\n- [General Principles](../litestar-styleguide/references/general.md)\n- [Python](../litestar-styleguide/references/python.md)\n- [Litestar](../litestar-styleguide/references/litestar.md)","tags":["litestar","email","skills","litestar-org","advanced-alchemy","agent-skills","agentskills","ai-agents","claude-code-plugin","claude-code-skills","gemini-cli-extension","htmx"],"capabilities":["skill","source-litestar-org","skill-litestar-email","topic-advanced-alchemy","topic-agent-skills","topic-agentskills","topic-ai-agents","topic-claude-code-plugin","topic-claude-code-skills","topic-gemini-cli-extension","topic-htmx","topic-inertia","topic-litestar","topic-mcp","topic-python"],"categories":["litestar-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/litestar-org/litestar-skills/litestar-email","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add litestar-org/litestar-skills","source_repo":"https://github.com/litestar-org/litestar-skills","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (11,158 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:53.786Z","embedding":null,"createdAt":"2026-05-18T13:20:57.185Z","updatedAt":"2026-05-18T19:13:53.786Z","lastSeenAt":"2026-05-18T19:13:53.786Z","tsv":"'/api/accounts':1105,1162 '/litestar-org/litestar-email':1217 '/litestar-saq/skill.md':701,1198 '/litestar-styleguide/references/general.md':1223 '/litestar-styleguide/references/litestar.md':1227 '/litestar-styleguide/references/python.md':1225 '/litestar-testing/skill.md':1207 '/litestar/skill.md':1191 '/path/to/file.pdf':406 '/send-notification':324 '0':1183 '1':587,1180 '10':246 '100/s':801 '2':618,716,1139 '201':1171 '3':637 '30':714,1137 '4':654 '465':238 '5':676 '587':173,227,493 '6':722 '604':92 'abl':910 'abstract':49 'account':611,1110,1117,1151 'accountcontrol':1102 'accountcr':1113 'activ':6 'add':632 'address':206,813,819 'aiosmtplib':66 'alic':1167,1186 'alice@example.com':1165 'altern':427 'annot':108 'api':70,74,78,255,267,278,600,816,929,994 'app':101,162,187,243,307 'app-password':242 'app.config.email':1014 'app.lib.settings':968 'app.plugins':868 'app/config/email.py':959 'app/domain/accounts/controllers.py':1090 'app/domain/accounts/tasks.py':1026 'app/server/plugins.py':1007 'application/pdf':407 'appropri':871 'assert':732,750,924,955,1168,1177,1181 'async':109,115,325,455,460,500,503,549,1032,1107,1148 'attach':405 'auto':5 'auto-activ':4 'automat':311 'await':335,433,466,470,510,572,703,1072,1119,1122,1160 'backend':31,56,61,129,168,192,214,488,590,592,623,730,821,869,878,985,992 'backendconfig':193 'background':677,752,1053,1200 'background-queu':751,1199 'baselin':1220 'bash':119 'basic':148 'batch':451 'bcc':385 'bcc@example.com':386 'block':697,767,920 'bodi':343,350,373,376,379,381,421,518,537,539,580,583,1082,1087 'boundari':817 'build':621 'call':59,745 'captur':82 'caus':820 'cc':383 'cc@example.com':384 'checkpoint':857 'choos':28 'class':1101 'client':854,1156 'client.post':1161 'code':88,863,938,1170 'come':931 'config':53,166,215,486,728,975,1018,1021,1024 'config.provide':505 'configur':619,884 'connect':456 'construct':542,655,901 'consum':99 'contract':608 'control':1094,1103 'corpor':595 'creat':1109 'creation':1152 'cross':1188 'cross-refer':1187 'ctx':1037,1057,1063 'custom':403 'data':332,1112,1121 'data.recipient':340 'declar':643 'def':326,501,550,972,1033,1108,1149 'default':204,395,705,786,829,1124 'degrad':769 'deliv':859 'dep':855 'depend':304 'descript':191,440 'dev/prod':880 'di':477,650,893,1192 'dict':334,1038 'direct':796 'display':212 'domain':283 'dump':810 'email':3,9,25,30,33,39,42,47,124,134,140,146,157,182,202,220,251,263,274,292,319,329,363,391,412,462,481,498,508,523,553,625,644,689,709,754,762,773,861,882,943,962,974,988,999,1001,1010,1017,1019,1023,1029,1036,1042,1049,1055,1059,1077,1128,1132,1155,1157,1164,1202,1212 'email-send':46,860 'email_service.outbox':303,734,926,1179,1182 'email_service.send':336,434,511,573,1073 'emailconfig':12,160,167,188,394,483,487,622,887,964,976,984,991 'emailconfig.backend':807 'emailmessag':14,322,338,359,365,366,447,485,513,543,575,656,658,899,1031,1075 'emailmultialtern':408,414,416,663 'emailplugin':11,159,165,631,865,1012,1020 'emailplugin.on':306 'emails/welcome.html':564,1069 'emails/welcome.txt':569 'emailservic':13,310,321,331,437,555,639,646,891 'emailservice.send':112 'engin':529,557,1062,1066 'enqueu':688,706,1125 'env':873,933 'environ':615,741 'error':822 'exampl':939 'except':783 'exist':606 'extra':126,845 'f':718,1079,1083,1141 'fals':234 'fine':832 'flow':34,687,944,1209 'flush':1174 'futur':106 'general':1221 'generic':63,593 'get':970,973,978,1016,1022 'github.com':1216 'github.com/litestar-org/litestar-email':1215 'guardrail':735 'handler':641,768,889 'hard':937 'hard-cod':936 'header':400 'hello':371,517 'high':793 'high-volum':792 'host':170,224,490,837 'html':349,378,380,538,562,582,584,668,1067,1086,1088 'http':69,73,77,853 'i/o':111 'id':711,1040,1130 'implicit':235 'import':10,107,153,158,221,252,264,275,293,315,320,364,413,482,547,963,969,1011,1015,1030,1093,1099 'init':308 'injec':36 'inject':305,638,890 'inmemoryconfig':20,79,200,287,294,295,616,725,731,737,874,957,966,986 'inspect':301 'instal':118,121,131,137,143,588 'instanc':898 'instead':918 'int':1041 'integr':534 'interact':686 'invalid':818 'jinja2':533 'json':1163 'key':256,268,279,281,717,805,930,995,997,1140 'key-xxxxxxxxxx':280 'len':1178 'level':777,888,897 'lifecycl':1194 'list':87 'litestar':2,8,27,38,41,51,100,123,133,139,145,152,154,156,163,219,250,262,273,291,314,318,362,411,480,522,531,634,648,693,758,916,961,1009,1028,1092,1097,1190,1196,1205,1226 'litestar-email':1,37,40,122,132,138,144,521 'litestar-saq':692,757,915,1195 'litestar-test':1204 'litestar.template':546 'log':803 'mail':596 'mailgun':76,147,610 'mailgunconfig':18,75,199,270,276,277,612 'main':502 'may':103 'memori':300 'messag':83,113,298,337,435,442,449,468,472,512,574,780,1074 'method':438,439 'mg.example.com':284 'modern':598 'modul':102,896 'module-level':895 'msg':415,436,443 'msg.attach':426 'msg1':469 'msg2':473 'msgs':450 'multipl':667 'name':185,208,213,397,399,627,1003,1005,1044,1070,1071,1081,1085,1134,1166 'need':591,666,674 'network':744 'never':96,802 'new':347,354,604 'non':685 'non-interact':684 'none':95,210,561,1046 'noreply@example.com':183,499 'notif':328,342,348,355 'notificationrequest':333 'offici':1213 'one':52,194 'op':682 'option':97,125,189,211,377,382 'outbox':86,748 'overrid':393,398,778 'override@example.com':392 'p99':770 'paramet':647 'part':669 'password':179,241,244,928 'passwords/api':804 'past':800 'path':1104 'pep':91 'per':779 'pick':589 'pip':120,130,136,142 'plain':374 'platform':425,431 'pluggabl':45 'plugin':54,164,620,635,776,1193 'pool':457 'poor':799 'port':172,226,237,492 'post':316,323,1095,1106 'prefer':602 'principl':1222 'project':605 'provid':43,651,746 'pull':851 'python':150,217,248,260,271,289,312,360,409,459,478,544,702,958,1006,1025,1089,1146,1224 'queu':913 'queue':753,946,1115,1153,1201 'quick':116 'rather':695 're':257 'real':743,877 'recipi':812 'recipient@example.com':368 'recommend':679 'refer':117,1189,1214 'region':285 'regist':309 'render':536,670 'repli':387 'reply@example.com':389 'request':699,922 'requir':369,372,903 'resend':68,135,788,843,953 'resendconfig':16,67,197,247,253,254,601,965,993 'resp':1159 'resp.status':1169 'retri':715,825,909,1138 'retry-':908 'return':356,983,990,1144 'rule':90 'sanit':806 'saq':694,759,917,948,1052,1098,1173,1197 'scale':798 'secret':180,927 'see':700 'self':1111 'self.create':1120 'send':23,48,327,441,444,448,452,551,661,678,690,707,755,862,911,951,1034,1047,1126,1203,1211 'sender':205 'sendgrid':72,141,607,790,844 'sendgridconfig':17,71,198,259,265,266,609 'sent':297,357 'separ':672 'servic':330,463,506,509,554,642,645,1056,1060,1158 'set':771,826,934,971,977,979 'settings.email.from':1000,1004 'settings.env':981 'settings.resend.api':996 'setup':149 'sg.xxxxxxxxxx':269 'share':1218 'ship':526,842 'simpl':660 'singl':446 'site':60 'skill' 'skill-litestar-email' 'slow':681,766,839,907 'smtp':64,458,594,763,797,836 'smtp.example.com':171,491 'smtp.gmail.com':225 'smtpconfig':15,62,161,169,196,216,222,223,484,489,597 'smtpconfig.timeout':828 'source-litestar-org' 'specif':128 'ssl':233,236 'standalon':474 'starttl':231 'state':1058,1064 'step':586,617,636,653,675,721 'store':296 'str':203,209,1043,1045 'string':540 'structlog':809 'style':89 'styleguid':1219 'subject':341,370,419,516,578,906,1078,1184 'svc':465 'svc.send':467,471 'swap':55,729 'task':940,949,1054,1114 'task_queues.get':704,1123 'taskqueu':1100,1116 'templat':520,528,556,671,1061,1065 'template_engine.render':563,568,1068 'templateengineprotocol':548,558 'test':32,81,288,614,723,727,740,876,923,954,982,1150,1176,1206,1208 'test@example.com':989 'tests/test_accounts.py':1147 'text':375,567,581 'text/html':432 'timeout':245,713,827,1136 'tls':175,229,495 'topic-advanced-alchemy' 'topic-agent-skills' 'topic-agentskills' 'topic-ai-agents' 'topic-claude-code-plugin' 'topic-claude-code-skills' 'topic-gemini-cli-extension' 'topic-htmx' 'topic-inertia' 'topic-litestar' 'topic-mcp' 'topic-python' 'touch':58 'transact':24,599,761,795 'true':176,230,358,496 'tune':833 'type':190 'union':93 'us':286 'usag':475 'use':21,104,174,228,232,494,530,657,662,736,756,787,849 'user':559,560,565,566,570,571,710,1039,1118,1129,1145 'user.email':577,1133 'user.id':712,720,1131,1143 'user.name':1135 'user@example.com':178,418,515 'usernam':177,239 'usual':831 'valid':811,856 'valu':404 'verifi':864 'via':65,302,691,892,914,952,956 'volum':794 'wast':824 'welcom':420,422,428,552,579,708,719,942,1035,1048,1080,1084,1127,1142,1154,1185 'welcome-email':941 'without':57 'workflow':585 'world':519 'wrap':629 'x':402 'x-custom':401 'xxxxxxxxxx':258,282 'you@gmail.com':240","prices":[{"id":"73e2eb8d-0276-4859-b2c2-9ea7e0c5a71b","listingId":"c2373a07-e409-4712-a647-2ac5931d3667","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"litestar-org","category":"litestar-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:20:57.185Z"}],"sources":[{"listingId":"c2373a07-e409-4712-a647-2ac5931d3667","source":"github","sourceId":"litestar-org/litestar-skills/litestar-email","sourceUrl":"https://github.com/litestar-org/litestar-skills/tree/main/skills/litestar-email","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:57.185Z","lastSeenAt":"2026-05-18T19:13:53.786Z"}],"details":{"listingId":"c2373a07-e409-4712-a647-2ac5931d3667","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"litestar-org","slug":"litestar-email","github":{"repo":"litestar-org/litestar-skills","stars":7,"topics":["advanced-alchemy","agent-skills","agentskills","ai-agents","claude-code-plugin","claude-code-skills","gemini-cli-extension","htmx","inertia","litestar","mcp","python","sqlspec"],"license":"mit","html_url":"https://github.com/litestar-org/litestar-skills","pushed_at":"2026-05-13T16:04:09Z","description":"Opinionated first-party agent skills, plugins, subagents, slash commands, and MCP servers for the Litestar framework ecosystem — publishable to Claude Code, Gemini CLI, Codex CLI, Cursor, OpenCode, and VS Code/Copilot from a single repo.","skill_md_sha":"75a9635dc8d3bf171ce2eddde897baf468964808","skill_md_path":"skills/litestar-email/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/litestar-org/litestar-skills/tree/main/skills/litestar-email"},"layout":"multi","source":"github","category":"litestar-skills","frontmatter":{"name":"litestar-email","description":"Auto-activate for litestar_email imports, EmailPlugin, EmailConfig, EmailService, EmailMessage, SMTPConfig, ResendConfig, SendGridConfig, MailgunConfig, or InMemoryConfig. Use when sending transactional email from Litestar, choosing an email backend, testing email flows, or injecting EmailService. Not for non-Litestar email SDK usage or marketing campaign platforms."},"skills_sh_url":"https://skills.sh/litestar-org/litestar-skills/litestar-email"},"updatedAt":"2026-05-18T19:13:53.786Z"}}