[{"data":1,"prerenderedAt":3084},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-mail-overview":442,"-hu-mail-overview-surround":3079},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\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","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\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","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\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","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":52,"body":444,"description":3072,"extension":3073,"links":3074,"meta":3075,"navigation":3076,"path":119,"seo":3077,"stem":120,"__hash__":3078},"docs_hu\u002Fhu\u002F13.mail\u002F1.overview.md",{"type":445,"value":446,"toc":3055},"minimark",[447,483,487,526,534,603,607,617,644,648,737,755,759,764,869,872,1052,1056,1072,1295,1318,1329,1333,1407,1447,1453,1457,1477,1755,1769,1865,1876,1881,2191,2200,2204,2216,2222,2232,2270,2320,2324,2327,2379,2709,2887,2908,2980,2996,3018,3022,3051],[448,449,450,451,454,455,458,459,458,462,465,466,469,470,474,475,478,479,482],"p",{},"A ",[452,453,113],"code",{}," önálló Go modul (",[452,456,457],{},"github.com\u002Fgp-system\u002Fmail",", +",[452,460,461],{},"mail\u002Fsmtp",[452,463,464],{},"mail\u002Fmjml","): egy ",[452,467,468],{},"Mailer"," interfész, egy fluens üzenetépítő, és egy sor törzs-típus (plain text, HTML, Go template, MJML). Bármely Go programban működik, kittel vagy anélkül. A ",[471,472,473],"a",{"href":41},"shop mintaalkalmazásban"," a ",[452,476,477],{},"sendOrderConfirmation"," listener a workerben fut, és MJML-ből renderelt rendelés-visszaigazolót küld. Az üzleti kód (a listener) csak a ",[452,480,481],{},"mail.Mailer"," interfészt látja; hogy mögötte SMTP van, log-kimenet vagy egy tesztbeli memória-mailer, azt a bekötés dönti el.",[484,485,25],"h2",{"id":486},"telepítés",[488,489,494],"pre",{"className":490,"code":491,"language":492,"meta":493,"style":493},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com\u002Fgp-system\u002Fmail@v0.1.0 # a kit is ezt a taget használja\ngo get github.com\u002Fgp-system\u002Fmail@latest\n","sh","",[452,495,496,516],{"__ignoreMap":493},[497,498,501,505,509,512],"span",{"class":499,"line":500},"line",1,[497,502,504],{"class":503},"sBMFI","go",[497,506,508],{"class":507},"sfazB"," get",[497,510,511],{"class":507}," github.com\u002Fgp-system\u002Fmail@v0.1.0",[497,513,515],{"class":514},"sHwdD"," # a kit is ezt a taget használja\n",[497,517,519,521,523],{"class":499,"line":518},2,[497,520,504],{"class":503},[497,522,508],{"class":507},[497,524,525],{"class":507}," github.com\u002Fgp-system\u002Fmail@latest\n",[448,527,528,529,533],{},"A gyökérmodulnak nincs saját függősége az ",[471,530,531],{"href":363},[452,532,358],{},"-en túl. A két opcionális alcsomag saját lábnyomot hoz, és egy bináris csak azért fizet, amelyiket ténylegesen importálja:",[535,536,537,550],"table",{},[538,539,540],"thead",{},[541,542,543,547],"tr",{},[544,545,546],"th",{},"Import-út",[544,548,549],{},"Mit ad hozzá",[551,552,553,570,587],"tbody",{},[541,554,555,560],{},[556,557,558],"td",{},[452,559,457],{},[556,561,562,563,565,566,569],{},"a ",[452,564,468],{}," interfészt, a ",[452,567,568],{},"Message","-t, a törzs-típusokat, a dev mailereket",[541,571,572,577],{},[556,573,574],{},[452,575,576],{},"github.com\u002Fgp-system\u002Fmail\u002Fsmtp",[556,578,579,580,586],{},"SMTP-küldést, a ",[471,581,585],{"href":582,"rel":583},"https:\u002F\u002Fgithub.com\u002Fwneessen\u002Fgo-mail",[584],"nofollow","wneessen\u002Fgo-mail","-en keresztül",[541,588,589,594],{},[556,590,591],{},[452,592,593],{},"github.com\u002Fgp-system\u002Fmail\u002Fmjml",[556,595,596,597,602],{},"MJML-ből HTML-fordítást, a ",[471,598,601],{"href":599,"rel":600},"https:\u002F\u002Fgithub.com\u002FBoostport\u002Fmjml-go",[584],"Boostport\u002Fmjml-go","-n (egy WASM runtime) keresztül",[484,604,606],{"id":605},"miért-interfész-a-mailer","Miért interfész a Mailer",[448,608,609,610,613,614,616],{},"A kit alapelve a ",[471,611,612],{"href":221},"„centralizálj, ne absztrahálj\"",": a mail a ",[471,615,147],{"href":153}," melletti másik kivétel, ahol az interfész szándékos:",[618,619,620,637],"ul",{},[621,622,623,624,628,629,633,634,636],"li",{},"A tényleges küldést a ",[471,625,626],{"href":123},[452,627,461],{}," alcsomag végzi, az MJML-fordítást a ",[471,630,631],{"href":127},[452,632,464],{},". A ",[452,635,113],{}," gyökércsomag egyiket sem importálja. A service-réteged SMTP-kliens és WASM-runtime nélkül fordul.",[621,638,639,640,643],{},"Tesztben a ",[452,641,642],{},"mail.NewMemory()"," egy sorral váltja ki a drivert, így a küldött üzenetek assertálhatók anélkül, hogy valódi SMTP-kapcsolat kellene.",[484,645,647],{"id":646},"az-interfész","Az interfész",[488,649,652],{"className":650,"code":651,"language":504,"meta":493,"style":493},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fmail\"\n\ntype Mailer interface {\n    Send(ctx context.Context, msg *Message) error\n}\n",[452,653,654,669,675,690,731],{"__ignoreMap":493},[497,655,656,660,664,666],{"class":499,"line":500},[497,657,659],{"class":658},"s7zQu","import",[497,661,663],{"class":662},"sMK4o"," \"",[497,665,457],{"class":503},[497,667,668],{"class":662},"\"\n",[497,670,671],{"class":499,"line":518},[497,672,674],{"emptyLinePlaceholder":673},true,"\n",[497,676,678,681,684,687],{"class":499,"line":677},3,[497,679,680],{"class":662},"type",[497,682,683],{"class":503}," Mailer",[497,685,686],{"class":662}," interface",[497,688,689],{"class":662}," {\n",[497,691,693,697,700,704,707,710,713,716,719,722,724,727],{"class":499,"line":692},4,[497,694,696],{"class":695},"s2Zo4","    Send",[497,698,699],{"class":662},"(",[497,701,703],{"class":702},"sHdIc","ctx",[497,705,706],{"class":503}," context",[497,708,709],{"class":662},".",[497,711,712],{"class":503},"Context",[497,714,715],{"class":662},",",[497,717,718],{"class":702}," msg",[497,720,721],{"class":662}," *",[497,723,568],{"class":503},[497,725,726],{"class":662},")",[497,728,730],{"class":729},"spNyl"," error\n",[497,732,734],{"class":499,"line":733},5,[497,735,736],{"class":662},"}\n",[448,738,450,739,742,743,746,747,750,751,754],{},[452,740,741],{},"Send"," szinkron és először ",[452,744,745],{},"Validate()","-et hív: címzett nélkül ",[452,748,749],{},"ErrNoRecipient",", törzs nélkül ",[452,752,753],{},"ErrNoBody"," jön vissza.",[484,756,758],{"id":757},"a-message-felépítése","A Message felépítése",[448,760,450,761,763],{},[452,762,568],{},"-t fluensen építed; a konstruálás sosem hibázik, a hiányosságok küldéskor derülnek ki:",[488,765,767],{"className":650,"code":766,"language":504,"meta":493,"style":493},"msg := mail.NewMessage().\n    WithFromNamed(\"Shop\", \"noreply@acme.test\").  \u002F\u002F elhagyható: a driver default feladója lép be\n    WithTo(\"user@example.com\").\n    WithSubject(\"Rendelésed visszaigazolása\").\n    WithText(\"Köszönjük a rendelést!\")\n",[452,768,769,789,819,836,852],{"__ignoreMap":493},[497,770,771,775,778,781,783,786],{"class":499,"line":500},[497,772,774],{"class":773},"sTEyZ","msg ",[497,776,777],{"class":662},":=",[497,779,780],{"class":773}," mail",[497,782,709],{"class":662},[497,784,785],{"class":695},"NewMessage",[497,787,788],{"class":662},"().\n",[497,790,791,794,796,799,802,804,806,808,811,813,816],{"class":499,"line":518},[497,792,793],{"class":695},"    WithFromNamed",[497,795,699],{"class":662},[497,797,798],{"class":662},"\"",[497,800,801],{"class":507},"Shop",[497,803,798],{"class":662},[497,805,715],{"class":662},[497,807,663],{"class":662},[497,809,810],{"class":507},"noreply@acme.test",[497,812,798],{"class":662},[497,814,815],{"class":662},").",[497,817,818],{"class":514},"  \u002F\u002F elhagyható: a driver default feladója lép be\n",[497,820,821,824,826,828,831,833],{"class":499,"line":677},[497,822,823],{"class":695},"    WithTo",[497,825,699],{"class":662},[497,827,798],{"class":662},[497,829,830],{"class":507},"user@example.com",[497,832,798],{"class":662},[497,834,835],{"class":662},").\n",[497,837,838,841,843,845,848,850],{"class":499,"line":692},[497,839,840],{"class":695},"    WithSubject",[497,842,699],{"class":662},[497,844,798],{"class":662},[497,846,847],{"class":507},"Rendelésed visszaigazolása",[497,849,798],{"class":662},[497,851,835],{"class":662},[497,853,854,857,859,861,864,866],{"class":499,"line":733},[497,855,856],{"class":695},"    WithText",[497,858,699],{"class":662},[497,860,798],{"class":662},[497,862,863],{"class":507},"Köszönjük a rendelést!",[497,865,798],{"class":662},[497,867,868],{"class":662},")\n",[448,870,871],{},"A builder teljes felülete:",[535,873,874,884],{},[538,875,876],{},[541,877,878,881],{},[544,879,880],{},"Metódus",[544,882,883],{},"Mit csinál",[551,885,886,908,921,934,947,957,967,980,1000,1010,1024,1038],{},[541,887,888,897],{},[556,889,890,893,894],{},[452,891,892],{},"WithFrom(addr)"," \u002F ",[452,895,896],{},"WithFromNamed(name, addr)",[556,898,899,900,903,904,907],{},"feladó; ha kihagyod, a driver konfigurált defaultja (",[452,901,902],{},"MAIL_FROM_ADDRESS","\u002F",[452,905,906],{},"MAIL_FROM_NAME",") érvényesül",[541,909,910,918],{},[556,911,912,893,915],{},[452,913,914],{},"WithTo(addrs...)",[452,916,917],{},"WithToNamed(name, addr)",[556,919,920],{},"To címzett(ek)",[541,922,923,931],{},[556,924,925,893,928],{},[452,926,927],{},"WithCc(addrs...)",[452,929,930],{},"WithCcNamed(name, addr)",[556,932,933],{},"Cc címzett(ek)",[541,935,936,944],{},[556,937,938,893,941],{},[452,939,940],{},"WithBcc(addrs...)",[452,942,943],{},"WithBccNamed(name, addr)",[556,945,946],{},"Bcc címzett(ek)",[541,948,949,954],{},[556,950,951],{},[452,952,953],{},"WithReplyTo(addr)",[556,955,956],{},"Reply-To",[541,958,959,964],{},[556,960,961],{},[452,962,963],{},"WithSubject(s)",[556,965,966],{},"tárgy",[541,968,969,974],{},[556,970,971],{},[452,972,973],{},"WithHeader(key, value)",[556,975,976,977,726],{},"egyedi fejléc (pl. ",[452,978,979],{},"List-Unsubscribe",[541,981,982,990],{},[556,983,984,893,987],{},[452,985,986],{},"WithText(s)",[452,988,989],{},"WithHTML(s)",[556,991,992,993,893,996,999],{},"rövidítés a ",[452,994,995],{},"WithBody(mail.Text(s))",[452,997,998],{},"WithBody(mail.HTML(s))"," hívásokra",[541,1001,1002,1007],{},[556,1003,1004],{},[452,1005,1006],{},"WithBody(b mail.Body)",[556,1008,1009],{},"tetszőleges törzs (az utolsó hívás nyer)",[541,1011,1012,1017],{},[556,1013,1014],{},[452,1015,1016],{},"WithAttachment(filename, data, contentType)",[556,1018,1019,1020,1023],{},"csatolmány memóriából (",[452,1021,1022],{},"contentType"," üresen: a driver kitalálja)",[541,1025,1026,1031],{},[556,1027,1028],{},[452,1029,1030],{},"WithAttachmentReader(filename, r, contentType)",[556,1032,1033,1034,1037],{},"streamelt csatolmány (az ",[452,1035,1036],{},"r"," egyszer, küldéskor olvasódik ki)",[541,1039,1040,1045],{},[556,1041,1042],{},[452,1043,1044],{},"WithEmbed(filename, data, contentType)",[556,1046,1047,1048,1051],{},"inline erőforrás, HTML-ből ",[452,1049,1050],{},"cid:\u003Cfilename>","-ként hivatkozva",[484,1053,1055],{"id":1054},"levéltörzs-típusok","Levéltörzs-típusok",[448,1057,1058,1059,1062,1063,1066,1067,1071],{},"Minden törzs a ",[452,1060,1061],{},"mail.Body"," interfészt implementálja (",[452,1064,1065],{},"Render(ctx) (Content, error)","; a driverek a send-span ",[1068,1069,1070],"strong",{},"belsejében"," renderelnek, így a template-hiba is trace-elve van):",[488,1073,1075],{"className":650,"code":1074,"language":504,"meta":493,"style":493},"\u002F\u002F 1. plain text\nmsg.WithText(\"Kész a fiókod.\")\n\n\u002F\u002F 2. nyers HTML, opcionális text-alternatívával\nmsg.WithBody(mail.HTML(\"\u003Cp>Kész a fiókod.\u003C\u002Fp>\").WithText(\"Kész a fiókod.\"))\n\n\u002F\u002F 3. html\u002Ftemplate + text\u002Ftemplate alternatíva ugyanabból az fs.FS-ből\n\u002F\u002Fgo:embed templates\nvar tmpls embed.FS\n\nmsg.WithBody(mail.Template(tmpls, \"templates\u002Finvoice.html.tmpl\", inv).\n    WithTextTemplate(\"templates\u002Finvoice.txt.tmpl\"))\n\n\u002F\u002F 4. előre parse-olt template-ek, saját cache mellett\nmsg.WithBody(mail.Parsed(htmlTpl, textTpl, data))\n",[452,1076,1077,1082,1103,1107,1112,1154,1159,1165,1171,1188,1193,1232,1249,1254,1260],{"__ignoreMap":493},[497,1078,1079],{"class":499,"line":500},[497,1080,1081],{"class":514},"\u002F\u002F 1. plain text\n",[497,1083,1084,1087,1089,1092,1094,1096,1099,1101],{"class":499,"line":518},[497,1085,1086],{"class":773},"msg",[497,1088,709],{"class":662},[497,1090,1091],{"class":695},"WithText",[497,1093,699],{"class":662},[497,1095,798],{"class":662},[497,1097,1098],{"class":507},"Kész a fiókod.",[497,1100,798],{"class":662},[497,1102,868],{"class":662},[497,1104,1105],{"class":499,"line":677},[497,1106,674],{"emptyLinePlaceholder":673},[497,1108,1109],{"class":499,"line":692},[497,1110,1111],{"class":514},"\u002F\u002F 2. nyers HTML, opcionális text-alternatívával\n",[497,1113,1114,1116,1118,1121,1123,1125,1127,1130,1132,1134,1137,1139,1141,1143,1145,1147,1149,1151],{"class":499,"line":733},[497,1115,1086],{"class":773},[497,1117,709],{"class":662},[497,1119,1120],{"class":695},"WithBody",[497,1122,699],{"class":662},[497,1124,113],{"class":773},[497,1126,709],{"class":662},[497,1128,1129],{"class":695},"HTML",[497,1131,699],{"class":662},[497,1133,798],{"class":662},[497,1135,1136],{"class":507},"\u003Cp>Kész a fiókod.\u003C\u002Fp>",[497,1138,798],{"class":662},[497,1140,815],{"class":662},[497,1142,1091],{"class":695},[497,1144,699],{"class":662},[497,1146,798],{"class":662},[497,1148,1098],{"class":507},[497,1150,798],{"class":662},[497,1152,1153],{"class":662},"))\n",[497,1155,1157],{"class":499,"line":1156},6,[497,1158,674],{"emptyLinePlaceholder":673},[497,1160,1162],{"class":499,"line":1161},7,[497,1163,1164],{"class":514},"\u002F\u002F 3. html\u002Ftemplate + text\u002Ftemplate alternatíva ugyanabból az fs.FS-ből\n",[497,1166,1168],{"class":499,"line":1167},8,[497,1169,1170],{"class":514},"\u002F\u002Fgo:embed templates\n",[497,1172,1174,1177,1180,1183,1185],{"class":499,"line":1173},9,[497,1175,1176],{"class":662},"var",[497,1178,1179],{"class":773}," tmpls ",[497,1181,1182],{"class":503},"embed",[497,1184,709],{"class":662},[497,1186,1187],{"class":503},"FS\n",[497,1189,1191],{"class":499,"line":1190},10,[497,1192,674],{"emptyLinePlaceholder":673},[497,1194,1196,1198,1200,1202,1204,1206,1208,1211,1213,1216,1218,1220,1223,1225,1227,1230],{"class":499,"line":1195},11,[497,1197,1086],{"class":773},[497,1199,709],{"class":662},[497,1201,1120],{"class":695},[497,1203,699],{"class":662},[497,1205,113],{"class":773},[497,1207,709],{"class":662},[497,1209,1210],{"class":695},"Template",[497,1212,699],{"class":662},[497,1214,1215],{"class":773},"tmpls",[497,1217,715],{"class":662},[497,1219,663],{"class":662},[497,1221,1222],{"class":507},"templates\u002Finvoice.html.tmpl",[497,1224,798],{"class":662},[497,1226,715],{"class":662},[497,1228,1229],{"class":773}," inv",[497,1231,835],{"class":662},[497,1233,1235,1238,1240,1242,1245,1247],{"class":499,"line":1234},12,[497,1236,1237],{"class":695},"    WithTextTemplate",[497,1239,699],{"class":662},[497,1241,798],{"class":662},[497,1243,1244],{"class":507},"templates\u002Finvoice.txt.tmpl",[497,1246,798],{"class":662},[497,1248,1153],{"class":662},[497,1250,1252],{"class":499,"line":1251},13,[497,1253,674],{"emptyLinePlaceholder":673},[497,1255,1257],{"class":499,"line":1256},14,[497,1258,1259],{"class":514},"\u002F\u002F 4. előre parse-olt template-ek, saját cache mellett\n",[497,1261,1263,1265,1267,1269,1271,1273,1275,1278,1280,1283,1285,1288,1290,1293],{"class":499,"line":1262},15,[497,1264,1086],{"class":773},[497,1266,709],{"class":662},[497,1268,1120],{"class":695},[497,1270,699],{"class":662},[497,1272,113],{"class":773},[497,1274,709],{"class":662},[497,1276,1277],{"class":695},"Parsed",[497,1279,699],{"class":662},[497,1281,1282],{"class":773},"htmlTpl",[497,1284,715],{"class":662},[497,1286,1287],{"class":773}," textTpl",[497,1289,715],{"class":662},[497,1291,1292],{"class":773}," data",[497,1294,1153],{"class":662},[448,1296,450,1297,1300,1301,1304,1305,1307,1308,1311,1312,1314,1315,1317],{},[452,1298,1299],{},"mail.Template"," ",[452,1302,1303],{},"WithFuncs(template.FuncMap)","-pel bővíthető parse előtt. MJML-forrású HTML-hez lásd az ",[471,1306,126],{"href":127}," oldalt: a lefordított ",[452,1309,1310],{},"mjml.Body"," is ",[452,1313,1061],{},", ugyanúgy illeszkedik a ",[452,1316,1120],{},"-ba.",[1319,1320,1321,1322,903,1325,1328],"note",{},"Nincs automatikus text\u002Fplain-generálás HTML-ből vagy MJML-ből: ha kell text-alternatíva, add meg explicit ",[452,1323,1324],{},".WithText()",[452,1326,1327],{},".WithTextTemplate()","-tel, a HTML-only levél HTML-only marad.",[484,1330,1332],{"id":1331},"dev-mailerek-memory-log-és-discard","Dev mailerek: memory, log és discard",[488,1334,1336],{"className":650,"code":1335,"language":504,"meta":493,"style":493},"mem := mail.NewMemory()               \u002F\u002F renderel és eltárol, nincs valódi küldés\nmailer := mail.NewLog(slog.Default()) \u002F\u002F renderel és logol küldés helyett (dev)\nmailer = mail.NewDiscard()            \u002F\u002F renderel (a template-hiba így is kiderül), majd eldob\n",[452,1337,1338,1358,1388],{"__ignoreMap":493},[497,1339,1340,1343,1345,1347,1349,1352,1355],{"class":499,"line":500},[497,1341,1342],{"class":773},"mem ",[497,1344,777],{"class":662},[497,1346,780],{"class":773},[497,1348,709],{"class":662},[497,1350,1351],{"class":695},"NewMemory",[497,1353,1354],{"class":662},"()",[497,1356,1357],{"class":514},"               \u002F\u002F renderel és eltárol, nincs valódi küldés\n",[497,1359,1360,1363,1365,1367,1369,1372,1374,1377,1379,1382,1385],{"class":499,"line":518},[497,1361,1362],{"class":773},"mailer ",[497,1364,777],{"class":662},[497,1366,780],{"class":773},[497,1368,709],{"class":662},[497,1370,1371],{"class":695},"NewLog",[497,1373,699],{"class":662},[497,1375,1376],{"class":773},"slog",[497,1378,709],{"class":662},[497,1380,1381],{"class":695},"Default",[497,1383,1384],{"class":662},"())",[497,1386,1387],{"class":514}," \u002F\u002F renderel és logol küldés helyett (dev)\n",[497,1389,1390,1392,1395,1397,1399,1402,1404],{"class":499,"line":677},[497,1391,1362],{"class":773},[497,1393,1394],{"class":662},"=",[497,1396,780],{"class":773},[497,1398,709],{"class":662},[497,1400,1401],{"class":695},"NewDiscard",[497,1403,1354],{"class":662},[497,1405,1406],{"class":514},"            \u002F\u002F renderel (a template-hiba így is kiderül), majd eldob\n",[448,1408,450,1409,1412,1413,1416,1417,1420,1421,1424,1425,1428,1429,1432,1433,1439,1440,1443,1444,1446],{},[452,1410,1411],{},"Memory"," minden üzenetet lerenderel és ",[452,1414,1415],{},"[]mail.SentMessage","-ként tárol (",[452,1418,1419],{},"Messages()",", ",[452,1422,1423],{},"Reset()","); konkurens használatra biztonságos. A ",[452,1426,1427],{},"Log"," driver Info szinten csak a tárgyat, címzett-darabszámot és renderelt méretet írja; a teljes törzset csak Debug szinten. PII alapból nem kerül logba. A ",[452,1430,1431],{},"Discard"," az, amit az ",[471,1434,1436],{"href":1435},"\u002Fhu\u002Fmail\u002Fsmtp#newifconfigured-a-dev-prod-kapcsol%C3%B3",[452,1437,1438],{},"smtp.NewIfConfigured"," ad vissza üres ",[452,1441,1442],{},"MAIL_HOST"," esetén: továbbra is validál és renderel (egy hibás template ugyanúgy elbukik, mint egy valódi driverrel), csak épp sosem küld vagy logol; a legcsendesebb \"a mail ki van kapcsolva\" állapot, szemben a ",[452,1445,1427],{}," \"ki van kapcsolva, de szólok róla\" viselkedésével.",[448,1448,1449,1450,1452],{},"A konkrét SMTP driverért lásd az ",[471,1451,122],{"href":123}," oldalt.",[484,1454,1456],{"id":1455},"a-shopban-a-sendorderconfirmation-listener","A shopban: a sendOrderConfirmation listener",[448,1458,450,1459,1462,1463,1300,1466,1469,1470,1473,1474,1476],{},[471,1460,1461],{"href":264},"worker","-ben futó listener az ",[452,1464,1465],{},"orderPlaced",[471,1467,1468],{"href":68},"eventre"," iratkozik fel, és a ",[452,1471,1472],{},"Dependencies","-ből kapott ",[452,1475,481],{},"-rel küld; a driverről nem tud:",[488,1478,1481],{"className":650,"code":1479,"filename":1480,"language":504,"meta":493,"style":493},"import (\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n    shopevents \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fevents\"\n)\n\n\u002F\u002Fgo:embed templates\nvar tmpls embed.FS\n\nfunc sendOrderConfirmation(deps shop.Dependencies) func(context.Context, shopevents.OrderPlaced) error {\n    return func(ctx context.Context, ev shopevents.OrderPlaced) error {\n        return deps.Mailer.Send(ctx, mail.NewMessage().\n            WithTo(ev.CustomerEmail).\n            WithSubject(\"Rendelésed visszaigazolása: \"+ev.OrderID).\n            WithBody(mjml.Template(tmpls, \"templates\u002Forder_confirmation.mjml.tmpl\", ev).\n                WithTextTemplate(\"templates\u002Forder_confirmation.txt.tmpl\")))\n    }\n}\n","internal\u002Fmodules\u002Fshop\u002Flisteners\u002Fsend_order_confirmation.go",[452,1482,1483,1490,1500,1512,1516,1520,1524,1536,1540,1589,1621,1651,1668,1694,1727,1744,1750],{"__ignoreMap":493},[497,1484,1485,1487],{"class":499,"line":500},[497,1486,659],{"class":658},[497,1488,1489],{"class":662}," (\n",[497,1491,1492,1495,1498],{"class":499,"line":518},[497,1493,1494],{"class":662},"    \"",[497,1496,1497],{"class":503},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop",[497,1499,668],{"class":662},[497,1501,1502,1505,1507,1510],{"class":499,"line":677},[497,1503,1504],{"class":773},"    shopevents ",[497,1506,798],{"class":662},[497,1508,1509],{"class":503},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\u002Fevents",[497,1511,668],{"class":662},[497,1513,1514],{"class":499,"line":692},[497,1515,868],{"class":662},[497,1517,1518],{"class":499,"line":733},[497,1519,674],{"emptyLinePlaceholder":673},[497,1521,1522],{"class":499,"line":1156},[497,1523,1170],{"class":514},[497,1525,1526,1528,1530,1532,1534],{"class":499,"line":1161},[497,1527,1176],{"class":662},[497,1529,1179],{"class":773},[497,1531,1182],{"class":503},[497,1533,709],{"class":662},[497,1535,1187],{"class":503},[497,1537,1538],{"class":499,"line":1167},[497,1539,674],{"emptyLinePlaceholder":673},[497,1541,1542,1545,1548,1550,1553,1556,1558,1560,1562,1565,1568,1570,1572,1574,1577,1579,1582,1584,1587],{"class":499,"line":1173},[497,1543,1544],{"class":662},"func",[497,1546,1547],{"class":695}," sendOrderConfirmation",[497,1549,699],{"class":662},[497,1551,1552],{"class":702},"deps",[497,1554,1555],{"class":503}," shop",[497,1557,709],{"class":662},[497,1559,1472],{"class":503},[497,1561,726],{"class":662},[497,1563,1564],{"class":662}," func(",[497,1566,1567],{"class":503},"context",[497,1569,709],{"class":662},[497,1571,712],{"class":503},[497,1573,715],{"class":662},[497,1575,1576],{"class":503}," shopevents",[497,1578,709],{"class":662},[497,1580,1581],{"class":503},"OrderPlaced",[497,1583,726],{"class":662},[497,1585,1586],{"class":729}," error",[497,1588,689],{"class":662},[497,1590,1591,1594,1596,1598,1600,1602,1604,1606,1609,1611,1613,1615,1617,1619],{"class":499,"line":1190},[497,1592,1593],{"class":658},"    return",[497,1595,1564],{"class":662},[497,1597,703],{"class":702},[497,1599,706],{"class":503},[497,1601,709],{"class":662},[497,1603,712],{"class":503},[497,1605,715],{"class":662},[497,1607,1608],{"class":702}," ev",[497,1610,1576],{"class":503},[497,1612,709],{"class":662},[497,1614,1581],{"class":503},[497,1616,726],{"class":662},[497,1618,1586],{"class":729},[497,1620,689],{"class":662},[497,1622,1623,1626,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649],{"class":499,"line":1195},[497,1624,1625],{"class":658},"        return",[497,1627,1628],{"class":773}," deps",[497,1630,709],{"class":662},[497,1632,468],{"class":773},[497,1634,709],{"class":662},[497,1636,741],{"class":695},[497,1638,699],{"class":662},[497,1640,703],{"class":773},[497,1642,715],{"class":662},[497,1644,780],{"class":773},[497,1646,709],{"class":662},[497,1648,785],{"class":695},[497,1650,788],{"class":662},[497,1652,1653,1656,1658,1661,1663,1666],{"class":499,"line":1234},[497,1654,1655],{"class":695},"            WithTo",[497,1657,699],{"class":662},[497,1659,1660],{"class":773},"ev",[497,1662,709],{"class":662},[497,1664,1665],{"class":773},"CustomerEmail",[497,1667,835],{"class":662},[497,1669,1670,1673,1675,1677,1680,1682,1685,1687,1689,1692],{"class":499,"line":1251},[497,1671,1672],{"class":695},"            WithSubject",[497,1674,699],{"class":662},[497,1676,798],{"class":662},[497,1678,1679],{"class":507},"Rendelésed visszaigazolása: ",[497,1681,798],{"class":662},[497,1683,1684],{"class":662},"+",[497,1686,1660],{"class":773},[497,1688,709],{"class":662},[497,1690,1691],{"class":773},"OrderID",[497,1693,835],{"class":662},[497,1695,1696,1699,1701,1704,1706,1708,1710,1712,1714,1716,1719,1721,1723,1725],{"class":499,"line":1256},[497,1697,1698],{"class":695},"            WithBody",[497,1700,699],{"class":662},[497,1702,1703],{"class":773},"mjml",[497,1705,709],{"class":662},[497,1707,1210],{"class":695},[497,1709,699],{"class":662},[497,1711,1215],{"class":773},[497,1713,715],{"class":662},[497,1715,663],{"class":662},[497,1717,1718],{"class":507},"templates\u002Forder_confirmation.mjml.tmpl",[497,1720,798],{"class":662},[497,1722,715],{"class":662},[497,1724,1608],{"class":773},[497,1726,835],{"class":662},[497,1728,1729,1732,1734,1736,1739,1741],{"class":499,"line":1262},[497,1730,1731],{"class":695},"                WithTextTemplate",[497,1733,699],{"class":662},[497,1735,798],{"class":662},[497,1737,1738],{"class":507},"templates\u002Forder_confirmation.txt.tmpl",[497,1740,798],{"class":662},[497,1742,1743],{"class":662},")))\n",[497,1745,1747],{"class":499,"line":1746},16,[497,1748,1749],{"class":662},"    }\n",[497,1751,1753],{"class":499,"line":1752},17,[497,1754,736],{"class":662},[448,1756,1757,1758,1761,1762,1764,1765,1768],{},"A regisztráció a ",[452,1759,1760],{},"listeners\u002Fregister.go","-ban él, a ",[452,1763,113],{}," nevű queue-ra irányítva (",[452,1766,1767],{},"add listener shop orderPlaced sendOrderConfirmation --queue mail"," generálta):",[488,1770,1773],{"className":650,"code":1771,"filename":1772,"language":504,"meta":493,"style":493},"func Register(reg *events.Registry, deps shop.Dependencies) {\n    events.Listen(reg, \"sendOrderConfirmation\", sendOrderConfirmation(deps), queue.OnQueue(\"mail\"))\n}\n","internal\u002Fmodules\u002Fshop\u002Flisteners\u002Fregister.go",[452,1774,1775,1810,1861],{"__ignoreMap":493},[497,1776,1777,1779,1782,1784,1787,1789,1791,1793,1796,1798,1800,1802,1804,1806,1808],{"class":499,"line":500},[497,1778,1544],{"class":662},[497,1780,1781],{"class":695}," Register",[497,1783,699],{"class":662},[497,1785,1786],{"class":702},"reg",[497,1788,721],{"class":662},[497,1790,61],{"class":503},[497,1792,709],{"class":662},[497,1794,1795],{"class":503},"Registry",[497,1797,715],{"class":662},[497,1799,1628],{"class":702},[497,1801,1555],{"class":503},[497,1803,709],{"class":662},[497,1805,1472],{"class":503},[497,1807,726],{"class":662},[497,1809,689],{"class":662},[497,1811,1812,1815,1817,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1843,1846,1848,1851,1853,1855,1857,1859],{"class":499,"line":518},[497,1813,1814],{"class":773},"    events",[497,1816,709],{"class":662},[497,1818,1819],{"class":695},"Listen",[497,1821,699],{"class":662},[497,1823,1786],{"class":773},[497,1825,715],{"class":662},[497,1827,663],{"class":662},[497,1829,477],{"class":507},[497,1831,798],{"class":662},[497,1833,715],{"class":662},[497,1835,1547],{"class":695},[497,1837,699],{"class":662},[497,1839,1552],{"class":773},[497,1841,1842],{"class":662},"),",[497,1844,1845],{"class":773}," queue",[497,1847,709],{"class":662},[497,1849,1850],{"class":695},"OnQueue",[497,1852,699],{"class":662},[497,1854,798],{"class":662},[497,1856,113],{"class":507},[497,1858,798],{"class":662},[497,1860,1153],{"class":662},[497,1862,1863],{"class":499,"line":677},[497,1864,736],{"class":662},[448,1866,1867,1868,1871,1872,1875],{},"A kézbesítés legalább-egyszeres, ezért a listener legyen idempotens: az ",[452,1869,1870],{},"events.MetaFromContext(ctx)","-ből kiolvasott ",[452,1873,1874],{},"Meta.ID"," stabil idempotencia-kulcs a retryk között.",[1877,1878,1880],"h3",{"id":1879},"a-teszt-memory-mailer","A teszt: Memory mailer",[488,1882,1884],{"className":650,"code":1883,"language":504,"meta":493,"style":493},"func TestSendOrderConfirmation(t *testing.T) {\n    mem := mail.NewMemory()\n    handle := sendOrderConfirmation(shop.Dependencies{Mailer: mem})\n\n    err := handle(t.Context(), shopevents.OrderPlaced{\n        OrderID: \"o-1001\", CustomerEmail: \"user@example.com\",\n    })\n\n    require.NoError(t, err)\n    sent := mem.Messages()\n    require.Len(t, sent, 1)\n    require.Equal(t, \"user@example.com\", sent[0].To[0].Address)\n    require.Contains(t, sent[0].Content.HTML, \"o-1001\") \u002F\u002F a Memory renderel is\n}\n",[452,1885,1886,1912,1928,1960,1964,1994,2024,2029,2033,2054,2070,2096,2144,2187],{"__ignoreMap":493},[497,1887,1888,1890,1893,1895,1898,1900,1903,1905,1908,1910],{"class":499,"line":500},[497,1889,1544],{"class":662},[497,1891,1892],{"class":695}," TestSendOrderConfirmation",[497,1894,699],{"class":662},[497,1896,1897],{"class":702},"t",[497,1899,721],{"class":662},[497,1901,1902],{"class":503},"testing",[497,1904,709],{"class":662},[497,1906,1907],{"class":503},"T",[497,1909,726],{"class":662},[497,1911,689],{"class":662},[497,1913,1914,1917,1919,1921,1923,1925],{"class":499,"line":518},[497,1915,1916],{"class":773},"    mem ",[497,1918,777],{"class":662},[497,1920,780],{"class":773},[497,1922,709],{"class":662},[497,1924,1351],{"class":695},[497,1926,1927],{"class":662},"()\n",[497,1929,1930,1933,1935,1937,1939,1942,1944,1946,1949,1951,1954,1957],{"class":499,"line":677},[497,1931,1932],{"class":773},"    handle ",[497,1934,777],{"class":662},[497,1936,1547],{"class":695},[497,1938,699],{"class":662},[497,1940,1941],{"class":503},"shop",[497,1943,709],{"class":662},[497,1945,1472],{"class":503},[497,1947,1948],{"class":662},"{",[497,1950,468],{"class":773},[497,1952,1953],{"class":662},":",[497,1955,1956],{"class":773}," mem",[497,1958,1959],{"class":662},"})\n",[497,1961,1962],{"class":499,"line":692},[497,1963,674],{"emptyLinePlaceholder":673},[497,1965,1966,1969,1971,1974,1976,1978,1980,1982,1985,1987,1989,1991],{"class":499,"line":733},[497,1967,1968],{"class":773},"    err ",[497,1970,777],{"class":662},[497,1972,1973],{"class":695}," handle",[497,1975,699],{"class":662},[497,1977,1897],{"class":773},[497,1979,709],{"class":662},[497,1981,712],{"class":695},[497,1983,1984],{"class":662},"(),",[497,1986,1576],{"class":503},[497,1988,709],{"class":662},[497,1990,1581],{"class":503},[497,1992,1993],{"class":662},"{\n",[497,1995,1996,1999,2001,2003,2006,2008,2010,2013,2015,2017,2019,2021],{"class":499,"line":1156},[497,1997,1998],{"class":773},"        OrderID",[497,2000,1953],{"class":662},[497,2002,663],{"class":662},[497,2004,2005],{"class":507},"o-1001",[497,2007,798],{"class":662},[497,2009,715],{"class":662},[497,2011,2012],{"class":773}," CustomerEmail",[497,2014,1953],{"class":662},[497,2016,663],{"class":662},[497,2018,830],{"class":507},[497,2020,798],{"class":662},[497,2022,2023],{"class":662},",\n",[497,2025,2026],{"class":499,"line":1161},[497,2027,2028],{"class":662},"    })\n",[497,2030,2031],{"class":499,"line":1167},[497,2032,674],{"emptyLinePlaceholder":673},[497,2034,2035,2038,2040,2043,2045,2047,2049,2052],{"class":499,"line":1173},[497,2036,2037],{"class":773},"    require",[497,2039,709],{"class":662},[497,2041,2042],{"class":695},"NoError",[497,2044,699],{"class":662},[497,2046,1897],{"class":773},[497,2048,715],{"class":662},[497,2050,2051],{"class":773}," err",[497,2053,868],{"class":662},[497,2055,2056,2059,2061,2063,2065,2068],{"class":499,"line":1190},[497,2057,2058],{"class":773},"    sent ",[497,2060,777],{"class":662},[497,2062,1956],{"class":773},[497,2064,709],{"class":662},[497,2066,2067],{"class":695},"Messages",[497,2069,1927],{"class":662},[497,2071,2072,2074,2076,2079,2081,2083,2085,2088,2090,2094],{"class":499,"line":1195},[497,2073,2037],{"class":773},[497,2075,709],{"class":662},[497,2077,2078],{"class":695},"Len",[497,2080,699],{"class":662},[497,2082,1897],{"class":773},[497,2084,715],{"class":662},[497,2086,2087],{"class":773}," sent",[497,2089,715],{"class":662},[497,2091,2093],{"class":2092},"sbssI"," 1",[497,2095,868],{"class":662},[497,2097,2098,2100,2102,2105,2107,2109,2111,2113,2115,2117,2119,2121,2124,2127,2130,2133,2135,2137,2139,2142],{"class":499,"line":1234},[497,2099,2037],{"class":773},[497,2101,709],{"class":662},[497,2103,2104],{"class":695},"Equal",[497,2106,699],{"class":662},[497,2108,1897],{"class":773},[497,2110,715],{"class":662},[497,2112,663],{"class":662},[497,2114,830],{"class":507},[497,2116,798],{"class":662},[497,2118,715],{"class":662},[497,2120,2087],{"class":773},[497,2122,2123],{"class":662},"[",[497,2125,2126],{"class":2092},"0",[497,2128,2129],{"class":662},"].",[497,2131,2132],{"class":773},"To",[497,2134,2123],{"class":662},[497,2136,2126],{"class":2092},[497,2138,2129],{"class":662},[497,2140,2141],{"class":773},"Address",[497,2143,868],{"class":662},[497,2145,2146,2148,2150,2153,2155,2157,2159,2161,2163,2165,2167,2170,2172,2174,2176,2178,2180,2182,2184],{"class":499,"line":1251},[497,2147,2037],{"class":773},[497,2149,709],{"class":662},[497,2151,2152],{"class":695},"Contains",[497,2154,699],{"class":662},[497,2156,1897],{"class":773},[497,2158,715],{"class":662},[497,2160,2087],{"class":773},[497,2162,2123],{"class":662},[497,2164,2126],{"class":2092},[497,2166,2129],{"class":662},[497,2168,2169],{"class":773},"Content",[497,2171,709],{"class":662},[497,2173,1129],{"class":773},[497,2175,715],{"class":662},[497,2177,663],{"class":662},[497,2179,2005],{"class":507},[497,2181,798],{"class":662},[497,2183,726],{"class":662},[497,2185,2186],{"class":514}," \u002F\u002F a Memory renderel is\n",[497,2188,2189],{"class":499,"line":1256},[497,2190,736],{"class":662},[448,2192,2193,2194,2196,2197,2199],{},"Mivel a ",[452,2195,1411],{}," ténylegesen renderel, a teszt a template-hibákat is elkapja: egy elgépelt mező a ",[452,2198,2169],{}," ellenőrzésén bukik, nem élesben.",[484,2201,2203],{"id":2202},"queue-zott-aszinkron-küldés","Queue-zott (aszinkron) küldés",[448,2205,450,2206,2208,2209,2212,2213,2215],{},[452,2207,468],{}," szinkron marad; az aszinkron küldés a fenti mintát követi: az esemény megy a queue-ba az ",[471,2210,2211],{"href":73},"outboxon"," át, és a listener küldi a levelet a workerben, retry-kkal. Nincs külön beépített „mail queue\": az ",[471,2214,61],{"href":68}," rendszer az.",[484,2217,2219,2220],{"id":2218},"hova-kerül-a-tartalom-add-mail","Hova kerül a tartalom: ",[452,2221,300],{},[448,2223,2224,2225,2227,2228,2231],{},"A fenti ",[452,2226,477],{}," példa közvetlenül a listenerből hívja a ",[452,2229,2230],{},"deps.Mailer.Send","-et: ez egyetlen, egyszerű üzenetre jó. Amint egy modul több, összetartozó értesítést küld, vagy az üzenet összeállítása (több címzett, számolt subject, több sablon) megér egy külön nevet és tesztet, generálj inkább egy notifiert:",[488,2233,2235],{"className":490,"code":2234,"language":492,"meta":493,"style":493},"gpsystem add mail \u003Cmodul> \u003Cnév>\n",[452,2236,2237],{"__ignoreMap":493},[497,2238,2239,2242,2245,2247,2250,2253,2256,2259,2261,2264,2267],{"class":499,"line":500},[497,2240,2241],{"class":503},"gpsystem",[497,2243,2244],{"class":507}," add",[497,2246,780],{"class":507},[497,2248,2249],{"class":662}," \u003C",[497,2251,2252],{"class":507},"modu",[497,2254,2255],{"class":773},"l",[497,2257,2258],{"class":662},">",[497,2260,2249],{"class":662},[497,2262,2263],{"class":507},"né",[497,2265,2266],{"class":773},"v",[497,2268,2269],{"class":662},">\n",[448,2271,2272,2273,2276,2277,2281,2282,2286,2287,2289,2290,2293,2294,2297,2298,2300,2301,2304,2305,2307,2308,903,2310,2313,2314,2319],{},"Ez ugyanaz a szétválasztás, amit a kit mindenhol követ: ",[1068,2274,2275],{},"a transzport infrastruktúra, a tartalom a modul üzleti logikája"," (lásd ",[471,2278,2280],{"href":2279},"\u002Fhu\u002Fgetting-started\u002Fproject-structure#mi-%C3%A9lhet-egy-modulon-bel%C3%BCl","Projektstruktúra: mi élhet egy modulon belül"," és a ",[471,2283,2285],{"href":2284},"\u002Fhu\u002Fconcepts\u002Farchitecture#k%C3%B6z%C3%B6s-k%C3%B3d-egy-d%C3%B6nt%C3%A9si-l%C3%A9tra","közös kód döntési létráját","). Az ",[452,2288,300],{}," legenerálja az ",[452,2291,2292],{},"internal\u002Fmodules\u002F\u003Cmodul>\u002Fmail\u002F\u003Cnév>.go"," fájlt: egy payload structot, egy ",[452,2295,2296],{},"\u003CNév>Notifier","-t, ami egy injektált ",[452,2299,481],{},"-t köt össze a modul saját sablonjaival, és bekötve egy ",[452,2302,2303],{},"Mailer mail.Mailer"," mezőt a modul ",[452,2306,1472],{},"-ébe, minden belépési pontban egyszer megkonstruálva, ",[452,2309,1438],{},[452,2311,2312],{},"MustNewIfConfigured","-dal. Lásd az ",[471,2315,2316,2318],{"href":301},[452,2317,300],{}," referenciát"," a pontos generált alakért.",[1877,2321,2323],{"id":2322},"kidolgozott-példa-a-contact-email-flow","Kidolgozott példa: a contact-email flow",[448,2325,2326],{},"A minta egy konkrét, végigvitt változata: egy webes űrlap, ami egyszerre értesíti az admin postafiókot és a kérelmezőt:",[2328,2329,2330,2343,2353,2363],"ol",{},[621,2331,2332,2335,2336,2339,2340,2342],{},[452,2333,2334],{},"POST \u002Fweb\u002Fcontact",": a web surface service-e elmenti a beküldést, és egy ",[452,2337,2338],{},"ContactSubmitted"," eventet dob az ",[471,2341,2211],{"href":73}," át, ugyanabban a tranzakcióban.",[621,2344,450,2345,2348,2349,2352],{},[452,2346,2347],{},"cmd\u002Fworker"," outbox-relay-je kézbesíti az eventet a ",[452,2350,2351],{},"sendContactEmail"," listenernek.",[621,2354,2355,2356,2359,2360,2362],{},"A listener meghívja az ",[452,2357,2358],{},"internal\u002Fmodules\u002Fcontact\u002Fmail.Notifier.Notify","-t, ami mindkét sablont lerendereli (egy admin-értesítést és egy kérelmező-visszaigazolást), és mindkettőt elküldi az injektált ",[452,2361,481],{},"-en át.",[621,2364,2365,2366,2368,2369,2371,2372,2375,2376,2378],{},"Ez a ",[452,2367,481],{}," élesben SMTP, devben (ha a ",[452,2370,1442],{}," üres) ",[452,2373,2374],{},"mail.NewDiscard()",", a notifier saját tesztjeiben pedig ",[452,2377,642],{}," (lásd fent).",[488,2380,2383],{"className":650,"code":2381,"filename":2382,"language":504,"meta":493,"style":493},"package mail\n\n\u002F\u002Fgo:embed templates\u002F*.tmpl\nvar templatesFS embed.FS\n\ntype ContactNotification struct {\n    Name, Email string\n    \u002F\u002F ... az űrlap többi mezője\n}\n\ntype Notifier interface {\n    Notify(ctx context.Context, n ContactNotification) error\n}\n\nfunc New(m kitmail.Mailer, cfg Config) Notifier {\n    return &notifier{mailer: m, adminTo: cfg.To}\n}\n\nfunc (n *notifier) Notify(ctx context.Context, p ContactNotification) error {\n    adminErr := n.sendAdminNotification(ctx, p)         \u002F\u002F -> Config.To\n    requesterErr := n.sendRequesterConfirmation(ctx, p) \u002F\u002F -> p.Email\n    return errors.Join(adminErr, requesterErr)\n}\n","internal\u002Fmodules\u002Fcontact\u002Fmail\u002Fnotifier.go",[452,2384,2385,2393,2397,2402,2415,2419,2431,2444,2449,2453,2457,2468,2494,2498,2502,2535,2570,2574,2579,2623,2651,2679,2704],{"__ignoreMap":493},[497,2386,2387,2390],{"class":499,"line":500},[497,2388,2389],{"class":662},"package",[497,2391,2392],{"class":503}," mail\n",[497,2394,2395],{"class":499,"line":518},[497,2396,674],{"emptyLinePlaceholder":673},[497,2398,2399],{"class":499,"line":677},[497,2400,2401],{"class":514},"\u002F\u002Fgo:embed templates\u002F*.tmpl\n",[497,2403,2404,2406,2409,2411,2413],{"class":499,"line":692},[497,2405,1176],{"class":662},[497,2407,2408],{"class":773}," templatesFS ",[497,2410,1182],{"class":503},[497,2412,709],{"class":662},[497,2414,1187],{"class":503},[497,2416,2417],{"class":499,"line":733},[497,2418,674],{"emptyLinePlaceholder":673},[497,2420,2421,2423,2426,2429],{"class":499,"line":1156},[497,2422,680],{"class":662},[497,2424,2425],{"class":503}," ContactNotification",[497,2427,2428],{"class":662}," struct",[497,2430,689],{"class":662},[497,2432,2433,2436,2438,2441],{"class":499,"line":1161},[497,2434,2435],{"class":773},"    Name",[497,2437,715],{"class":662},[497,2439,2440],{"class":773}," Email ",[497,2442,2443],{"class":729},"string\n",[497,2445,2446],{"class":499,"line":1167},[497,2447,2448],{"class":514},"    \u002F\u002F ... az űrlap többi mezője\n",[497,2450,2451],{"class":499,"line":1173},[497,2452,736],{"class":662},[497,2454,2455],{"class":499,"line":1190},[497,2456,674],{"emptyLinePlaceholder":673},[497,2458,2459,2461,2464,2466],{"class":499,"line":1195},[497,2460,680],{"class":662},[497,2462,2463],{"class":503}," Notifier",[497,2465,686],{"class":662},[497,2467,689],{"class":662},[497,2469,2470,2473,2475,2477,2479,2481,2483,2485,2488,2490,2492],{"class":499,"line":1234},[497,2471,2472],{"class":695},"    Notify",[497,2474,699],{"class":662},[497,2476,703],{"class":702},[497,2478,706],{"class":503},[497,2480,709],{"class":662},[497,2482,712],{"class":503},[497,2484,715],{"class":662},[497,2486,2487],{"class":702}," n",[497,2489,2425],{"class":503},[497,2491,726],{"class":662},[497,2493,730],{"class":729},[497,2495,2496],{"class":499,"line":1251},[497,2497,736],{"class":662},[497,2499,2500],{"class":499,"line":1256},[497,2501,674],{"emptyLinePlaceholder":673},[497,2503,2504,2506,2509,2511,2514,2517,2519,2521,2523,2526,2529,2531,2533],{"class":499,"line":1262},[497,2505,1544],{"class":662},[497,2507,2508],{"class":695}," New",[497,2510,699],{"class":662},[497,2512,2513],{"class":702},"m",[497,2515,2516],{"class":503}," kitmail",[497,2518,709],{"class":662},[497,2520,468],{"class":503},[497,2522,715],{"class":662},[497,2524,2525],{"class":702}," cfg",[497,2527,2528],{"class":503}," Config",[497,2530,726],{"class":662},[497,2532,2463],{"class":503},[497,2534,689],{"class":662},[497,2536,2537,2539,2542,2545,2547,2550,2552,2555,2557,2560,2562,2564,2566,2568],{"class":499,"line":1746},[497,2538,1593],{"class":658},[497,2540,2541],{"class":662}," &",[497,2543,2544],{"class":503},"notifier",[497,2546,1948],{"class":662},[497,2548,2549],{"class":773},"mailer",[497,2551,1953],{"class":662},[497,2553,2554],{"class":773}," m",[497,2556,715],{"class":662},[497,2558,2559],{"class":773}," adminTo",[497,2561,1953],{"class":662},[497,2563,2525],{"class":773},[497,2565,709],{"class":662},[497,2567,2132],{"class":773},[497,2569,736],{"class":662},[497,2571,2572],{"class":499,"line":1752},[497,2573,736],{"class":662},[497,2575,2577],{"class":499,"line":2576},18,[497,2578,674],{"emptyLinePlaceholder":673},[497,2580,2582,2584,2587,2590,2593,2595,2597,2600,2602,2604,2606,2608,2610,2612,2615,2617,2619,2621],{"class":499,"line":2581},19,[497,2583,1544],{"class":662},[497,2585,2586],{"class":662}," (",[497,2588,2589],{"class":702},"n ",[497,2591,2592],{"class":662},"*",[497,2594,2544],{"class":503},[497,2596,726],{"class":662},[497,2598,2599],{"class":695}," Notify",[497,2601,699],{"class":662},[497,2603,703],{"class":702},[497,2605,706],{"class":503},[497,2607,709],{"class":662},[497,2609,712],{"class":503},[497,2611,715],{"class":662},[497,2613,2614],{"class":702}," p",[497,2616,2425],{"class":503},[497,2618,726],{"class":662},[497,2620,1586],{"class":729},[497,2622,689],{"class":662},[497,2624,2626,2629,2631,2633,2635,2638,2640,2642,2644,2646,2648],{"class":499,"line":2625},20,[497,2627,2628],{"class":773},"    adminErr ",[497,2630,777],{"class":662},[497,2632,2487],{"class":773},[497,2634,709],{"class":662},[497,2636,2637],{"class":695},"sendAdminNotification",[497,2639,699],{"class":662},[497,2641,703],{"class":773},[497,2643,715],{"class":662},[497,2645,2614],{"class":773},[497,2647,726],{"class":662},[497,2649,2650],{"class":514},"         \u002F\u002F -> Config.To\n",[497,2652,2654,2657,2659,2661,2663,2666,2668,2670,2672,2674,2676],{"class":499,"line":2653},21,[497,2655,2656],{"class":773},"    requesterErr ",[497,2658,777],{"class":662},[497,2660,2487],{"class":773},[497,2662,709],{"class":662},[497,2664,2665],{"class":695},"sendRequesterConfirmation",[497,2667,699],{"class":662},[497,2669,703],{"class":773},[497,2671,715],{"class":662},[497,2673,2614],{"class":773},[497,2675,726],{"class":662},[497,2677,2678],{"class":514}," \u002F\u002F -> p.Email\n",[497,2680,2682,2684,2687,2689,2692,2694,2697,2699,2702],{"class":499,"line":2681},22,[497,2683,1593],{"class":658},[497,2685,2686],{"class":773}," errors",[497,2688,709],{"class":662},[497,2690,2691],{"class":695},"Join",[497,2693,699],{"class":662},[497,2695,2696],{"class":773},"adminErr",[497,2698,715],{"class":662},[497,2700,2701],{"class":773}," requesterErr",[497,2703,868],{"class":662},[497,2705,2707],{"class":499,"line":2706},23,[497,2708,736],{"class":662},[488,2710,2713],{"className":650,"code":2711,"filename":2712,"language":504,"meta":493,"style":493},"func sendContactEmail(deps contact.Dependencies) func(context.Context, contactevents.ContactSubmitted) error {\n    notifier := contactmail.New(deps.Mailer, deps.Mail)\n    return func(ctx context.Context, ev contactevents.ContactSubmitted) error {\n        return notifier.Notify(ctx, contactmail.ContactNotification{Name: ev.Name, Email: ev.Email \u002F* ... *\u002F})\n    }\n}\n","internal\u002Fmodules\u002Fcontact\u002Flisteners\u002Fsendcontactemail.go",[452,2714,2715,2758,2792,2822,2879,2883],{"__ignoreMap":493},[497,2716,2717,2719,2722,2724,2726,2729,2731,2733,2735,2737,2739,2741,2743,2745,2748,2750,2752,2754,2756],{"class":499,"line":500},[497,2718,1544],{"class":662},[497,2720,2721],{"class":695}," sendContactEmail",[497,2723,699],{"class":662},[497,2725,1552],{"class":702},[497,2727,2728],{"class":503}," contact",[497,2730,709],{"class":662},[497,2732,1472],{"class":503},[497,2734,726],{"class":662},[497,2736,1564],{"class":662},[497,2738,1567],{"class":503},[497,2740,709],{"class":662},[497,2742,712],{"class":503},[497,2744,715],{"class":662},[497,2746,2747],{"class":503}," contactevents",[497,2749,709],{"class":662},[497,2751,2338],{"class":503},[497,2753,726],{"class":662},[497,2755,1586],{"class":729},[497,2757,689],{"class":662},[497,2759,2760,2763,2765,2768,2770,2773,2775,2777,2779,2781,2783,2785,2787,2790],{"class":499,"line":518},[497,2761,2762],{"class":773},"    notifier ",[497,2764,777],{"class":662},[497,2766,2767],{"class":773}," contactmail",[497,2769,709],{"class":662},[497,2771,2772],{"class":695},"New",[497,2774,699],{"class":662},[497,2776,1552],{"class":773},[497,2778,709],{"class":662},[497,2780,468],{"class":773},[497,2782,715],{"class":662},[497,2784,1628],{"class":773},[497,2786,709],{"class":662},[497,2788,2789],{"class":773},"Mail",[497,2791,868],{"class":662},[497,2793,2794,2796,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820],{"class":499,"line":677},[497,2795,1593],{"class":658},[497,2797,1564],{"class":662},[497,2799,703],{"class":702},[497,2801,706],{"class":503},[497,2803,709],{"class":662},[497,2805,712],{"class":503},[497,2807,715],{"class":662},[497,2809,1608],{"class":702},[497,2811,2747],{"class":503},[497,2813,709],{"class":662},[497,2815,2338],{"class":503},[497,2817,726],{"class":662},[497,2819,1586],{"class":729},[497,2821,689],{"class":662},[497,2823,2824,2826,2829,2831,2834,2836,2838,2840,2842,2844,2847,2849,2852,2854,2856,2858,2860,2862,2865,2867,2869,2871,2874,2877],{"class":499,"line":692},[497,2825,1625],{"class":658},[497,2827,2828],{"class":773}," notifier",[497,2830,709],{"class":662},[497,2832,2833],{"class":695},"Notify",[497,2835,699],{"class":662},[497,2837,703],{"class":773},[497,2839,715],{"class":662},[497,2841,2767],{"class":503},[497,2843,709],{"class":662},[497,2845,2846],{"class":503},"ContactNotification",[497,2848,1948],{"class":662},[497,2850,2851],{"class":773},"Name",[497,2853,1953],{"class":662},[497,2855,1608],{"class":773},[497,2857,709],{"class":662},[497,2859,2851],{"class":773},[497,2861,715],{"class":662},[497,2863,2864],{"class":773}," Email",[497,2866,1953],{"class":662},[497,2868,1608],{"class":773},[497,2870,709],{"class":662},[497,2872,2873],{"class":773},"Email ",[497,2875,2876],{"class":514},"\u002F* ... *\u002F",[497,2878,1959],{"class":662},[497,2880,2881],{"class":499,"line":733},[497,2882,1749],{"class":662},[497,2884,2885],{"class":499,"line":1156},[497,2886,736],{"class":662},[448,2888,2889,2890,2893,2894,2897,2898,2901,2902,2281,2905,2907],{},"Mind a címzettkonfiguráció (",[452,2891,2892],{},"Config.To",", modul-tartalom), mind a közös SMTP-config (",[452,2895,2896],{},"smtp.Config",", kit-szintű transzport) ugyanazon a ",[452,2899,2900],{},"MAIL_"," prefixen komponálódik a platform configban: a ",[452,2903,2904],{},"MAIL_TO",[452,2906,1442],{}," csak két mező egy env-névtér alatt, ütközés nélkül:",[488,2909,2912],{"className":650,"code":2910,"filename":2911,"language":504,"meta":493,"style":493},"type Config struct {\n    \u002F\u002F ...\n    Mail        smtp.Config        `envPrefix:\"MAIL_\"` \u002F\u002F MAIL_HOST, MAIL_FROM_ADDRESS, ...\n    ContactMail contactmail.Config `envPrefix:\"MAIL_\"` \u002F\u002F MAIL_TO\n}\n","internal\u002Fplatform\u002Fconfig\u002Fconfig.go",[452,2913,2914,2924,2929,2954,2976],{"__ignoreMap":493},[497,2915,2916,2918,2920,2922],{"class":499,"line":500},[497,2917,680],{"class":662},[497,2919,2528],{"class":503},[497,2921,2428],{"class":662},[497,2923,689],{"class":662},[497,2925,2926],{"class":499,"line":518},[497,2927,2928],{"class":514},"    \u002F\u002F ...\n",[497,2930,2931,2934,2937,2939,2942,2945,2948,2951],{"class":499,"line":677},[497,2932,2933],{"class":773},"    Mail        ",[497,2935,2936],{"class":503},"smtp",[497,2938,709],{"class":662},[497,2940,2941],{"class":503},"Config",[497,2943,2944],{"class":662},"        `",[497,2946,2947],{"class":507},"envPrefix:\"MAIL_\"",[497,2949,2950],{"class":662},"`",[497,2952,2953],{"class":514}," \u002F\u002F MAIL_HOST, MAIL_FROM_ADDRESS, ...\n",[497,2955,2956,2959,2962,2964,2966,2969,2971,2973],{"class":499,"line":692},[497,2957,2958],{"class":773},"    ContactMail ",[497,2960,2961],{"class":503},"contactmail",[497,2963,709],{"class":662},[497,2965,2941],{"class":503},[497,2967,2968],{"class":662}," `",[497,2970,2947],{"class":507},[497,2972,2950],{"class":662},[497,2974,2975],{"class":514}," \u002F\u002F MAIL_TO\n",[497,2977,2978],{"class":499,"line":733},[497,2979,736],{"class":662},[1319,2981,2982,2983,2985,2986,2988,2989,2991,2992,2995],{},"Az ",[452,2984,300],{}," nem generálja le kézzel a fenti ",[452,2987,2351],{},"-ben látott bekötést: a generátor a notifiert, a sablonjait és a ",[452,2990,1472],{},"\u002Fconfig bekötést állítja elő; a payload mezők, a subject-sor és a hívás egy service-ből vagy listenerből üzleti logika, amit te írsz meg, ugyanúgy, ahogy a ",[452,2993,2994],{},"service\u002Fservice.go"," is minimális seamként generálódik.",[448,2997,2998,2999,3002,3003,3007,3008,3011,3012,903,3015,3017],{},"Ha egy modul tartalma egy recipiensnek szól, nem csak egy puszta címnek, főleg ha többre van szükség mint mail (perzisztált inbox, élő push), lásd a ",[471,3000,3001],{"href":136},"Notification"," oldalt és az ",[471,3004,3005],{"href":306},[452,3006,305],{},"-t helyette; a két generátor összeadódik, és egy notification ",[452,3009,3010],{},"ToMail","-je ugyanazokat a ",[452,3013,3014],{},"mail.Message",[452,3016,1299],{}," buildereket használja, mint amiket itt láttál.",[484,3019,3021],{"id":3020},"kapcsolódó-oldalak","Kapcsolódó oldalak",[618,3023,3024,3033,3038,3043],{},[621,3025,3026,3028,3029,3032],{},[471,3027,122],{"href":123},": az SMTP driver, konfigurációja és a ",[452,3030,3031],{},"NewIfConfigured"," dev\u002Fprod kapcsoló.",[621,3034,3035,3037],{},[471,3036,126],{"href":127},": MJML template-ek fordítása responsive HTML-lé.",[621,3039,3040,3042],{},[471,3041,3001],{"href":136},": recipiensnek címzett tartalom, akár több csatornán, mail-lel is.",[621,3044,3045,3047,3048,3050],{},[471,3046,220],{"href":221},": hol helyezkedik el a ",[452,3049,113],{}," a többi önálló modul között.",[3052,3053,3054],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":493,"searchDepth":518,"depth":518,"links":3056},[3057,3058,3059,3060,3061,3062,3063,3066,3067,3071],{"id":486,"depth":518,"text":25},{"id":605,"depth":518,"text":606},{"id":646,"depth":518,"text":647},{"id":757,"depth":518,"text":758},{"id":1054,"depth":518,"text":1055},{"id":1331,"depth":518,"text":1332},{"id":1455,"depth":518,"text":1456,"children":3064},[3065],{"id":1879,"depth":677,"text":1880},{"id":2202,"depth":518,"text":2203},{"id":2218,"depth":518,"text":3068,"children":3069},"Hova kerül a tartalom: add mail",[3070],{"id":2322,"depth":677,"text":2323},{"id":3020,"depth":518,"text":3021},"Email-küldés: fluent Message builder, MJML template-ek, memória-mailer a tesztekhez.","md",null,{},{"icon":114},{"title":52,"description":3072},"NJGKMwcHVzcpafS31rCY2NQg2IuU20hVkgTUgCeYatE",[3080,3082],{"title":108,"path":109,"stem":110,"description":3081,"icon":111,"children":-1},"A markbates\u002Fgoth (Discord, Facebook, Google) bekötése egy sima net\u002Fhttp alkalmazásba, ami tokenekhez csak a gp-system\u002Fauth-ot igényli, gpsystem tooling nélkül.",{"title":122,"path":123,"stem":124,"description":3083,"icon":114,"children":-1},"SMTP transzport konfiguráció a mailhez.",1785445882018]