emailengine-app 2.61.1 → 2.61.2

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 (136) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/data/google-crawlers.json +1 -1
  3. package/lib/account/account-state.js +248 -0
  4. package/lib/account.js +17 -178
  5. package/lib/api-routes/account-routes.js +1006 -0
  6. package/lib/api-routes/message-routes.js +1377 -0
  7. package/lib/consts.js +12 -2
  8. package/lib/email-client/base-client.js +282 -771
  9. package/lib/email-client/gmail/gmail-api.js +243 -0
  10. package/lib/email-client/gmail-client.js +145 -53
  11. package/lib/email-client/imap/mailbox.js +24 -698
  12. package/lib/email-client/imap/sync-operations.js +812 -0
  13. package/lib/email-client/imap-client.js +1 -1
  14. package/lib/email-client/message-builder.js +566 -0
  15. package/lib/email-client/notification-handler.js +314 -0
  16. package/lib/email-client/outlook/graph-api.js +326 -0
  17. package/lib/email-client/outlook-client.js +159 -113
  18. package/lib/email-client/smtp-pool-manager.js +196 -0
  19. package/lib/imapproxy/imap-server.js +3 -12
  20. package/lib/oauth/gmail.js +4 -4
  21. package/lib/oauth/mail-ru.js +30 -5
  22. package/lib/oauth/outlook.js +57 -3
  23. package/lib/oauth/pubsub/google.js +30 -11
  24. package/lib/oauth/scope-checker.js +202 -0
  25. package/lib/oauth2-apps.js +8 -4
  26. package/lib/redis-operations.js +484 -0
  27. package/lib/routes-ui.js +283 -2582
  28. package/lib/tools.js +4 -196
  29. package/lib/ui-routes/account-routes.js +1931 -0
  30. package/lib/ui-routes/admin-config-routes.js +1233 -0
  31. package/lib/ui-routes/admin-entities-routes.js +2367 -0
  32. package/lib/ui-routes/oauth-routes.js +992 -0
  33. package/lib/utils/network.js +237 -0
  34. package/package.json +9 -9
  35. package/sbom.json +1 -1
  36. package/static/js/app.js +5 -5
  37. package/static/licenses.html +78 -18
  38. package/translations/de.mo +0 -0
  39. package/translations/de.po +85 -82
  40. package/translations/en.mo +0 -0
  41. package/translations/en.po +63 -71
  42. package/translations/et.mo +0 -0
  43. package/translations/et.po +84 -82
  44. package/translations/fr.mo +0 -0
  45. package/translations/fr.po +85 -82
  46. package/translations/ja.mo +0 -0
  47. package/translations/ja.po +84 -82
  48. package/translations/messages.pot +74 -87
  49. package/translations/nl.mo +0 -0
  50. package/translations/nl.po +86 -82
  51. package/translations/pl.mo +0 -0
  52. package/translations/pl.po +84 -82
  53. package/views/account/security.hbs +4 -4
  54. package/views/accounts/account.hbs +13 -13
  55. package/views/accounts/register/imap-server.hbs +12 -12
  56. package/views/config/document-store/pre-processing/index.hbs +4 -2
  57. package/views/config/oauth/app.hbs +6 -7
  58. package/views/config/oauth/index.hbs +2 -2
  59. package/views/config/service.hbs +3 -4
  60. package/views/dashboard.hbs +5 -7
  61. package/views/error.hbs +22 -7
  62. package/views/gateways/gateway.hbs +2 -2
  63. package/views/partials/add_account_modal.hbs +7 -10
  64. package/views/partials/document_store_header.hbs +1 -1
  65. package/views/partials/editor_scope_info.hbs +0 -1
  66. package/views/partials/oauth_config_header.hbs +1 -1
  67. package/views/partials/side_menu.hbs +3 -3
  68. package/views/partials/webhook_form.hbs +2 -2
  69. package/views/templates/index.hbs +1 -1
  70. package/views/templates/template.hbs +8 -8
  71. package/views/tokens/index.hbs +6 -6
  72. package/views/tokens/new.hbs +1 -1
  73. package/views/webhooks/index.hbs +4 -4
  74. package/views/webhooks/webhook.hbs +7 -7
  75. package/workers/api.js +148 -2436
  76. package/workers/smtp.js +2 -1
  77. package/lib/imapproxy/imap-core/test/client.js +0 -46
  78. package/lib/imapproxy/imap-core/test/fixtures/append.eml +0 -1196
  79. package/lib/imapproxy/imap-core/test/fixtures/chunks.js +0 -44
  80. package/lib/imapproxy/imap-core/test/fixtures/fix1.eml +0 -6
  81. package/lib/imapproxy/imap-core/test/fixtures/fix2.eml +0 -599
  82. package/lib/imapproxy/imap-core/test/fixtures/fix3.eml +0 -32
  83. package/lib/imapproxy/imap-core/test/fixtures/fix4.eml +0 -6
  84. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.eml +0 -599
  85. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.js +0 -2740
  86. package/lib/imapproxy/imap-core/test/fixtures/mimetorture.json +0 -1411
  87. package/lib/imapproxy/imap-core/test/fixtures/mimetree.js +0 -85
  88. package/lib/imapproxy/imap-core/test/fixtures/nodemailer.eml +0 -582
  89. package/lib/imapproxy/imap-core/test/fixtures/ryan_finnie_mime_torture.eml +0 -599
  90. package/lib/imapproxy/imap-core/test/fixtures/simple.eml +0 -42
  91. package/lib/imapproxy/imap-core/test/fixtures/simple.json +0 -164
  92. package/lib/imapproxy/imap-core/test/imap-compile-stream-test.js +0 -671
  93. package/lib/imapproxy/imap-core/test/imap-compiler-test.js +0 -272
  94. package/lib/imapproxy/imap-core/test/imap-indexer-test.js +0 -236
  95. package/lib/imapproxy/imap-core/test/imap-parser-test.js +0 -922
  96. package/lib/imapproxy/imap-core/test/memory-notifier.js +0 -129
  97. package/lib/imapproxy/imap-core/test/prepare.sh +0 -74
  98. package/lib/imapproxy/imap-core/test/protocol-test.js +0 -1756
  99. package/lib/imapproxy/imap-core/test/search-test.js +0 -1356
  100. package/lib/imapproxy/imap-core/test/test-client.js +0 -152
  101. package/lib/imapproxy/imap-core/test/test-server.js +0 -623
  102. package/lib/imapproxy/imap-core/test/tools-test.js +0 -22
  103. package/test/api-test.js +0 -899
  104. package/test/autoreply-test.js +0 -327
  105. package/test/bounce-test.js +0 -151
  106. package/test/complaint-test.js +0 -256
  107. package/test/fixtures/autoreply/LICENSE +0 -27
  108. package/test/fixtures/autoreply/rfc3834-01.eml +0 -23
  109. package/test/fixtures/autoreply/rfc3834-02.eml +0 -24
  110. package/test/fixtures/autoreply/rfc3834-03.eml +0 -26
  111. package/test/fixtures/autoreply/rfc3834-04.eml +0 -48
  112. package/test/fixtures/autoreply/rfc3834-05.eml +0 -19
  113. package/test/fixtures/autoreply/rfc3834-06.eml +0 -59
  114. package/test/fixtures/bounces/163.eml +0 -2521
  115. package/test/fixtures/bounces/fastmail.eml +0 -242
  116. package/test/fixtures/bounces/gmail.eml +0 -252
  117. package/test/fixtures/bounces/hotmail.eml +0 -655
  118. package/test/fixtures/bounces/mailru.eml +0 -121
  119. package/test/fixtures/bounces/outlook.eml +0 -1107
  120. package/test/fixtures/bounces/postfix.eml +0 -101
  121. package/test/fixtures/bounces/rambler.eml +0 -116
  122. package/test/fixtures/bounces/workmail.eml +0 -142
  123. package/test/fixtures/bounces/yahoo.eml +0 -139
  124. package/test/fixtures/bounces/zoho.eml +0 -83
  125. package/test/fixtures/bounces/zonemta.eml +0 -100
  126. package/test/fixtures/complaints/LICENSE +0 -27
  127. package/test/fixtures/complaints/amazonses.eml +0 -72
  128. package/test/fixtures/complaints/dmarc.eml +0 -59
  129. package/test/fixtures/complaints/hotmail.eml +0 -49
  130. package/test/fixtures/complaints/optout.eml +0 -40
  131. package/test/fixtures/complaints/standard-arf.eml +0 -68
  132. package/test/fixtures/complaints/yahoo.eml +0 -68
  133. package/test/oauth2-apps-test.js +0 -301
  134. package/test/sendonly-test.js +0 -160
  135. package/test/test-config.js +0 -34
  136. package/test/webhooks-server.js +0 -39
@@ -1,7 +1,7 @@
1
1
  msgid ""
2
2
  msgstr ""
3
3
  "Project-Id-Version: \n"
4
- "POT-Creation-Date: 2025-08-13 10:54+0000\n"
4
+ "POT-Creation-Date: 2025-12-29 11:35+0000\n"
5
5
  "PO-Revision-Date: \n"
6
6
  "Last-Translator: \n"
7
7
  "Language-Team: \n"
@@ -11,7 +11,7 @@ msgstr ""
11
11
  "Content-Transfer-Encoding: 8bit\n"
12
12
  "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 "
13
13
  "|| n%100>14) ? 1 : 2);\n"
14
- "X-Generator: Poedit 3.6\n"
14
+ "X-Generator: Poedit 3.8\n"
15
15
 
16
16
  #: views/config/license.hbs:45
17
17
  msgid "%d day"
@@ -20,6 +20,10 @@ msgstr[0] "%d dzień"
20
20
  msgstr[1] "%d dni"
21
21
  msgstr[2] "%d dni"
22
22
 
23
+ #: views/redirect.hbs:1
24
+ msgid "Click <a href=\"%s\">here</a> to continue&mldr;"
25
+ msgstr "Kliknij <a href=\"%s\">tutaj</a>, aby kontynuować&mldr;"
26
+
23
27
  #: views/unsubscribe.hbs:3 views/unsubscribe.hbs:62 views/unsubscribe.hbs:85
24
28
  msgid "Unsubscribe"
25
29
  msgstr "Wypisz się"
@@ -65,10 +69,6 @@ msgstr "Adres e-mail"
65
69
  msgid "Enter your email address"
66
70
  msgstr "Wprowadź swój adres e-mail"
67
71
 
68
- #: views/redirect.hbs:1
69
- msgid "Click <a href=\"%s\">here</a> to continue&mldr;"
70
- msgstr "Kliknij <a href=\"%s\">tutaj</a>, aby kontynuować&mldr;"
71
-
72
72
  #: views/accounts/register/index.hbs:2
73
73
  msgid "Choose your email account provider"
74
74
  msgstr "Wybierz dostawcę konta e-mail"
@@ -77,6 +77,28 @@ msgstr "Wybierz dostawcę konta e-mail"
77
77
  msgid "Standard IMAP"
78
78
  msgstr "Standardowy IMAP"
79
79
 
80
+ #: views/accounts/register/imap.hbs:11
81
+ msgid "Your name"
82
+ msgstr "Twoje imię"
83
+
84
+ #: views/accounts/register/imap.hbs:17
85
+ msgid "Enter your full name"
86
+ msgstr "Wpisz swoje imię i nazwisko"
87
+
88
+ #: views/accounts/register/imap.hbs:31
89
+ #: views/accounts/register/imap-server.hbs:36
90
+ #: views/accounts/register/imap-server.hbs:128
91
+ msgid "Password"
92
+ msgstr "Hasło"
93
+
94
+ #: views/accounts/register/imap.hbs:37
95
+ msgid "Enter your account password"
96
+ msgstr "Wprowadź hasło do konta"
97
+
98
+ #: views/accounts/register/imap.hbs:51
99
+ msgid "Continue"
100
+ msgstr "Kontynuuj"
101
+
80
102
  #: views/accounts/register/imap-server.hbs:19
81
103
  msgid "IMAP"
82
104
  msgstr "IMAP"
@@ -86,12 +108,6 @@ msgstr "IMAP"
86
108
  msgid "Username"
87
109
  msgstr "Nazwa użytkownika"
88
110
 
89
- #: views/accounts/register/imap-server.hbs:36
90
- #: views/accounts/register/imap-server.hbs:128
91
- #: views/accounts/register/imap.hbs:31
92
- msgid "Password"
93
- msgstr "Hasło"
94
-
95
111
  #: views/accounts/register/imap-server.hbs:45
96
112
  #: views/accounts/register/imap-server.hbs:136
97
113
  msgid "Important"
@@ -160,75 +176,59 @@ msgstr ""
160
176
  "szyfrowania opartego na STARTTLS."
161
177
 
162
178
  #: views/accounts/register/imap-server.hbs:209
163
- msgid "Test settings"
164
- msgstr "Sprawdź ustawienia"
179
+ msgid "Verify connection"
180
+ msgstr "Zweryfikuj polaczenie"
165
181
 
166
182
  #: views/accounts/register/imap-server.hbs:218
167
- #: views/accounts/register/imap.hbs:51
168
- msgid "Continue"
169
- msgstr "Kontynuuj"
183
+ msgid "Save and continue"
184
+ msgstr "Zapisz i kontynuuj"
170
185
 
171
186
  #: views/accounts/register/imap-server.hbs:226
172
- msgid "Continue without testing"
173
- msgstr "Kontynuuj bez testowania"
187
+ msgid "Skip verification"
188
+ msgstr "Pomin weryfikacje"
174
189
 
175
190
  #: views/accounts/register/imap-server.hbs:241
176
- msgid "Test failed"
177
- msgstr "Test nie powiódł się"
191
+ msgid "Connection test failed"
192
+ msgstr "Test polaczenia nie powiodl sie"
178
193
 
179
194
  #: views/accounts/register/imap-server.hbs:247
180
- msgid "Failed to validate provided email server settings."
181
- msgstr "Nie udało się zweryfikować podanych ustawień serwera poczty e-mail."
195
+ msgid "We couldn't connect with these settings. Check the errors below."
196
+ msgstr "Nie udalo sie polaczyc z tymi ustawieniami. Sprawdz bledy ponizej."
182
197
 
183
198
  #: views/accounts/register/imap-server.hbs:318
184
- msgid "General Error"
185
- msgstr "Błąd ogólny"
199
+ msgid "Error"
200
+ msgstr "Blad"
186
201
 
187
202
  #: views/accounts/register/imap-server.hbs:320
188
- msgid "Validation Error"
189
- msgstr "Błąd walidacji"
203
+ msgid "Invalid settings"
204
+ msgstr "Nieprawidlowe ustawienia"
190
205
 
191
206
  #: views/accounts/register/imap-server.hbs:326
192
- msgid "Failed to validate IMAP server settings"
193
- msgstr "Nie udało się zweryfikować ustawień serwera IMAP"
207
+ msgid "Couldn't connect to IMAP server"
208
+ msgstr "Nie udalo sie polaczyc z serwerem IMAP"
194
209
 
195
210
  #: views/accounts/register/imap-server.hbs:328
196
- msgid "IMAP Server responded with the following message:"
197
- msgstr "Serwer IMAP odpowiedział następującym komunikatem:"
211
+ #: views/accounts/register/imap-server.hbs:337
212
+ msgid "Server response:"
213
+ msgstr "Odpowiedz serwera:"
198
214
 
199
215
  #: views/accounts/register/imap-server.hbs:335
200
- msgid "Failed to validate SMTP server settings"
201
- msgstr "Nie udało się zweryfikować ustawień serwera SMTP"
202
-
203
- #: views/accounts/register/imap-server.hbs:337
204
- msgid "SMTP Server responded with the following message:"
205
- msgstr "Serwer SMTP odpowiedział następującym komunikatem:"
216
+ msgid "Couldn't connect to SMTP server"
217
+ msgstr "Nie udalo sie polaczyc z serwerem SMTP"
206
218
 
207
219
  #: views/accounts/register/imap-server.hbs:395
208
- msgid "HTTP error!"
209
- msgstr "Błąd HTTP!"
210
-
211
- #: views/accounts/register/imap.hbs:11
212
- msgid "Your name"
213
- msgstr "Twoje imię"
220
+ msgid "Request failed."
221
+ msgstr "Zadanie nie powiodlo sie."
214
222
 
215
- #: views/accounts/register/imap.hbs:17
216
- msgid "Enter your full name"
217
- msgstr "Wpisz swoje imię i nazwisko"
218
-
219
- #: views/accounts/register/imap.hbs:37
220
- msgid "Enter your account password"
221
- msgstr "Wprowadź hasło do konta"
222
-
223
- #: lib/routes-ui.js:529
223
+ #: lib/routes-ui.js:532
224
224
  msgid "Delegated"
225
225
  msgstr "Delegowany"
226
226
 
227
- #: lib/routes-ui.js:530
227
+ #: lib/routes-ui.js:533
228
228
  msgid "Using credentials from \"%s\""
229
229
  msgstr "Używanie poświadczeń z \"%s\""
230
230
 
231
- #: lib/routes-ui.js:580
231
+ #: lib/routes-ui.js:583
232
232
  msgid ""
233
233
  "Connection timed out. This usually occurs if you are behind a firewall or "
234
234
  "connecting to the wrong port."
@@ -236,11 +236,11 @@ msgstr ""
236
236
  "Przekroczono limit czasu połączenia. Zwykle dzieje się tak, gdy użytkownik "
237
237
  "znajduje się za zaporą sieciową lub łączy się z niewłaściwym portem."
238
238
 
239
- #: lib/routes-ui.js:583
239
+ #: lib/routes-ui.js:586
240
240
  msgid "The server unexpectedly closed the connection."
241
241
  msgstr "Serwer nieoczekiwanie zamknął połączenie."
242
242
 
243
- #: lib/routes-ui.js:586
243
+ #: lib/routes-ui.js:589
244
244
  msgid ""
245
245
  "The server unexpectedly closed the connection. This usually happens when "
246
246
  "attempting to connect to a TLS port without TLS enabled."
@@ -248,7 +248,7 @@ msgstr ""
248
248
  "Serwer nieoczekiwanie zamknął połączenie. Zwykle dzieje się tak podczas "
249
249
  "próby połączenia z portem TLS bez włączonego protokołu TLS."
250
250
 
251
- #: lib/routes-ui.js:591
251
+ #: lib/routes-ui.js:594
252
252
  msgid ""
253
253
  "The server refused the connection. This typically occurs if the server is "
254
254
  "not running, is overloaded, or you are connecting to the wrong host or port."
@@ -256,62 +256,54 @@ msgstr ""
256
256
  "Serwer odmówił połączenia. Zwykle dzieje się tak, gdy serwer nie działa, "
257
257
  "jest przeciążony lub łączysz się z niewłaściwym hostem lub portem."
258
258
 
259
- #: lib/routes-ui.js:709
259
+ #: lib/routes-ui.js:712
260
260
  msgid "Invalid API key for OpenAI"
261
261
  msgstr "Nieprawidłowy klucz API dla OpenAI"
262
262
 
263
- #: lib/routes-ui.js:5006 lib/routes-ui.js:6958 lib/routes-ui.js:6969
263
+ #: lib/routes-ui.js:5031 lib/routes-ui.js:6986 lib/routes-ui.js:6997
264
264
  msgid "Server hostname was not found"
265
265
  msgstr "Nie znaleziono nazwy hosta serwera"
266
266
 
267
- #: lib/routes-ui.js:5009 lib/routes-ui.js:6961 lib/routes-ui.js:6972
267
+ #: lib/routes-ui.js:5034 lib/routes-ui.js:6989 lib/routes-ui.js:7000
268
268
  msgid "Invalid username or password"
269
269
  msgstr "Nieprawidłowa nazwa użytkownika lub hasło"
270
270
 
271
- #: lib/routes-ui.js:5013 lib/routes-ui.js:6976
271
+ #: lib/routes-ui.js:5038 lib/routes-ui.js:7004
272
272
  msgid "TLS protocol error"
273
273
  msgstr "Błąd protokołu TLS"
274
274
 
275
- #: lib/routes-ui.js:6705 lib/routes-ui.js:6740 lib/routes-ui.js:6855
276
- #: lib/routes-ui.js:6902 lib/routes-ui.js:7131 lib/routes-ui.js:7167
277
- #: workers/api.js:2346
275
+ #: lib/routes-ui.js:6733 lib/routes-ui.js:6768 lib/routes-ui.js:6883
276
+ #: lib/routes-ui.js:6930 lib/routes-ui.js:7159 lib/routes-ui.js:7195
277
+ #: workers/api.js:2407
278
278
  msgid "Email Account Setup"
279
279
  msgstr "Konfiguracja konta e-mail"
280
280
 
281
- #: lib/routes-ui.js:6765 lib/routes-ui.js:6798 lib/routes-ui.js:9717
282
- msgid "Failed to validate request arguments"
283
- msgstr "Nie udało się zweryfikować argumentów żądania"
284
-
285
- #: lib/routes-ui.js:6895 lib/routes-ui.js:7160
286
- msgid "Failed to process account"
287
- msgstr "Nie udało się przetworzyć konta"
281
+ #: lib/routes-ui.js:6793 lib/routes-ui.js:6826 lib/routes-ui.js:9745
282
+ msgid "Invalid request. Check your input and try again."
283
+ msgstr "Nie udało się zweryfikować argumentów żądania."
288
284
 
289
- #: lib/routes-ui.js:9680 lib/tools.js:795
285
+ #: lib/routes-ui.js:9708 lib/tools.js:794
290
286
  msgid "Invalid input"
291
287
  msgstr "Nieprawidłowe dane wejściowe"
292
288
 
293
- #: lib/routes-ui.js:9690 lib/routes-ui.js:9808 lib/routes-ui.js:9825
294
- #: lib/routes-ui.js:9861
289
+ #: lib/routes-ui.js:9718 lib/routes-ui.js:9836 lib/routes-ui.js:9853
290
+ #: lib/routes-ui.js:9889
295
291
  msgid "Subscription Management"
296
292
  msgstr "Zarządzanie subskrypcjami"
297
293
 
298
- #: lib/routes-ui.js:9819 lib/routes-ui.js:9854
299
- msgid "Failed to process request"
300
- msgstr "Nie udało się przetworzyć żądania"
301
-
302
- #: workers/api.js:8996 workers/api.js:9112
294
+ #: workers/api.js:9113 workers/api.js:9229
303
295
  msgid "Requested page not found"
304
296
  msgstr "Nie znaleziono żądanej strony"
305
297
 
306
- #: workers/api.js:8997
298
+ #: workers/api.js:9114
307
299
  msgid "Something went wrong"
308
300
  msgstr "Ups... Coś poszlo nie tak"
309
301
 
310
- #: lib/tools.js:1494
302
+ #: lib/tools.js:1493
311
303
  msgid "Signature validation failed"
312
304
  msgstr "Walidacja podpisu nie powiodła się"
313
305
 
314
- #: lib/tools.js:1503 lib/tools.js:1508
306
+ #: lib/tools.js:1502 lib/tools.js:1507
315
307
  msgid "Invalid or expired account setup URL"
316
308
  msgstr "Nieprawidłowy lub wygasły adres URL konfiguracji konta"
317
309
 
@@ -326,3 +318,13 @@ msgstr ""
326
318
  "aplikacji) dla kont e-mail w usługach Outlook.com, Hotmail.com i Microsoft "
327
319
  "365. Aby kontynuować, użyj przycisku \"Zaloguj się za pomocą Microsoft\", "
328
320
  "aby bezpiecznie połączyć swoje konto."
321
+
322
+ #, fuzzy
323
+ #~| msgid "Failed to process account"
324
+ #~ msgid "Couldn't set up account. Try again."
325
+ #~ msgstr "Nie udało się przetworzyć konta"
326
+
327
+ #, fuzzy
328
+ #~| msgid "Failed to process request"
329
+ #~ msgid "Couldn't process request. Try again."
330
+ #~ msgstr "Nie udało się przetworzyć żądania"
@@ -113,8 +113,8 @@
113
113
  <form method="post" action="/admin/account/tfa/disable">
114
114
  <input type="hidden" name="crumb" value="{{crumb}}" />
115
115
  <input type="hidden" name="type" value="totp" />
116
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
117
- <button type="submit" class="btn btn-danger">Yes, Disable 2FA</button>
116
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
117
+ <button type="submit" class="btn btn-danger">Disable 2FA</button>
118
118
  </form>
119
119
  </div>
120
120
  </div>
@@ -151,7 +151,7 @@
151
151
 
152
152
  <input type="hidden" name="crumb" value="{{crumb}}" />
153
153
  <input type="hidden" name="type" value="totp" />
154
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
154
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
155
155
  <button type="submit" class="btn btn-primary">Enable 2FA</button>
156
156
  </div>
157
157
  </div>
@@ -177,7 +177,7 @@
177
177
  <div class="modal-footer">
178
178
 
179
179
  <input type="hidden" name="crumb" value="{{crumb}}" />
180
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
180
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
181
181
  <button type="submit" class="btn btn-primary"><i
182
182
  class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i> Sign Out Everywhere</button>
183
183
  </div>
@@ -15,12 +15,12 @@
15
15
 
16
16
  <a type="button" class="btn btn-light" href="/admin/accounts/{{account.account}}/edit"
17
17
  title="Edit account configuration" data-toggle="tooltip" data-placement="top">
18
- <i class="fas fa-user-edit fa-fw"></i> Edit
18
+ <i class="fas fa-user-edit fa-fw"></i> Edit account
19
19
  </a>
20
20
 
21
21
  <button type="button" class="btn btn-light" data-toggle="modal" data-target="#deleteModal"
22
22
  title="Delete this account and all associated data" id="delete-btn" data-placement="top">
23
- <i class="fas fa-trash-alt fa-fw"></i> Delete
23
+ <i class="fas fa-trash-alt fa-fw"></i> Delete account
24
24
  </button>
25
25
 
26
26
  <button type="button" class="btn btn-light" id="request-reconnect"
@@ -87,7 +87,7 @@
87
87
  {{#if canReadMail}}
88
88
  <a type="button" class="btn btn-light" href="/admin/accounts/{{account.account}}/browse"
89
89
  title="Browse messages" data-toggle="tooltip" data-placement="top">
90
- <i class="fas fa-folder-open fa-fw"></i> Browse
90
+ <i class="fas fa-folder-open fa-fw"></i> Browse messages
91
91
  </a>
92
92
  {{/if}}
93
93
  </div>
@@ -98,7 +98,7 @@
98
98
  title="Re-authenticate OAuth2 account" id="renew-grant-btn" data-placement="top">
99
99
  {{#if account.type.icon}}
100
100
  <i class="{{account.type.icon}} fa-fw"></i>
101
- {{/if}} Renew grant
101
+ {{/if}} Re-authenticate
102
102
  </button>
103
103
  </div>
104
104
  {{/if}}
@@ -181,7 +181,7 @@
181
181
  <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
182
182
  <a class="dropdown-item" href="#" id="toggle-logs">{{#if
183
183
  account.logs}}Disable{{else}}Enable{{/if}}</a>
184
- <a class="dropdown-item" href="#" id="flush-logs">Flush stored logs</a>
184
+ <a class="dropdown-item" href="#" id="flush-logs">Clear stored logs</a>
185
185
  </div>
186
186
  </div>
187
187
 
@@ -787,7 +787,7 @@
787
787
  <div class="modal-dialog">
788
788
  <div class="modal-content">
789
789
  <div class="modal-header">
790
- <h5 class="modal-title" id="renewGrantLabel">Renew grant</h5>
790
+ <h5 class="modal-title" id="renewGrantLabel">Re-authenticate account</h5>
791
791
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
792
792
  <span aria-hidden="true">&times;</span>
793
793
  </button>
@@ -805,11 +805,11 @@
805
805
  <input type="hidden" name="type" value="{{account.oauth2.provider}}">
806
806
  <input type="hidden" name="data" value="{{accountForm.data}}">
807
807
  <input type="hidden" name="sig" value="{{accountForm.signature}}">
808
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
808
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
809
809
  <button type="submit" class="btn btn-primary">
810
810
  {{#if account.type.icon}}
811
811
  <i class="{{account.type.icon}} fa-fw"></i>
812
- {{/if}} Renew grant
812
+ {{/if}} Re-authenticate
813
813
  </button>
814
814
  </form>
815
815
  </div>
@@ -821,20 +821,20 @@
821
821
  <div class="modal-dialog">
822
822
  <div class="modal-content">
823
823
  <div class="modal-header">
824
- <h5 class="modal-title" id="deleteModalLabel">Delete account</h5>
824
+ <h5 class="modal-title" id="deleteModalLabel">Delete Account</h5>
825
825
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
826
826
  <span aria-hidden="true">&times;</span>
827
827
  </button>
828
828
  </div>
829
829
  <div class="modal-body">
830
- <p>Are you sure you want to delete the account for {{account.name}}? This action is not
831
- recoverable.</p>
830
+ <p>Are you sure you want to delete the account for {{account.name}}? This action cannot be
831
+ undone.</p>
832
832
  </div>
833
833
  <div class="modal-footer">
834
834
  <form method="post" action="/admin/accounts/{{account.account}}/delete">
835
835
  <input type="hidden" name="crumb" value="{{crumb}}" />
836
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
837
- <button type="submit" class="btn btn-danger">Delete</button>
836
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
837
+ <button type="submit" class="btn btn-danger">Delete account</button>
838
838
  </form>
839
839
  </div>
840
840
  </div>
@@ -206,7 +206,7 @@
206
206
  <span class="icon text-white-50">
207
207
  <i class="fas fa-question-circle"></i>
208
208
  </span>
209
- <span class="text">{{_ "Test settings" templateLocale }}</span>
209
+ <span class="text">{{_ "Verify connection" templateLocale }}</span>
210
210
  </button>
211
211
 
212
212
  <div class="btn-group">
@@ -215,7 +215,7 @@
215
215
  <span class="icon text-white-50">
216
216
  <i class="fas fa-arrow-right"></i>
217
217
  </span>
218
- <span class="text">{{_ "Continue" templateLocale }}</span>
218
+ <span class="text">{{_ "Save and continue" templateLocale }}</span>
219
219
  </button>
220
220
  <button type="button" id="submit-settings-btn-down"
221
221
  class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"
@@ -223,7 +223,7 @@
223
223
  <span class="sr-only">Toggle Dropdown</span>
224
224
  </button>
225
225
  <div class="dropdown-menu">
226
- <a class="dropdown-item" href="#" id="submit-wo-testing">{{_ "Continue without testing"
226
+ <a class="dropdown-item" href="#" id="submit-wo-testing">{{_ "Skip verification"
227
227
  templateLocale }}</a>
228
228
  </div>
229
229
  </div>
@@ -238,13 +238,13 @@
238
238
  <div class="modal-dialog modal-lg">
239
239
  <div class="modal-content">
240
240
  <div class="modal-header">
241
- <h5 class="modal-title" id="testResponseModalLabel">{{_ "Test failed" templateLocale }}</h5>
241
+ <h5 class="modal-title" id="testResponseModalLabel">{{_ "Connection test failed" templateLocale }}</h5>
242
242
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
243
243
  <span aria-hidden="true">&times;</span>
244
244
  </button>
245
245
  </div>
246
246
  <div class="modal-body">
247
- <p>{{_ "Failed to validate provided email server settings." templateLocale}}</p>
247
+ <p>{{_ "We couldn't connect with these settings. Check the errors below." templateLocale}}</p>
248
248
  <dl class="row" id="test-errors-list"></dl>
249
249
  </div>
250
250
  <div class="modal-footer">
@@ -315,26 +315,26 @@
315
315
  errorsListElm.innerHTML = '';
316
316
 
317
317
  if (data.error && !data.fields) {
318
- addErrorRow('{{_ "General Error" templateLocale }}', data.error.message || data.error)
318
+ addErrorRow('{{_ "Error" templateLocale }}', data.error.message || data.error)
319
319
  } else if (data.fields) {
320
- addErrorRow('{{_ "Validation Error" templateLocale }}', data.message);
320
+ addErrorRow('{{_ "Invalid settings" templateLocale }}', data.message);
321
321
  for (let field of data.fields) {
322
322
  addErrorRow('-', field.message, 'aaaa', 'bbbbbb');
323
323
  }
324
324
  } else {
325
325
  if (!data.imap || !data.imap.success) {
326
- let error = data.imap && data.imap.error || '{{_ "Failed to validate IMAP server settings" templateLocale }}'
326
+ let error = data.imap && data.imap.error || '{{_ "Couldn't connect to IMAP server" templateLocale }}'
327
327
  if (data.imap && data.imap.responseText) {
328
- addErrorRow('IMAP', error, '{{_ "IMAP Server responded with the following message:" templateLocale }}', data.imap.responseText);
328
+ addErrorRow('IMAP', error, '{{_ "Server response:" templateLocale }}', data.imap.responseText);
329
329
  } else {
330
330
  addErrorRow('IMAP', error);
331
331
  }
332
332
  }
333
333
 
334
334
  if (!data.smtp || !data.smtp.success) {
335
- let error = data.smtp && data.smtp.error || '{{_ "Failed to validate SMTP server settings" templateLocale }}'
335
+ let error = data.smtp && data.smtp.error || '{{_ "Couldn't connect to SMTP server" templateLocale }}'
336
336
  if (data.smtp && data.smtp.responseText) {
337
- addErrorRow('SMTP', error, '{{_ "SMTP Server responded with the following message:" templateLocale }}', data.smtp.responseText);
337
+ addErrorRow('SMTP', error, '{{_ "Server response:" templateLocale }}', data.smtp.responseText);
338
338
  } else {
339
339
  addErrorRow('SMTP', error);
340
340
  }
@@ -392,7 +392,7 @@
392
392
  console.error(err)
393
393
  }
394
394
 
395
- throw new Error(`{{_ "HTTP error!" templateLocale}} status: ${res.status}`);
395
+ throw new Error(`{{_ "Request failed." templateLocale}} status: ${res.status}`);
396
396
  }
397
397
 
398
398
  const data = await res.json();
@@ -52,7 +52,8 @@
52
52
  <div style="line-height: 1; margin-bottom: 10px;">
53
53
  <small>JavaScript code to determine if the email should be stored. If the code evaluates to
54
54
  <code>true</code> then the email is synced to the document store, otherwise it is skipped. The
55
- script includes <code>payload</code> as a global variable that contains the email data.</small>
55
+ script includes <code>payload</code> as a global variable that contains the email data.
56
+ Use <code>env</code> to access <a href="/admin/config/service#scriptEnv">script variables</a>.</small>
56
57
  </div>
57
58
  <div id="editor-fn" class="code-editor"></div>
58
59
  <div class="editor-embed-block">
@@ -89,7 +90,8 @@
89
90
  <div style="line-height: 1; margin-bottom: 10px;">
90
91
  <small>JavaScript code to modify email payload structure. Protected fields <code>id</code>,
91
92
  <code>account</code>, <code>path</code>, <code>uid</code>, <code>specialUse</code>, and
92
- <code>messageId</code> can not be modified.</small>
93
+ <code>messageId</code> cannot be modified.
94
+ Use <code>env</code> to access <a href="/admin/config/service#scriptEnv">script variables</a>.</small>
93
95
  </div>
94
96
 
95
97
  <div class="row">
@@ -30,12 +30,12 @@
30
30
 
31
31
  <a type="button" class="btn btn-light" href="/admin/config/oauth/edit/{{app.id}}"
32
32
  title="Edit OAuth2 application" data-toggle="tooltip" data-placement="top">
33
- <i class="fas fa-user-edit fa-fw"></i> Edit
33
+ <i class="fas fa-user-edit fa-fw"></i> Edit app
34
34
  </a>
35
35
 
36
36
  <button type="button" class="btn btn-light" data-toggle="modal" data-target="#deleteModal"
37
37
  title="Delete this application" id="delete-btn" data-placement="top">
38
- <i class="fas fa-trash-alt fa-fw"></i> Delete
38
+ <i class="fas fa-trash-alt fa-fw"></i> Delete app
39
39
  </button>
40
40
 
41
41
  </div>
@@ -280,21 +280,20 @@
280
280
  <div class="modal-dialog">
281
281
  <div class="modal-content">
282
282
  <div class="modal-header">
283
- <h5 class="modal-title" id="deleteModalLabel">Delete application</h5>
283
+ <h5 class="modal-title" id="deleteModalLabel">Delete OAuth2 App</h5>
284
284
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
285
285
  <span aria-hidden="true">&times;</span>
286
286
  </button>
287
287
  </div>
288
288
  <div class="modal-body">
289
- <p>Are you sure you want to delete the OAuth2 application "{{app.name}}"? This action is not
290
- recoverable.</p>
289
+ <p>Are you sure you want to delete the OAuth2 application "{{app.name}}"? This action cannot be undone.</p>
291
290
  </div>
292
291
  <div class="modal-footer">
293
292
  <form method="post" action="/admin/config/oauth/delete" class="pending-form">
294
293
  <input type="hidden" name="crumb" value="{{crumb}}" />
295
294
  <input type="hidden" name="app" value="{{app.id}}" />
296
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
297
- <button type="submit" class="btn btn-danger"><i class="fas fa-trash-alt"></i> Delete</button>
295
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
296
+ <button type="submit" class="btn btn-danger"><i class="fas fa-trash-alt"></i> Delete app</button>
298
297
  </form>
299
298
  </div>
300
299
  </div>
@@ -1,7 +1,7 @@
1
1
  <div class="float-right">
2
2
  <div class="btn-group">
3
3
  <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
4
- <i class="fas fa-plus fa-fw" id="test-smtp-icon"></i> Create new
4
+ <i class="fas fa-plus fa-fw" id="test-smtp-icon"></i> Create OAuth2 app
5
5
  </button>
6
6
  <div class="dropdown-menu">
7
7
  <a class="dropdown-item" href="{{newLink}}?provider=gmail">Gmail</a>
@@ -135,7 +135,7 @@
135
135
  {{#if firstPage}}
136
136
  No OAuth2 apps have been registered yet.
137
137
  {{else}}
138
- Nothing to show here.
138
+ No OAuth2 apps found.
139
139
  {{/if}}
140
140
  </p>
141
141
  </div>
@@ -445,12 +445,12 @@
445
445
 
446
446
  <p>Global settings for filter and map functions in <a href="/admin/webhooks">webhook routes</a>.</p>
447
447
 
448
- <div class="form-group">
448
+ <div class="form-group" id="scriptEnv">
449
449
 
450
450
  <div class="text-muted float-right code-link">[<a href="/admin/swagger#/Settings/postV1Settings"
451
451
  target="_blank" rel="noopener noreferrer">scriptEnv</a>]</div>
452
452
 
453
- <label>Environment Variables (JSON)</label>
453
+ <label>Script Variables (JSON)</label>
454
454
 
455
455
  <input type="hidden" class="{{#if errors.scriptEnv}}is-invalid{{/if}}" id="scriptEnvElement"
456
456
  name="scriptEnv" value="{{values.scriptEnv}}">
@@ -469,8 +469,7 @@
469
469
  <span class="invalid-feedback">{{errors.scriptEnv}}</span>
470
470
  {{/if}}
471
471
 
472
- <small class="form-text text-muted">JSON object available as <code>env</code> variable in all webhook
473
- scripts.</small>
472
+ <small class="form-text text-muted">JSON object available as <code>env</code> variable in all filter and map functions. Use for shared secrets like API keys, access tokens, or configuration values. For example, if set to <code>{"token":"secret123"}</code>, then <code>env.token</code> in your scripts returns <code>"secret123"</code>.</small>
474
473
  </div>
475
474
 
476
475
  </div>
@@ -52,14 +52,12 @@
52
52
  <div class="col mr-2">
53
53
  <div class="text-xs font-weight-bold text-success text-uppercase mb-1">Welcome to EmailEngine!
54
54
  </div>
55
- <p>To start using EmailEngine, add an email account to the <a href="/admin/accounts">account
56
- registry</a>. Once registered, you can access this account to send
57
- and receive emails using the <a href="/admin/swagger">EmailEngine API</a>.
55
+ <p>Get started by connecting your first email account. Once connected, you can send
56
+ and receive emails through the <a href="/admin/swagger">API</a>.
58
57
  </p>
59
- <p>You can add email accounts by using the API endpoint for <a
58
+ <p class="text-muted small">You can also add accounts programmatically via the <a
60
59
  href="https://api.emailengine.app/#operation/postV1Account" target="_blank"
61
- rel="noopener noreferrer" referrerpolicy="no-referrer">registering
62
- accounts</a> or through the hosted authentication form.
60
+ rel="noopener noreferrer" referrerpolicy="no-referrer">API endpoint</a>.
63
61
  </p>
64
62
  <div>
65
63
  <button type="button" class="btn btn-primary btn-icon-split" data-toggle="modal"
@@ -67,7 +65,7 @@
67
65
  <span class="icon text-white-50">
68
66
  <i class="fas fa-user-plus"></i>
69
67
  </span>
70
- <span class="text">Add an account</span>
68
+ <span class="text">Connect your first account</span>
71
69
  </button>
72
70
  </div>
73
71
  </div>