[{"data":1,"prerenderedAt":1104},["ShallowReactive",2],{"navigation_docs_en":3,"-en-mail-smtp":441,"-en-mail-smtp-surround":1099},[4,45,60,81,112,129,146,173,197,213,242,279,356,372,384,403,429],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fen\u002Fqueue","en\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Overview","\u002Fen\u002Fqueue\u002Foverview","en\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Tasks","\u002Fen\u002Fqueue\u002Ftasks","en\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fen\u002Fevents","en\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Events","\u002Fen\u002Fevents\u002Foverview","en\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fen\u002Fevents\u002Foutbox","en\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Scheduling","\u002Fen\u002Fevents\u002Fscheduler","en\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fen\u002Fauth","en\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Authentication","\u002Fen\u002Fauth\u002Foverview","en\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fen\u002Fauth\u002Frbac","en\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policies","\u002Fen\u002Fauth\u002Fpolicy","en\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Using auth standalone","\u002Fen\u002Fauth\u002Fstandalone","en\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login with goth, standalone","\u002Fen\u002Fauth\u002Fsocial-standalone","en\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fen\u002Fmail","en\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fen\u002Fmail\u002Foverview","en\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fen\u002Fmail\u002Fsmtp","en\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fen\u002Fmail\u002Fmjml","en\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fen\u002Fnotify","en\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fen\u002Fnotify\u002Foverview","en\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database channel","\u002Fen\u002Fnotify\u002Fdatabase","en\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast channel","\u002Fen\u002Fnotify\u002Fbroadcast","en\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fen\u002Fstorage","en\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fen\u002Fstorage\u002Foverview","en\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fen\u002Fstorage\u002Fdisk-api","en\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memory and local disk","\u002Fen\u002Fstorage\u002Flocal","en\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fen\u002Fstorage\u002Fs3","en\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Testing","\u002Fen\u002Fstorage\u002Ftesting","en\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fen\u002Ftelemetry","en\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fen\u002Ftelemetry\u002Foverview","en\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logging","\u002Fen\u002Ftelemetry\u002Flogging","en\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fen\u002Ftelemetry\u002Fopentelemetry","en\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fen\u002Ftelemetry\u002Fsentry","en\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"Kit","i-lucide-box","\u002Fen\u002Fkit","en\u002F3.kit",[248,251,256,261,266,270,275],{"title":52,"path":249,"stem":250,"icon":244},"\u002Fen\u002Fkit\u002Foverview","en\u002F3.kit\u002F1.overview",{"title":252,"path":253,"stem":254,"icon":255},"Application lifecycle","\u002Fen\u002Fkit\u002Fapp","en\u002F3.kit\u002F2.app","i-lucide-power",{"title":257,"path":258,"stem":259,"icon":260},"Server","\u002Fen\u002Fkit\u002Fserver","en\u002F3.kit\u002F3.server","i-lucide-server",{"title":262,"path":263,"stem":264,"icon":265},"Worker","\u002Fen\u002Fkit\u002Fworker","en\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":267,"path":268,"stem":269,"icon":70},"Realtime","\u002Fen\u002Fkit\u002Frealtime","en\u002F3.kit\u002F5.realtime",{"title":271,"path":272,"stem":273,"icon":274},"Migrations","\u002Fen\u002Fkit\u002Fmigrations","en\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":276,"path":277,"stem":278,"icon":111},"Social login","\u002Fen\u002Fkit\u002Fsocial-login","en\u002F3.kit\u002F7.social-login",{"title":280,"icon":281,"path":282,"stem":283,"children":284,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F4.cli",[285,288,293,298,303,308,313,318,323,328,333,337,342,347,351],{"title":52,"path":286,"stem":287,"icon":281},"\u002Fen\u002Fcli\u002Foverview","en\u002F4.cli\u002F1.overview",{"title":289,"path":290,"stem":291,"icon":292},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":294,"path":295,"stem":296,"icon":297},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":299,"path":300,"stem":301,"icon":302},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":304,"path":305,"stem":306,"icon":307},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":309,"path":310,"stem":311,"icon":312},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":314,"path":315,"stem":316,"icon":317},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":319,"path":320,"stem":321,"icon":322},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":324,"path":325,"stem":326,"icon":327},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":329,"path":330,"stem":331,"icon":332},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":334,"path":335,"stem":336,"icon":244},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F4.cli\u002F5.add-core",{"title":338,"path":339,"stem":340,"icon":341},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":343,"path":344,"stem":345,"icon":346},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":348,"path":349,"stem":350,"icon":265},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F4.cli\u002F8.worker-generators",{"title":352,"path":353,"stem":354,"icon":355},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":357,"icon":227,"path":358,"stem":359,"children":360,"page":44},"errs","\u002Fen\u002Ferrs","en\u002F5.errs",[361,364,368],{"title":52,"path":362,"stem":363,"icon":227},"\u002Fen\u002Ferrs\u002Foverview","en\u002F5.errs\u002F1.overview",{"title":365,"path":366,"stem":367},"API","\u002Fen\u002Ferrs\u002Fapi","en\u002F5.errs\u002F2.api",{"title":369,"path":370,"stem":371,"icon":227},"Integration","\u002Fen\u002Ferrs\u002Fintegration","en\u002F5.errs\u002F3.integration",{"title":373,"icon":231,"path":374,"stem":375,"children":376,"page":44},"envconf","\u002Fen\u002Fenvconf","en\u002F6.envconf",[377,380],{"title":52,"path":378,"stem":379,"icon":231},"\u002Fen\u002Fenvconf\u002Foverview","en\u002F6.envconf\u002F1.overview",{"title":381,"path":382,"stem":383},"Recipes","\u002Fen\u002Fenvconf\u002Frecipes","en\u002F6.envconf\u002F2.recipes",{"title":385,"icon":386,"path":387,"stem":388,"children":389,"page":44},"httperr","i-lucide-globe","\u002Fen\u002Fhttperr","en\u002F7.httperr",[390,393,398],{"title":52,"path":391,"stem":392,"icon":386},"\u002Fen\u002Fhttperr\u002Foverview","en\u002F7.httperr\u002F1.overview",{"title":394,"path":395,"stem":396,"icon":397},"Error responses","\u002Fen\u002Fhttperr\u002Ferror-responses","en\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":399,"path":400,"stem":401,"icon":402},"Validation","\u002Fen\u002Fhttperr\u002Fvalidation","en\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":404,"icon":405,"path":406,"stem":407,"children":408,"page":44},"dbx","i-lucide-database","\u002Fen\u002Fdbx","en\u002F8.dbx",[409,412,416,420,425],{"title":52,"path":410,"stem":411,"icon":405},"\u002Fen\u002Fdbx\u002Foverview","en\u002F8.dbx\u002F1.overview",{"title":413,"path":414,"stem":415,"icon":106},"pgx","\u002Fen\u002Fdbx\u002Fpg","en\u002F8.dbx\u002F2.pg",{"title":417,"path":418,"stem":419,"icon":47},"bun","\u002Fen\u002Fdbx\u002Fbunx","en\u002F8.dbx\u002F3.bunx",{"title":421,"path":422,"stem":423,"icon":424},"Transactions","\u002Fen\u002Fdbx\u002Ftransactions","en\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":426,"path":427,"stem":428,"icon":317},"Seeders","\u002Fen\u002Fdbx\u002Fseed","en\u002F8.dbx\u002F5.seed",{"title":430,"icon":55,"path":431,"stem":432,"children":433,"page":44},"paginate","\u002Fen\u002Fpaginate","en\u002F9.paginate",[434,437],{"title":52,"path":435,"stem":436,"icon":55},"\u002Fen\u002Fpaginate\u002Foverview","en\u002F9.paginate\u002F1.overview",{"title":438,"path":439,"stem":440,"icon":19},"Cursor pagination","\u002Fen\u002Fpaginate\u002Fcursor","en\u002F9.paginate\u002F2.cursor",{"id":442,"title":122,"body":443,"description":1092,"extension":1093,"links":1094,"meta":1095,"navigation":1096,"path":123,"seo":1097,"stem":124,"__hash__":1098},"docs_en\u002Fen\u002F13.mail\u002F2.smtp.md",{"type":444,"value":445,"toc":1084},"minimark",[446,458,487,506,511,631,634,645,698,870,876,880,897,923,927,955,959,1004,1048,1052,1080],[447,448,449,450,454,455,457],"p",{},"This is the subpackage a project imports once it actually wants to send mail, rather than just working against the ",[451,452,453],"code",{},"Mailer"," interface ",[451,456,113],{}," defines.",[459,460,465],"pre",{"className":461,"code":462,"language":463,"meta":464,"style":464},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fmail\u002Fsmtp\"\n","go","",[451,466,467],{"__ignoreMap":464},[468,469,472,476,480,484],"span",{"class":470,"line":471},"line",1,[468,473,475],{"class":474},"s7zQu","import",[468,477,479],{"class":478},"sMK4o"," \"",[468,481,483],{"class":482},"sBMFI","github.com\u002Fgp-system\u002Fmail\u002Fsmtp",[468,485,486],{"class":478},"\"\n",[447,488,489,492,493,500,501,505],{},[451,490,491],{},"mail\u002Fsmtp"," is the concrete driver that actually leaves the process: it sends over SMTP via ",[494,495,499],"a",{"href":496,"rel":497},"https:\u002F\u002Fgithub.com\u002Fwneessen\u002Fgo-mail",[498],"nofollow","wneessen\u002Fgo-mail",". It is the only mailer in the module that opens a network connection; see ",[494,502,504],{"href":503},"\u002Fen\u002Fmail\u002Foverview#dev-mailers-memory-log-and-discard","Dev mailers"," on the overview page for the no-op alternatives used in tests and in mail-less environments.",[507,508,510],"h2",{"id":509},"constructors","Constructors",[459,512,514],{"className":461,"code":513,"language":463,"meta":464,"style":464},"mailer, err := smtp.New(ctx, cfg.Mail)              \u002F\u002F errors on empty Host or FromAddress\nmailer, err := smtp.NewIfConfigured(ctx, cfg.Mail)   \u002F\u002F empty Host -> mail.NewDiscard(), no error\nmailer := smtp.MustNewIfConfigured(ctx, cfg.Mail)    \u002F\u002F panics on error; the usual main() constructor\n",[451,515,516,564,599],{"__ignoreMap":464},[468,517,518,522,525,528,531,534,537,541,544,547,549,552,554,557,560],{"class":470,"line":471},[468,519,521],{"class":520},"sTEyZ","mailer",[468,523,524],{"class":478},",",[468,526,527],{"class":520}," err ",[468,529,530],{"class":478},":=",[468,532,533],{"class":520}," smtp",[468,535,536],{"class":478},".",[468,538,540],{"class":539},"s2Zo4","New",[468,542,543],{"class":478},"(",[468,545,546],{"class":520},"ctx",[468,548,524],{"class":478},[468,550,551],{"class":520}," cfg",[468,553,536],{"class":478},[468,555,556],{"class":520},"Mail",[468,558,559],{"class":478},")",[468,561,563],{"class":562},"sHwdD","              \u002F\u002F errors on empty Host or FromAddress\n",[468,565,567,569,571,573,575,577,579,582,584,586,588,590,592,594,596],{"class":470,"line":566},2,[468,568,521],{"class":520},[468,570,524],{"class":478},[468,572,527],{"class":520},[468,574,530],{"class":478},[468,576,533],{"class":520},[468,578,536],{"class":478},[468,580,581],{"class":539},"NewIfConfigured",[468,583,543],{"class":478},[468,585,546],{"class":520},[468,587,524],{"class":478},[468,589,551],{"class":520},[468,591,536],{"class":478},[468,593,556],{"class":520},[468,595,559],{"class":478},[468,597,598],{"class":562},"   \u002F\u002F empty Host -> mail.NewDiscard(), no error\n",[468,600,602,605,607,609,611,614,616,618,620,622,624,626,628],{"class":470,"line":601},3,[468,603,604],{"class":520},"mailer ",[468,606,530],{"class":478},[468,608,533],{"class":520},[468,610,536],{"class":478},[468,612,613],{"class":539},"MustNewIfConfigured",[468,615,543],{"class":478},[468,617,546],{"class":520},[468,619,524],{"class":478},[468,621,551],{"class":520},[468,623,536],{"class":478},[468,625,556],{"class":520},[468,627,559],{"class":478},[468,629,630],{"class":562},"    \u002F\u002F panics on error; the usual main() constructor\n",[507,632,204],{"id":633},"configuration",[447,635,636,637,640,641,644],{},"Compose ",[451,638,639],{},"smtp.Config"," into your project config under a ",[451,642,643],{},"MAIL_"," prefix:",[459,646,648],{"className":461,"code":647,"language":463,"meta":464,"style":464},"type Config struct {\n    \u002F\u002F ...\n    Mail smtp.Config `envPrefix:\"MAIL_\"`\n}\n",[451,649,650,664,669,692],{"__ignoreMap":464},[468,651,652,655,658,661],{"class":470,"line":471},[468,653,654],{"class":478},"type",[468,656,657],{"class":482}," Config",[468,659,660],{"class":478}," struct",[468,662,663],{"class":478}," {\n",[468,665,666],{"class":470,"line":566},[468,667,668],{"class":562},"    \u002F\u002F ...\n",[468,670,671,674,677,679,682,685,689],{"class":470,"line":601},[468,672,673],{"class":520},"    Mail ",[468,675,676],{"class":482},"smtp",[468,678,536],{"class":478},[468,680,681],{"class":482},"Config",[468,683,684],{"class":478}," `",[468,686,688],{"class":687},"sfazB","envPrefix:\"MAIL_\"",[468,690,691],{"class":478},"`\n",[468,693,695],{"class":470,"line":694},4,[468,696,697],{"class":478},"}\n",[699,700,701,717],"table",{},[702,703,704],"thead",{},[705,706,707,711,714],"tr",{},[708,709,710],"th",{},"Variable",[708,712,713],{},"Default",[708,715,716],{},"Meaning",[718,719,720,737,752,769,798,824,843,855],"tbody",{},[705,721,722,728,734],{},[723,724,725],"td",{},[451,726,727],{},"MAIL_HOST",[723,729,730],{},[731,732,733],"em",{},"(empty = no transport)",[723,735,736],{},"SMTP server address",[705,738,739,744,749],{},[723,740,741],{},[451,742,743],{},"MAIL_PORT",[723,745,746],{},[451,747,748],{},"587",[723,750,751],{},"SMTP port",[705,753,754,763,766],{},[723,755,756,759,760],{},[451,757,758],{},"MAIL_USERNAME"," \u002F ",[451,761,762],{},"MAIL_PASSWORD",[723,764,765],{},"empty",[723,767,768],{},"empty: no auth (Mailpit, internal relays)",[705,770,771,776,781],{},[723,772,773],{},[451,774,775],{},"MAIL_AUTH",[723,777,778],{},[451,779,780],{},"auto",[723,782,783,785,786,785,789,785,792,785,795],{},[451,784,780],{}," | ",[451,787,788],{},"plain",[451,790,791],{},"login",[451,793,794],{},"cram-md5",[451,796,797],{},"none",[705,799,800,805,810],{},[723,801,802],{},[451,803,804],{},"MAIL_TLS",[723,806,807],{},[451,808,809],{},"starttls",[723,811,812,785,814,817,818,821,822],{},[451,813,809],{},[451,815,816],{},"starttls-opportunistic"," (dev, TLS-less server) | ",[451,819,820],{},"tls"," (implicit TLS, 465) | ",[451,823,797],{},[705,825,826,831,840],{},[723,827,828],{},[451,829,830],{},"MAIL_FROM_ADDRESS",[723,832,833],{},[834,835,836,837,839],"strong",{},"required once ",[451,838,727],{}," is set",[723,841,842],{},"default sender address",[705,844,845,850,852],{},[723,846,847],{},[451,848,849],{},"MAIL_FROM_NAME",[723,851,765],{},[723,853,854],{},"default sender display name",[705,856,857,862,867],{},[723,858,859],{},[451,860,861],{},"MAIL_TIMEOUT",[723,863,864],{},[451,865,866],{},"15s",[723,868,869],{},"dial\u002Fsend timeout",[447,871,872,873,536],{},"The full list lives in the ",[494,874,875],{"href":205},"configuration reference",[507,877,879],{"id":878},"tls-and-auth-modes","TLS and auth modes",[447,881,882,884,885,887,888,890,891,893,894,896],{},[451,883,804],{}," picks the connection's encryption from four modes: ",[451,886,809],{}," upgrades a plaintext connection after the initial handshake (the common port-587 setup, and the default here); ",[451,889,816],{}," attempts the same upgrade but tolerates a server that doesn't offer it, useful against a dev relay (Mailpit) that speaks plain SMTP; ",[451,892,820],{}," dials with implicit TLS from the first byte (port 465); ",[451,895,797],{}," sends in the clear, for a trusted internal network only.",[447,898,899,901,902,904,905,907,908,910,911,913,914,916,917,919,920,922],{},[451,900,775],{}," picks the SASL mechanism: ",[451,903,780],{}," negotiates the strongest mechanism the server advertises, and is the right default for anything real. ",[451,906,788],{}," and ",[451,909,791],{}," are explicit fallbacks for servers with a narrower advertisement; ",[451,912,794],{}," is a legacy challenge-response mechanism kept for older relays. ",[451,915,797],{}," skips authentication entirely, the same \"no credentials\" posture ",[451,918,758],{},"\u002F",[451,921,762],{}," being empty already implies, useful when the relay itself gates access by network location rather than by credentials.",[507,924,926],{"id":925},"timeouts-and-the-startup-connection-check","Timeouts and the startup connection check",[447,928,929,931,932,919,937,943,944,946,947,950,951,954],{},[451,930,540],{}," verifies the connection with a dial+close at construction, the same convention as ",[494,933,934],{"href":414},[451,935,936],{},"pg.NewPool",[494,938,940],{"href":939},"\u002Fen\u002Fqueue\u002Foverview#client",[451,941,942],{},"queue.NewClient","'s ping: a broken config fails at startup, not at the first email. ",[451,945,861],{}," bounds both that startup check and every subsequent dial\u002Fsend. Every ",[451,948,949],{},"Send"," opens its own OTel span (",[451,952,953],{},"smtp.send",") with a recipient count; never with addresses.",[507,956,958],{"id":957},"newifconfigured-the-devprod-switch","NewIfConfigured: the dev\u002Fprod switch",[447,960,961,907,964,967,968,971,972,974,975,977,978,980,981,986,987,989,990,992,993,995,996,998,999,1003],{},[451,962,963],{},"Host",[451,965,966],{},"FromAddress"," are not ",[451,969,970],{},"required"," env tags: an empty ",[451,973,963],{}," is how a project signals \"no mail transport configured\" (usually in dev, or in a service that never actually sends mail). ",[451,976,581],{}," (and its panicking counterpart ",[451,979,613],{},") turns that into ",[494,982,983],{"href":503},[451,984,985],{},"mail.NewDiscard()"," instead of an error; ",[451,988,540],{}," still errors on an empty ",[451,991,966],{}," once ",[451,994,963],{}," is set, since that would silently mis-address every message. ",[451,997,581],{}," is what ",[494,1000,1001],{"href":300},[451,1002,299],{}," wires into a generated project.",[1005,1006,1007,1008,1013,1014,1017,1018,1021,1022,1025,1026,1029,1030,1033,1034,1036,1037,919,1040,1042,1043,1047],"note",{},"A project generated with ",[494,1009,1011],{"href":1010},"\u002Fen\u002Fcli\u002Fnew-project#the-compose-dev-stack",[451,1012,319],{}," already runs a ",[451,1015,1016],{},"mailpit"," service in ",[451,1019,1020],{},"compose.yml"," (accepts SMTP, UI at ",[451,1023,1024],{},"MAILPIT_HOST","), and ",[451,1027,1028],{},".env.example"," ships the matching ",[451,1031,1032],{},"MAIL_*"," lines, but wiring ",[451,1035,639],{}," into your own project config, and calling ",[451,1038,1039],{},"smtp.NewIfConfigured",[451,1041,613],{},", happens once, on the first ",[494,1044,1045],{"href":300},[451,1046,299],{}," call.",[507,1049,1051],{"id":1050},"related-pages","Related pages",[1053,1054,1055,1068,1073],"ul",{},[1056,1057,1058,1060,1061,1063,1064,1067],"li",{},[494,1059,52],{"href":119},": the ",[451,1062,453],{}," interface, the ",[451,1065,1066],{},"Message"," builder, and the dev mailers.",[1056,1069,1070,1072],{},[494,1071,126],{"href":127},": compiling MJML templates into the HTML this driver sends.",[1056,1074,1075,1079],{},[494,1076,1077],{"href":300},[451,1078,299],{},": the generator that wires a notifier and this driver into a module.",[1081,1082,1083],"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 .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);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":464,"searchDepth":566,"depth":566,"links":1085},[1086,1087,1088,1089,1090,1091],{"id":509,"depth":566,"text":510},{"id":633,"depth":566,"text":204},{"id":878,"depth":566,"text":879},{"id":925,"depth":566,"text":926},{"id":957,"depth":566,"text":958},{"id":1050,"depth":566,"text":1051},"SMTP transport configuration for mail.","md",null,{},{"icon":114},{"title":122,"description":1092},"V9ao0YPNeZn9O6BrgtZV939Vkpm4ySmQi6JzqLTKcm8",[1100,1102],{"title":52,"path":119,"stem":120,"description":1101,"icon":114,"children":-1},"Email sending: fluent Message builder, MJML templates, a memory mailer for tests.",{"title":126,"path":127,"stem":128,"description":1103,"icon":114,"children":-1},"MJML templating for mail.",1785445900990]