Compare commits
18 Commits
1.2.2
...
5cf33146fe
| Author | SHA1 | Date | |
|---|---|---|---|
|
5cf33146fe
|
|||
|
402684f206
|
|||
|
57d4a095a4
|
|||
|
30dafb408d
|
|||
|
a9e8479be7
|
|||
|
320a3f71d4
|
|||
|
c13fb48b4b
|
|||
|
c33b2194ea
|
|||
|
876663a00d
|
|||
|
a0c35d1cef
|
|||
|
104ed4e9d1
|
|||
|
027a6e6375
|
|||
|
3a06f2fff9
|
|||
|
aff8084692
|
|||
|
bbf58e52ce
|
|||
|
e8c66e65e6
|
|||
|
f6c8b2ee8c
|
|||
|
f8d97ed19e
|
@@ -5,9 +5,3 @@ SMTP_PASS="secret.1"
|
|||||||
EMAIL_FROM="noreply@lauf-fuer-kaya.de"
|
EMAIL_FROM="noreply@lauf-fuer-kaya.de"
|
||||||
EMAIL_REPLYTO="info@lauf-fuer-kaya.de"
|
EMAIL_REPLYTO="info@lauf-fuer-kaya.de"
|
||||||
REDIS_URL=redis://localhost:6379
|
REDIS_URL=redis://localhost:6379
|
||||||
FRONTEND_URL="https://run.lauf-fuer-kaya.de"
|
|
||||||
DOCUMENT_SERVER_URL="https://documents.run.lauf-fuer-kaya.de"
|
|
||||||
AUTHKEY=""
|
|
||||||
EVENT_DATE="23.05.2025"
|
|
||||||
EVENT_NAME="Lauf für Kaya! 2025"
|
|
||||||
NODE_ENV=production
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
steps:
|
|
||||||
- name: build dev
|
|
||||||
image: woodpeckerci/plugin-docker-buildx
|
|
||||||
settings:
|
|
||||||
repo: registry.odit.services/lfk/mailer
|
|
||||||
tags:
|
|
||||||
- dev
|
|
||||||
registry: registry.odit.services
|
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
cache_from: registry.odit.services/lfk/mailer:dev
|
|
||||||
username:
|
|
||||||
from_secret: odit-registry-builder-username
|
|
||||||
password:
|
|
||||||
from_secret: odit-registry-builder-password
|
|
||||||
when:
|
|
||||||
branch: dev
|
|
||||||
when:
|
|
||||||
event: push
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
steps:
|
|
||||||
- name: build tag
|
|
||||||
image: woodpeckerci/plugin-docker-buildx
|
|
||||||
settings:
|
|
||||||
repo: registry.odit.services/lfk/mailer
|
|
||||||
tags:
|
|
||||||
- "${CI_COMMIT_TAG}"
|
|
||||||
registry: registry.odit.services
|
|
||||||
platforms: linux/amd64,linux/arm64
|
|
||||||
cache_from: registry.odit.services/lfk/mailer:dev
|
|
||||||
username:
|
|
||||||
from_secret: odit-registry-builder-username
|
|
||||||
password:
|
|
||||||
from_secret: odit-registry-builder-password
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- tag
|
|
||||||
166
CHANGELOG.md
166
CHANGELOG.md
@@ -1,166 +0,0 @@
|
|||||||
### Changelog
|
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
|
||||||
|
|
||||||
#### [v0.2.3](https://git.odit.services/lfk/mailer/compare/v0.2.2...v0.2.3)
|
|
||||||
|
|
||||||
- Fixed missing closing tag [`8e2bbb3`](https://git.odit.services/lfk/mailer/commit/8e2bbb324091c0ba28ccd24fc189b2e7ddab8ce3)
|
|
||||||
|
|
||||||
#### [v0.2.2](https://git.odit.services/lfk/mailer/compare/v0.2.1...v0.2.2)
|
|
||||||
|
|
||||||
> 3 February 2023
|
|
||||||
|
|
||||||
- update runner-welcome mail template [`#15`](https://git.odit.services/lfk/mailer/issues/15)
|
|
||||||
- 🚀Bumped version to v0.2.2 [`a616570`](https://git.odit.services/lfk/mailer/commit/a6165708a6a529bf219f28be74e2de71e64a2be5)
|
|
||||||
- Merge pull request 'cleaned up mail texts for lfk 2023' (#16) from feature/simpler-mail-texts into main [`e7ad878`](https://git.odit.services/lfk/mailer/commit/e7ad878fb93773d1dec35d3b8b9c4f7b4b773221)
|
|
||||||
- cleaned up mail texts for lfk 2023 [`1eb1a0a`](https://git.odit.services/lfk/mailer/commit/1eb1a0ad7e11b8f25b2b8d0efea991cab444c6ee)
|
|
||||||
|
|
||||||
#### [v0.2.1](https://git.odit.services/lfk/mailer/compare/v0.1.2...v0.2.1)
|
|
||||||
|
|
||||||
> 2 February 2023
|
|
||||||
|
|
||||||
- update runner-welcome mail template [`#15`](https://git.odit.services/lfk/mailer/issues/15)
|
|
||||||
- Moved Release management to releaseit [`68bd293`](https://git.odit.services/lfk/mailer/commit/68bd293acb474fe8f201423ffd442d0ee186a482)
|
|
||||||
- Fresh licenses 4 yall [`c48a2ed`](https://git.odit.services/lfk/mailer/commit/c48a2ed01e65dc20c562d80099ca7448a8725446)
|
|
||||||
- Version pinning [`22470d6`](https://git.odit.services/lfk/mailer/commit/22470d6160b450515966e7e38c37c45085f8ceb2)
|
|
||||||
- 🚀Bumped version to v0.2.1 [`da4f497`](https://git.odit.services/lfk/mailer/commit/da4f497e887e788adf6d39f71d61488157c8381a)
|
|
||||||
- Now building w/ kaniko [`f422f98`](https://git.odit.services/lfk/mailer/commit/f422f989c7d5c2fead70e37fc314b734034916f7)
|
|
||||||
- 📖New license file version [CI SKIP] [skip ci] [`247d4b6`](https://git.odit.services/lfk/mailer/commit/247d4b617678655845b5baf6ae5deba01e953a39)
|
|
||||||
- Bumped used ci node images [`0692b72`](https://git.odit.services/lfk/mailer/commit/0692b72955974c2fdee6441d4e7838d41dde8ed6)
|
|
||||||
- 🚀Bumped version to v0.2.0 [`84e3778`](https://git.odit.services/lfk/mailer/commit/84e3778b8962834b57ee92ba01a0b02505bbc7e7)
|
|
||||||
- Merge pull request 'feature/kaniko' (#18) from feature/kaniko into dev [`4ca5f9d`](https://git.odit.services/lfk/mailer/commit/4ca5f9d38dc3300d0bcbf8448283b53b484a827d)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`00bb40d`](https://git.odit.services/lfk/mailer/commit/00bb40ddf999245d9fa0b005f000e670f4daf60c)
|
|
||||||
- Bumped docker node [`af173dc`](https://git.odit.services/lfk/mailer/commit/af173dcec822f12d8233b717304ad82b7fac14db)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`e155454`](https://git.odit.services/lfk/mailer/commit/e155454013aa32e31db6afe5d6cb476c21d38aba)
|
|
||||||
- Shut up pnpm warnings [`acb013e`](https://git.odit.services/lfk/mailer/commit/acb013e8ae86f868aced40dbc2a68f8165627145)
|
|
||||||
- Merge pull request 'update runner-welcome mail template' (#17) from dev into main [`07306be`](https://git.odit.services/lfk/mailer/commit/07306be49722877dcce04660e452acedc6f77663)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`e713ef5`](https://git.odit.services/lfk/mailer/commit/e713ef54ef39d4759832ada073cea825b4ef26dc)
|
|
||||||
|
|
||||||
#### [v0.1.2](https://git.odit.services/lfk/mailer/compare/v0.1.1...v0.1.2)
|
|
||||||
|
|
||||||
> 15 April 2021
|
|
||||||
|
|
||||||
- Merge pull request 'Release 0.1.2' (#14) from dev into main [`15b98e8`](https://git.odit.services/lfk/mailer/commit/15b98e83098906005e0f3f0b24313f9cab6ec1af)
|
|
||||||
- Fixed typos and added missing translations🌎 [`8099d2f`](https://git.odit.services/lfk/mailer/commit/8099d2fdbaa8fea6e4fd6a993ac1cfb09e01d14d)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`c8378b6`](https://git.odit.services/lfk/mailer/commit/c8378b66ba512a90ca4386d5a3570f4bb8bea049)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`fbc95be`](https://git.odit.services/lfk/mailer/commit/fbc95be3455eed0d97a124f7df277d0f902e76c9)
|
|
||||||
- 🚀Bumped version to v0.1.2 [`d550059`](https://git.odit.services/lfk/mailer/commit/d5500594945b99e428ac1651afd1fe8a8eeba192)
|
|
||||||
|
|
||||||
#### [v0.1.1](https://git.odit.services/lfk/mailer/compare/v0.1.0...v0.1.1)
|
|
||||||
|
|
||||||
> 31 March 2021
|
|
||||||
|
|
||||||
- Merge pull request 'Release 0.1.1' (#13) from dev into main [`b47660a`](https://git.odit.services/lfk/mailer/commit/b47660af65362d773911e99fa9ebf99340d1a368)
|
|
||||||
- Added mail templates for forgotten selfservice links [`56c3dec`](https://git.odit.services/lfk/mailer/commit/56c3deca574fc4501cc9b51128b4f3b0467d24c9)
|
|
||||||
- Applied Docker MTU fix 🛠 [`f6c03c7`](https://git.odit.services/lfk/mailer/commit/f6c03c7ae218faf8bcdc4108e809ef121b87ef92)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`00e7837`](https://git.odit.services/lfk/mailer/commit/00e78371f3d875460596c24f3544d4e94a896f3c)
|
|
||||||
- Added tests [`91f9a8c`](https://git.odit.services/lfk/mailer/commit/91f9a8cbdecf74a74e68b80f3aec675de59e46d4)
|
|
||||||
- Added translation keys [`1d4d1d1`](https://git.odit.services/lfk/mailer/commit/1d4d1d18d85349b6f877fa5f1df82fe0d9dafe79)
|
|
||||||
- Sorted locales [`9ba4b40`](https://git.odit.services/lfk/mailer/commit/9ba4b4001d35afa49e4eb3232a21784ed443c52e)
|
|
||||||
- 📖New license file version [CI SKIP] [skip ci] [`ab0e41f`](https://git.odit.services/lfk/mailer/commit/ab0e41f73be5ad281d5909d6d8baa4dd882c7cc3)
|
|
||||||
- Updated ci with new kubernetes secrets 🚀🚀🚀 [`7842a3c`](https://git.odit.services/lfk/mailer/commit/7842a3c437a7d028df9e610257f7ccc0c3d8a871)
|
|
||||||
- Added new mailer function [`8da7c55`](https://git.odit.services/lfk/mailer/commit/8da7c55deb5c0b4fccb7f18688613d06dd92df45)
|
|
||||||
- Adjusted tests for mail types [`8271014`](https://git.odit.services/lfk/mailer/commit/8271014a101439ea46233099182eb78da9fdc11c)
|
|
||||||
- Added MailTypes to responses [`0fa94fc`](https://git.odit.services/lfk/mailer/commit/0fa94fc8679b45aa702068ad96097fe18b385a50)
|
|
||||||
- Revert "Now using more images powered by us 🚀🚀🚀" [`d5f2910`](https://git.odit.services/lfk/mailer/commit/d5f29108c479e641db91b2f48ab3cf5da16e9d14)
|
|
||||||
- Now using more images powered by us 🚀🚀🚀 [`c1d8b78`](https://git.odit.services/lfk/mailer/commit/c1d8b781a62ebedafa7f1fa598eab966e91d8b64)
|
|
||||||
- Added endpoint [`9807e61`](https://git.odit.services/lfk/mailer/commit/9807e61fa81a5790fc09f9920905c683ea1c3a79)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`07aeaf6`](https://git.odit.services/lfk/mailer/commit/07aeaf6d6ba46d0bde62141a7ab0f47c9afde565)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`416be79`](https://git.odit.services/lfk/mailer/commit/416be7920cc551bfd2da2ddfc2fdc25367cafc99)
|
|
||||||
- Added translation keys to txt [`44972e4`](https://git.odit.services/lfk/mailer/commit/44972e4a93204aa9f6acbbf29f3012aa8213af77)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`d996d2e`](https://git.odit.services/lfk/mailer/commit/d996d2e85f24c9e3723913bafc8078a13732fc04)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`8996aef`](https://git.odit.services/lfk/mailer/commit/8996aef1523e079aec83b63df99c44173f3a43cc)
|
|
||||||
- 🚀Bumped version to v0.1.1 [`34e0c72`](https://git.odit.services/lfk/mailer/commit/34e0c729b542b026b997f25a33165383ff879222)
|
|
||||||
- Merge pull request 'Now base64-encoding the selfservice tokens👀' (#12) from bugfix/11-selfservice_profile_link into dev [`5ff6f77`](https://git.odit.services/lfk/mailer/commit/5ff6f77dafa6a3a67615fae6d228c31cb8eac6b9)
|
|
||||||
- Changed ci pipeline type to kubernetes [`18c8600`](https://git.odit.services/lfk/mailer/commit/18c8600563c4369321a0e9ba51a09a2fa95198b5)
|
|
||||||
- Dockerfile with cached images 🔥 [`f554718`](https://git.odit.services/lfk/mailer/commit/f55471825ef6833600780cb229148d7b7d122150)
|
|
||||||
- Now base64-encoding the selfservice tokens👀 [`1f58165`](https://git.odit.services/lfk/mailer/commit/1f581650c5164b6b6d6a6fce5e86e64074c1bdf9)
|
|
||||||
- Merge pull request 'Selfservice link forgotten mails feature/5-registration_forgot_mails' (#10) from feature/5-registration_forgot_mails into dev [`f011659`](https://git.odit.services/lfk/mailer/commit/f011659469bd62dffc17e440a6ed42d1fbe7956e)
|
|
||||||
- Added new mailtype enum [`015b25a`](https://git.odit.services/lfk/mailer/commit/015b25a2056fe3537fb8e88539c25c2c9e6ba618)
|
|
||||||
- Fixed typo [`577f321`](https://git.odit.services/lfk/mailer/commit/577f321b3ffcea666eaaa529e86e532702432635)
|
|
||||||
- Renamed templates [`34e30d6`](https://git.odit.services/lfk/mailer/commit/34e30d64929ca7555cee62c4da86d07050b94ff5)
|
|
||||||
|
|
||||||
#### v0.1.0
|
|
||||||
|
|
||||||
> 4 March 2021
|
|
||||||
|
|
||||||
- Merge pull request 'Alpha release 0.1.0' (#9) from dev into main [`e60360c`](https://git.odit.services/lfk/mailer/commit/e60360ccd4f5d6d01b7f20b12e60edc4adb1f75d)
|
|
||||||
- 📖New license file version [CI SKIP] [skip ci] [`10b1312`](https://git.odit.services/lfk/mailer/commit/10b13127aa48f65641d1295b77556a6f74a94625)
|
|
||||||
- Added basic welcome mails [`b3f61f5`](https://git.odit.services/lfk/mailer/commit/b3f61f51e367c10e102e1d53e6c41c8280f6c0c3)
|
|
||||||
- 🚀Bumped version to v0.1.0 [`5e7cfff`](https://git.odit.services/lfk/mailer/commit/5e7cfff41eaf14bf17319319534c7713d9bbf3b9)
|
|
||||||
- Added drone file [`3f21503`](https://git.odit.services/lfk/mailer/commit/3f21503848b14c5f8f2066ab3fd8fe114bf1de41)
|
|
||||||
- 📖New license file version [CI SKIP] [skip ci] [`f11137e`](https://git.odit.services/lfk/mailer/commit/f11137e0c2140cd226d418c284387bc6a9532030)
|
|
||||||
- Added welcome mail tests [`ce87e1f`](https://git.odit.services/lfk/mailer/commit/ce87e1fc03340922c412a431d9595c740a78f42b)
|
|
||||||
- Added reset mail valid tests [`4624250`](https://git.odit.services/lfk/mailer/commit/46242509637e05e6b258b406d0a2a76e5db9ca03)
|
|
||||||
- Added all missing config vars/interpolations [`4994cb0`](https://git.odit.services/lfk/mailer/commit/4994cb0489b168ecc9f18103fdea5e578bb9ef74)
|
|
||||||
- Sorted translations [`1862013`](https://git.odit.services/lfk/mailer/commit/18620133b92baa81272ee084385129b2fb60d234)
|
|
||||||
- Added more info to the readme [`9cb100c`](https://git.odit.services/lfk/mailer/commit/9cb100c7c43b082263f4f58c82554c85d7be8494)
|
|
||||||
- Moved models to their own files [`9ce86eb`](https://git.odit.services/lfk/mailer/commit/9ce86ebef7d11ed0fb674dcf77f1b6dacd934aa4)
|
|
||||||
- Fixed typo [`4b5e24f`](https://git.odit.services/lfk/mailer/commit/4b5e24f3e30db94cf46d6d6362be519343c71a83)
|
|
||||||
- Added test mail tests [`bf9652d`](https://git.odit.services/lfk/mailer/commit/bf9652dcfed3667f9d2e8cfd933963935a621a88)
|
|
||||||
- Added + sorted translations [`6e99ad5`](https://git.odit.services/lfk/mailer/commit/6e99ad5c1ca3a4853a38acae6f0526c0fa54180c)
|
|
||||||
- Added german translations [`e2237d3`](https://git.odit.services/lfk/mailer/commit/e2237d34d39ccaef5600a6eb5d4c555531cb5941)
|
|
||||||
- Added jest config and first tests [`ec939e6`](https://git.odit.services/lfk/mailer/commit/ec939e6c1142e825cdb21555e03d9e026e7cdf3c)
|
|
||||||
- Added langauge keys for pw reset [`7595235`](https://git.odit.services/lfk/mailer/commit/7595235491694e95b11043f2d5e1fa20c65cd43c)
|
|
||||||
- Locales as enums [`d450ecb`](https://git.odit.services/lfk/mailer/commit/d450ecbf7cf8e0b97c46e1f1f57cfcd6f7c30dce)
|
|
||||||
- Added dockerfile and docker-compose [`c0c8046`](https://git.odit.services/lfk/mailer/commit/c0c8046031aeb19b3da5cd292316af54462c0978)
|
|
||||||
- Updated api doc tests to listen on the right endpoint [`f6a53cc`](https://git.odit.services/lfk/mailer/commit/f6a53cc3e47308e84cde13640cb3f614642fd4ca)
|
|
||||||
- Added drone pipeline for automagic tests [`3501a4b`](https://git.odit.services/lfk/mailer/commit/3501a4bef1b6ec73ea0be643e1b4e95ee9874ff9)
|
|
||||||
- Added env var docs to readme [`5314100`](https://git.odit.services/lfk/mailer/commit/5314100065f24cb0902c1ba207b880016abd300e)
|
|
||||||
- Added missing translations [`1ec95a1`](https://git.odit.services/lfk/mailer/commit/1ec95a1fda13bdfdc9c056a4f73578045c77d964)
|
|
||||||
- 📖New license file version [CI SKIP] [skip ci] [`4cde30e`](https://git.odit.services/lfk/mailer/commit/4cde30ef98370069dfad748e12bd720c1b84ad3e)
|
|
||||||
- Merge pull request 'Welcome mails feature/2-welcome_mails' (#7) from feature/2-welcome_mails into dev [`0b96dc8`](https://git.odit.services/lfk/mailer/commit/0b96dc8ba519b42922f1464853d694fc2984cbc0)
|
|
||||||
- Merge pull request 'Added real information to the README feature/3-readme' (#8) from feature/3-readme into dev [`aed676c`](https://git.odit.services/lfk/mailer/commit/aed676c04b6223916b638340b04677fc34c5b6ae)
|
|
||||||
- Added registration mail endpoint [`b3952c3`](https://git.odit.services/lfk/mailer/commit/b3952c39e5f52412c955d6a9cb96f81396e06d82)
|
|
||||||
- Added request class [`056b74c`](https://git.odit.services/lfk/mailer/commit/056b74ce2268185d39554a7d7afeaaf75c4e17a2)
|
|
||||||
- Added reset mail request model [`5812a48`](https://git.odit.services/lfk/mailer/commit/5812a485ee2e23e8d0bb15bedbebdf7734817865)
|
|
||||||
- Now accepting reset mail class [`7445223`](https://git.odit.services/lfk/mailer/commit/7445223f1e6782536157d09cddcad9c942b72e7d)
|
|
||||||
- Added ci status [`e48f830`](https://git.odit.services/lfk/mailer/commit/e48f830c08900a9c9e4451d16a25f3ef3d9485e4)
|
|
||||||
- Merge pull request 'Added tests for the mail endpoints feature/4-tests' (#6) from feature/4-tests into dev [`7473931`](https://git.odit.services/lfk/mailer/commit/7473931f2705bbdff7a15b74f8d1f39228694697)
|
|
||||||
- Merge pull request 'Initial release 0.0.1' (#1) from dev into main [`1d3901a`](https://git.odit.services/lfk/mailer/commit/1d3901ae8f9a0c4675cacd7d0c44c547a06985d4)
|
|
||||||
- Added basic loaders/files/dirs [`4e80aa8`](https://git.odit.services/lfk/mailer/commit/4e80aa8a32911ca9697e411f82e8923977ae8216)
|
|
||||||
- Added the old mail templates [`c5f2532`](https://git.odit.services/lfk/mailer/commit/c5f2532504768ee26c170e4f4d84bc25a87c63cc)
|
|
||||||
- Initial commit [`907b989`](https://git.odit.services/lfk/mailer/commit/907b989d534dab098cc6013f5954203bc9a37510)
|
|
||||||
- Added language keys for test mails [`8ab80fd`](https://git.odit.services/lfk/mailer/commit/8ab80fd7ed19f90c51a3f15f90d23e33c451df8e)
|
|
||||||
- Added basic files and depedencies [`4e5d5ae`](https://git.odit.services/lfk/mailer/commit/4e5d5ae31171a9b60e684694e04b840a92abbe50)
|
|
||||||
- Added basic mailer that can send pw reset mails [`279a9ca`](https://git.odit.services/lfk/mailer/commit/279a9ca946ec028e7003df4f3f78ce80f5e455b4)
|
|
||||||
- Added basic config [`9c2f465`](https://git.odit.services/lfk/mailer/commit/9c2f465b99b8610047b5f5b4b8d6707e6d6ee8bd)
|
|
||||||
- Now generateing api key via eng_gen script [`17f5876`](https://git.odit.services/lfk/mailer/commit/17f5876d738bcc461f7b4fac907cb8bb9bc13aa5)
|
|
||||||
- Added function for sending test mail [`602600d`](https://git.odit.services/lfk/mailer/commit/602600db895a01ca72182e3e2d6094a5e20d4b85)
|
|
||||||
- Added basic apispec generator [`124c7a5`](https://git.odit.services/lfk/mailer/commit/124c7a5d1544686dc4fd6e2eaf50e519c2fe0a49)
|
|
||||||
- Added app startup file [`53daae9`](https://git.odit.services/lfk/mailer/commit/53daae956da47008312e45a49d445f5674c33551)
|
|
||||||
- Added basic mail controller [`972b09d`](https://git.odit.services/lfk/mailer/commit/972b09d8ca4cf250e308340a4ba59f741de77801)
|
|
||||||
- Added ans sorted translations [`3f5b77d`](https://git.odit.services/lfk/mailer/commit/3f5b77dc8e085fc25b4b5cc9ffa054ee8ec5bd6b)
|
|
||||||
- Added the usual middlewares [`e0523db`](https://git.odit.services/lfk/mailer/commit/e0523db739f772166c0bf895d0d40435848f4600)
|
|
||||||
- Added function for generateing test envs [`fc37d14`](https://git.odit.services/lfk/mailer/commit/fc37d146209f6561cc1642774f1ef3a9cadb39f8)
|
|
||||||
- Added ans sorted translations [`aedcbd5`](https://git.odit.services/lfk/mailer/commit/aedcbd5f56692c522c356c9c05cd6b5e13c87b3a)
|
|
||||||
- Sorted translations [`a84500c`](https://git.odit.services/lfk/mailer/commit/a84500ca1b240c72a69d47f9b35adea7a288c23a)
|
|
||||||
- Added success response [`895e346`](https://git.odit.services/lfk/mailer/commit/895e346e599a93ac32c90318197a890fd0599513)
|
|
||||||
- Added status controller [`aa28601`](https://git.odit.services/lfk/mailer/commit/aa286013a146fe2ad11c1601bef529ad956a9fed)
|
|
||||||
- Fixed broken formatting [`dc3bab3`](https://git.odit.services/lfk/mailer/commit/dc3bab324704005490aaffcd62f18e660c4315c8)
|
|
||||||
- Added mail errors [`c5fe167`](https://git.odit.services/lfk/mailer/commit/c5fe1671a2e1325740a29c93f2fe2dbb76579391)
|
|
||||||
- Added basic jest packages and scripts [`fa9d0e5`](https://git.odit.services/lfk/mailer/commit/fa9d0e5790a6d7ba9d4490bc016e0f9afde49ec8)
|
|
||||||
- Updated comments [`d77670f`](https://git.odit.services/lfk/mailer/commit/d77670fb7023aae86b7039684a6b059ee91bf17d)
|
|
||||||
- Added custom i18n ally framework [`264af07`](https://git.odit.services/lfk/mailer/commit/264af075f306675e4247fbcadebfcdab8fa0ba3b)
|
|
||||||
- Added stuff to gitignore [`21fab5d`](https://git.odit.services/lfk/mailer/commit/21fab5d53a7f228fa4ef64e53c64fe5324b0ec17)
|
|
||||||
- Fixed json [`a1fbabd`](https://git.odit.services/lfk/mailer/commit/a1fbabdee8f414498c5efd95d5d87f41ef3cc28e)
|
|
||||||
- 🧾New changelog file version [CI SKIP] [skip ci] [`7c16dd1`](https://git.odit.services/lfk/mailer/commit/7c16dd1b447369c87f2e3a487ec2a3f1fc8451c5)
|
|
||||||
- Disabled html autoformatting [`6c5996e`](https://git.odit.services/lfk/mailer/commit/6c5996e1e514ad9b2294316088c34e44255ae895)
|
|
||||||
- Added nodemailer dependencies [`87d7175`](https://git.odit.services/lfk/mailer/commit/87d7175f962e8810c98fc72a9bb0fc19ef9e2c22)
|
|
||||||
- Added initial translation [`48aa076`](https://git.odit.services/lfk/mailer/commit/48aa076e08b7c32bf53b86c942b129d7f366d93b)
|
|
||||||
- Updated consola [`9323cec`](https://git.odit.services/lfk/mailer/commit/9323cecf944dde0b5c187059ded0fe576a0e6758)
|
|
||||||
- Added eventname to config [`a62f9c6`](https://git.odit.services/lfk/mailer/commit/a62f9c683dd09303af47e2ed4e8df60bb2df3121)
|
|
||||||
- Added test watch mode [`38cffc2`](https://git.odit.services/lfk/mailer/commit/38cffc20490fe10b4e4bc4d88a8377562cd1545a)
|
|
||||||
- Added email address verification [`9b5c0b8`](https://git.odit.services/lfk/mailer/commit/9b5c0b8f0630ddaeb78e0d319692985d91a6db76)
|
|
||||||
- Fixed argument bug [`6a803c0`](https://git.odit.services/lfk/mailer/commit/6a803c04ab2065db60a13b1aa3333fdfe252f1ab)
|
|
||||||
- Added env generation script [`01f5001`](https://git.odit.services/lfk/mailer/commit/01f500135518a628cca9f2a51e25f9ef94b99fa2)
|
|
||||||
- Not ignoring i18n ally framework any more [`92494ea`](https://git.odit.services/lfk/mailer/commit/92494eaf6cea490a2c87ebc8f4d14e52d7d9ed0c)
|
|
||||||
- Added copyright owner to config [`806cc81`](https://git.odit.services/lfk/mailer/commit/806cc814c39fbe9e09eda87660e076eade1c8b01)
|
|
||||||
- Adjusted mail title [`314ceac`](https://git.odit.services/lfk/mailer/commit/314ceaca9d1ff8423c027a9457e6c8d8520272a4)
|
|
||||||
- Fixed inerpolation [`f8b9b18`](https://git.odit.services/lfk/mailer/commit/f8b9b188ae47adbc2a11a68274e9d2db3eb6b692)
|
|
||||||
- Changed wording [`940acab`](https://git.odit.services/lfk/mailer/commit/940acab77015eced94e5273d4d0a824653665098)
|
|
||||||
- Updated interpolations [`0926f31`](https://git.odit.services/lfk/mailer/commit/0926f31fac183a7064aac1679babc57f3b3681c8)
|
|
||||||
- Added empty locale files [`0438df3`](https://git.odit.services/lfk/mailer/commit/0438df3bd18c4c424d0db4c269f3ce9f40eb97e5)
|
|
||||||
- Removed eventname from config [`691d61b`](https://git.odit.services/lfk/mailer/commit/691d61bd3c40ded3d617a8569dab51e7728ee8ce)
|
|
||||||
- Added eventname to config [`9bdb307`](https://git.odit.services/lfk/mailer/commit/9bdb3072aa318f5621443b839c6d1067d80b3580)
|
|
||||||
- Moved scripts to own scripts folder [`22195c1`](https://git.odit.services/lfk/mailer/commit/22195c11dd825f83d8415445e2ee82aaa53a83cd)
|
|
||||||
16
Dockerfile
16
Dockerfile
@@ -1,7 +1,21 @@
|
|||||||
FROM oven/bun:1.1.40-slim
|
FROM oven/bun:1.1.36-slim
|
||||||
|
# FROM oven/bun:1.0.25
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy package files
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
COPY package.json .
|
COPY package.json .
|
||||||
RUN bun i
|
RUN bun i
|
||||||
|
# COPY package.json bun.lockb ./
|
||||||
|
# RUN bun install --frozen-lockfile
|
||||||
|
|
||||||
|
# Copy source code
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
# Expose the application port
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
|
# Start the application
|
||||||
CMD ["bun", "run", "start"]
|
CMD ["bun", "run", "start"]
|
||||||
362
LICENSE
362
LICENSE
@@ -1,362 +0,0 @@
|
|||||||
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Creative
|
|
||||||
Commons Corporation ("Creative Commons") is not a law firm and does not provide
|
|
||||||
legal services or legal advice. Distribution of Creative Commons public licenses
|
|
||||||
does not create a lawyer-client or other relationship. Creative Commons makes
|
|
||||||
its licenses and related information available on an "as-is" basis. Creative
|
|
||||||
Commons gives no warranties regarding its licenses, any material licensed
|
|
||||||
under their terms and conditions, or any related information. Creative Commons
|
|
||||||
disclaims all liability for damages resulting from their use to the fullest
|
|
||||||
extent possible.
|
|
||||||
|
|
||||||
Using Creative Commons Public Licenses
|
|
||||||
|
|
||||||
Creative Commons public licenses provide a standard set of terms and conditions
|
|
||||||
that creators and other rights holders may use to share original works of
|
|
||||||
authorship and other material subject to copyright and certain other rights
|
|
||||||
specified in the public license below. The following considerations are for
|
|
||||||
informational purposes only, are not exhaustive, and do not form part of our
|
|
||||||
licenses.
|
|
||||||
|
|
||||||
Considerations for licensors: Our public licenses are intended for use by
|
|
||||||
those authorized to give the public permission to use material in ways otherwise
|
|
||||||
restricted by copyright and certain other rights. Our licenses are irrevocable.
|
|
||||||
Licensors should read and understand the terms and conditions of the license
|
|
||||||
they choose before applying it. Licensors should also secure all rights necessary
|
|
||||||
before applying our licenses so that the public can reuse the material as
|
|
||||||
expected. Licensors should clearly mark any material not subject to the license.
|
|
||||||
This includes other CC-licensed material, or material used under an exception
|
|
||||||
or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors
|
|
||||||
|
|
||||||
Considerations for the public: By using one of our public licenses, a licensor
|
|
||||||
grants the public permission to use the licensed material under specified
|
|
||||||
terms and conditions. If the licensor's permission is not necessary for any
|
|
||||||
reason–for example, because of any applicable exception or limitation to copyright–then
|
|
||||||
that use is not regulated by the license. Our licenses grant only permissions
|
|
||||||
under copyright and certain other rights that a licensor has authority to
|
|
||||||
grant. Use of the licensed material may still be restricted for other reasons,
|
|
||||||
including because others have copyright or other rights in the material. A
|
|
||||||
licensor may make special requests, such as asking that all changes be marked
|
|
||||||
or described. Although not required by our licenses, you are encouraged to
|
|
||||||
respect those requests where reasonable. More considerations for the public
|
|
||||||
: wiki.creativecommons.org/Considerations_for_licensees
|
|
||||||
|
|
||||||
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public
|
|
||||||
License
|
|
||||||
|
|
||||||
By exercising the Licensed Rights (defined below), You accept and agree to
|
|
||||||
be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike
|
|
||||||
4.0 International Public License ("Public License"). To the extent this Public
|
|
||||||
License may be interpreted as a contract, You are granted the Licensed Rights
|
|
||||||
in consideration of Your acceptance of these terms and conditions, and the
|
|
||||||
Licensor grants You such rights in consideration of benefits the Licensor
|
|
||||||
receives from making the Licensed Material available under these terms and
|
|
||||||
conditions.
|
|
||||||
|
|
||||||
Section 1 – Definitions.
|
|
||||||
|
|
||||||
a. Adapted Material means material subject to Copyright and Similar Rights
|
|
||||||
that is derived from or based upon the Licensed Material and in which the
|
|
||||||
Licensed Material is translated, altered, arranged, transformed, or otherwise
|
|
||||||
modified in a manner requiring permission under the Copyright and Similar
|
|
||||||
Rights held by the Licensor. For purposes of this Public License, where the
|
|
||||||
Licensed Material is a musical work, performance, or sound recording, Adapted
|
|
||||||
Material is always produced where the Licensed Material is synched in timed
|
|
||||||
relation with a moving image.
|
|
||||||
|
|
||||||
b. Adapter's License means the license You apply to Your Copyright and Similar
|
|
||||||
Rights in Your contributions to Adapted Material in accordance with the terms
|
|
||||||
and conditions of this Public License.
|
|
||||||
|
|
||||||
c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses,
|
|
||||||
approved by Creative Commons as essentially the equivalent of this Public
|
|
||||||
License.
|
|
||||||
|
|
||||||
d. Copyright and Similar Rights means copyright and/or similar rights closely
|
|
||||||
related to copyright including, without limitation, performance, broadcast,
|
|
||||||
sound recording, and Sui Generis Database Rights, without regard to how the
|
|
||||||
rights are labeled or categorized. For purposes of this Public License, the
|
|
||||||
rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
|
||||||
|
|
||||||
e. Effective Technological Measures means those measures that, in the absence
|
|
||||||
of proper authority, may not be circumvented under laws fulfilling obligations
|
|
||||||
under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996,
|
|
||||||
and/or similar international agreements.
|
|
||||||
|
|
||||||
f. Exceptions and Limitations means fair use, fair dealing, and/or any other
|
|
||||||
exception or limitation to Copyright and Similar Rights that applies to Your
|
|
||||||
use of the Licensed Material.
|
|
||||||
|
|
||||||
g. License Elements means the license attributes listed in the name of a Creative
|
|
||||||
Commons Public License. The License Elements of this Public License are Attribution,
|
|
||||||
NonCommercial, and ShareAlike.
|
|
||||||
|
|
||||||
h. Licensed Material means the artistic or literary work, database, or other
|
|
||||||
material to which the Licensor applied this Public License.
|
|
||||||
|
|
||||||
i. Licensed Rights means the rights granted to You subject to the terms and
|
|
||||||
conditions of this Public License, which are limited to all Copyright and
|
|
||||||
Similar Rights that apply to Your use of the Licensed Material and that the
|
|
||||||
Licensor has authority to license.
|
|
||||||
|
|
||||||
j. Licensor means the individual(s) or entity(ies) granting rights under this
|
|
||||||
Public License.
|
|
||||||
|
|
||||||
k. NonCommercial means not primarily intended for or directed towards commercial
|
|
||||||
advantage or monetary compensation. For purposes of this Public License, the
|
|
||||||
exchange of the Licensed Material for other material subject to Copyright
|
|
||||||
and Similar Rights by digital file-sharing or similar means is NonCommercial
|
|
||||||
provided there is no payment of monetary compensation in connection with the
|
|
||||||
exchange.
|
|
||||||
|
|
||||||
l. Share means to provide material to the public by any means or process that
|
|
||||||
requires permission under the Licensed Rights, such as reproduction, public
|
|
||||||
display, public performance, distribution, dissemination, communication, or
|
|
||||||
importation, and to make material available to the public including in ways
|
|
||||||
that members of the public may access the material from a place and at a time
|
|
||||||
individually chosen by them.
|
|
||||||
|
|
||||||
m. Sui Generis Database Rights means rights other than copyright resulting
|
|
||||||
from Directive 96/9/EC of the European Parliament and of the Council of 11
|
|
||||||
March 1996 on the legal protection of databases, as amended and/or succeeded,
|
|
||||||
as well as other essentially equivalent rights anywhere in the world.
|
|
||||||
|
|
||||||
n. You means the individual or entity exercising the Licensed Rights under
|
|
||||||
this Public License. Your has a corresponding meaning.
|
|
||||||
|
|
||||||
Section 2 – Scope.
|
|
||||||
|
|
||||||
a. License grant.
|
|
||||||
|
|
||||||
1. Subject to the terms and conditions of this Public License, the Licensor
|
|
||||||
hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive,
|
|
||||||
irrevocable license to exercise the Licensed Rights in the Licensed Material
|
|
||||||
to:
|
|
||||||
|
|
||||||
A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial
|
|
||||||
purposes only; and
|
|
||||||
|
|
||||||
B. produce, reproduce, and Share Adapted Material for NonCommercial purposes
|
|
||||||
only.
|
|
||||||
|
|
||||||
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions
|
|
||||||
and Limitations apply to Your use, this Public License does not apply, and
|
|
||||||
You do not need to comply with its terms and conditions.
|
|
||||||
|
|
||||||
3. Term. The term of this Public License is specified in Section 6(a).
|
|
||||||
|
|
||||||
4. Media and formats; technical modifications allowed. The Licensor authorizes
|
|
||||||
You to exercise the Licensed Rights in all media and formats whether now known
|
|
||||||
or hereafter created, and to make technical modifications necessary to do
|
|
||||||
so. The Licensor waives and/or agrees not to assert any right or authority
|
|
||||||
to forbid You from making technical modifications necessary to exercise the
|
|
||||||
Licensed Rights, including technical modifications necessary to circumvent
|
|
||||||
Effective Technological Measures. For purposes of this Public License, simply
|
|
||||||
making modifications authorized by this Section 2(a)(4) never produces Adapted
|
|
||||||
Material.
|
|
||||||
|
|
||||||
5. Downstream recipients.
|
|
||||||
|
|
||||||
A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed
|
|
||||||
Material automatically receives an offer from the Licensor to exercise the
|
|
||||||
Licensed Rights under the terms and conditions of this Public License.
|
|
||||||
|
|
||||||
B. Additional offer from the Licensor – Adapted Material. Every recipient
|
|
||||||
of Adapted Material from You automatically receives an offer from the Licensor
|
|
||||||
to exercise the Licensed Rights in the Adapted Material under the conditions
|
|
||||||
of the Adapter's License You apply.
|
|
||||||
|
|
||||||
C. No downstream restrictions. You may not offer or impose any additional
|
|
||||||
or different terms or conditions on, or apply any Effective Technological
|
|
||||||
Measures to, the Licensed Material if doing so restricts exercise of the Licensed
|
|
||||||
Rights by any recipient of the Licensed Material.
|
|
||||||
|
|
||||||
6. No endorsement. Nothing in this Public License constitutes or may be construed
|
|
||||||
as permission to assert or imply that You are, or that Your use of the Licensed
|
|
||||||
Material is, connected with, or sponsored, endorsed, or granted official status
|
|
||||||
by, the Licensor or others designated to receive attribution as provided in
|
|
||||||
Section 3(a)(1)(A)(i).
|
|
||||||
|
|
||||||
b. Other rights.
|
|
||||||
|
|
||||||
1. Moral rights, such as the right of integrity, are not licensed under this
|
|
||||||
Public License, nor are publicity, privacy, and/or other similar personality
|
|
||||||
rights; however, to the extent possible, the Licensor waives and/or agrees
|
|
||||||
not to assert any such rights held by the Licensor to the limited extent necessary
|
|
||||||
to allow You to exercise the Licensed Rights, but not otherwise.
|
|
||||||
|
|
||||||
2. Patent and trademark rights are not licensed under this Public License.
|
|
||||||
|
|
||||||
3. To the extent possible, the Licensor waives any right to collect royalties
|
|
||||||
from You for the exercise of the Licensed Rights, whether directly or through
|
|
||||||
a collecting society under any voluntary or waivable statutory or compulsory
|
|
||||||
licensing scheme. In all other cases the Licensor expressly reserves any right
|
|
||||||
to collect such royalties, including when the Licensed Material is used other
|
|
||||||
than for NonCommercial purposes.
|
|
||||||
|
|
||||||
Section 3 – License Conditions.
|
|
||||||
|
|
||||||
Your exercise of the Licensed Rights is expressly made subject to the following
|
|
||||||
conditions.
|
|
||||||
|
|
||||||
a. Attribution.
|
|
||||||
|
|
||||||
1. If You Share the Licensed Material (including in modified form), You must:
|
|
||||||
|
|
||||||
A. retain the following if it is supplied by the Licensor with the Licensed
|
|
||||||
Material:
|
|
||||||
|
|
||||||
i. identification of the creator(s) of the Licensed Material and any others
|
|
||||||
designated to receive attribution, in any reasonable manner requested by the
|
|
||||||
Licensor (including by pseudonym if designated);
|
|
||||||
|
|
||||||
ii. a copyright notice;
|
|
||||||
|
|
||||||
iii. a notice that refers to this Public License;
|
|
||||||
|
|
||||||
iv. a notice that refers to the disclaimer of warranties;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
|
||||||
|
|
||||||
B. indicate if You modified the Licensed Material and retain an indication
|
|
||||||
of any previous modifications; and
|
|
||||||
|
|
||||||
C. indicate the Licensed Material is licensed under this Public License, and
|
|
||||||
include the text of, or the URI or hyperlink to, this Public License.
|
|
||||||
|
|
||||||
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner
|
|
||||||
based on the medium, means, and context in which You Share the Licensed Material.
|
|
||||||
For example, it may be reasonable to satisfy the conditions by providing a
|
|
||||||
URI or hyperlink to a resource that includes the required information.
|
|
||||||
|
|
||||||
3. If requested by the Licensor, You must remove any of the information required
|
|
||||||
by Section 3(a)(1)(A) to the extent reasonably practicable.
|
|
||||||
|
|
||||||
b. ShareAlike.In addition to the conditions in Section 3(a), if You Share
|
|
||||||
Adapted Material You produce, the following conditions also apply.
|
|
||||||
|
|
||||||
1. The Adapter's License You apply must be a Creative Commons license with
|
|
||||||
the same License Elements, this version or later, or a BY-NC-SA Compatible
|
|
||||||
License.
|
|
||||||
|
|
||||||
2. You must include the text of, or the URI or hyperlink to, the Adapter's
|
|
||||||
License You apply. You may satisfy this condition in any reasonable manner
|
|
||||||
based on the medium, means, and context in which You Share Adapted Material.
|
|
||||||
|
|
||||||
3. You may not offer or impose any additional or different terms or conditions
|
|
||||||
on, or apply any Effective Technological Measures to, Adapted Material that
|
|
||||||
restrict exercise of the rights granted under the Adapter's License You apply.
|
|
||||||
|
|
||||||
Section 4 – Sui Generis Database Rights.
|
|
||||||
|
|
||||||
Where the Licensed Rights include Sui Generis Database Rights that apply to
|
|
||||||
Your use of the Licensed Material:
|
|
||||||
|
|
||||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract,
|
|
||||||
reuse, reproduce, and Share all or a substantial portion of the contents of
|
|
||||||
the database for NonCommercial purposes only;
|
|
||||||
|
|
||||||
b. if You include all or a substantial portion of the database contents in
|
|
||||||
a database in which You have Sui Generis Database Rights, then the database
|
|
||||||
in which You have Sui Generis Database Rights (but not its individual contents)
|
|
||||||
is Adapted Material, including for purposes of Section 3(b); and
|
|
||||||
|
|
||||||
c. You must comply with the conditions in Section 3(a) if You Share all or
|
|
||||||
a substantial portion of the contents of the database.
|
|
||||||
|
|
||||||
For the avoidance of doubt, this Section 4 supplements and does not replace
|
|
||||||
Your obligations under this Public License where the Licensed Rights include
|
|
||||||
other Copyright and Similar Rights.
|
|
||||||
|
|
||||||
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
|
||||||
|
|
||||||
a. Unless otherwise separately undertaken by the Licensor, to the extent possible,
|
|
||||||
the Licensor offers the Licensed Material as-is and as-available, and makes
|
|
||||||
no representations or warranties of any kind concerning the Licensed Material,
|
|
||||||
whether express, implied, statutory, or other. This includes, without limitation,
|
|
||||||
warranties of title, merchantability, fitness for a particular purpose, non-infringement,
|
|
||||||
absence of latent or other defects, accuracy, or the presence or absence of
|
|
||||||
errors, whether or not known or discoverable. Where disclaimers of warranties
|
|
||||||
are not allowed in full or in part, this disclaimer may not apply to You.
|
|
||||||
|
|
||||||
b. To the extent possible, in no event will the Licensor be liable to You
|
|
||||||
on any legal theory (including, without limitation, negligence) or otherwise
|
|
||||||
for any direct, special, indirect, incidental, consequential, punitive, exemplary,
|
|
||||||
or other losses, costs, expenses, or damages arising out of this Public License
|
|
||||||
or use of the Licensed Material, even if the Licensor has been advised of
|
|
||||||
the possibility of such losses, costs, expenses, or damages. Where a limitation
|
|
||||||
of liability is not allowed in full or in part, this limitation may not apply
|
|
||||||
to You.
|
|
||||||
|
|
||||||
c. The disclaimer of warranties and limitation of liability provided above
|
|
||||||
shall be interpreted in a manner that, to the extent possible, most closely
|
|
||||||
approximates an absolute disclaimer and waiver of all liability.
|
|
||||||
|
|
||||||
Section 6 – Term and Termination.
|
|
||||||
|
|
||||||
a. This Public License applies for the term of the Copyright and Similar Rights
|
|
||||||
licensed here. However, if You fail to comply with this Public License, then
|
|
||||||
Your rights under this Public License terminate automatically.
|
|
||||||
|
|
||||||
b. Where Your right to use the Licensed Material has terminated under Section
|
|
||||||
6(a), it reinstates:
|
|
||||||
|
|
||||||
1. automatically as of the date the violation is cured, provided it is cured
|
|
||||||
within 30 days of Your discovery of the violation; or
|
|
||||||
|
|
||||||
2. upon express reinstatement by the Licensor.
|
|
||||||
|
|
||||||
For the avoidance of doubt, this Section 6(b) does not affect any right the
|
|
||||||
Licensor may have to seek remedies for Your violations of this Public License.
|
|
||||||
|
|
||||||
c. For the avoidance of doubt, the Licensor may also offer the Licensed Material
|
|
||||||
under separate terms or conditions or stop distributing the Licensed Material
|
|
||||||
at any time; however, doing so will not terminate this Public License.
|
|
||||||
|
|
||||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
|
||||||
|
|
||||||
Section 7 – Other Terms and Conditions.
|
|
||||||
|
|
||||||
a. The Licensor shall not be bound by any additional or different terms or
|
|
||||||
conditions communicated by You unless expressly agreed.
|
|
||||||
|
|
||||||
b. Any arrangements, understandings, or agreements regarding the Licensed
|
|
||||||
Material not stated herein are separate from and independent of the terms
|
|
||||||
and conditions of this Public License.
|
|
||||||
|
|
||||||
Section 8 – Interpretation.
|
|
||||||
|
|
||||||
a. For the avoidance of doubt, this Public License does not, and shall not
|
|
||||||
be interpreted to, reduce, limit, restrict, or impose conditions on any use
|
|
||||||
of the Licensed Material that could lawfully be made without permission under
|
|
||||||
this Public License.
|
|
||||||
|
|
||||||
b. To the extent possible, if any provision of this Public License is deemed
|
|
||||||
unenforceable, it shall be automatically reformed to the minimum extent necessary
|
|
||||||
to make it enforceable. If the provision cannot be reformed, it shall be severed
|
|
||||||
from this Public License without affecting the enforceability of the remaining
|
|
||||||
terms and conditions.
|
|
||||||
|
|
||||||
c. No term or condition of this Public License will be waived and no failure
|
|
||||||
to comply consented to unless expressly agreed to by the Licensor.
|
|
||||||
|
|
||||||
d. Nothing in this Public License constitutes or may be interpreted as a limitation
|
|
||||||
upon, or waiver of, any privileges and immunities that apply to the Licensor
|
|
||||||
or You, including from the legal processes of any jurisdiction or authority.
|
|
||||||
|
|
||||||
Creative Commons is not a party to its public licenses. Notwithstanding, Creative
|
|
||||||
Commons may elect to apply one of its public licenses to material it publishes
|
|
||||||
and in those instances will be considered the "Licensor." The text of the
|
|
||||||
Creative Commons public licenses is dedicated to the public domain under the
|
|
||||||
CC0 Public Domain Dedication. Except for the limited purpose of indicating
|
|
||||||
that material is shared under a Creative Commons public license or as otherwise
|
|
||||||
permitted by the Creative Commons policies published at creativecommons.org/policies,
|
|
||||||
Creative Commons does not authorize the use of the trademark "Creative Commons"
|
|
||||||
or any other trademark or logo of Creative Commons without its prior written
|
|
||||||
consent including, without limitation, in connection with any unauthorized
|
|
||||||
modifications to any of its public licenses or any other arrangements, understandings,
|
|
||||||
or agreements concerning use of licensed material. For the avoidance of doubt,
|
|
||||||
this paragraph does not form part of the public licenses.
|
|
||||||
|
|
||||||
Creative Commons may be contacted at creativecommons.org.
|
|
||||||
12
README.md
12
README.md
@@ -34,6 +34,7 @@ curl -X POST http://localhost:3000/api/v1/email \
|
|||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d '{
|
-d '{
|
||||||
"to": "user@example.com",
|
"to": "user@example.com",
|
||||||
|
"subject": "Welcome to Lauf für Kaya! 2025",
|
||||||
"templateName": "welcome",
|
"templateName": "welcome",
|
||||||
"language": "en",
|
"language": "en",
|
||||||
"data": {
|
"data": {
|
||||||
@@ -51,10 +52,13 @@ curl -X POST http://localhost:3000/api/v1/email \
|
|||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d '{
|
-d '{
|
||||||
"to": "user@example.com",
|
"to": "user@example.com",
|
||||||
|
"subject": "Password Reset Request",
|
||||||
"templateName": "password-reset",
|
"templateName": "password-reset",
|
||||||
"language": "de",
|
"language": "de",
|
||||||
"data": {
|
"data": {
|
||||||
"token": "123465789"
|
"name": "John Doe",
|
||||||
|
"resetLink": "https://example.com/reset/123",
|
||||||
|
"expiresIn": "24 hours"
|
||||||
}
|
}
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
@@ -75,10 +79,6 @@ SMTP_PASS="secret.1"
|
|||||||
EMAIL_FROM="noreply@lauf-fuer-kaya.de"
|
EMAIL_FROM="noreply@lauf-fuer-kaya.de"
|
||||||
EMAIL_REPLYTO="info@lauf-fuer-kaya.de"
|
EMAIL_REPLYTO="info@lauf-fuer-kaya.de"
|
||||||
REDIS_URL=redis://localhost:6379
|
REDIS_URL=redis://localhost:6379
|
||||||
FRONTEND_URL="https://run.lauf-fuer-kaya.de"
|
|
||||||
AUTHKEY=""
|
|
||||||
EVENT_DATE="23.05.2025"
|
|
||||||
EVENT_NAME="Lauf für Kaya! 2025"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🛠️ Development
|
## 🛠️ Development
|
||||||
@@ -99,4 +99,4 @@ The project uses:
|
|||||||
|
|
||||||
### Password Reset
|
### Password Reset
|
||||||
- Languages: 🇬🇧 English, 🇩🇪 German
|
- Languages: 🇬🇧 English, 🇩🇪 German
|
||||||
- Variables: `token`
|
- Variables: `name`, `resetLink`, `expiresIn`
|
||||||
@@ -14,10 +14,6 @@ services:
|
|||||||
- SMTP_PASS="secret.1"
|
- SMTP_PASS="secret.1"
|
||||||
- EMAIL_FROM="noreply@lauf-fuer-kaya.de"
|
- EMAIL_FROM="noreply@lauf-fuer-kaya.de"
|
||||||
- EMAIL_REPLYTO="info@lauf-fuer-kaya.de"
|
- EMAIL_REPLYTO="info@lauf-fuer-kaya.de"
|
||||||
- FRONTEND_URL="https://run.lauf-fuer-kaya.de"
|
|
||||||
- AUTHKEY=""
|
|
||||||
- EVENT_DATE="23.05.2025"
|
|
||||||
- EVENT_NAME="Lauf für Kaya! 2025"
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- redis
|
- redis
|
||||||
|
|
||||||
|
|||||||
22
package.json
22
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@odit/lfk-mailer",
|
"name": "email-microservice",
|
||||||
"version": "1.2.1",
|
"version": "1.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -9,19 +9,19 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hono/node-server": "1.13.7",
|
"@hono/node-server": "1.13.7",
|
||||||
"@hono/swagger-ui": "0.5.0",
|
"@hono/swagger-ui": "0.4.1",
|
||||||
"@hono/zod-openapi": "0.18.3",
|
"@hono/zod-openapi": "0.18.0",
|
||||||
"@hono/zod-validator": "0.4.2",
|
"@hono/zod-validator": "0.4.1",
|
||||||
"bullmq": "5.34.3",
|
"bullmq": "5.29.0",
|
||||||
"handlebars": "4.7.8",
|
"handlebars": "4.7.8",
|
||||||
"hono": "4.6.14",
|
"hono": "4.6.11",
|
||||||
"ioredis": "5.4.1",
|
"ioredis": "5.4.1",
|
||||||
"nodemailer": "6.9.16",
|
"nodemailer": "6.9.16",
|
||||||
"zod": "3.24.1"
|
"zod": "3.23.8"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "22.10.2",
|
"@types/node": "22.9.1",
|
||||||
"@types/nodemailer": "6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
"bun-types": "1.1.40"
|
"bun-types": "1.1.36"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,6 @@ const app = new Hono()
|
|||||||
app.use('*', logger())
|
app.use('*', logger())
|
||||||
app.use('*', prettyJSON())
|
app.use('*', prettyJSON())
|
||||||
|
|
||||||
if ((process.env.AUTHKEY || "") === "") {
|
|
||||||
console.warn("process.env.AUTHKEY was not provided!");
|
|
||||||
}
|
|
||||||
|
|
||||||
app.route('/api/v1/email', emailRouter)
|
app.route('/api/v1/email', emailRouter)
|
||||||
app.get('/docs', createSwaggerUI())
|
app.get('/docs', createSwaggerUI())
|
||||||
app.get('/swagger', createSwaggerUI())
|
app.get('/swagger', createSwaggerUI())
|
||||||
|
|||||||
@@ -2,13 +2,11 @@ import { createTransport } from "nodemailer";
|
|||||||
import { Queue, Worker, QueueEvents } from "bullmq";
|
import { Queue, Worker, QueueEvents } from "bullmq";
|
||||||
import { config } from "../config/env";
|
import { config } from "../config/env";
|
||||||
import Redis from "ioredis";
|
import Redis from "ioredis";
|
||||||
import { Attachment } from "nodemailer/lib/mailer";
|
|
||||||
|
|
||||||
interface EmailJob {
|
interface EmailJob {
|
||||||
to: string;
|
to: string;
|
||||||
subject: string;
|
subject: string;
|
||||||
html: string;
|
html: string;
|
||||||
attachments: Attachment[];
|
|
||||||
text: string;
|
text: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,22 +32,21 @@ const transporter = createTransport({
|
|||||||
port: config.smtp.port,
|
port: config.smtp.port,
|
||||||
auth: {
|
auth: {
|
||||||
user: config.smtp.user,
|
user: config.smtp.user,
|
||||||
pass: config.smtp.pass,
|
pass: config.smtp.pass
|
||||||
},
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
const worker = new Worker<EmailJob>(
|
const worker = new Worker<EmailJob>(
|
||||||
QUEUE_NAME,
|
QUEUE_NAME,
|
||||||
async (job) => {
|
async (job) => {
|
||||||
await transporter.sendMail({
|
await transporter.sendMail({
|
||||||
from: { address: config.email.from, name: "Lauf für Kaya!" },
|
from: config.email.from,
|
||||||
replyTo: config.email.replyTo,
|
replyTo: config.email.replyTo,
|
||||||
to: job.data.to,
|
to: job.data.to,
|
||||||
subject: job.data.subject,
|
subject: job.data.subject,
|
||||||
text: job.data.text,
|
text: job.data.text,
|
||||||
html: job.data.html,
|
html: job.data.html,
|
||||||
attachments: job.data.attachments,
|
})
|
||||||
});
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
connection,
|
connection,
|
||||||
@@ -64,7 +61,7 @@ const worker = new Worker<EmailJob>(
|
|||||||
const queueEvents = new QueueEvents(QUEUE_NAME, { connection });
|
const queueEvents = new QueueEvents(QUEUE_NAME, { connection });
|
||||||
|
|
||||||
worker.on("completed", (job) => {
|
worker.on("completed", (job) => {
|
||||||
console.log(`Email job ${job.id} completed`);
|
// console.log(`Email job ${job.id} completed`);
|
||||||
});
|
});
|
||||||
|
|
||||||
worker.on("failed", (job, error) => {
|
worker.on("failed", (job, error) => {
|
||||||
@@ -72,7 +69,7 @@ worker.on("failed", (job, error) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
queueEvents.on("waiting", ({ jobId }) => {
|
queueEvents.on("waiting", ({ jobId }) => {
|
||||||
console.log(`Job ${jobId} is waiting`);
|
// console.log(`Job ${jobId} is waiting`)
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on("SIGTERM", async () => {
|
process.on("SIGTERM", async () => {
|
||||||
|
|||||||
@@ -1,59 +1,34 @@
|
|||||||
import { Hono } from 'hono'
|
import { Hono } from 'hono'
|
||||||
import { bearerAuth } from 'hono/bearer-auth'
|
|
||||||
import { zValidator } from '@hono/zod-validator'
|
import { zValidator } from '@hono/zod-validator'
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
import { EmailService } from '../services/email'
|
import { EmailService } from '../services/email'
|
||||||
import { getEmailTemplate } from '../templates'
|
import { getEmailTemplate } from '../templates'
|
||||||
import { Language } from '../types'
|
import { Language } from '../types'
|
||||||
import { Attachment } from 'nodemailer/lib/mailer'
|
|
||||||
|
|
||||||
const emailRouter = new Hono()
|
const emailRouter = new Hono()
|
||||||
const emailService = new EmailService()
|
const emailService = new EmailService()
|
||||||
|
|
||||||
const sendEmailSchema = z.object({
|
const sendEmailSchema = z.object({
|
||||||
to: z.string().email(),
|
to: z.string().email(),
|
||||||
|
subject: z.string(),
|
||||||
templateName: z.string(),
|
templateName: z.string(),
|
||||||
language: z.enum(['en', 'de']),
|
language: z.enum(['en', 'de']),
|
||||||
data: z.record(z.any())
|
data: z.record(z.any())
|
||||||
})
|
})
|
||||||
|
|
||||||
async function generateBarcodeDataURL(data) {
|
emailRouter.post('/', zValidator('json', sendEmailSchema), async (c) => {
|
||||||
return `${process.env.DOCUMENT_SERVER_URL}/v1/barcodes/code128/${data}`
|
let { to, subject, templateName, language, data } = c.req.valid('json')
|
||||||
}
|
|
||||||
|
|
||||||
emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('json', sendEmailSchema), async (c) => {
|
|
||||||
let { to, templateName, language, data } = c.req.valid('json')
|
|
||||||
const attachments: Attachment[] = []
|
|
||||||
try {
|
try {
|
||||||
const template = getEmailTemplate(templateName, language as Language)
|
const template = getEmailTemplate(templateName, language as Language)
|
||||||
if (templateName === "welcome") {
|
if (templateName === "welcome") {
|
||||||
if (data.name && data.link && data.barcode_content) {
|
if (data.barcode_content === "0123456789") {
|
||||||
const dataURL = await generateBarcodeDataURL(data.barcode_content);
|
data.barcode_url = "https://barcodeapi.org/api/128/0123456789?"
|
||||||
data.barcode_url = dataURL;
|
|
||||||
} else {
|
|
||||||
return c.json({ success: false, error: "required params 'data.name', 'data.link', 'data.barcode_content' not provided" }, 406)
|
|
||||||
}
|
|
||||||
const attachment: Attachment = {
|
|
||||||
filename: 'invite.ics',
|
|
||||||
content: `BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//ICS Generator//NONSGML ICS Generator//DE\nBEGIN:VEVENT\nUID:1742337822408-5ghrzyi@icsgenerator.local\nDTSTAMP:20250318T224342Z\nSUMMARY:Lauf für Kaya! 2025\nDTSTART:20250523T110000Z\nDTEND:20250523T160000Z\nDESCRIPTION:Der Lauf für Kaya! 2025 findet am 23.05.2025 auf dem Sportplatz des Gymnasium Herzogenaurach statt. Zur Anmeldung einfach zum Infozelt kommen.\nLOCATION:Sportplatz Gymnasium Herzogenaurach\nBEGIN:VALARM\nACTION:DISPLAY\nDESCRIPTION:Erinnerung: Lauf für Kaya! 2025\nTRIGGER:-PT1440M\nEND:VALARM\nEND:VEVENT\nEND:VCALENDAR`,
|
|
||||||
contentType: 'text/calendar; method=REQUEST',
|
|
||||||
}
|
|
||||||
attachments.push(attachment)
|
|
||||||
}
|
|
||||||
if (templateName === "password-reset") {
|
|
||||||
if (data.token) {
|
|
||||||
console.log(data);
|
|
||||||
data.reset_link = `${process.env.FRONTEND_URL}/reset/${(Buffer.from(data.token)).toString("base64")}`
|
|
||||||
} else {
|
|
||||||
return c.json({ success: false, error: "'data.token' not provided" }, 406)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data.event_date = process.env.EVENT_DATE
|
|
||||||
data.event_name = process.env.EVENT_NAME
|
|
||||||
await emailService.sendEmail({
|
await emailService.sendEmail({
|
||||||
to,
|
to,
|
||||||
attachments,
|
subject,
|
||||||
subject: template.subject(data),
|
|
||||||
html: template.html(data),
|
html: template.html(data),
|
||||||
text: template.text(data)
|
text: template.text(data)
|
||||||
})
|
})
|
||||||
@@ -65,7 +40,7 @@ emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('js
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Add queue status endpoint
|
// Add queue status endpoint
|
||||||
emailRouter.get('/status', bearerAuth({ token: process.env.AUTHKEY }), async (c) => {
|
emailRouter.get('/status', async (c) => {
|
||||||
try {
|
try {
|
||||||
const status = await emailService.getQueueStatus()
|
const status = await emailService.getQueueStatus()
|
||||||
return c.json(status)
|
return c.json(status)
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
import { emailQueue } from '../queues/email.queue'
|
import { emailQueue } from '../queues/email.queue'
|
||||||
import { config } from '../config/env'
|
import { config } from '../config/env'
|
||||||
import { Attachment } from 'nodemailer/lib/mailer'
|
|
||||||
|
|
||||||
interface EmailOptions {
|
interface EmailOptions {
|
||||||
to: string
|
to: string
|
||||||
subject: string
|
subject: string
|
||||||
html: string
|
html: string
|
||||||
attachments: Attachment[]
|
|
||||||
text: string
|
text: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,12 +10,15 @@ const routes = {
|
|||||||
'application/json': {
|
'application/json': {
|
||||||
schema: {
|
schema: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
required: ['to', 'templateName', 'language', 'data'],
|
required: ['to', 'subject', 'templateName', 'language', 'data'],
|
||||||
properties: {
|
properties: {
|
||||||
to: {
|
to: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
format: 'email'
|
format: 'email'
|
||||||
},
|
},
|
||||||
|
subject: {
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
templateName: {
|
templateName: {
|
||||||
type: 'string'
|
type: 'string'
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import { compile } from 'handlebars'
|
|||||||
interface TemplateCache {
|
interface TemplateCache {
|
||||||
[key: string]: {
|
[key: string]: {
|
||||||
html: HandlebarsTemplateDelegate
|
html: HandlebarsTemplateDelegate
|
||||||
subject: HandlebarsTemplateDelegate,
|
|
||||||
text: HandlebarsTemplateDelegate
|
text: HandlebarsTemplateDelegate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,15 +18,12 @@ function loadTemplate(name: string, language: Language) {
|
|||||||
if (!templateCache[cacheKey]) {
|
if (!templateCache[cacheKey]) {
|
||||||
const htmlPath = join(process.cwd(), 'src', 'templates', name, `${language}.html`)
|
const htmlPath = join(process.cwd(), 'src', 'templates', name, `${language}.html`)
|
||||||
const textPath = join(process.cwd(), 'src', 'templates', name, `${language}.txt`)
|
const textPath = join(process.cwd(), 'src', 'templates', name, `${language}.txt`)
|
||||||
const subjectPath = join(process.cwd(), 'src', 'templates', name, `${language}.subject.txt`)
|
|
||||||
|
|
||||||
const htmlTemplate = readFileSync(htmlPath, 'utf-8')
|
const htmlTemplate = readFileSync(htmlPath, 'utf-8')
|
||||||
const textTemplate = readFileSync(textPath, 'utf-8')
|
const textTemplate = readFileSync(textPath, 'utf-8')
|
||||||
const subjectTemplate = readFileSync(subjectPath, 'utf-8')
|
|
||||||
|
|
||||||
templateCache[cacheKey] = {
|
templateCache[cacheKey] = {
|
||||||
html: compile(htmlTemplate),
|
html: compile(htmlTemplate),
|
||||||
subject: compile(subjectTemplate),
|
|
||||||
text: compile(textTemplate)
|
text: compile(textTemplate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -39,7 +35,6 @@ export function getEmailTemplate(name: string, language: Language) {
|
|||||||
const template = loadTemplate(name, language)
|
const template = loadTemplate(name, language)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
subject: (data: any) => template.subject(data),
|
|
||||||
html: (data: any) => template.html(data),
|
html: (data: any) => template.html(data),
|
||||||
text: (data: any) => template.text(data)
|
text: (data: any) => template.text(data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,298 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<h1>Anfrage zum Zurücksetzen des Passworts</h1>
|
||||||
<html dir="ltr" lang="en">
|
<p>Hallo {{name}},</p>
|
||||||
<head>
|
<p>Wir haben eine Anfrage zum Zurücksetzen Ihres Passworts erhalten. Klicken Sie auf den untenstehenden Link, um ein neues Passwort zu erstellen:</p>
|
||||||
<meta content="width=device-width" name="viewport" />
|
<a href="{{resetLink}}" style="display: inline-block; background: #007bff; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; margin: 15px 0;">Passwort zurücksetzen</a>
|
||||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
<p>Dieser Link läuft in {{expiresIn}} ab.</p>
|
||||||
<meta name="x-apple-disable-message-reformatting" />
|
<p>Falls Sie diese Anfrage nicht gestellt haben, ignorieren Sie bitte diese E-Mail oder kontaktieren Sie den Support, wenn Sie Bedenken haben.</p>
|
||||||
<meta content="IE=edge" http-equiv="X-UA-Compatible" />
|
<p>Mit freundlichen Grüßen,<br>Ihr Support-Team</p>
|
||||||
<meta name="x-apple-disable-message-reformatting" />
|
|
||||||
<meta
|
|
||||||
content="telephone=no,address=no,email=no,date=no,url=no"
|
|
||||||
name="format-detection"
|
|
||||||
/>
|
|
||||||
<meta content="light" name="color-scheme" />
|
|
||||||
<meta content="light" name="supported-color-schemes" />
|
|
||||||
<!--$-->
|
|
||||||
<style>
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
mso-font-alt: "sans-serif";
|
|
||||||
src: url(https://rsms.me/inter/font-files/Inter-Regular.woff2?v=3.19)
|
|
||||||
format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
* {
|
|
||||||
font-family: "Inter", sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
blockquote,
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
img,
|
|
||||||
li,
|
|
||||||
ol,
|
|
||||||
p,
|
|
||||||
ul {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
@media only screen and (max-width: 425px) {
|
|
||||||
.tab-row-full {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
.tab-col-full {
|
|
||||||
display: block !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
.tab-pad {
|
|
||||||
padding: 0 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body style="margin: 0">
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: none;
|
|
||||||
overflow: hidden;
|
|
||||||
line-height: 1px;
|
|
||||||
opacity: 0;
|
|
||||||
max-height: 0;
|
|
||||||
max-width: 0;
|
|
||||||
"
|
|
||||||
id="__react-email-preview"
|
|
||||||
>
|
|
||||||
Anfrage zum Zurücksetzen des Passworts
|
|
||||||
<div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table
|
|
||||||
align="center"
|
|
||||||
width="100%"
|
|
||||||
border="0"
|
|
||||||
cellpadding="0"
|
|
||||||
cellspacing="0"
|
|
||||||
role="presentation"
|
|
||||||
style="
|
|
||||||
max-width: 600px;
|
|
||||||
min-width: 300px;
|
|
||||||
width: 100%;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
padding: 0.5rem;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<tbody>
|
|
||||||
<tr style="width: 100%">
|
|
||||||
<td>
|
|
||||||
<table
|
|
||||||
align="center"
|
|
||||||
width="100%"
|
|
||||||
border="0"
|
|
||||||
cellpadding="0"
|
|
||||||
cellspacing="0"
|
|
||||||
role="presentation"
|
|
||||||
style="margin-top: 0px; margin-bottom: 32px"
|
|
||||||
>
|
|
||||||
<tbody style="width: 100%">
|
|
||||||
<tr style="width: 100%">
|
|
||||||
<td align="left" data-id="__react-email-column">
|
|
||||||
<img
|
|
||||||
title="Logo"
|
|
||||||
alt="Logo"
|
|
||||||
src="https://run.lauf-fuer-kaya.de/lfk-logo.png"
|
|
||||||
style="
|
|
||||||
display: block;
|
|
||||||
outline: none;
|
|
||||||
border: none;
|
|
||||||
text-decoration: none;
|
|
||||||
width: 64px;
|
|
||||||
height: 64px;
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<h2
|
|
||||||
style="
|
|
||||||
text-align: left;
|
|
||||||
color: #111827;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
margin-top: 0;
|
|
||||||
font-size: 30px;
|
|
||||||
line-height: 36px;
|
|
||||||
font-weight: 700;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<strong>Anfrage zum Zurücksetzen des Passworts</strong>
|
|
||||||
</h2>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<strong>Hallo 👋</strong>
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
Wir haben eine Anfrage zum Zurücksetzen deines Passworts
|
|
||||||
erhalten.<br />Verwende den folgenden Link, um ein neues Passwort
|
|
||||||
zu erstellen:
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<a
|
|
||||||
href="{{reset_link}}"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>{{reset_link}}</a
|
|
||||||
>
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
Falls du diese Anfrage nicht gestellt hast, ignoriere bitte diese
|
|
||||||
E-Mail.
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
Sportliche Grüße 🏃♂️<br />Dein Team Lauf für Kaya!
|
|
||||||
</p>
|
|
||||||
<hr
|
|
||||||
style="
|
|
||||||
width: 100%;
|
|
||||||
border: none;
|
|
||||||
border-top: 1px solid #eaeaea;
|
|
||||||
margin-top: 32px;
|
|
||||||
margin-bottom: 32px;
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
Lauf für Kaya! <strong>Powered by </strong
|
|
||||||
><u
|
|
||||||
><strong
|
|
||||||
><a
|
|
||||||
href="https://odit.services?ref=lfkmail"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>ODIT.Services</a
|
|
||||||
></strong
|
|
||||||
></u
|
|
||||||
>.<br /><u
|
|
||||||
><strong
|
|
||||||
><a
|
|
||||||
href="https://lauf-fuer-kaya.de/impressum/"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>Impressum</a
|
|
||||||
></strong
|
|
||||||
></u
|
|
||||||
>
|
|
||||||
-
|
|
||||||
<u
|
|
||||||
><strong
|
|
||||||
><a
|
|
||||||
href="https://lauf-fuer-kaya.de/datenschutz/"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>Datenschutzerklärung</a
|
|
||||||
></strong
|
|
||||||
></u
|
|
||||||
>
|
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<!--/$-->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Lauf für Kaya! - Passwort Reset
|
|
||||||
@@ -1,17 +1,13 @@
|
|||||||
Hallo 👋
|
Anfrage zum Zurücksetzen des Passworts
|
||||||
|
|
||||||
Wir haben eine Anfrage zum Zurücksetzen deines Passworts erhalten.
|
Hallo {{name}},
|
||||||
Verwende den folgenden Link, um ein neues Passwort zu erstellen:
|
|
||||||
{{reset_link}}
|
|
||||||
|
|
||||||
Falls du diese Anfrage nicht gestellt hast, ignoriere bitte diese E-Mail.
|
Wir haben eine Anfrage zum Zurücksetzen Ihres Passworts erhalten. Verwenden Sie den folgenden Link, um ein neues Passwort zu erstellen:
|
||||||
|
{{resetLink}}
|
||||||
|
|
||||||
Sportliche Grüße 🏃♂️
|
Dieser Link läuft in {{expiresIn}} ab.
|
||||||
Dein Team Lauf für Kaya!
|
|
||||||
|
|
||||||
-
|
Falls Sie diese Anfrage nicht gestellt haben, ignorieren Sie bitte diese E-Mail oder kontaktieren Sie den Support, wenn Sie Bedenken haben.
|
||||||
|
|
||||||
Lauf für Kaya!
|
Mit freundlichen Grüßen,
|
||||||
Powered by ODIT.Services (https://odit.services)
|
Ihr Support-Team
|
||||||
Impressum: https://lauf-fuer-kaya.de/impressum/
|
|
||||||
Datenschutzerklärung: https://lauf-fuer-kaya.de/datenschutz/
|
|
||||||
@@ -1,297 +1,7 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<h1>Password Reset Request</h1>
|
||||||
<html dir="ltr" lang="en">
|
<p>Hello {{name}},</p>
|
||||||
<head>
|
<p>We received a request to reset your password. Click the link below to create a new password:</p>
|
||||||
<meta content="width=device-width" name="viewport" />
|
<a href="{{resetLink}}" style="display: inline-block; background: #007bff; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; margin: 15px 0;">Reset Password</a>
|
||||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
<p>This link will expire in {{expiresIn}}.</p>
|
||||||
<meta name="x-apple-disable-message-reformatting" />
|
<p>If you didn't request this password reset, please ignore this email or contact support if you have concerns.</p>
|
||||||
<meta content="IE=edge" http-equiv="X-UA-Compatible" />
|
<p>Best regards,<br>Your Support Team</p>
|
||||||
<meta name="x-apple-disable-message-reformatting" />
|
|
||||||
<meta
|
|
||||||
content="telephone=no,address=no,email=no,date=no,url=no"
|
|
||||||
name="format-detection"
|
|
||||||
/>
|
|
||||||
<meta content="light" name="color-scheme" />
|
|
||||||
<meta content="light" name="supported-color-schemes" />
|
|
||||||
<!--$-->
|
|
||||||
<style>
|
|
||||||
@font-face {
|
|
||||||
font-family: "Inter";
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
mso-font-alt: "sans-serif";
|
|
||||||
src: url(https://rsms.me/inter/font-files/Inter-Regular.woff2?v=3.19)
|
|
||||||
format("woff2");
|
|
||||||
}
|
|
||||||
|
|
||||||
* {
|
|
||||||
font-family: "Inter", sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<style>
|
|
||||||
blockquote,
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
img,
|
|
||||||
li,
|
|
||||||
ol,
|
|
||||||
p,
|
|
||||||
ul {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
@media only screen and (max-width: 425px) {
|
|
||||||
.tab-row-full {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
.tab-col-full {
|
|
||||||
display: block !important;
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
.tab-pad {
|
|
||||||
padding: 0 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body style="margin: 0">
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: none;
|
|
||||||
overflow: hidden;
|
|
||||||
line-height: 1px;
|
|
||||||
opacity: 0;
|
|
||||||
max-height: 0;
|
|
||||||
max-width: 0;
|
|
||||||
"
|
|
||||||
id="__react-email-preview"
|
|
||||||
>
|
|
||||||
Password-Reset
|
|
||||||
<div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table
|
|
||||||
align="center"
|
|
||||||
width="100%"
|
|
||||||
border="0"
|
|
||||||
cellpadding="0"
|
|
||||||
cellspacing="0"
|
|
||||||
role="presentation"
|
|
||||||
style="
|
|
||||||
max-width: 600px;
|
|
||||||
min-width: 300px;
|
|
||||||
width: 100%;
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
padding: 0.5rem;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<tbody>
|
|
||||||
<tr style="width: 100%">
|
|
||||||
<td>
|
|
||||||
<table
|
|
||||||
align="center"
|
|
||||||
width="100%"
|
|
||||||
border="0"
|
|
||||||
cellpadding="0"
|
|
||||||
cellspacing="0"
|
|
||||||
role="presentation"
|
|
||||||
style="margin-top: 0px; margin-bottom: 32px"
|
|
||||||
>
|
|
||||||
<tbody style="width: 100%">
|
|
||||||
<tr style="width: 100%">
|
|
||||||
<td align="left" data-id="__react-email-column">
|
|
||||||
<img
|
|
||||||
title="Logo"
|
|
||||||
alt="Logo"
|
|
||||||
src="https://run.lauf-fuer-kaya.de/lfk-logo.png"
|
|
||||||
style="
|
|
||||||
display: block;
|
|
||||||
outline: none;
|
|
||||||
border: none;
|
|
||||||
text-decoration: none;
|
|
||||||
width: 64px;
|
|
||||||
height: 64px;
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<h2
|
|
||||||
style="
|
|
||||||
text-align: left;
|
|
||||||
color: #111827;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
margin-top: 0;
|
|
||||||
font-size: 30px;
|
|
||||||
line-height: 36px;
|
|
||||||
font-weight: 700;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<strong>Password-Reset</strong>
|
|
||||||
</h2>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<strong>Hi 👋</strong>
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
We received a request to reset your password.<br />Use the
|
|
||||||
following link to create a new password:
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<a
|
|
||||||
href="{{reset_link}}"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>{{reset_link}}</a
|
|
||||||
>
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
If you didn't request this password reset, please ignore this
|
|
||||||
email.
|
|
||||||
</p>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
Sporty Greetings 🏃♂️<br />Your Team Lauf für Kaya!
|
|
||||||
</p>
|
|
||||||
<hr
|
|
||||||
style="
|
|
||||||
width: 100%;
|
|
||||||
border: none;
|
|
||||||
border-top: 1px solid #eaeaea;
|
|
||||||
margin-top: 32px;
|
|
||||||
margin-bottom: 32px;
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
<p
|
|
||||||
style="
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
text-align: left;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
margin-top: 0px;
|
|
||||||
color: #374151;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
Lauf für Kaya! <strong>Powered by </strong
|
|
||||||
><u
|
|
||||||
><strong
|
|
||||||
><a
|
|
||||||
href="https://odit.services?ref=lfkmail"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>ODIT.Services</a
|
|
||||||
></strong
|
|
||||||
></u
|
|
||||||
>.<br /><u
|
|
||||||
><strong
|
|
||||||
><a
|
|
||||||
href="https://lauf-fuer-kaya.de/impressum/"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>Imprint</a
|
|
||||||
></strong
|
|
||||||
></u
|
|
||||||
>
|
|
||||||
-
|
|
||||||
<u
|
|
||||||
><strong
|
|
||||||
><a
|
|
||||||
href="https://lauf-fuer-kaya.de/datenschutz/"
|
|
||||||
rel="noopener noreferrer nofollow"
|
|
||||||
style="
|
|
||||||
color: #111827;
|
|
||||||
text-decoration: underline;
|
|
||||||
font-weight: 500;
|
|
||||||
"
|
|
||||||
target="_blank"
|
|
||||||
>Privacy Policy</a
|
|
||||||
></strong
|
|
||||||
></u
|
|
||||||
>
|
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<!--/$-->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Lauf für Kaya! - Password Reset
|
|
||||||
@@ -1,17 +1,13 @@
|
|||||||
Hello 👋
|
Password Reset Request
|
||||||
|
|
||||||
We received a request to reset your password.
|
Hello {{name}},
|
||||||
Use the following link to create a new password:
|
|
||||||
{{reset_link}}
|
|
||||||
|
|
||||||
If you didn't request this password reset, please ignore this email.
|
We received a request to reset your password. Use the following link to create a new password:
|
||||||
|
{{resetLink}}
|
||||||
|
|
||||||
Sporty Greetings 🏃♂️
|
This link will expire in {{expiresIn}}.
|
||||||
Your Team Lauf für Kaya!
|
|
||||||
|
|
||||||
-
|
If you didn't request this password reset, please ignore this email or contact support if you have concerns.
|
||||||
|
|
||||||
Lauf für Kaya!
|
Best regards,
|
||||||
Powered by ODIT.Services (https://odit.services)
|
Your Support Team
|
||||||
Imprint: https://lauf-fuer-kaya.de/impressum/
|
|
||||||
Privacy Policy: https://lauf-fuer-kaya.de/datenschutz/
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
Willkommen beim {{event_name}}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
Hallo {{name}} 👋
|
Hallo {{name}} 👋
|
||||||
|
|
||||||
vielen Dank für deine Registrierung beim {{event_name}}
|
vielen Dank für deine Registrierung beim Lauf für Kaya! 2025
|
||||||
|
|
||||||
Am Lauftag ({{event_date}}) musst du nur noch deinen Barcode vorzeigen, damit erhältst du deine Läuferkarte.
|
Am Lauftag (23.05.2025) musst du nur noch deinen Barcode vorzeigen, damit erhältst du deine Läuferkarte.
|
||||||
Deinen Registrierungs-Code, Rundenzeiten und weitere Infos kannst du jederzeit im Lauf für Kaya! Selfservice unter {{link}} einsehen.
|
Deinen Registrierungs-Code, Rundenzeiten und weitere Infos kannst du jederzeit im Lauf für Kaya! Selfservice unter {{link}} einsehen.
|
||||||
|
|
||||||
Wir freuen uns schon auf dich und einen erfolgreichen Lauf für Kaya!
|
Wir freuen uns schon auf dich und einen erfolgreichen Lauf für Kaya!
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
Welcome to {{event_name}}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
Hello {{name}} 👋
|
Hello {{name}} 👋
|
||||||
|
|
||||||
Thank you for registering for the {{event_name}}
|
Thank you for registering for the Lauf für Kaya! 2025
|
||||||
|
|
||||||
On the day of the run ({{event_date}}) you only have to show your barcode to receive your runner's card.
|
On the day of the run (23.05.2025) you only have to show your barcode to receive your runner's card.
|
||||||
You can view your registration code, lap times and further information at any time from the Lauf für Kaya! Selfservice at {{link}}.
|
You can view your registration code, lap times and further information at any time from the Lauf für Kaya! Selfservice at {{link}}.
|
||||||
|
|
||||||
We look forward to seeing you and to a successful Lauf für Kaya!
|
We look forward to seeing you and to a successful Lauf für Kaya!
|
||||||
|
|||||||
Reference in New Issue
Block a user