@nxgt/janus-mail 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +262 -0
  3. package/dist/generated/locales.d.ts +5 -0
  4. package/dist/generated/locales.d.ts.map +1 -0
  5. package/dist/generated/mail.d.ts +29 -0
  6. package/dist/generated/mail.d.ts.map +1 -0
  7. package/dist/index.d.ts +20 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +234 -0
  10. package/dist/index.js.map +14 -0
  11. package/dist/janus-mail.d.ts +24 -0
  12. package/dist/janus-mail.d.ts.map +1 -0
  13. package/dist/mails.d.ts +26 -0
  14. package/dist/mails.d.ts.map +1 -0
  15. package/dist/options.d.ts +27 -0
  16. package/dist/options.d.ts.map +1 -0
  17. package/dist/templates.d.ts +15 -0
  18. package/dist/templates.d.ts.map +1 -0
  19. package/dist/types.d.ts +145 -0
  20. package/dist/types.d.ts.map +1 -0
  21. package/docs/README.md +34 -0
  22. package/docs/guide/building.md +130 -0
  23. package/docs/guide/locales.md +113 -0
  24. package/docs/guide/sending.md +242 -0
  25. package/docs/guide/templates.md +183 -0
  26. package/docs/roadmap.md +52 -0
  27. package/docs/troubleshooting.md +313 -0
  28. package/mails/en/email-changed.html +42 -0
  29. package/mails/en/email-changed.txt +21 -0
  30. package/mails/en/password-changed.html +42 -0
  31. package/mails/en/password-changed.txt +21 -0
  32. package/mails/en/reset-password.html +40 -0
  33. package/mails/en/reset-password.txt +22 -0
  34. package/mails/en/sign-in-code.html +36 -0
  35. package/mails/en/sign-in-code.txt +15 -0
  36. package/mails/en/verify-email.html +40 -0
  37. package/mails/en/verify-email.txt +22 -0
  38. package/mails/fr/email-changed.html +42 -0
  39. package/mails/fr/email-changed.txt +21 -0
  40. package/mails/fr/password-changed.html +41 -0
  41. package/mails/fr/password-changed.txt +21 -0
  42. package/mails/fr/reset-password.html +39 -0
  43. package/mails/fr/reset-password.txt +22 -0
  44. package/mails/fr/sign-in-code.html +36 -0
  45. package/mails/fr/sign-in-code.txt +15 -0
  46. package/mails/fr/verify-email.html +40 -0
  47. package/mails/fr/verify-email.txt +22 -0
  48. package/mails/mail-manifest.json +128 -0
  49. package/package.json +71 -0
@@ -0,0 +1,313 @@
1
+ # Troubleshooting `@nxgt/janus-mail`
2
+
3
+ Each entry is headed by the text you see: a message, an error `code`, or a
4
+ compiler error. Search this page for the words of your message.
5
+
6
+ How the messages are shaped:
7
+
8
+ - **Every message starts with the call you wrote**: `janusMail: …` for an
9
+ option, `janusMail.<method>: …` for a call. Messages from `@nxgt/mail` start
10
+ with its own calls: `render: …`, `send: …`, `createMailRenderer: …`.
11
+ - **A `TypeError` is a wiring mistake**, from how the application was put
12
+ together — never from what a recipient did. Fix the code; no handler
13
+ should answer one.
14
+ - **A message names the option or the field, never its value**: a link in a
15
+ verification e-mail is a credential, and never reaches a log through an
16
+ error.
17
+ - **`MailFailure` and `MailRefused` are `@nxgt/mail`'s**, passed through
18
+ untouched: this package defines no error class.
19
+
20
+ ## Index
21
+
22
+ **Wiring — `janusMail()`**
23
+ - [`janusMail: options must be an object, as { mailer, from, brand, links }`](#janusmail-options-must-be-an-object-as--mailer-from-brand-links-)
24
+ - [`janusMail: mailer must be a Mailer — an object with a send function`](#janusmail-mailer-must-be-a-mailer--an-object-with-a-send-function)
25
+ - [`janusMail: from must be an address, as 'noreply@example.com' or { name, address }`](#janusmail-from-must-be-an-address-as-noreplyexamplecom-or--name-address-)
26
+ - [`janusMail: replyTo must be an address, as 'support@example.com' or { name, address }`](#janusmail-replyto-must-be-an-address-as-supportexamplecom-or--name-address-)
27
+ - [`janusMail: brand must be the name the e-mails show, as 'Acme'`](#janusmail-brand-must-be-the-name-the-e-mails-show-as-acme)
28
+ - [`janusMail: links must be an object, as { verifyEmail, resetPassword, secureAccount }`](#janusmail-links-must-be-an-object-as--verifyemail-resetpassword-secureaccount-)
29
+ - [`janusMail: links.<name> must be a function`](#janusmail-linksname-must-be-a-function)
30
+ - [`janusMail: locales must list at least one locale, as ['en', 'fr']`](#janusmail-locales-must-list-at-least-one-locale-as-en-fr)
31
+ - [`janusMail: locales holds the same locale twice`](#janusmail-locales-holds-the-same-locale-twice)
32
+ - [`janusMail: fallbackLocale must be one of locales`](#janusmail-fallbacklocale-must-be-one-of-locales)
33
+ - [`janusMail: templates must be an object of functions, as { verifyEmail: (variables) => rendered }`](#janusmail-templates-must-be-an-object-of-functions-as--verifyemail-variables--rendered-)
34
+ - [`janusMail: templates has no template <name> — name one of verifyEmail, resetPassword, signInCode, passwordChanged, emailChanged`](#janusmail-templates-has-no-template-name--name-one-of-verifyemail-resetpassword-signincode-passwordchanged-emailchanged)
35
+ - [`janusMail: templates.<name> must be a function`](#janusmail-templatesname-must-be-a-function)
36
+ - [`janusMail: templates.<name> is not an own enumerable property — pass a plain object, as { <name>: (variables) => rendered }`](#janusmail-templatesname-is-not-an-own-enumerable-property--pass-a-plain-object-as--name-variables--rendered-)
37
+ - [`janusMail: the default templates are built in en and fr only — with another locale in locales, pass every template in templates; <names> missing`](#janusmail-the-default-templates-are-built-in-en-and-fr-only--with-another-locale-in-locales-pass-every-template-in-templates-names-missing)
38
+
39
+ **Sending**
40
+ - [`janusMail.<method>: <field> must be a string`](#janusmailmethod-field-must-be-a-string)
41
+ - [`MAIL_REFUSED` — `render: <email>: link must be an http:, https: or mailto: URL`](#mail_refused--render-email-link-must-be-an-http-https-or-mailto-url)
42
+ - [`janusMail.<method>: links.<call> must answer a string`](#janusmailmethod-linkscall-must-answer-a-string)
43
+ - [`render: <email>: link must be a string or a finite number`](#render-email-link-must-be-a-string-or-a-finite-number)
44
+ - [`MAIL_REFUSED` — from the mailer](#mail_refused--from-the-mailer)
45
+ - [`MAIL_FAILED` — `MailFailure`](#mail_failed--mailfailure)
46
+ - [`createMailRenderer: …/mails/mail-manifest.json cannot be read — run maizzle build, and deploy its output folder`](#createmailrenderer-mailsmail-manifestjson-cannot-be-read--run-maizzle-build-and-deploy-its-output-folder)
47
+ - [`Could not resolve "node:fs"` on an edge runtime](#could-not-resolve-nodefs-on-an-edge-runtime)
48
+
49
+ **Compile errors**
50
+ - [`TS2345: Argument of type '(IssuedToken & { user: … }) | null' is not assignable to parameter of type 'IssuedToken'.`](#ts2345-argument-of-type-issuedtoken---user----null-is-not-assignable-to-parameter-of-type-issuedtoken)
51
+ - [`TS2739: Type '{ … }' is missing the following properties from type 'JanusMailTemplates<…>'`](#ts2739-type----is-missing-the-following-properties-from-type-janusmailtemplates)
52
+ - [`TS2322: Type '"de"' is not assignable to type '"en" | "fr"'.`](#ts2322-type-de-is-not-assignable-to-type-en--fr)
53
+
54
+ ---
55
+
56
+ ## Wiring — `janusMail()`
57
+
58
+ Each is a bare `TypeError`, thrown when `janusMail()` is called — at
59
+ start-up, before anything is sent.
60
+
61
+ ### `janusMail: options must be an object, as { mailer, from, brand, links }`
62
+
63
+ `janusMail()` called with nothing, `null`, or not an object. Pass the options.
64
+
65
+ ### `janusMail: mailer must be a Mailer — an object with a send function`
66
+
67
+ No `mailer`, or one without `send`. Pass a transport's mailer — or
68
+ `createMemoryMailer()` in a test:
69
+
70
+ ```ts
71
+ import { createResendMailer } from '@nxgt/mail-resend';
72
+ janusMail({ mailer: createResendMailer({ apiKey }), from, brand: 'Acme', links });
73
+ ```
74
+
75
+ ### `janusMail: from must be an address, as 'noreply@example.com' or { name, address }`
76
+
77
+ No `from`, a blank string, or an object without its `address`. A name and an
78
+ address are written `{ name: 'Acme', address: 'noreply@acme.example' }`,
79
+ never `'Acme <noreply@acme.example>'` — the mailer refuses that string with
80
+ `MailRefused` at the first send.
81
+
82
+ ### `janusMail: replyTo must be an address, as 'support@example.com' or { name, address }`
83
+
84
+ A `replyTo` given, and not an address. Leave it out to reply to `from`.
85
+
86
+ ### `janusMail: brand must be the name the e-mails show, as 'Acme'`
87
+
88
+ No `brand`, a blank one, or not a string — `{ name: 'Acme' }`, the shape of
89
+ `@nxgt/mail-ui`, included. The brand is the name alone:
90
+
91
+ ```ts
92
+ janusMail({ mailer, from, brand: 'Acme', links });
93
+ ```
94
+
95
+ ### `janusMail: links must be an object, as { verifyEmail, resetPassword, secureAccount }`
96
+
97
+ No `links`. All three are required: the notices link to `secureAccount`.
98
+
99
+ ### `janusMail: links.<name> must be a function`
100
+
101
+ `links.verifyEmail`, `links.resetPassword` or `links.secureAccount` missing,
102
+ or given as a URL. The first two take the one-time token; the third takes
103
+ nothing:
104
+
105
+ ```ts
106
+ links: {
107
+ verifyEmail: (token) => `https://acme.example/verify?token=${encodeURIComponent(token)}`,
108
+ resetPassword: (token) => `https://acme.example/reset?token=${encodeURIComponent(token)}`,
109
+ secureAccount: () => 'https://acme.example/account/security',
110
+ },
111
+ ```
112
+
113
+ ### `janusMail: locales must list at least one locale, as ['en', 'fr']`
114
+
115
+ `locales: []`, `locales: 'en'`, or a list holding something that is not a
116
+ non-empty string. Leave it out for `['en', 'fr']`.
117
+
118
+ ### `janusMail: locales holds the same locale twice`
119
+
120
+ `['en', 'en']`. List each once.
121
+
122
+ ### `janusMail: fallbackLocale must be one of locales`
123
+
124
+ A `fallbackLocale` the list does not hold — `'de'` with the default
125
+ `locales`. It is also a compile error; see
126
+ [`TS2322: Type '"de"'…`](#ts2322-type-de-is-not-assignable-to-type-en--fr).
127
+
128
+ ### `janusMail: templates must be an object of functions, as { verifyEmail: (variables) => rendered }`
129
+
130
+ `templates` given as a list or a function. Key each template by its name.
131
+
132
+ ### `janusMail: templates has no template <name> — name one of verifyEmail, resetPassword, signInCode, passwordChanged, emailChanged`
133
+
134
+ A key that is not one of the five — `welcome`, or the e-mail's file name
135
+ `'verify-email'` rather than the template's, `verifyEmail`. Other e-mails are
136
+ on the [roadmap](roadmap.md); send them with `@nxgt/mail` directly meanwhile.
137
+
138
+ ### `janusMail: templates.<name> must be a function`
139
+
140
+ A template given as a string, a `Rendered`, or `undefined`. A template is a
141
+ function of its variables: `signInCode: ({ code }) => ({ subject, html, text })`.
142
+
143
+ ### `janusMail: templates.<name> is not an own enumerable property — pass a plain object, as { <name>: (variables) => rendered }`
144
+
145
+ `templates` holds the template, but not as an own enumerable property. Two
146
+ causes:
147
+
148
+ - **a method on a prototype** — `templates` is a class instance whose
149
+ templates are methods;
150
+ - **an own property that is not enumerable** — one set with
151
+ `Object.defineProperty` and no `enumerable: true`.
152
+
153
+ Only an object's own enumerable keys are copied over the defaults, so the
154
+ template would be dropped and the default sent in its place: refused
155
+ instead. Pass a plain object, binding the methods if they read `this`:
156
+
157
+ ```ts
158
+ const own = new MyTemplates();
159
+ janusMail({ …, templates: { signInCode: own.signInCode.bind(own) } });
160
+ ```
161
+
162
+ A class whose templates are fields (`signInCode = (variables) => …`) passes
163
+ as it is: fields are own properties.
164
+
165
+ ### `janusMail: the default templates are built in en and fr only — with another locale in locales, pass every template in templates; <names> missing`
166
+
167
+ `locales` holds a locale beyond `en` and `fr`, and `templates` leaves some
168
+ out: the defaults could not render them in that locale. Pass all five — see
169
+ [Adding a locale](guide/locales.md#adding-a-locale) — or drop the locale.
170
+ The message lists the templates missing.
171
+
172
+ ## Sending
173
+
174
+ ### `janusMail.<method>: <field> must be a string`
175
+
176
+ A `TypeError` from a call, naming the method and the field it could not read
177
+ — `janusMail.resetPassword: token must be a string`,
178
+ `janusMail.verifyEmail: name must be a string`,
179
+ `janusMail.emailChanged: formerEmail must be a string`. The usual cause is
180
+ passing what a flow answered without checking it for `null`:
181
+
182
+ ```ts
183
+ const issued = await auth.resetPassword.request(email);
184
+ if (issued !== null) await mail.resetPassword(issued, { name: issued.user.name });
185
+ ```
186
+
187
+ `issued` needs `token` and `email` (`code` and `email` for `signInCode`), and
188
+ the recipient its `name` — a user whose schema has no name passes one
189
+ anyway: `{ name: user.email }`.
190
+
191
+ ### `MAIL_REFUSED` — `render: <email>: link must be an http:, https: or mailto: URL`
192
+
193
+ A `MailRefused` from `@nxgt/mail`'s renderer, before the mailer is called
194
+ (`mailer.attempts` stays 0). A link from `links` is not an absolute URL a
195
+ mail client can follow: `/verify?token=…` (relative), `javascript:…`,
196
+ `data:…`, or a URL holding a quote, a space or a line break. Make every
197
+ `links` function answer an absolute `https://` URL:
198
+
199
+ ```ts
200
+ links: { verifyEmail: (token) => new URL(`/verify?token=${encodeURIComponent(token)}`, 'https://acme.example').href, … }
201
+ ```
202
+
203
+ Sending it again fails again: it is a bug, not an outage.
204
+
205
+ A `mailto:` URL is accepted — `secureAccount: () => 'mailto:security@acme.example'`
206
+ sends a user who did not make the change to your support desk.
207
+
208
+ ### `janusMail.<method>: links.<call> must answer a string`
209
+
210
+ A `TypeError` from a call, before anything is rendered or sent
211
+ (`mailer.attempts` stays 0) — `janusMail.verifyEmail: links.verifyEmail(token)
212
+ must answer a string`, `janusMail.emailChanged: links.secureAccount() must
213
+ answer a string`. The `links` function answered something other than a
214
+ string: a `URL` object, `undefined`, or a promise — an `async` function.
215
+ Answer `url.href`, and compute the link synchronously:
216
+
217
+ ```ts
218
+ const base = new URL('https://acme.example');
219
+ links: {
220
+ verifyEmail: (token) => new URL(`/verify?token=${encodeURIComponent(token)}`, base).href,
221
+ …
222
+ }
223
+ ```
224
+
225
+ A link that needs a lookup — a tenant's domain — is looked up before the
226
+ call, and the `links` function reads what was looked up.
227
+
228
+ In TypeScript, an `async` link or a `URL` object is a compile error, so this
229
+ is only reached from JavaScript, or through a cast.
230
+
231
+ ### `render: <email>: link must be a string or a finite number`
232
+
233
+ A `TypeError` from the renderer, when `janusTemplates()` or
234
+ `mail.templates.*` is called directly with a `link` that is not a string;
235
+ `janusMail()`'s methods check the link first, and throw the entry above
236
+ instead. The renderer's other messages —
237
+ `render: the locale asked for is not one of the build's, en, fr` and
238
+ `render: <email> needs the variable <name>` — come from calling
239
+ `janusTemplates()` or `mail.templates.*` directly with a locale not built or
240
+ a variable left out; `janusMail()`'s methods never do either. See `@nxgt/mail`'s
241
+ [troubleshooting](https://github.com/softistx/nxgt-mail/blob/develop/packages/mail/docs/troubleshooting.md).
242
+
243
+ ### `MAIL_REFUSED` — from the mailer
244
+
245
+ The message was refused by `checkMessage` or the provider: an `issued.email`
246
+ or a `to.email` that is not an address, a `from` written
247
+ `'Acme <noreply@acme.example>'`. The message names the field (`send: to is
248
+ not an e-mail address`) — see `@nxgt/mail`'s
249
+ [troubleshooting](https://github.com/softistx/nxgt-mail/blob/develop/packages/mail/docs/troubleshooting.md).
250
+
251
+ ### `MAIL_FAILED` — `MailFailure`
252
+
253
+ The transport could not hand the e-mail over: a refused connection, a
254
+ timeout, a 5xx. **Nothing is known to have been sent.** The method rejects
255
+ with the mailer's own error — `error === theMailersError` — so its `cause`
256
+ is the transport's. Answer it as an outage, and never as "sent":
257
+
258
+ ```ts
259
+ import { MailError } from '@nxgt/mail';
260
+
261
+ try {
262
+ await mail.signInCode(issued);
263
+ } catch (error) {
264
+ if (error instanceof MailError && error.code === 'MAIL_FAILED') {
265
+ return Response.json({ code: 'MAIL_FAILED' }, { status: 503 }); // or queue a retry
266
+ }
267
+ throw error;
268
+ }
269
+ ```
270
+
271
+ This package retries nothing: a retry is your decision.
272
+
273
+ ### `createMailRenderer: …/mails/mail-manifest.json cannot be read — run maizzle build, and deploy its output folder`
274
+
275
+ A plain `Error`, the first time a default template renders: the package's
276
+ `mails/` folder is missing. The installed package was copied without it — a
277
+ bundler that inlined `@nxgt/janus-mail` into one file, or a deploy that kept
278
+ `dist/` only. Keep `@nxgt/janus-mail` external to your bundle, and deploy
279
+ `node_modules/@nxgt/janus-mail/mails/` with it. Overriding every template
280
+ avoids the read altogether. (In this repository: run `bun run build`.)
281
+
282
+ ### `Could not resolve "node:fs"` on an edge runtime
283
+
284
+ The default templates read `mails/` with `node:fs`, through
285
+ `@nxgt/mail/renderer`: Node, Bun or Deno only. On an edge runtime, pass all
286
+ five templates yourself; an inlined build is on the [roadmap](roadmap.md).
287
+
288
+ ## Compile errors
289
+
290
+ ### `TS2345: Argument of type '(IssuedToken & { user: … }) | null' is not assignable to parameter of type 'IssuedToken'.`
291
+
292
+ `auth.resetPassword.request(email)` answers `null` for an address nobody
293
+ holds. Check it before sending, and answer the visitor the same either way:
294
+
295
+ ```ts
296
+ const issued = await auth.resetPassword.request(email);
297
+ if (issued !== null) await mail.resetPassword(issued, { name: issued.user.name });
298
+ return new Response(null, { status: 202 });
299
+ ```
300
+
301
+ The same holds for `signInCode.request`, whose answer passed unchecked reads
302
+ `Argument of type 'IssuedCode<…> | null' is not assignable to parameter of
303
+ type 'Pick<IssuedCode<unknown>, "email" | "code">'`.
304
+
305
+ ### `TS2739: Type '{ … }' is missing the following properties from type 'JanusMailTemplates<…>'`
306
+
307
+ `locales` holds a locale beyond `en` and `fr`, and `templates` does not give
308
+ all five. See [Adding a locale](guide/locales.md#adding-a-locale).
309
+
310
+ ### `TS2322: Type '"de"' is not assignable to type '"en" | "fr"'.`
311
+
312
+ A `fallbackLocale` outside `locales`. Add it to `locales` — with every
313
+ template, if it is not `en` or `fr` — or pick one of them.
@@ -0,0 +1,42 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" dir="ltr" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="x-apple-disable-message-reformatting">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <meta name="color-scheme" content="light">
8
+ <meta name="supported-color-schemes" content="light">
9
+ </head>
10
+ <body xml:lang="en" dir="ltr" style="margin:0;padding:0;width:100%;height:100%;word-break:break-word;background-color:#f4f4f4;"><div style="display:none;">Your account now signs in with a new address.&#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
11
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
12
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
13
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
14
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
15
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
16
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
17
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &nbsp;</div><span style="display:none">
18
+ <!--[if mso]><xml><o:OfficeDocumentSettings><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings><w:WordDocument><w:DontUseAdvancedTypographyReadingMail/></w:WordDocument></xml>
19
+ <![endif]--></span><div role="article" aria-roledescription="email" lang="en" dir="ltr" style="font-size:medium;font-size:max(16px,1rem)">
20
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;background-color:#f4f4f4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont, 'Segoe UI',Roboto, 'Noto Sans',Ubuntu,Cantarell, 'Helvetica Neue',sans-serif;"><tr><td align="center" style="padding:32px 16px;">
21
+ <!--[if mso]>
22
+ <table role="none" cellpadding="0" cellspacing="0" style="width:600px" align="center"><tr><td>
23
+ <![endif]--><div style="margin:0 auto;max-width:600px;">
24
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;"><tr><td style="padding-bottom:24px;text-align:center;"><span style="font-size:18px;line-height:28px;font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">{{ brand }}</span>
25
+ </td></tr><tr><td style="border-radius:14px;border-color:#e2e8f0;border-style:solid;border-width:1px;border-color:lab(91.7353% -.998765 -4.76968);background-color:#fff;background-color:lab(100% 0 0);padding:32px;font-size:14px;line-height:20px;color:#020618;color:lab(1.76974% 1.32743 -9.28855);box-shadow:0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 1px 3px rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);"><h1 style="margin:0 0 16px;font-size:24px;line-height:32px;
26
+ font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">Your e-mail address was changed</h1><p style="margin:0 0 16px;font-size:14px;line-height:20px;color:#020918;color:lab(2.35721% .367686 -8.51797);">Hello {{ name }},</p><p style="margin:0 0 16px;font-size:14px;line-height:20px;color:#020918;color:lab(2.35721% .367686 -8.51797);">Your {{ brand }} account now uses {{ newEmail }}. We send this notice to your former address.</p>
27
+ <table role="presentation" cellpadding="0" cellspacing="0" style="margin-bottom:16px;width:100%;"><tr><td style="border-width:0;border-left-style:solid;border-left-width:8px;border-style:solid;border-color:#f05100;border-color:lab(57.1026% 64.2584 89.8886);background-color:#fef6f2;padding:16px;">
28
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;"><tr><td style="vertical-align:top;"><p style="margin:0;font-size:14px;line-height:20px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);">If this was not you, secure your account now.</p>
29
+ </td></tr></table>
30
+ </td></tr></table><div><a style="display:inline-block;border-radius:9999px;background-color:#27272a;padding:10px 16px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont, 'Segoe UI',Roboto, 'Noto Sans',Ubuntu,Cantarell, 'Helvetica Neue',sans-serif;font-size:14px;line-height:16px;font-weight:500;color:#f8fafc;color:lab(98.1434% -.369519 -1.05966);text-decoration:none;" href="{{ link }}">
31
+ <!--[if mso]><i style="mso-font-width:114%;mso-text-raise:19px;" hidden>&emsp;</i>
32
+ <![endif]--> <span style="mso-text-raise:10px;">Undo this change</span>
33
+ <!--[if mso]><i style="mso-font-width:114%;" hidden>&emsp;&#8203;</i>
34
+ <![endif]--></a></div><div role="separator" style="line-height:24px;">&zwj;</div><p style="margin:0 0 16px;font-size:12px;line-height:16px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);">If the button does not work, open this link: <a href="{{ link }}" style="color:#54a2ff;color:lab(65.0361% -1.42065 -56.9802);text-decoration:underline;">{{ link }}</a></p>
35
+ </td></tr><tr><td style="padding-left:24px;padding-right:24px;padding-top:24px;text-align:center;font-size:12px;line-height:16px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);"><p style="margin:0 0 8px;">You received this e-mail because you have an account with {{ brand }}.</p><p style="margin:0;">{{ brand }}</p>
36
+ </td></tr></table></div>
37
+ <!--[if mso]>
38
+ </td></tr></table>
39
+ <![endif]-->
40
+ </td></tr></table></div>
41
+ </body>
42
+ </html>
@@ -0,0 +1,21 @@
1
+ Your account now signs in with a new address.
2
+
3
+ {{ brand }}
4
+
5
+ Your e-mail address was changed
6
+
7
+ Hello {{ name }},
8
+
9
+ Your {{ brand }} account now uses {{ newEmail }}. We send this notice to your former address.
10
+
11
+ If this was not you, secure your account now.
12
+
13
+ Undo this change
14
+
15
+ {{ link }}
16
+
17
+ If the button does not work, open this link: {{ link }}
18
+
19
+ You received this e-mail because you have an account with {{ brand }}.
20
+
21
+ {{ brand }}
@@ -0,0 +1,42 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" dir="ltr" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="x-apple-disable-message-reformatting">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <meta name="color-scheme" content="light">
8
+ <meta name="supported-color-schemes" content="light">
9
+ </head>
10
+ <body xml:lang="en" dir="ltr" style="margin:0;padding:0;width:100%;height:100%;word-break:break-word;background-color:#f4f4f4;"><div style="display:none;">The password of your account was just changed.&#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
11
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
12
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
13
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
14
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
15
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
16
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
17
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &nbsp;</div><span style="display:none">
18
+ <!--[if mso]><xml><o:OfficeDocumentSettings><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings><w:WordDocument><w:DontUseAdvancedTypographyReadingMail/></w:WordDocument></xml>
19
+ <![endif]--></span><div role="article" aria-roledescription="email" lang="en" dir="ltr" style="font-size:medium;font-size:max(16px,1rem)">
20
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;background-color:#f4f4f4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont, 'Segoe UI',Roboto, 'Noto Sans',Ubuntu,Cantarell, 'Helvetica Neue',sans-serif;"><tr><td align="center" style="padding:32px 16px;">
21
+ <!--[if mso]>
22
+ <table role="none" cellpadding="0" cellspacing="0" style="width:600px" align="center"><tr><td>
23
+ <![endif]--><div style="margin:0 auto;max-width:600px;">
24
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;"><tr><td style="padding-bottom:24px;text-align:center;"><span style="font-size:18px;line-height:28px;font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">{{ brand }}</span>
25
+ </td></tr><tr><td style="border-radius:14px;border-color:#e2e8f0;border-style:solid;border-width:1px;border-color:lab(91.7353% -.998765 -4.76968);background-color:#fff;background-color:lab(100% 0 0);padding:32px;font-size:14px;line-height:20px;color:#020618;color:lab(1.76974% 1.32743 -9.28855);box-shadow:0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 1px 3px rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);"><h1 style="margin:0 0 16px;font-size:24px;line-height:32px;
26
+ font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">Your password was changed</h1><p style="margin:0 0 16px;font-size:14px;line-height:20px;color:#020918;color:lab(2.35721% .367686 -8.51797);">Hello {{ name }},</p><p style="margin:0 0 16px;font-size:14px;line-height:20px;color:#020918;color:lab(2.35721% .367686 -8.51797);">The password of your {{ brand }} account was just changed.</p>
27
+ <table role="presentation" cellpadding="0" cellspacing="0" style="margin-bottom:16px;width:100%;"><tr><td style="border-width:0;border-left-style:solid;border-left-width:8px;border-style:solid;border-color:#f05100;border-color:lab(57.1026% 64.2584 89.8886);background-color:#fef6f2;padding:16px;">
28
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;"><tr><td style="vertical-align:top;"><p style="margin:0;font-size:14px;line-height:20px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);">If this was not you, secure your account now.</p>
29
+ </td></tr></table>
30
+ </td></tr></table><div><a style="display:inline-block;border-radius:9999px;background-color:#27272a;padding:10px 16px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont, 'Segoe UI',Roboto, 'Noto Sans',Ubuntu,Cantarell, 'Helvetica Neue',sans-serif;font-size:14px;line-height:16px;font-weight:500;color:#f8fafc;color:lab(98.1434% -.369519 -1.05966);text-decoration:none;" href="{{ link }}">
31
+ <!--[if mso]><i style="mso-font-width:114%;mso-text-raise:19px;" hidden>&emsp;</i>
32
+ <![endif]--> <span style="mso-text-raise:10px;">Secure my account</span>
33
+ <!--[if mso]><i style="mso-font-width:114%;" hidden>&emsp;&#8203;</i>
34
+ <![endif]--></a></div><div role="separator" style="line-height:24px;">&zwj;</div><p style="margin:0 0 16px;font-size:12px;line-height:16px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);">If the button does not work, open this link: <a href="{{ link }}" style="color:#54a2ff;color:lab(65.0361% -1.42065 -56.9802);text-decoration:underline;">{{ link }}</a></p>
35
+ </td></tr><tr><td style="padding-left:24px;padding-right:24px;padding-top:24px;text-align:center;font-size:12px;line-height:16px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);"><p style="margin:0 0 8px;">You received this e-mail because you have an account with {{ brand }}.</p><p style="margin:0;">{{ brand }}</p>
36
+ </td></tr></table></div>
37
+ <!--[if mso]>
38
+ </td></tr></table>
39
+ <![endif]-->
40
+ </td></tr></table></div>
41
+ </body>
42
+ </html>
@@ -0,0 +1,21 @@
1
+ The password of your account was just changed.
2
+
3
+ {{ brand }}
4
+
5
+ Your password was changed
6
+
7
+ Hello {{ name }},
8
+
9
+ The password of your {{ brand }} account was just changed.
10
+
11
+ If this was not you, secure your account now.
12
+
13
+ Secure my account
14
+
15
+ {{ link }}
16
+
17
+ If the button does not work, open this link: {{ link }}
18
+
19
+ You received this e-mail because you have an account with {{ brand }}.
20
+
21
+ {{ brand }}
@@ -0,0 +1,40 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" dir="ltr" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="x-apple-disable-message-reformatting">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <meta name="color-scheme" content="light">
8
+ <meta name="supported-color-schemes" content="light">
9
+ </head>
10
+ <body xml:lang="en" dir="ltr" style="margin:0;padding:0;width:100%;height:100%;word-break:break-word;background-color:#f4f4f4;"><div style="display:none;">Choose a new password for your account.&#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
11
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
12
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
13
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
14
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
15
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
16
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
17
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &nbsp;</div><span style="display:none">
18
+ <!--[if mso]><xml><o:OfficeDocumentSettings><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings><w:WordDocument><w:DontUseAdvancedTypographyReadingMail/></w:WordDocument></xml>
19
+ <![endif]--></span><div role="article" aria-roledescription="email" lang="en" dir="ltr" style="font-size:medium;font-size:max(16px,1rem)">
20
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;background-color:#f4f4f4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont, 'Segoe UI',Roboto, 'Noto Sans',Ubuntu,Cantarell, 'Helvetica Neue',sans-serif;"><tr><td align="center" style="padding:32px 16px;">
21
+ <!--[if mso]>
22
+ <table role="none" cellpadding="0" cellspacing="0" style="width:600px" align="center"><tr><td>
23
+ <![endif]--><div style="margin:0 auto;max-width:600px;">
24
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;"><tr><td style="padding-bottom:24px;text-align:center;"><span style="font-size:18px;line-height:28px;font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">{{ brand }}</span>
25
+ </td></tr><tr><td style="border-radius:14px;border-color:#e2e8f0;border-style:solid;border-width:1px;border-color:lab(91.7353% -.998765 -4.76968);background-color:#fff;background-color:lab(100% 0 0);padding:32px;font-size:14px;line-height:20px;color:#020618;color:lab(1.76974% 1.32743 -9.28855);box-shadow:0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 1px 3px rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);"><h1 style="margin:0 0 16px;font-size:24px;line-height:32px;
26
+ font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">Reset your password</h1><p style="margin:0 0 16px;font-size:14px;line-height:20px;color:#020918;color:lab(2.35721% .367686 -8.51797);">Hello {{ name }},</p><p style="margin:0 0 16px;font-size:14px;line-height:20px;color:#020918;color:lab(2.35721% .367686 -8.51797);">Someone asked to reset the password of your {{ brand }} account. Choose a new one with the button below.</p><div><a style="display:inline-block;border-radius:
27
+ 9999px;background-color:#27272a;padding:10px 16px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont, 'Segoe UI',Roboto, 'Noto Sans',Ubuntu,Cantarell, 'Helvetica Neue',sans-serif;font-size:14px;line-height:16px;font-weight:500;color:#f8fafc;color:lab(98.1434% -.369519 -1.05966);text-decoration:none;" href="{{ link }}">
28
+ <!--[if mso]><i style="mso-font-width:114%;mso-text-raise:19px;" hidden>&emsp;</i>
29
+ <![endif]--> <span style="mso-text-raise:10px;">Choose a new password</span>
30
+ <!--[if mso]><i style="mso-font-width:114%;" hidden>&emsp;&#8203;</i>
31
+ <![endif]--></a></div><div role="separator" style="line-height:24px;">&zwj;</div><p style="margin:0 0 16px;font-size:12px;line-height:16px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);">If the button does not work, open this link: <a href="{{ link }}" style="color:#54a2ff;color:lab(65.0361% -1.42065 -56.9802);text-decoration:underline;">{{ link }}</a></p><p style="margin:0 0 16px;font-size:10px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);">If you did not ask for this, you can
32
+ ignore this e-mail.</p>
33
+ </td></tr><tr><td style="padding-left:24px;padding-right:24px;padding-top:24px;text-align:center;font-size:12px;line-height:16px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);"><p style="margin:0 0 8px;">You received this e-mail because you have an account with {{ brand }}.</p><p style="margin:0;">{{ brand }}</p>
34
+ </td></tr></table></div>
35
+ <!--[if mso]>
36
+ </td></tr></table>
37
+ <![endif]-->
38
+ </td></tr></table></div>
39
+ </body>
40
+ </html>
@@ -0,0 +1,22 @@
1
+ Choose a new password for your account.
2
+
3
+ {{ brand }}
4
+
5
+ Reset your password
6
+
7
+ Hello {{ name }},
8
+
9
+ Someone asked to reset the password of your {{ brand }} account. Choose a new one with the button below.
10
+
11
+ Choose a new password
12
+
13
+ {{ link }}
14
+
15
+ If the button does not work, open this link: {{ link }}
16
+
17
+ If you did not ask for this, you can
18
+ ignore this e-mail.
19
+
20
+ You received this e-mail because you have an account with {{ brand }}.
21
+
22
+ {{ brand }}
@@ -0,0 +1,36 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" dir="ltr" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="x-apple-disable-message-reformatting">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <meta name="color-scheme" content="light">
8
+ <meta name="supported-color-schemes" content="light">
9
+ </head>
10
+ <body xml:lang="en" dir="ltr" style="margin:0;padding:0;width:100%;height:100%;word-break:break-word;background-color:#f4f4f4;"><div style="display:none;">Enter this code to sign in.&#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
11
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
12
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
13
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
14
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
15
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
16
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847;
17
+ &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &#8199;&#65279;&#847; &nbsp;</div><span style="display:none">
18
+ <!--[if mso]><xml><o:OfficeDocumentSettings><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings><w:WordDocument><w:DontUseAdvancedTypographyReadingMail/></w:WordDocument></xml>
19
+ <![endif]--></span><div role="article" aria-roledescription="email" lang="en" dir="ltr" style="font-size:medium;font-size:max(16px,1rem)">
20
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;background-color:#f4f4f4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont, 'Segoe UI',Roboto, 'Noto Sans',Ubuntu,Cantarell, 'Helvetica Neue',sans-serif;"><tr><td align="center" style="padding:32px 16px;">
21
+ <!--[if mso]>
22
+ <table role="none" cellpadding="0" cellspacing="0" style="width:600px" align="center"><tr><td>
23
+ <![endif]--><div style="margin:0 auto;max-width:600px;">
24
+ <table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;"><tr><td style="padding-bottom:24px;text-align:center;"><span style="font-size:18px;line-height:28px;font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">{{ brand }}</span>
25
+ </td></tr><tr><td style="border-radius:14px;border-color:#e2e8f0;border-style:solid;border-width:1px;border-color:lab(91.7353% -.998765 -4.76968);background-color:#fff;background-color:lab(100% 0 0);padding:32px;font-size:14px;line-height:20px;color:#020618;color:lab(1.76974% 1.32743 -9.28855);box-shadow:0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 0 rgba(0,0,0,0),0 1px 3px rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);"><h1 style="margin:0 0 16px;font-size:24px;line-height:32px;
26
+ font-weight:600;color:#020918;color:lab(2.35721% .367686 -8.51797);">Your sign-in code</h1><p style="margin:0 0 16px;font-size:14px;line-height:20px;color:#020918;color:lab(2.35721% .367686 -8.51797);">Enter this code to sign in to {{ brand }}. It works once.</p>
27
+ <table role="presentation" cellpadding="0" cellspacing="0" style="margin-bottom:16px;width:100%;"><tr><td style="border-radius:10px;background-color:#f1f5f9;background-color:lab(96.286% -.852436 -2.46847);padding:16px 24px;text-align:center;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:30px;line-height:36px;font-weight:600;letter-spacing:.3em;color:#020918;color:lab(2.35721% .367686 -8.51797);">{{ code }}
28
+ </td></tr></table><p style="margin:0 0 16px;font-size:10px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);">If you did not try to sign in, you can ignore this e-mail: no one can sign in without the code.</p>
29
+ </td></tr><tr><td style="padding-left:24px;padding-right:24px;padding-top:24px;text-align:center;font-size:12px;line-height:16px;color:#62748e;color:lab(48.0876% -2.03595 -16.5814);"><p style="margin:0 0 8px;">You received this e-mail because you have an account with {{ brand }}.</p><p style="margin:0;">{{ brand }}</p>
30
+ </td></tr></table></div>
31
+ <!--[if mso]>
32
+ </td></tr></table>
33
+ <![endif]-->
34
+ </td></tr></table></div>
35
+ </body>
36
+ </html>
@@ -0,0 +1,15 @@
1
+ Enter this code to sign in.
2
+
3
+ {{ brand }}
4
+
5
+ Your sign-in code
6
+
7
+ Enter this code to sign in to {{ brand }}. It works once.
8
+
9
+ {{ code }}
10
+
11
+ If you did not try to sign in, you can ignore this e-mail: no one can sign in without the code.
12
+
13
+ You received this e-mail because you have an account with {{ brand }}.
14
+
15
+ {{ brand }}