@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.
- package/LICENSE +21 -0
- package/README.md +262 -0
- package/dist/generated/locales.d.ts +5 -0
- package/dist/generated/locales.d.ts.map +1 -0
- package/dist/generated/mail.d.ts +29 -0
- package/dist/generated/mail.d.ts.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +234 -0
- package/dist/index.js.map +14 -0
- package/dist/janus-mail.d.ts +24 -0
- package/dist/janus-mail.d.ts.map +1 -0
- package/dist/mails.d.ts +26 -0
- package/dist/mails.d.ts.map +1 -0
- package/dist/options.d.ts +27 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/templates.d.ts +15 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/types.d.ts +145 -0
- package/dist/types.d.ts.map +1 -0
- package/docs/README.md +34 -0
- package/docs/guide/building.md +130 -0
- package/docs/guide/locales.md +113 -0
- package/docs/guide/sending.md +242 -0
- package/docs/guide/templates.md +183 -0
- package/docs/roadmap.md +52 -0
- package/docs/troubleshooting.md +313 -0
- package/mails/en/email-changed.html +42 -0
- package/mails/en/email-changed.txt +21 -0
- package/mails/en/password-changed.html +42 -0
- package/mails/en/password-changed.txt +21 -0
- package/mails/en/reset-password.html +40 -0
- package/mails/en/reset-password.txt +22 -0
- package/mails/en/sign-in-code.html +36 -0
- package/mails/en/sign-in-code.txt +15 -0
- package/mails/en/verify-email.html +40 -0
- package/mails/en/verify-email.txt +22 -0
- package/mails/fr/email-changed.html +42 -0
- package/mails/fr/email-changed.txt +21 -0
- package/mails/fr/password-changed.html +41 -0
- package/mails/fr/password-changed.txt +21 -0
- package/mails/fr/reset-password.html +39 -0
- package/mails/fr/reset-password.txt +22 -0
- package/mails/fr/sign-in-code.html +36 -0
- package/mails/fr/sign-in-code.txt +15 -0
- package/mails/fr/verify-email.html +40 -0
- package/mails/fr/verify-email.txt +22 -0
- package/mails/mail-manifest.json +128 -0
- 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. ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
11
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
12
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
13
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
14
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
15
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
16
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
17
|
+
 ͏  ͏  ͏ </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> </i>
|
|
32
|
+
<![endif]--> <span style="mso-text-raise:10px;">Undo this change</span>
|
|
33
|
+
<!--[if mso]><i style="mso-font-width:114%;" hidden> ​</i>
|
|
34
|
+
<![endif]--></a></div><div role="separator" style="line-height:24px;">‍</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. ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
11
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
12
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
13
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
14
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
15
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
16
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
17
|
+
 ͏  ͏ </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> </i>
|
|
32
|
+
<![endif]--> <span style="mso-text-raise:10px;">Secure my account</span>
|
|
33
|
+
<!--[if mso]><i style="mso-font-width:114%;" hidden> ​</i>
|
|
34
|
+
<![endif]--></a></div><div role="separator" style="line-height:24px;">‍</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. ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
11
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
12
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
13
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
14
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
15
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
16
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
17
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏ </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> </i>
|
|
29
|
+
<![endif]--> <span style="mso-text-raise:10px;">Choose a new password</span>
|
|
30
|
+
<!--[if mso]><i style="mso-font-width:114%;" hidden> ​</i>
|
|
31
|
+
<![endif]--></a></div><div role="separator" style="line-height:24px;">‍</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. ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
11
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
12
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
13
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
14
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
15
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
16
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏
|
|
17
|
+
 ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏  ͏ </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 }}
|