@nocobase/app-plugin-mail 1.0.0-beta.12 → 1.0.0-beta.14

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 (112) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +33 -0
  3. package/dist/client/components/ui/field.d.ts +7 -0
  4. package/dist/client/components/ui/field.d.ts.map +1 -0
  5. package/dist/client/components/ui/field.js +20 -0
  6. package/dist/client/components/ui/field.js.map +1 -0
  7. package/dist/client/hooks/use-mail-workspace-data.d.ts +3 -1
  8. package/dist/client/hooks/use-mail-workspace-data.d.ts.map +1 -1
  9. package/dist/client/hooks/use-mail-workspace-data.js +14 -2
  10. package/dist/client/hooks/use-mail-workspace-data.js.map +1 -1
  11. package/dist/client/locales/en-US.d.ts +3 -0
  12. package/dist/client/locales/en-US.d.ts.map +1 -1
  13. package/dist/client/locales/en-US.js +3 -0
  14. package/dist/client/locales/en-US.js.map +1 -1
  15. package/dist/client/locales/zh-CN.d.ts.map +1 -1
  16. package/dist/client/locales/zh-CN.js +3 -0
  17. package/dist/client/locales/zh-CN.js.map +1 -1
  18. package/dist/client/mail-client.d.ts +5 -1
  19. package/dist/client/mail-client.d.ts.map +1 -1
  20. package/dist/client/mail-client.js.map +1 -1
  21. package/dist/client/pages/mail-workspace-page.d.ts.map +1 -1
  22. package/dist/client/pages/mail-workspace-page.js +39 -10
  23. package/dist/client/pages/mail-workspace-page.js.map +1 -1
  24. package/dist/database/migrations/.manifest.json +10 -2
  25. package/dist/database/migrations/202609030001_create_mail_tables.d.ts.map +1 -1
  26. package/dist/database/migrations/202609030001_create_mail_tables.js +8 -4
  27. package/dist/database/migrations/202609030001_create_mail_tables.js.map +1 -1
  28. package/dist/database/migrations/202610090001_mail_create_message_participants.d.ts +4 -0
  29. package/dist/database/migrations/202610090001_mail_create_message_participants.d.ts.map +1 -0
  30. package/dist/database/migrations/202610090001_mail_create_message_participants.js +167 -0
  31. package/dist/database/migrations/202610090001_mail_create_message_participants.js.map +1 -0
  32. package/dist/database/migrations/202610250001_mail_imap_message_locations.d.ts +4 -0
  33. package/dist/database/migrations/202610250001_mail_imap_message_locations.d.ts.map +1 -0
  34. package/dist/database/migrations/202610250001_mail_imap_message_locations.js +297 -0
  35. package/dist/database/migrations/202610250001_mail_imap_message_locations.js.map +1 -0
  36. package/dist/server/adapters/imap-smtp/adapter.d.ts +60 -3
  37. package/dist/server/adapters/imap-smtp/adapter.d.ts.map +1 -1
  38. package/dist/server/adapters/imap-smtp/adapter.js +774 -83
  39. package/dist/server/adapters/imap-smtp/adapter.js.map +1 -1
  40. package/dist/server/adapters/imap-smtp/constants.d.ts +6 -0
  41. package/dist/server/adapters/imap-smtp/constants.d.ts.map +1 -1
  42. package/dist/server/adapters/imap-smtp/constants.js +6 -0
  43. package/dist/server/adapters/imap-smtp/constants.js.map +1 -1
  44. package/dist/server/adapters/imap-smtp/content.d.ts +11 -0
  45. package/dist/server/adapters/imap-smtp/content.d.ts.map +1 -1
  46. package/dist/server/adapters/imap-smtp/content.js +82 -3
  47. package/dist/server/adapters/imap-smtp/content.js.map +1 -1
  48. package/dist/server/adapters/imap-smtp/definition.d.ts +7 -0
  49. package/dist/server/adapters/imap-smtp/definition.d.ts.map +1 -1
  50. package/dist/server/adapters/imap-smtp/definition.js +19 -11
  51. package/dist/server/adapters/imap-smtp/definition.js.map +1 -1
  52. package/dist/server/adapters/imap-smtp/locators.d.ts +7 -0
  53. package/dist/server/adapters/imap-smtp/locators.d.ts.map +1 -1
  54. package/dist/server/adapters/imap-smtp/locators.js +53 -3
  55. package/dist/server/adapters/imap-smtp/locators.js.map +1 -1
  56. package/dist/server/adapters/imap-smtp/types.d.ts +87 -0
  57. package/dist/server/adapters/imap-smtp/types.d.ts.map +1 -1
  58. package/dist/server/operations/message-mutations.d.ts.map +1 -1
  59. package/dist/server/operations/message-mutations.js +57 -5
  60. package/dist/server/operations/message-mutations.js.map +1 -1
  61. package/dist/server/operations/sync-mailbox.d.ts.map +1 -1
  62. package/dist/server/operations/sync-mailbox.js +26 -10
  63. package/dist/server/operations/sync-mailbox.js.map +1 -1
  64. package/dist/server/providers/mail-builtins.d.ts.map +1 -1
  65. package/dist/server/providers/mail-builtins.js +6 -2
  66. package/dist/server/providers/mail-builtins.js.map +1 -1
  67. package/dist/server/routes/api.d.ts.map +1 -1
  68. package/dist/server/routes/api.js +3 -1
  69. package/dist/server/routes/api.js.map +1 -1
  70. package/dist/server/routes/schemas.d.ts +2 -0
  71. package/dist/server/routes/schemas.d.ts.map +1 -1
  72. package/dist/server/routes/schemas.js +13 -0
  73. package/dist/server/routes/schemas.js.map +1 -1
  74. package/dist/server/store/account-removals.d.ts.map +1 -1
  75. package/dist/server/store/account-removals.js +6 -0
  76. package/dist/server/store/account-removals.js.map +1 -1
  77. package/dist/server/store/attachments.d.ts.map +1 -1
  78. package/dist/server/store/attachments.js +3 -0
  79. package/dist/server/store/attachments.js.map +1 -1
  80. package/dist/server/store/draft-states.d.ts.map +1 -1
  81. package/dist/server/store/draft-states.js +2 -0
  82. package/dist/server/store/draft-states.js.map +1 -1
  83. package/dist/server/store/message-participants.d.ts +25 -0
  84. package/dist/server/store/message-participants.d.ts.map +1 -0
  85. package/dist/server/store/message-participants.js +109 -0
  86. package/dist/server/store/message-participants.js.map +1 -0
  87. package/dist/server/store/message-writes.d.ts +24 -1
  88. package/dist/server/store/message-writes.d.ts.map +1 -1
  89. package/dist/server/store/message-writes.js +360 -1
  90. package/dist/server/store/message-writes.js.map +1 -1
  91. package/dist/server/store/messages.d.ts.map +1 -1
  92. package/dist/server/store/messages.js +26 -3
  93. package/dist/server/store/messages.js.map +1 -1
  94. package/dist/server/store/rows.d.ts +20 -0
  95. package/dist/server/store/rows.d.ts.map +1 -1
  96. package/dist/server/store/sync.d.ts +7 -1
  97. package/dist/server/store/sync.d.ts.map +1 -1
  98. package/dist/server/store/sync.js +333 -7
  99. package/dist/server/store/sync.js.map +1 -1
  100. package/dist/shared/mail.d.ts +2 -0
  101. package/dist/shared/mail.d.ts.map +1 -1
  102. package/dist/shared/mail.js.map +1 -1
  103. package/dist/shared/participant.d.ts +14 -0
  104. package/dist/shared/participant.d.ts.map +1 -0
  105. package/dist/shared/participant.js +45 -0
  106. package/dist/shared/participant.js.map +1 -0
  107. package/package.json +12 -11
  108. package/skills/nocobase-app-plugin-mail/SKILL.md +9 -7
  109. package/skills/nocobase-app-plugin-mail/references/client-integration.md +19 -1
  110. package/skills/nocobase-app-plugin-mail/references/http-api.md +32 -24
  111. package/skills/nocobase-app-plugin-mail/references/public-api.md +2 -0
  112. package/skills/nocobase-app-plugin-mail/references/synchronization-and-diagnostics.md +14 -0
@@ -0,0 +1,167 @@
1
+ import { defineMigration, } from '@nocobase/db';
2
+ // These rules belong to this historical migration, not the live address parser.
3
+ function normalizeAddress(value) {
4
+ if (typeof value !== 'string')
5
+ return undefined;
6
+ if (/[^\u0021-\u007e]/.test(value.trim()))
7
+ return undefined;
8
+ const address = value.trim().toLowerCase();
9
+ if (address.length > 320)
10
+ return undefined;
11
+ const at = address.indexOf('@');
12
+ if (at <= 0 || at !== address.lastIndexOf('@'))
13
+ return undefined;
14
+ const local = address.slice(0, at);
15
+ if (local.length > 64 ||
16
+ !/^[a-z0-9!#$%&'*+\-/=?^_`{|}~]+(?:\.[a-z0-9!#$%&'*+\-/=?^_`{|}~]+)*$/.test(local))
17
+ return undefined;
18
+ const domain = address.slice(at + 1);
19
+ if (domain.length > 253 || !domain.includes('.'))
20
+ return undefined;
21
+ if (domain
22
+ .split('.')
23
+ .some((label) => label.length === 0 ||
24
+ label.length > 63 ||
25
+ !/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(label)))
26
+ return undefined;
27
+ return { address, domain };
28
+ }
29
+ const migration = defineMigration({
30
+ name: '202610090001_mail_create_message_participants',
31
+ async up({ builder, query }) {
32
+ await builder.createCollection('mailMessageParticipants', (collection) => {
33
+ collection.uuid('messageId', { nullable: false });
34
+ collection.uuid('accountId', { nullable: false });
35
+ collection.string('role', { length: 4, nullable: false });
36
+ collection.string('address', { length: 320, nullable: false });
37
+ collection.string('domain', { length: 253, nullable: false });
38
+ collection.primary(['messageId', 'role', 'address'], {
39
+ name: 'mail_participants_pk',
40
+ });
41
+ collection.index(['accountId', 'address', 'messageId'], {
42
+ name: 'mail_participants_address_idx',
43
+ });
44
+ collection.index(['accountId', 'domain', 'messageId'], {
45
+ name: 'mail_participants_domain_idx',
46
+ });
47
+ // One cascade path only: the owning message already belongs to an account.
48
+ collection.foreignKey('messageId', {
49
+ references: { collection: 'mailMessages', fields: ['id'] },
50
+ onDelete: 'cascade',
51
+ });
52
+ });
53
+ let skippedAddresses = 0;
54
+ let malformedValues = 0;
55
+ const object = (value) => {
56
+ if (value == null)
57
+ return undefined;
58
+ if (typeof value === 'string') {
59
+ try {
60
+ value = JSON.parse(value);
61
+ }
62
+ catch {
63
+ malformedValues += 1;
64
+ return undefined;
65
+ }
66
+ }
67
+ if (value === null)
68
+ return undefined;
69
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
70
+ malformedValues += 1;
71
+ return undefined;
72
+ }
73
+ return value;
74
+ };
75
+ try {
76
+ let after;
77
+ while (true) {
78
+ let page = query
79
+ .selectFrom('mailMessages')
80
+ .select(['id', 'accountId', 'sender', 'recipients'])
81
+ .orderBy('id', 'asc')
82
+ .limit(100);
83
+ if (after)
84
+ page = page.where('id', '>', after);
85
+ const messages = await page.execute();
86
+ if (messages.length === 0)
87
+ break;
88
+ let batch = [];
89
+ for (const message of messages) {
90
+ const sender = object(message.sender);
91
+ const recipients = object(message.recipients);
92
+ const seen = new Set();
93
+ const candidates = [];
94
+ if (sender)
95
+ candidates.push(['from', sender]);
96
+ for (const role of ['to', 'cc']) {
97
+ const list = recipients?.[role];
98
+ if (list === undefined)
99
+ continue;
100
+ if (!Array.isArray(list)) {
101
+ malformedValues += 1;
102
+ continue;
103
+ }
104
+ for (const value of list)
105
+ candidates.push([role, value]);
106
+ }
107
+ for (const [role, candidate] of candidates) {
108
+ const value = candidate !== null &&
109
+ typeof candidate === 'object' &&
110
+ !Array.isArray(candidate)
111
+ ? candidate
112
+ : undefined;
113
+ const normalized = normalizeAddress(value?.address);
114
+ if (!normalized) {
115
+ skippedAddresses += 1;
116
+ continue;
117
+ }
118
+ const key = `${role}:${normalized.address}`;
119
+ if (seen.has(key))
120
+ continue;
121
+ seen.add(key);
122
+ batch.push({
123
+ messageId: message.id,
124
+ accountId: message.accountId,
125
+ role,
126
+ ...normalized,
127
+ });
128
+ // Five bindings per row; a large To/Cc list must not exceed parameter limits.
129
+ if (batch.length === 100) {
130
+ await query
131
+ .insertInto('mailMessageParticipants')
132
+ .values(batch)
133
+ .execute();
134
+ batch = [];
135
+ }
136
+ }
137
+ }
138
+ if (batch.length > 0)
139
+ await query
140
+ .insertInto('mailMessageParticipants')
141
+ .values(batch)
142
+ .execute();
143
+ after = messages.at(-1)?.id;
144
+ }
145
+ }
146
+ catch (error) {
147
+ // MySQL and other non-transactional DDL dialects need explicit failed-backfill cleanup.
148
+ // No source message was changed, so the migration can be retried from its original JSON.
149
+ try {
150
+ await builder.dropCollection('mailMessageParticipants');
151
+ }
152
+ catch (cleanupError) {
153
+ throw new AggregateError([error, cleanupError], 'Mail participant backfill and cleanup failed.', { cause: cleanupError });
154
+ }
155
+ throw error;
156
+ }
157
+ if (skippedAddresses > 0 || malformedValues > 0) {
158
+ process.emitWarning(`Mail participant backfill skipped ${skippedAddresses} invalid addresses and ${malformedValues} malformed values.`, { code: 'MAIL_PARTICIPANT_BACKFILL_SKIPPED' });
159
+ }
160
+ },
161
+ async down({ builder }) {
162
+ await builder.dropCollection('mailMessageParticipants');
163
+ },
164
+ });
165
+ export default migration;
166
+ //# sourceMappingURL=202610090001_mail_create_message_participants.js.map
167
+ // @nocobase/task-manifest v1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"202610090001_mail_create_message_participants.js","sourceRoot":"","sources":["../../../database/migrations/202610090001_mail_create_message_participants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type MigrationDefinition } from '@nocobase/db';
2
+ declare const migration: MigrationDefinition;
3
+ export default migration;
4
+ //# sourceMappingURL=202610250001_mail_imap_message_locations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"202610250001_mail_imap_message_locations.d.ts","sourceRoot":"","sources":["../../../database/migrations/202610250001_mail_imap_message_locations.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,cAAc,CAAC;AAoKtB,QAAA,MAAM,SAAS,EAAE,mBA8Lf,CAAC;AAEH,eAAe,SAAS,CAAC"}
@@ -0,0 +1,297 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { defineMigration, } from '@nocobase/db';
3
+ // Rollback cannot discard mail business data or its location ownership.
4
+ const MESSAGE_TABLES = [
5
+ 'mailMessages',
6
+ 'mailMessageFolders',
7
+ 'mailMessageLabels',
8
+ 'mailMessageParticipants',
9
+ 'mailSyncTombstones',
10
+ 'mailDraftStates',
11
+ 'mailSubmissions',
12
+ 'mailOutboundAttachments',
13
+ 'mailSyncStates',
14
+ 'mailSyncRuns',
15
+ 'mailOutbox',
16
+ 'mailPushPending',
17
+ 'mailAccountRemovals',
18
+ ];
19
+ async function assertNoMessages(query, action) {
20
+ for (const table of MESSAGE_TABLES) {
21
+ const row = await query.selectFrom(table).selectAll().limit(1).execute();
22
+ if (row.length > 0)
23
+ throw new Error(`Cannot ${action} IMAP message locations while ${table} contains data. Rollback would lose mail business data.`);
24
+ }
25
+ }
26
+ function legacyCopy(message) {
27
+ const mirror = message.providerMessageId.startsWith('local-draft:');
28
+ const identity = mirror
29
+ ? message.providerDraftMessageId
30
+ : message.providerMessageId;
31
+ // SMTP accepted RFC IDs and local-only drafts have no recorded remote tuple.
32
+ if (!identity?.startsWith('imap:'))
33
+ return undefined;
34
+ const fail = (reason) => {
35
+ throw new Error(`Cannot upgrade legacy IMAP message ${message.id}: ${reason}.`);
36
+ };
37
+ if (!message.ownerId)
38
+ fail('missing owning account');
39
+ if (message.providerType !== 'imap-smtp')
40
+ return undefined;
41
+ if (identity.length > 500)
42
+ fail('locator exceeds identity capacity');
43
+ let parsed;
44
+ try {
45
+ const encoded = identity.slice(5);
46
+ const bytes = Buffer.from(encoded, 'base64url');
47
+ if (!encoded || bytes.toString('base64url') !== encoded)
48
+ return fail('invalid locator encoding');
49
+ if (!Buffer.from(bytes.toString('utf8'), 'utf8').equals(bytes))
50
+ return fail('invalid locator encoding');
51
+ const value = JSON.parse(bytes.toString('utf8'));
52
+ if (!value || typeof value !== 'object' || Array.isArray(value))
53
+ return fail('invalid locator object');
54
+ parsed = value;
55
+ }
56
+ catch {
57
+ return fail('invalid locator encoding');
58
+ }
59
+ const { folder, uidValidity, uid } = parsed;
60
+ if (typeof folder !== 'string' ||
61
+ !folder.length ||
62
+ folder.length > 500 ||
63
+ folder.includes('\0'))
64
+ return fail('invalid folder path');
65
+ if (typeof uidValidity !== 'string' ||
66
+ !/^[1-9]\d{0,9}$/.test(uidValidity) ||
67
+ BigInt(uidValidity) > 4294967295n)
68
+ return fail('invalid UIDVALIDITY');
69
+ if (typeof uid !== 'number' ||
70
+ !Number.isSafeInteger(uid) ||
71
+ uid < 1 ||
72
+ uid > 4294967295)
73
+ return fail('invalid UID');
74
+ return {
75
+ message,
76
+ sourceField: mirror ? 'providerDraftMessageIdSource' : 'imapIdSource',
77
+ folder,
78
+ uidValidity,
79
+ uid,
80
+ };
81
+ }
82
+ /** Two bounded scans: preflight before DDL, then copy only recorded local facts. */
83
+ async function legacyCopies(query, visit) {
84
+ let last;
85
+ for (;;) {
86
+ let selection = query
87
+ .selectFrom('mailMessages')
88
+ .leftJoin('mailAccounts', 'mailAccounts.id', 'mailMessages.accountId')
89
+ .select([
90
+ 'mailMessages.id',
91
+ 'mailMessages.accountId',
92
+ 'mailAccounts.id as ownerId',
93
+ 'mailAccounts.providerType',
94
+ 'mailMessages.providerMessageId',
95
+ 'mailMessages.providerDraftMessageId',
96
+ 'mailMessages.read',
97
+ 'mailMessages.starred',
98
+ 'mailMessages.receivedAt',
99
+ 'mailMessages.createdAt',
100
+ 'mailMessages.updatedAt',
101
+ ])
102
+ .orderBy('mailMessages.accountId')
103
+ .orderBy('mailMessages.id')
104
+ .limit(100);
105
+ if (last) {
106
+ const cursor = last;
107
+ selection = selection.where((builder) => builder.or([
108
+ builder('mailMessages.accountId', '>', cursor.accountId),
109
+ builder.and([
110
+ builder('mailMessages.accountId', '=', cursor.accountId),
111
+ builder('mailMessages.id', '>', cursor.id),
112
+ ]),
113
+ ]));
114
+ }
115
+ const rows = await selection.execute();
116
+ if (!rows.length)
117
+ return;
118
+ await visit(rows.flatMap((row) => {
119
+ const copy = legacyCopy(row);
120
+ return copy ? [copy] : [];
121
+ }));
122
+ last = rows.at(-1);
123
+ }
124
+ }
125
+ const migration = defineMigration({
126
+ name: '202610250001_mail_imap_message_locations',
127
+ async up({ builder, query, connection }) {
128
+ let accountId;
129
+ const owners = new Map();
130
+ await legacyCopies(query, async (copies) => {
131
+ for (const copy of copies) {
132
+ if (accountId !== copy.message.accountId) {
133
+ owners.clear();
134
+ accountId = copy.message.accountId;
135
+ }
136
+ const tuple = JSON.stringify([copy.folder, copy.uidValidity, copy.uid]);
137
+ const owner = owners.get(tuple);
138
+ if (owner && owner !== copy.message.id)
139
+ throw new Error(`Cannot upgrade legacy IMAP message ${copy.message.id}: tuple belongs to message ${owner}.`);
140
+ owners.set(tuple, copy.message.id);
141
+ }
142
+ });
143
+ // SQLite rebuilds a table when changing its column type. Detach only the
144
+ // incoming Mail foreign keys so that dropping that table cannot cascade.
145
+ // The migration transaction restores both schema and data on any failure.
146
+ const incoming = [
147
+ [
148
+ 'mailMessageFolders',
149
+ 'fk_mail_message_folders_message_id_mail_messages',
150
+ 'messageId',
151
+ 'mailMessages',
152
+ ],
153
+ [
154
+ 'mailMessageLabels',
155
+ 'fk_mail_message_labels_message_id_mail_messages',
156
+ 'messageId',
157
+ 'mailMessages',
158
+ ],
159
+ // Restore both label constraints in their original order as well.
160
+ [
161
+ 'mailMessageLabels',
162
+ 'fk_mail_message_labels_label_id_mail_labels',
163
+ 'labelId',
164
+ 'mailLabels',
165
+ ],
166
+ [
167
+ 'mailMessageParticipants',
168
+ 'fk_mail_message_participants_message_id_mail_messages',
169
+ 'messageId',
170
+ 'mailMessages',
171
+ ],
172
+ ];
173
+ const detach = connection.dialect === 'sqlite' &&
174
+ (await query.selectFrom('mailMessages').select('id').limit(1).execute())
175
+ .length > 0;
176
+ if (detach) {
177
+ for (const [table, name] of incoming) {
178
+ await builder.alterCollection(table, (collection) => collection.dropConstraint(name));
179
+ }
180
+ }
181
+ await builder.alterCollection('mailMessages', (collection) => {
182
+ collection.string('imapIdSource', { length: 20 });
183
+ collection.string('providerDraftMessageIdSource', { length: 20 });
184
+ collection.uuid('imapOrphanRunId');
185
+ // A complete RFC Message-ID header can exceed the previous 1000 characters.
186
+ collection.alterField('internetMessageId', {
187
+ type: 'text',
188
+ db: connection.dialect === 'mysql' ? { nativeType: 'longtext' } : {},
189
+ });
190
+ // Target of the locations' account-scoped foreign key.
191
+ collection.unique(['accountId', 'id'], {
192
+ name: 'mail_messages_account_id_unique',
193
+ });
194
+ });
195
+ if (detach) {
196
+ for (const [table, name, field, target] of incoming) {
197
+ await builder.alterCollection(table, (collection) => collection.foreignKey(field, {
198
+ name,
199
+ references: { collection: target, fields: ['id'] },
200
+ onDelete: 'cascade',
201
+ }));
202
+ }
203
+ }
204
+ await builder.createCollection('mailMessageImapLocations', (collection) => {
205
+ collection.uuid('id').primary();
206
+ collection.uuid('accountId', { nullable: false });
207
+ collection.uuid('messageId', { nullable: false });
208
+ collection.string('providerFolderId', { length: 500, nullable: false });
209
+ // Canonical decimal UIDVALIDITY, 1 to 4294967295.
210
+ collection.string('uidValidity', { length: 10, nullable: false });
211
+ // Signed 64-bit holds every uint32 UID on every dialect.
212
+ collection.bigInt('uid', { nullable: false });
213
+ collection.string('status', { length: 10, nullable: false });
214
+ collection.string('invalidationReason', { length: 40 });
215
+ collection.boolean('read', { nullable: false, defaultValue: false });
216
+ collection.boolean('starred', { nullable: false, defaultValue: false });
217
+ collection.datetimeTz('receivedAt');
218
+ collection.datetimeTz('createdAt', { nullable: false });
219
+ collection.datetimeTz('updatedAt', { nullable: false });
220
+ collection.unique(['accountId', 'providerFolderId', 'uidValidity', 'uid'], {
221
+ name: 'mail_imap_locations_tuple_unique',
222
+ });
223
+ collection.index(['accountId', 'messageId'], {
224
+ name: 'mail_imap_locations_message_idx',
225
+ });
226
+ // One cascade path only: the owning message already belongs to the account.
227
+ collection.foreignKey(['accountId', 'messageId'], {
228
+ name: 'mail_imap_locations_message_fk',
229
+ references: {
230
+ collection: 'mailMessages',
231
+ fields: ['accountId', 'id'],
232
+ },
233
+ onDelete: 'cascade',
234
+ });
235
+ });
236
+ const now = new Date().toISOString();
237
+ await legacyCopies(query, async (copies) => {
238
+ if (!copies.length)
239
+ return;
240
+ await query
241
+ .insertInto('mailMessageImapLocations')
242
+ .values(copies.map((copy) => ({
243
+ id: randomUUID(),
244
+ accountId: copy.message.accountId,
245
+ messageId: copy.message.id,
246
+ providerFolderId: copy.folder,
247
+ uidValidity: copy.uidValidity,
248
+ uid: copy.uid,
249
+ status: 'valid',
250
+ invalidationReason: null,
251
+ read: copy.message.read,
252
+ starred: copy.message.starred,
253
+ receivedAt: copy.message.receivedAt,
254
+ createdAt: copy.message.createdAt ?? now,
255
+ updatedAt: copy.message.updatedAt ?? now,
256
+ })))
257
+ .execute();
258
+ for (const field of [
259
+ 'imapIdSource',
260
+ 'providerDraftMessageIdSource',
261
+ ]) {
262
+ const ids = copies
263
+ .filter((copy) => copy.sourceField === field)
264
+ .map((copy) => copy.message.id);
265
+ if (ids.length)
266
+ await query
267
+ .updateTable('mailMessages')
268
+ .set({ [field]: 'locator' })
269
+ .where('id', 'in', ids)
270
+ .execute();
271
+ }
272
+ });
273
+ },
274
+ async down({ builder, query }) {
275
+ // Restoring the 1000-character Message-ID column must not cut stored values.
276
+ await assertNoMessages(query, 'remove');
277
+ if ((await query
278
+ .selectFrom('mailMessageImapLocations')
279
+ .selectAll()
280
+ .limit(1)
281
+ .execute()).length)
282
+ throw new Error('Cannot remove IMAP message locations while location business data exists.');
283
+ await builder.dropCollection('mailMessageImapLocations');
284
+ await builder.alterCollection('mailMessages', (collection) => {
285
+ collection.dropConstraint('mail_messages_account_id_unique');
286
+ collection.alterField('internetMessageId', {
287
+ type: 'string',
288
+ length: 1000,
289
+ db: {},
290
+ });
291
+ collection.dropFields('imapIdSource', 'providerDraftMessageIdSource', 'imapOrphanRunId');
292
+ });
293
+ },
294
+ });
295
+ export default migration;
296
+ //# sourceMappingURL=202610250001_mail_imap_message_locations.js.map
297
+ // @nocobase/task-manifest v1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"202610250001_mail_imap_message_locations.js","sourceRoot":"","sources":["../../../database/migrations/202610250001_mail_imap_message_locations.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,43 @@
1
+ import { ImapFlow } from 'imapflow';
1
2
  import type { MailAttachmentContent, MailProviderResult, MailSyncCursor } from '../../../shared/mail.js';
2
3
  import type { MailProviderAdapter, MailProviderAccount, MailProviderContext, MailProviderFolderPage, MailProviderListChangesInput, MailProviderListFoldersInput, MailProviderListMessagesInput, MailProviderMessagePage, MailProviderSendInput, MailProviderSendResult, NormalizedMailMessage } from '../../contracts/provider.js';
3
- import type { ImapSmtpCredential } from './types.js';
4
+ import type { ImapOperationSnapshot, ImapLocationPersistence, ImapSmtpCredential } from './types.js';
5
+ import type { MailSyncStepCommit } from '../../contracts/persistence.js';
6
+ import type { MailSyncRun } from '../../../shared/mail.js';
4
7
  import type { ImapSmtpMailProviderConfig } from './config.js';
8
+ import { createImapClient, createSmtpTransport } from './connection.js';
5
9
  export declare class ImapSmtpAdapter implements MailProviderAdapter {
10
+ private readonly context;
6
11
  private readonly config;
12
+ private readonly account;
7
13
  private readonly credential;
14
+ private readonly locations?;
15
+ private readonly protocol;
16
+ private readonly operation?;
8
17
  readonly identity: MailProviderAccount['provider'];
9
18
  readonly capabilities: MailProviderAdapter['capabilities'];
10
19
  private readonly folderTypes;
11
20
  private imapClient?;
12
21
  private readonly smtpTransport;
13
- constructor(_context: MailProviderContext, config: ImapSmtpMailProviderConfig, account: MailProviderAccount, credential: ImapSmtpCredential);
22
+ private copies;
23
+ private changes;
24
+ private cleanup;
25
+ private verificationIncomplete;
26
+ private readonly verificationCopies;
27
+ private readonly syncRun?;
28
+ private rawBudget;
29
+ private readonly rawCache;
30
+ constructor(context: MailProviderContext, config: ImapSmtpMailProviderConfig, account: MailProviderAccount, credential: ImapSmtpCredential, locations?: ImapLocationPersistence | undefined, run?: MailSyncRun, protocol?: {
31
+ readonly imap: typeof createImapClient;
32
+ readonly smtp: typeof createSmtpTransport;
33
+ readonly expungeUid: typeof expungeUid;
34
+ }, operation?: ImapOperationSnapshot | undefined);
35
+ forSync(run: MailSyncRun): ImapSmtpAdapter;
36
+ forMessage(messageId: string, providerMessageId: string, operation: 'flags' | 'delete'): Promise<ImapSmtpAdapter>;
37
+ /** True when this instance records message copies in the account's location table. */
38
+ get persistsLocations(): boolean;
39
+ /** Commit a sync step together with the location evidence this instance gathered for it. */
40
+ commitSyncStep(input: MailSyncStepCommit): Promise<MailSyncRun>;
14
41
  listFolders(input: MailProviderListFoldersInput): Promise<MailProviderResult<MailProviderFolderPage>>;
15
42
  getCurrentSyncCursor(signal?: AbortSignal): Promise<MailProviderResult<MailSyncCursor>>;
16
43
  listMessages(input: MailProviderListMessagesInput): Promise<MailProviderResult<MailProviderMessagePage>>;
@@ -21,13 +48,14 @@ export declare class ImapSmtpAdapter implements MailProviderAdapter {
21
48
  readonly hasMore: boolean;
22
49
  }>>;
23
50
  getMessage(providerMessageId: string, signal?: AbortSignal): Promise<MailProviderResult<NormalizedMailMessage>>;
24
- getAttachment(_providerMessageId: string, providerAttachmentId: string, signal?: AbortSignal): Promise<MailProviderResult<MailAttachmentContent>>;
51
+ getAttachment(providerMessageId: string, providerAttachmentId: string, signal?: AbortSignal): Promise<MailProviderResult<MailAttachmentContent>>;
25
52
  sendMessage(input: MailProviderSendInput): Promise<MailProviderSendResult>;
26
53
  setRead(providerMessageId: string, read: boolean, signal?: AbortSignal): Promise<MailProviderResult<void>>;
27
54
  setStarred(providerMessageId: string, starred: boolean, signal?: AbortSignal): Promise<MailProviderResult<void>>;
28
55
  deleteMessage(providerMessageId: string, permanently: boolean, signal?: AbortSignal): Promise<MailProviderResult<void>>;
29
56
  close(): Promise<void>;
30
57
  private updateFlags;
58
+ private closeImap;
31
59
  private imap;
32
60
  private listMailboxes;
33
61
  private selectableMailboxes;
@@ -35,6 +63,35 @@ export declare class ImapSmtpAdapter implements MailProviderAdapter {
35
63
  private selectedFolderState;
36
64
  private normalizeFolder;
37
65
  private fetchMessages;
66
+ private beginStep;
67
+ /**
68
+ * Choose each copy's identity: its persisted location first, then the
69
+ * server's native ID, then an RFC Message-ID proven by identical MIME bytes,
70
+ * and otherwise the copy's own location.
71
+ */
72
+ private assignIdentities;
73
+ private nativeSource;
74
+ /** Compare a new copy with a verified copy already stored under this RFC Message-ID. */
75
+ private matchesStoredCopy;
76
+ private sameRawCopies;
77
+ /** Complete raw MIME of one copy within the per-message and per-step budgets. */
78
+ private rawCopy;
79
+ /**
80
+ * Select a stored copy and confirm it is still the same message. Returns
81
+ * undefined for a changed generation, a missing UID or another identity.
82
+ */
83
+ private openCopy;
84
+ private copyChanged;
85
+ /** Change one flag on every verified copy, committing each confirmed copy on its own. */
86
+ private updateCopyFlags;
87
+ /**
88
+ * One complete pass over every selectable folder. It reconciles stored
89
+ * copies, and two matching passes in a row authorize orphan cleanup.
90
+ */
91
+ private verifyFolders;
38
92
  private normalizeMessage;
39
93
  }
94
+ /** ImapFlow 2.2.10's command primitive keeps the verb explicitly scoped to a UID. */
95
+ declare function expungeUid(client: ImapFlow, uid: number): Promise<void>;
96
+ export {};
40
97
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../server/adapters/imap-smtp/adapter.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,qBAAqB,EAErB,kBAAkB,EAClB,cAAc,EACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EAEtB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAuC9D,qBAAa,eAAgB,YAAW,mBAAmB;IAavD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAd7B,SAAgB,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC1D,SAAgB,YAAY,EAAE,mBAAmB,CAAC,cAAc,CAAC,CACxC;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IACJ,OAAO,CAAC,UAAU,CAAC,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;gBAG1C,QAAQ,EAAE,mBAAmB,EACZ,MAAM,EAAE,0BAA0B,EACnD,OAAO,EAAE,mBAAmB,EACX,UAAU,EAAE,kBAAkB;IAMpC,WAAW,CACtB,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;IAgBzC,oBAAoB,CAC/B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAkBjC,YAAY,CACvB,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC;IAoJ1C,WAAW,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CACpE,kBAAkB,CAAC;QACjB,QAAQ,CAAC,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;QACpD,QAAQ,CAAC,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;QACtD,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC3B,CAAC,CACH;IA2IY,UAAU,CACrB,iBAAiB,EAAE,MAAM,EACzB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IA0CxC,aAAa,CACxB,kBAAkB,EAAE,MAAM,EAC1B,oBAAoB,EAAE,MAAM,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IAgExC,WAAW,CACtB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC;IA8IrB,OAAO,CAClB,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAIvB,UAAU,CACrB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAIvB,aAAa,CACxB,iBAAiB,EAAE,MAAM,EACzB,WAAW,EAAE,OAAO,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAqBvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAYrB,WAAW;YAmBX,IAAI;YAQJ,aAAa;IAyB3B,OAAO,CAAC,mBAAmB;YAYb,WAAW;YAyDX,mBAAmB;IA0BjC,OAAO,CAAC,eAAe;YAUT,aAAa;YA0Bb,gBAAgB;CA2E/B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../server/adapters/imap-smtp/adapter.ts"],"names":[],"mappings":"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"}