emailengine-app 2.68.1 → 2.69.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 (68) hide show
  1. package/.github/workflows/deploy.yml +2 -0
  2. package/.github/workflows/release.yaml +4 -0
  3. package/CHANGELOG.md +40 -0
  4. package/config/default.toml +2 -0
  5. package/data/google-crawlers.json +7 -1
  6. package/lib/account.js +62 -25
  7. package/lib/api-routes/account-routes.js +493 -75
  8. package/lib/api-routes/blocklist-routes.js +337 -0
  9. package/lib/api-routes/delivery-test-routes.js +321 -0
  10. package/lib/api-routes/export-routes.js +1 -12
  11. package/lib/api-routes/gateway-routes.js +376 -0
  12. package/lib/api-routes/license-routes.js +142 -0
  13. package/lib/api-routes/mailbox-routes.js +318 -0
  14. package/lib/api-routes/message-routes.js +21 -129
  15. package/lib/api-routes/oauth2-app-routes.js +631 -0
  16. package/lib/api-routes/outbox-routes.js +173 -0
  17. package/lib/api-routes/pubsub-routes.js +98 -0
  18. package/lib/api-routes/route-helpers.js +45 -0
  19. package/lib/api-routes/settings-routes.js +331 -0
  20. package/lib/api-routes/stats-routes.js +77 -0
  21. package/lib/api-routes/submit-routes.js +472 -0
  22. package/lib/api-routes/template-routes.js +7 -55
  23. package/lib/api-routes/token-routes.js +297 -0
  24. package/lib/api-routes/webhook-route-routes.js +152 -0
  25. package/lib/email-client/gmail-client.js +14 -0
  26. package/lib/email-client/imap/mailbox.js +34 -11
  27. package/lib/email-client/imap/subconnection.js +20 -12
  28. package/lib/email-client/imap/sync-operations.js +130 -2
  29. package/lib/email-client/imap-client.js +116 -58
  30. package/lib/email-client/outlook-client.js +85 -13
  31. package/lib/export.js +60 -19
  32. package/lib/imapproxy/imap-core/lib/commands/starttls.js +18 -0
  33. package/lib/imapproxy/imap-core/lib/imap-command.js +6 -1
  34. package/lib/imapproxy/imap-core/lib/imap-connection.js +106 -23
  35. package/lib/imapproxy/imap-core/lib/imap-server.js +24 -0
  36. package/lib/imapproxy/imap-core/lib/imap-stream.js +26 -0
  37. package/lib/message-port-stream.js +113 -16
  38. package/lib/reject-worker-calls.js +42 -0
  39. package/lib/routes-ui.js +37 -8778
  40. package/lib/schemas.js +26 -1
  41. package/lib/tools.js +68 -0
  42. package/lib/ui-routes/account-routes.js +40 -210
  43. package/lib/ui-routes/admin-config-routes.js +913 -487
  44. package/lib/ui-routes/admin-entities-routes.js +1 -0
  45. package/lib/ui-routes/auth-routes.js +1339 -0
  46. package/lib/ui-routes/dashboard-routes.js +188 -0
  47. package/lib/ui-routes/document-store-routes.js +800 -0
  48. package/lib/ui-routes/export-routes.js +217 -0
  49. package/lib/ui-routes/internals-routes.js +354 -0
  50. package/lib/ui-routes/network-config-routes.js +759 -0
  51. package/lib/ui-routes/{oauth-routes.js → oauth-config-routes.js} +371 -91
  52. package/lib/ui-routes/route-helpers.js +316 -0
  53. package/lib/ui-routes/smtp-test-routes.js +236 -0
  54. package/lib/ui-routes/unsubscribe-routes.js +234 -0
  55. package/lib/webhook-request.js +36 -0
  56. package/package.json +8 -8
  57. package/sbom.json +1 -1
  58. package/server.js +214 -16
  59. package/static/licenses.html +12 -12
  60. package/translations/messages.pot +129 -149
  61. package/views/dashboard.hbs +7 -26
  62. package/views/internals/index.hbs +15 -0
  63. package/views/tokens/index.hbs +9 -0
  64. package/workers/api.js +198 -4401
  65. package/workers/export.js +87 -54
  66. package/workers/imap.js +29 -13
  67. package/workers/submit.js +20 -11
  68. package/workers/webhooks.js +6 -20
@@ -1,10 +1,10 @@
1
1
  msgid ""
2
2
  msgstr ""
3
3
  "Content-Type: text/plain; charset=ascii\n"
4
- "POT-Creation-Date: 2026-06-01 09:16+0000\n"
4
+ "POT-Creation-Date: 2026-06-09 18:01+0000\n"
5
5
 
6
6
  #: views/error.hbs:4
7
- #: workers/api.js:7192
7
+ #: workers/api.js:2959
8
8
  msgid "Something went wrong"
9
9
  msgstr ""
10
10
 
@@ -21,7 +21,7 @@ msgid "Dashboard"
21
21
  msgstr ""
22
22
 
23
23
  #: views/config/license.hbs:45
24
- #: lib/routes-ui.js:2509
24
+ #: lib/ui-routes/oauth-config-routes.js:219
25
25
  msgid "%d day"
26
26
  msgid_plural "%d days"
27
27
  msgstr[0] ""
@@ -55,6 +55,46 @@ msgstr ""
55
55
  msgid "Try Again"
56
56
  msgstr ""
57
57
 
58
+ #: views/accounts/register/imap.hbs:11
59
+ msgid "Your name"
60
+ msgstr ""
61
+
62
+ #: views/accounts/register/imap.hbs:17
63
+ msgid "Enter your full name"
64
+ msgstr ""
65
+
66
+ #: views/accounts/register/imap.hbs:21
67
+ #: views/unsubscribe.hbs:75
68
+ msgid "Email address"
69
+ msgstr ""
70
+
71
+ #: views/accounts/register/imap.hbs:27
72
+ #: views/unsubscribe.hbs:81
73
+ msgid "Enter your email address"
74
+ msgstr ""
75
+
76
+ #: views/accounts/register/imap.hbs:31
77
+ #: views/accounts/register/imap-server.hbs:36
78
+ #: views/accounts/register/imap-server.hbs:128
79
+ msgid "Password"
80
+ msgstr ""
81
+
82
+ #: views/accounts/register/imap.hbs:37
83
+ msgid "Enter your account password"
84
+ msgstr ""
85
+
86
+ #: views/accounts/register/imap.hbs:51
87
+ msgid "Continue"
88
+ msgstr ""
89
+
90
+ #: views/accounts/register/index.hbs:2
91
+ msgid "Choose your email account provider"
92
+ msgstr ""
93
+
94
+ #: views/accounts/register/index.hbs:15
95
+ msgid "Standard IMAP"
96
+ msgstr ""
97
+
58
98
  #: views/unsubscribe.hbs:3
59
99
  #: views/unsubscribe.hbs:62
60
100
  #: views/unsubscribe.hbs:85
@@ -94,46 +134,6 @@ msgstr ""
94
134
  msgid "Your email address <em>%s</em> was re-subscribed."
95
135
  msgstr ""
96
136
 
97
- #: views/unsubscribe.hbs:75
98
- #: views/accounts/register/imap.hbs:21
99
- msgid "Email address"
100
- msgstr ""
101
-
102
- #: views/unsubscribe.hbs:81
103
- #: views/accounts/register/imap.hbs:27
104
- msgid "Enter your email address"
105
- msgstr ""
106
-
107
- #: views/accounts/register/imap.hbs:11
108
- msgid "Your name"
109
- msgstr ""
110
-
111
- #: views/accounts/register/imap.hbs:17
112
- msgid "Enter your full name"
113
- msgstr ""
114
-
115
- #: views/accounts/register/imap.hbs:31
116
- #: views/accounts/register/imap-server.hbs:36
117
- #: views/accounts/register/imap-server.hbs:128
118
- msgid "Password"
119
- msgstr ""
120
-
121
- #: views/accounts/register/imap.hbs:37
122
- msgid "Enter your account password"
123
- msgstr ""
124
-
125
- #: views/accounts/register/imap.hbs:51
126
- msgid "Continue"
127
- msgstr ""
128
-
129
- #: views/accounts/register/index.hbs:2
130
- msgid "Choose your email account provider"
131
- msgstr ""
132
-
133
- #: views/accounts/register/index.hbs:15
134
- msgid "Standard IMAP"
135
- msgstr ""
136
-
137
137
  #: views/accounts/register/imap-server.hbs:19
138
138
  msgid "IMAP"
139
139
  msgstr ""
@@ -249,169 +249,149 @@ msgstr ""
249
249
  msgid "Request failed."
250
250
  msgstr ""
251
251
 
252
- #: lib/routes-ui.js:385
253
- #: lib/ui-routes/account-routes.js:60
254
- msgid "Delegated"
252
+ #: workers/api.js:2178
253
+ #: workers/api.js:2506
254
+ #: lib/ui-routes/account-routes.js:399
255
+ #: lib/ui-routes/account-routes.js:434
256
+ #: lib/ui-routes/account-routes.js:549
257
+ #: lib/ui-routes/account-routes.js:596
258
+ #: lib/ui-routes/account-routes.js:843
259
+ #: lib/ui-routes/account-routes.js:879
260
+ msgid "Email Account Setup"
255
261
  msgstr ""
256
262
 
257
- #: lib/routes-ui.js:386
258
- #: lib/ui-routes/account-routes.js:61
259
- msgid "Using credentials from \"%s\""
263
+ #: workers/api.js:2958
264
+ #: workers/api.js:3075
265
+ msgid "Requested page not found"
260
266
  msgstr ""
261
267
 
262
- #: lib/routes-ui.js:436
263
- #: lib/ui-routes/account-routes.js:111
264
- msgid ""
265
- "Connection timed out. This usually occurs if you are behind a firewall or "
266
- "connecting to the wrong port."
268
+ #: lib/tools.js:958
269
+ #: lib/ui-routes/unsubscribe-routes.js:30
270
+ msgid "Invalid input"
267
271
  msgstr ""
268
272
 
269
- #: lib/routes-ui.js:439
270
- #: lib/ui-routes/account-routes.js:114
271
- msgid "The server unexpectedly closed the connection."
273
+ #: lib/tools.js:1725
274
+ msgid "Signature validation failed"
272
275
  msgstr ""
273
276
 
274
- #: lib/routes-ui.js:442
275
- #: lib/ui-routes/account-routes.js:117
276
- msgid ""
277
- "The server unexpectedly closed the connection. This usually happens when "
278
- "attempting to connect to a TLS port without TLS enabled."
277
+ #: lib/tools.js:1734
278
+ #: lib/tools.js:1739
279
+ msgid "Invalid or expired account setup URL"
279
280
  msgstr ""
280
281
 
281
- #: lib/routes-ui.js:447
282
- #: lib/ui-routes/account-routes.js:122
282
+ #: lib/autodetect-imap-settings.js:80
283
283
  msgid ""
284
- "The server refused the connection. This typically occurs if the server is "
285
- "not running, is overloaded, or you are connecting to the wrong host or port."
286
- msgstr ""
287
-
288
- #: lib/routes-ui.js:574
289
- msgid "Invalid API key for OpenAI"
290
- msgstr ""
291
-
292
- #: lib/routes-ui.js:2502
293
- msgid "Unknown"
294
- msgstr ""
295
-
296
- #: lib/routes-ui.js:2511
297
- msgid "Indefinite"
298
- msgstr ""
299
-
300
- #: lib/routes-ui.js:5285
301
- #: lib/routes-ui.js:5320
302
- #: lib/routes-ui.js:5435
303
- #: lib/routes-ui.js:5482
304
- #: lib/routes-ui.js:5729
305
- #: lib/routes-ui.js:5765
306
- #: workers/api.js:2280
307
- #: workers/api.js:2608
308
- #: lib/ui-routes/account-routes.js:554
309
- #: lib/ui-routes/account-routes.js:590
310
- #: lib/ui-routes/account-routes.js:707
311
- #: lib/ui-routes/account-routes.js:754
312
- #: lib/ui-routes/account-routes.js:1003
313
- #: lib/ui-routes/account-routes.js:1039
314
- msgid "Email Account Setup"
315
- msgstr ""
316
-
317
- #: lib/routes-ui.js:5345
318
- #: lib/routes-ui.js:5378
319
- #: lib/routes-ui.js:8338
320
- #: lib/ui-routes/account-routes.js:615
321
- #: lib/ui-routes/account-routes.js:649
322
- msgid "Invalid request. Check your input and try again."
284
+ "Microsoft has disabled password-based sign-ins (including app passwords) "
285
+ "for Outlook.com, Hotmail.com, and Microsoft 365 email accounts. To "
286
+ "continue, please use the \"Sign in with Microsoft\" button to securely "
287
+ "connect your account."
323
288
  msgstr ""
324
289
 
325
- #: lib/routes-ui.js:5538
326
- #: lib/routes-ui.js:5549
327
- #: lib/ui-routes/account-routes.js:811
328
- #: lib/ui-routes/account-routes.js:822
329
290
  #: lib/ui-routes/admin-entities-routes.js:2020
291
+ #: lib/ui-routes/account-routes.js:652
292
+ #: lib/ui-routes/account-routes.js:663
330
293
  msgid "Server hostname was not found"
331
294
  msgstr ""
332
295
 
333
- #: lib/routes-ui.js:5541
334
- #: lib/routes-ui.js:5552
335
- #: lib/ui-routes/account-routes.js:814
336
- #: lib/ui-routes/account-routes.js:825
337
296
  #: lib/ui-routes/admin-entities-routes.js:2023
297
+ #: lib/ui-routes/account-routes.js:655
298
+ #: lib/ui-routes/account-routes.js:666
338
299
  msgid "Invalid username or password"
339
300
  msgstr ""
340
301
 
341
- #: lib/routes-ui.js:5555
342
- #: lib/ui-routes/account-routes.js:828
343
302
  #: lib/ui-routes/admin-entities-routes.js:2026
303
+ #: lib/ui-routes/account-routes.js:669
344
304
  msgid "Authentication credentials were not provided"
345
305
  msgstr ""
346
306
 
347
- #: lib/routes-ui.js:5558
348
- #: lib/ui-routes/account-routes.js:831
349
307
  #: lib/ui-routes/admin-entities-routes.js:2029
308
+ #: lib/ui-routes/account-routes.js:672
350
309
  msgid "OAuth2 authentication failed"
351
310
  msgstr ""
352
311
 
353
- #: lib/routes-ui.js:5561
354
- #: lib/routes-ui.js:5565
355
- #: lib/ui-routes/account-routes.js:834
356
- #: lib/ui-routes/account-routes.js:838
357
312
  #: lib/ui-routes/admin-entities-routes.js:2032
358
313
  #: lib/ui-routes/admin-entities-routes.js:2036
314
+ #: lib/ui-routes/account-routes.js:675
315
+ #: lib/ui-routes/account-routes.js:679
359
316
  msgid "TLS protocol error"
360
317
  msgstr ""
361
318
 
362
- #: lib/routes-ui.js:5569
363
- #: lib/ui-routes/account-routes.js:842
364
319
  #: lib/ui-routes/admin-entities-routes.js:2040
320
+ #: lib/ui-routes/account-routes.js:683
365
321
  msgid "Connection timed out"
366
322
  msgstr ""
367
323
 
368
- #: lib/routes-ui.js:5572
369
- #: lib/ui-routes/account-routes.js:845
370
324
  #: lib/ui-routes/admin-entities-routes.js:2043
325
+ #: lib/ui-routes/account-routes.js:686
371
326
  msgid "Could not connect to server"
372
327
  msgstr ""
373
328
 
374
- #: lib/routes-ui.js:5575
375
- #: lib/ui-routes/account-routes.js:848
376
329
  #: lib/ui-routes/admin-entities-routes.js:2046
330
+ #: lib/ui-routes/account-routes.js:689
377
331
  msgid "Unexpected server response"
378
332
  msgstr ""
379
333
 
380
- #: lib/routes-ui.js:8301
381
- #: lib/tools.js:950
382
- msgid "Invalid input"
334
+ #: lib/ui-routes/account-routes.js:459
335
+ #: lib/ui-routes/account-routes.js:492
336
+ #: lib/ui-routes/unsubscribe-routes.js:67
337
+ msgid "Invalid request. Check your input and try again."
383
338
  msgstr ""
384
339
 
385
- #: lib/routes-ui.js:8311
386
- #: lib/routes-ui.js:8429
387
- #: lib/routes-ui.js:8446
388
- #: lib/routes-ui.js:8482
389
- msgid "Subscription Management"
340
+ #: lib/ui-routes/account-routes.js:589
341
+ #: lib/ui-routes/account-routes.js:872
342
+ msgid "Couldn't set up account. Try again."
390
343
  msgstr ""
391
344
 
392
- #: workers/api.js:7191
393
- #: workers/api.js:7308
394
- msgid "Requested page not found"
345
+ #: lib/ui-routes/oauth-config-routes.js:212
346
+ msgid "Unknown"
395
347
  msgstr ""
396
348
 
397
- #: lib/tools.js:1653
398
- msgid "Signature validation failed"
349
+ #: lib/ui-routes/oauth-config-routes.js:221
350
+ msgid "Indefinite"
399
351
  msgstr ""
400
352
 
401
- #: lib/tools.js:1662
402
- #: lib/tools.js:1667
403
- msgid "Invalid or expired account setup URL"
353
+ #: lib/ui-routes/admin-config-routes.js:144
354
+ msgid "Invalid API key for OpenAI"
404
355
  msgstr ""
405
356
 
406
- #: lib/autodetect-imap-settings.js:80
357
+ #: lib/ui-routes/route-helpers.js:83
358
+ msgid "Delegated"
359
+ msgstr ""
360
+
361
+ #: lib/ui-routes/route-helpers.js:84
362
+ msgid "Using credentials from \"%s\""
363
+ msgstr ""
364
+
365
+ #: lib/ui-routes/route-helpers.js:134
407
366
  msgid ""
408
- "Microsoft has disabled password-based sign-ins (including app passwords) "
409
- "for Outlook.com, Hotmail.com, and Microsoft 365 email accounts. To "
410
- "continue, please use the \"Sign in with Microsoft\" button to securely "
411
- "connect your account."
367
+ "Connection timed out. This usually occurs if you are behind a firewall or "
368
+ "connecting to the wrong port."
412
369
  msgstr ""
413
370
 
414
- #: lib/ui-routes/account-routes.js:747
415
- #: lib/ui-routes/account-routes.js:1032
416
- msgid "Couldn't set up account. Try again."
371
+ #: lib/ui-routes/route-helpers.js:137
372
+ msgid "The server unexpectedly closed the connection."
373
+ msgstr ""
374
+
375
+ #: lib/ui-routes/route-helpers.js:140
376
+ msgid ""
377
+ "The server unexpectedly closed the connection. This usually happens when "
378
+ "attempting to connect to a TLS port without TLS enabled."
379
+ msgstr ""
380
+
381
+ #: lib/ui-routes/route-helpers.js:145
382
+ msgid ""
383
+ "The server refused the connection. This typically occurs if the server is "
384
+ "not running, is overloaded, or you are connecting to the wrong host or port."
385
+ msgstr ""
386
+
387
+ #: lib/ui-routes/unsubscribe-routes.js:40
388
+ #: lib/ui-routes/unsubscribe-routes.js:158
389
+ #: lib/ui-routes/unsubscribe-routes.js:175
390
+ #: lib/ui-routes/unsubscribe-routes.js:211
391
+ msgid "Subscription Management"
392
+ msgstr ""
393
+
394
+ #: lib/ui-routes/unsubscribe-routes.js:169
395
+ #: lib/ui-routes/unsubscribe-routes.js:204
396
+ msgid "Couldn't process request. Try again."
417
397
  msgstr ""
@@ -5,16 +5,16 @@
5
5
  </div>
6
6
 
7
7
 
8
- {{#if isElastiCache}}
9
- <div class="card border-left-danger mt-4">
8
+ {{#each redisWarnings}}
9
+ <div class="card border-left-{{color}} mt-4">
10
10
  <div class="card-body">
11
11
  <div class="row no-gutters align-items-center">
12
12
  <div class="col mr-2">
13
- <div class="text-xs font-weight-bold text-danger text-uppercase mb-1">Compatibility warning
13
+ <div class="text-xs font-weight-bold text-{{color}} text-uppercase mb-1">{{title}}
14
14
  </div>
15
- <p>EmailEngine is incompatible with Amazon ElastiCache as the database backend.</p>
16
- <p>Please switch to a standard Redis instance. Using ElastiCache with EmailEngine can result in data
17
- loss and some features may not work correctly.</p>
15
+ {{#each details}}
16
+ <p>{{this}}</p>
17
+ {{/each}}
18
18
  </div>
19
19
  <div class="col-auto">
20
20
  <i class="fas fa-exclamation-circle fa-2x text-gray-300"></i>
@@ -22,26 +22,7 @@
22
22
  </div>
23
23
  </div>
24
24
  </div>
25
- {{/if}}
26
-
27
-
28
- {{#if isRedisCluster}}
29
- <div class="card border-left-danger mt-4">
30
- <div class="card-body">
31
- <div class="row no-gutters align-items-center">
32
- <div class="col mr-2">
33
- <div class="text-xs font-weight-bold text-danger text-uppercase mb-1">Compatibility warning
34
- </div>
35
- <p>EmailEngine is incompatible with Redis Cluster setup.</p>
36
- <p>Please switch to a standard Redis primary instance.</p>
37
- </div>
38
- <div class="col-auto">
39
- <i class="fas fa-exclamation-circle fa-2x text-gray-300"></i>
40
- </div>
41
- </div>
42
- </div>
43
- </div>
44
- {{/if}}
25
+ {{/each}}
45
26
 
46
27
 
47
28
  {{#unless hasAccounts}}
@@ -5,6 +5,21 @@
5
5
  </h1>
6
6
  </div>
7
7
 
8
+ {{#if apiWorkerWarning}}
9
+ <div class="alert alert-warning mt-4" role="alert">
10
+ <i class="fas fa-exclamation-triangle"></i>
11
+ <strong>Multiple API workers are not active.</strong>
12
+ {{#equals apiWorkerWarning.reason "port"}}
13
+ <code>EENGINE_WORKERS_API</code> is set to {{apiWorkerWarning.requested}}, but EmailEngine could not verify
14
+ <code>SO_REUSEPORT</code> support because the API port was unavailable while probing at startup, so only a single
15
+ API worker was started. This is usually a transient conflict and may clear on the next restart.
16
+ {{else}}
17
+ <code>EENGINE_WORKERS_API</code> is set to {{apiWorkerWarning.requested}}, but this platform does not support
18
+ <code>SO_REUSEPORT</code> (requires Linux with Node.js 23.1 or newer), so only a single API worker was started.
19
+ {{/equals}}
20
+ </div>
21
+ {{/if}}
22
+
8
23
  <div class="card mb-4 mt-4">
9
24
 
10
25
  <div class="table-responsive">
@@ -34,6 +34,9 @@
34
34
  <th class="p-0">
35
35
  <div class="p-2">Scopes</div>
36
36
  </th>
37
+ <th class="p-0">
38
+ <div class="p-2">Token ID</div>
39
+ </th>
37
40
  <th class="p-0">
38
41
  <div class="p-2">Last used</div>
39
42
  </th>
@@ -56,6 +59,12 @@
56
59
  {{/if}}
57
60
  </td>
58
61
 
62
+ <td class="p-2">
63
+ {{#if idShort}}
64
+ <code data-toggle="tooltip" data-placement="top" title="{{id}}" style="cursor: help;">{{idShort}}</code>
65
+ {{/if}}
66
+ </td>
67
+
59
68
  <td class="p-2">
60
69
  {{#if access.timeStr}}
61
70
  <span class="relative-time" data-time="{{access.timeStr}}"></span>