fluxmail 0.4.1 → 0.6.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/README.md +6 -4
- package/dist/accounts/defaultGoogleOAuth.d.ts +4 -0
- package/dist/accounts/defaultGoogleOAuth.d.ts.map +1 -0
- package/dist/accounts/defaultGoogleOAuth.js +7 -0
- package/dist/accounts/defaultGoogleOAuth.js.map +1 -0
- package/dist/accounts/gmailConnection.js +2 -2
- package/dist/accounts/gmailConnection.js.map +1 -1
- package/dist/accounts/googleAuth.d.ts +16 -9
- package/dist/accounts/googleAuth.d.ts.map +1 -1
- package/dist/accounts/googleAuth.js +52 -20
- package/dist/accounts/googleAuth.js.map +1 -1
- package/dist/accounts/microsoftAuth.d.ts +5 -2
- package/dist/accounts/microsoftAuth.d.ts.map +1 -1
- package/dist/accounts/microsoftAuth.js +25 -22
- package/dist/accounts/microsoftAuth.js.map +1 -1
- package/dist/accounts/registry.d.ts +11 -9
- package/dist/accounts/registry.d.ts.map +1 -1
- package/dist/accounts/registry.js +169 -98
- package/dist/accounts/registry.js.map +1 -1
- package/dist/auth.d.ts +106 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +455 -0
- package/dist/auth.js.map +1 -0
- package/dist/authorization.d.ts +9 -0
- package/dist/authorization.d.ts.map +1 -0
- package/dist/authorization.js +23 -0
- package/dist/authorization.js.map +1 -0
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1096 -403
- package/dist/cli.js.map +1 -1
- package/dist/cliInstances.d.ts +51 -0
- package/dist/cliInstances.d.ts.map +1 -0
- package/dist/cliInstances.js +237 -0
- package/dist/cliInstances.js.map +1 -0
- package/dist/cliMail.d.ts +9 -0
- package/dist/cliMail.d.ts.map +1 -0
- package/dist/cliMail.js +450 -0
- package/dist/cliMail.js.map +1 -0
- package/dist/config.d.ts +95 -118
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +351 -286
- package/dist/config.js.map +1 -1
- package/dist/configMigration.d.ts +8 -0
- package/dist/configMigration.d.ts.map +1 -0
- package/dist/configMigration.js +234 -0
- package/dist/configMigration.js.map +1 -0
- package/dist/context.d.ts +8 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -8
- package/dist/context.js.map +1 -1
- package/dist/deploymentConfig.d.ts +190 -0
- package/dist/deploymentConfig.d.ts.map +1 -0
- package/dist/deploymentConfig.js +539 -0
- package/dist/deploymentConfig.js.map +1 -0
- package/dist/http/admin.d.ts +75 -3
- package/dist/http/admin.d.ts.map +1 -1
- package/dist/http/admin.js +347 -79
- package/dist/http/admin.js.map +1 -1
- package/dist/http/app.d.ts +4 -1
- package/dist/http/app.d.ts.map +1 -1
- package/dist/http/app.js +119 -63
- package/dist/http/app.js.map +1 -1
- package/dist/http/identity.d.ts +114 -0
- package/dist/http/identity.d.ts.map +1 -0
- package/dist/http/identity.js +936 -0
- package/dist/http/identity.js.map +1 -0
- package/dist/http/operationRoutes.d.ts +8 -0
- package/dist/http/operationRoutes.d.ts.map +1 -0
- package/dist/http/operationRoutes.js +13 -0
- package/dist/http/operationRoutes.js.map +1 -0
- package/dist/http/rest.d.ts +16 -4
- package/dist/http/rest.d.ts.map +1 -1
- package/dist/http/rest.js +213 -71
- package/dist/http/rest.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/instanceConfig.d.ts +36 -0
- package/dist/instanceConfig.d.ts.map +1 -0
- package/dist/instanceConfig.js +157 -0
- package/dist/instanceConfig.js.map +1 -0
- package/dist/licensing/activation.d.ts +2 -1
- package/dist/licensing/activation.d.ts.map +1 -1
- package/dist/licensing/activation.js +2 -3
- package/dist/licensing/activation.js.map +1 -1
- package/dist/licensing/entitlements.d.ts.map +1 -1
- package/dist/licensing/entitlements.js +2 -2
- package/dist/licensing/entitlements.js.map +1 -1
- package/dist/licensing/refresher.d.ts +6 -1
- package/dist/licensing/refresher.d.ts.map +1 -1
- package/dist/licensing/refresher.js +18 -7
- package/dist/licensing/refresher.js.map +1 -1
- package/dist/logging.d.ts +87 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +612 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp/buildServer.d.ts +3 -1
- package/dist/mcp/buildServer.d.ts.map +1 -1
- package/dist/mcp/buildServer.js +27 -24
- package/dist/mcp/buildServer.js.map +1 -1
- package/dist/permissions.d.ts +1 -1
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +10 -4
- package/dist/permissions.js.map +1 -1
- package/dist/scheduler/sendScheduler.d.ts +4 -3
- package/dist/scheduler/sendScheduler.d.ts.map +1 -1
- package/dist/scheduler/sendScheduler.js +15 -3
- package/dist/scheduler/sendScheduler.js.map +1 -1
- package/dist/service/emailService.d.ts +10 -17
- package/dist/service/emailService.d.ts.map +1 -1
- package/dist/service/emailService.js +28 -38
- package/dist/service/emailService.js.map +1 -1
- package/dist/storage/adminAudit.d.ts +15 -2
- package/dist/storage/adminAudit.d.ts.map +1 -1
- package/dist/storage/adminAudit.js +22 -27
- package/dist/storage/adminAudit.js.map +1 -1
- package/dist/storage/apiKeys.d.ts +8 -8
- package/dist/storage/apiKeys.d.ts.map +1 -1
- package/dist/storage/apiKeys.js +16 -11
- package/dist/storage/apiKeys.js.map +1 -1
- package/dist/storage/db.d.ts +596 -31
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +383 -45
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/fileLock.d.ts +7 -0
- package/dist/storage/fileLock.d.ts.map +1 -0
- package/dist/storage/fileLock.js +183 -0
- package/dist/storage/fileLock.js.map +1 -0
- package/dist/storage/gmailConnectionGrants.d.ts +3 -4
- package/dist/storage/gmailConnectionGrants.d.ts.map +1 -1
- package/dist/storage/gmailConnectionGrants.js +6 -6
- package/dist/storage/gmailConnectionGrants.js.map +1 -1
- package/dist/storage/members.d.ts +11 -0
- package/dist/storage/members.d.ts.map +1 -1
- package/dist/storage/members.js +70 -6
- package/dist/storage/members.js.map +1 -1
- package/dist/telemetry.d.ts +17 -2
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +34 -19
- package/dist/telemetry.js.map +1 -1
- package/dist/updateNotifier.d.ts +18 -0
- package/dist/updateNotifier.d.ts.map +1 -0
- package/dist/updateNotifier.js +128 -0
- package/dist/updateNotifier.js.map +1 -0
- package/package.json +38 -5
package/dist/cliMail.js
ADDED
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { lookup as lookupMimeType } from 'mime-types';
|
|
5
|
+
import { EmailError, parseSingleAddress } from '@fluxmail/core';
|
|
6
|
+
import { apiErrorCode, instanceClient, instanceResponseError, } from './cliInstances.js';
|
|
7
|
+
const MODIFY_ACTIONS = {
|
|
8
|
+
markRead: 'markRead',
|
|
9
|
+
'mark-read': 'markRead',
|
|
10
|
+
markUnread: 'markUnread',
|
|
11
|
+
'mark-unread': 'markUnread',
|
|
12
|
+
star: 'star',
|
|
13
|
+
unstar: 'unstar',
|
|
14
|
+
archive: 'archive',
|
|
15
|
+
trash: 'trash',
|
|
16
|
+
untrash: 'untrash',
|
|
17
|
+
delete: 'delete',
|
|
18
|
+
move: 'move',
|
|
19
|
+
addLabels: 'addLabels',
|
|
20
|
+
'add-labels': 'addLabels',
|
|
21
|
+
removeLabels: 'removeLabels',
|
|
22
|
+
'remove-labels': 'removeLabels',
|
|
23
|
+
};
|
|
24
|
+
function collect(value, previous) {
|
|
25
|
+
return [...previous, value];
|
|
26
|
+
}
|
|
27
|
+
function printJson(value) {
|
|
28
|
+
console.log(JSON.stringify(value, null, 2));
|
|
29
|
+
}
|
|
30
|
+
function readSource(source) {
|
|
31
|
+
try {
|
|
32
|
+
return readFileSync(source === '-' ? 0 : source, 'utf8');
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw new EmailError('invalid_request', `Could not read ${source === '-' ? 'stdin' : source}: ${error instanceof Error ? error.message : String(error)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function readJsonInput(source) {
|
|
39
|
+
let parsed;
|
|
40
|
+
try {
|
|
41
|
+
parsed = JSON.parse(readSource(source));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error instanceof EmailError)
|
|
45
|
+
throw error;
|
|
46
|
+
throw new EmailError('invalid_request', `Could not parse JSON input: ${error instanceof Error ? error.message : String(error)}`);
|
|
47
|
+
}
|
|
48
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
49
|
+
throw new EmailError('invalid_request', 'JSON input must be an object.');
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
function parseAddresses(values) {
|
|
54
|
+
return values.map((value) => {
|
|
55
|
+
const parsed = parseSingleAddress(value);
|
|
56
|
+
if (!parsed)
|
|
57
|
+
throw new EmailError('invalid_request', `Could not parse email address: "${value}".`);
|
|
58
|
+
return parsed;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function readAttachment(filePath) {
|
|
62
|
+
let content;
|
|
63
|
+
try {
|
|
64
|
+
content = readFileSync(filePath);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
throw new EmailError('invalid_request', `Could not read attachment ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
68
|
+
}
|
|
69
|
+
const filename = path.basename(filePath);
|
|
70
|
+
return {
|
|
71
|
+
filename,
|
|
72
|
+
mimeType: lookupMimeType(filename) || 'application/octet-stream',
|
|
73
|
+
content: content.toString('base64'),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function hasMessageContentOptions(options) {
|
|
77
|
+
return Boolean(options.to.length ||
|
|
78
|
+
options.cc.length ||
|
|
79
|
+
options.bcc.length ||
|
|
80
|
+
options.subject !== undefined ||
|
|
81
|
+
options.body !== undefined ||
|
|
82
|
+
options.bodyFile !== undefined ||
|
|
83
|
+
options.html !== undefined ||
|
|
84
|
+
options.htmlFile !== undefined ||
|
|
85
|
+
options.attach.length ||
|
|
86
|
+
options.replyTo !== undefined ||
|
|
87
|
+
options.replyAll);
|
|
88
|
+
}
|
|
89
|
+
function messageRequest(options) {
|
|
90
|
+
if (options.input) {
|
|
91
|
+
if (hasMessageContentOptions(options)) {
|
|
92
|
+
throw new EmailError('invalid_request', '--input cannot be combined with message content options.');
|
|
93
|
+
}
|
|
94
|
+
return readJsonInput(options.input);
|
|
95
|
+
}
|
|
96
|
+
if (options.body !== undefined && options.bodyFile !== undefined) {
|
|
97
|
+
throw new EmailError('invalid_request', '--body and --body-file cannot be used together.');
|
|
98
|
+
}
|
|
99
|
+
if (options.html !== undefined && options.htmlFile !== undefined) {
|
|
100
|
+
throw new EmailError('invalid_request', '--html and --html-file cannot be used together.');
|
|
101
|
+
}
|
|
102
|
+
let text = options.body ?? (options.bodyFile ? readSource(options.bodyFile) : undefined);
|
|
103
|
+
const html = options.html ?? (options.htmlFile ? readSource(options.htmlFile) : undefined);
|
|
104
|
+
if (text === undefined && html === undefined && !process.stdin.isTTY)
|
|
105
|
+
text = readSource('-');
|
|
106
|
+
return {
|
|
107
|
+
...(options.to.length ? { to: parseAddresses(options.to) } : {}),
|
|
108
|
+
...(options.cc.length ? { cc: parseAddresses(options.cc) } : {}),
|
|
109
|
+
...(options.bcc.length ? { bcc: parseAddresses(options.bcc) } : {}),
|
|
110
|
+
...(options.subject !== undefined ? { subject: options.subject } : {}),
|
|
111
|
+
body: {
|
|
112
|
+
...(text !== undefined ? { text } : {}),
|
|
113
|
+
...(html !== undefined ? { html } : {}),
|
|
114
|
+
},
|
|
115
|
+
...(options.attach.length ? { attachments: options.attach.map(readAttachment) } : {}),
|
|
116
|
+
...(options.replyTo ? { replyToMessageId: options.replyTo } : {}),
|
|
117
|
+
...(options.replyAll ? { replyAll: true } : {}),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function addMessageContentOptions(command) {
|
|
121
|
+
return command
|
|
122
|
+
.option('--to <address>', 'Add a To recipient; repeat as needed', collect, [])
|
|
123
|
+
.option('--cc <address>', 'Add a Cc recipient; repeat as needed', collect, [])
|
|
124
|
+
.option('--bcc <address>', 'Add a Bcc recipient; repeat as needed', collect, [])
|
|
125
|
+
.option('--subject <subject>', 'Set the subject')
|
|
126
|
+
.option('--body <text>', 'Set the plain-text body')
|
|
127
|
+
.option('--body-file <path>', 'Read the plain-text body from a file')
|
|
128
|
+
.option('--html <html>', 'Set the HTML body')
|
|
129
|
+
.option('--html-file <path>', 'Read the HTML body from a file')
|
|
130
|
+
.option('--attach <path>', 'Attach a local file; repeat as needed', collect, [])
|
|
131
|
+
.option('--reply-to <message-id>', 'Reply to a message')
|
|
132
|
+
.option('--reply-all', 'Include the original recipients in the reply')
|
|
133
|
+
.option('--input <file>', 'Read an exact REST JSON body from a file, or pass - for stdin');
|
|
134
|
+
}
|
|
135
|
+
function addQueryOptions(command, includeText) {
|
|
136
|
+
command
|
|
137
|
+
.option('--folder <folder>', 'Filter by folder ID, role, or name')
|
|
138
|
+
.option('--from <address>', 'Filter by sender')
|
|
139
|
+
.option('--to <address>', 'Filter by recipient')
|
|
140
|
+
.option('--subject <text>', 'Filter by subject')
|
|
141
|
+
.option('--unread-only', 'Return unread messages only')
|
|
142
|
+
.option('--starred-only', 'Return starred messages only')
|
|
143
|
+
.option('--has-attachment', 'Return messages with attachments only')
|
|
144
|
+
.option('--after <date>', 'Return messages on or after this ISO date')
|
|
145
|
+
.option('--before <date>', 'Return messages before this ISO date')
|
|
146
|
+
.option('--raw-provider-query <query>', 'Pass a provider-native query')
|
|
147
|
+
.option('--page-size <number>', 'Return 1 to 100 messages')
|
|
148
|
+
.option('--page-token <token>', 'Continue from a previous response');
|
|
149
|
+
if (includeText)
|
|
150
|
+
command.option('--text <query>', 'Filter by full-text search');
|
|
151
|
+
return command;
|
|
152
|
+
}
|
|
153
|
+
function queryString(options, searchText) {
|
|
154
|
+
const query = new URLSearchParams();
|
|
155
|
+
for (const [key, value] of [
|
|
156
|
+
['folder', options.folder],
|
|
157
|
+
['text', searchText ?? options.text],
|
|
158
|
+
['from', options.from],
|
|
159
|
+
['to', options.to],
|
|
160
|
+
['subject', options.subject],
|
|
161
|
+
['after', options.after],
|
|
162
|
+
['before', options.before],
|
|
163
|
+
['rawProviderQuery', options.rawProviderQuery],
|
|
164
|
+
['pageSize', options.pageSize],
|
|
165
|
+
['pageToken', options.pageToken],
|
|
166
|
+
]) {
|
|
167
|
+
if (value !== undefined)
|
|
168
|
+
query.set(key, value);
|
|
169
|
+
}
|
|
170
|
+
if (options.unreadOnly)
|
|
171
|
+
query.set('unreadOnly', 'true');
|
|
172
|
+
if (options.starredOnly)
|
|
173
|
+
query.set('starredOnly', 'true');
|
|
174
|
+
if (options.hasAttachment)
|
|
175
|
+
query.set('hasAttachment', 'true');
|
|
176
|
+
return query.size ? `?${query}` : '';
|
|
177
|
+
}
|
|
178
|
+
async function resolveAccountId(client, requested) {
|
|
179
|
+
const requestedRef = requested?.trim();
|
|
180
|
+
if (requestedRef && /^acct_[^@\s]+$/.test(requestedRef))
|
|
181
|
+
return requestedRef;
|
|
182
|
+
const listed = await client.json('/api/v1/accounts');
|
|
183
|
+
if (listed.length === 0) {
|
|
184
|
+
throw new EmailError('invalid_request', 'No email accounts are available. Connect an account first.');
|
|
185
|
+
}
|
|
186
|
+
const member = await client.json('/api/v1/me');
|
|
187
|
+
const accounts = listed.filter((account) => account.ownerMemberId === member.id || account.sharedWithAll || account.grantedMemberIds.includes(member.id));
|
|
188
|
+
if (requestedRef) {
|
|
189
|
+
const normalized = requestedRef.toLowerCase();
|
|
190
|
+
const account = accounts.find((candidate) => candidate.id === requestedRef || candidate.email.toLowerCase() === normalized);
|
|
191
|
+
if (!account)
|
|
192
|
+
throw new EmailError('not_found', `No accessible account has id or email "${requestedRef}".`);
|
|
193
|
+
return account.id;
|
|
194
|
+
}
|
|
195
|
+
if (accounts.length === 0) {
|
|
196
|
+
throw new EmailError('invalid_request', 'No email accounts are accessible to this member.');
|
|
197
|
+
}
|
|
198
|
+
if (accounts.length > 1) {
|
|
199
|
+
throw new EmailError('invalid_request', `Multiple accounts are available. Pass --mail-account or -a with one of: ${accounts
|
|
200
|
+
.map((account) => `${account.id} (${account.email})`)
|
|
201
|
+
.join(', ')}.`);
|
|
202
|
+
}
|
|
203
|
+
return accounts[0].id;
|
|
204
|
+
}
|
|
205
|
+
async function responseError(response) {
|
|
206
|
+
let error;
|
|
207
|
+
try {
|
|
208
|
+
const body = (await response.json());
|
|
209
|
+
error = body.error;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// The fallback below does not expose response content.
|
|
213
|
+
}
|
|
214
|
+
throw instanceResponseError(error?.code ?? 'request_failed', error?.message ?? `Request failed with HTTP ${response.status}.`, response.status, error?.data);
|
|
215
|
+
}
|
|
216
|
+
function jsonRequest(body, headers = {}) {
|
|
217
|
+
return {
|
|
218
|
+
method: 'POST',
|
|
219
|
+
headers: { 'content-type': 'application/json', ...headers },
|
|
220
|
+
body: JSON.stringify(body),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
export function registerMailCommands(program, options) {
|
|
224
|
+
const run = (fn) => async () => {
|
|
225
|
+
try {
|
|
226
|
+
await fn();
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
options.reportError(error, apiErrorCode(error));
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
const accountContext = async () => {
|
|
233
|
+
const client = instanceClient(options.selectedInstance());
|
|
234
|
+
const accountId = await resolveAccountId(client, options.selectedAccount());
|
|
235
|
+
return { client, accountId };
|
|
236
|
+
};
|
|
237
|
+
const printEnvelope = async (request) => printJson(await request);
|
|
238
|
+
const folders = program.command('folders').description('Work with navigable mailbox folders');
|
|
239
|
+
folders
|
|
240
|
+
.command('list')
|
|
241
|
+
.description('List folders in an email account')
|
|
242
|
+
.action(run(async () => {
|
|
243
|
+
const { client, accountId } = await accountContext();
|
|
244
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/folders`));
|
|
245
|
+
}));
|
|
246
|
+
const labels = program.command('labels').description('Work with Gmail labels and Outlook categories');
|
|
247
|
+
labels
|
|
248
|
+
.command('list')
|
|
249
|
+
.description('List Gmail user labels or Outlook categories')
|
|
250
|
+
.action(run(async () => {
|
|
251
|
+
const { client, accountId } = await accountContext();
|
|
252
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/labels`));
|
|
253
|
+
}));
|
|
254
|
+
const emails = program.command('emails').description('Read, send, and organize email');
|
|
255
|
+
const listEmails = addQueryOptions(emails.command('list').description('List and filter messages'), true);
|
|
256
|
+
listEmails.action(async (query) => run(async () => {
|
|
257
|
+
const { client, accountId } = await accountContext();
|
|
258
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages${queryString(query)}`));
|
|
259
|
+
})());
|
|
260
|
+
const search = addQueryOptions(emails.command('search').argument('<query>', 'Full-text search query').description('Search messages'), false);
|
|
261
|
+
search.action(async (query, queryOptions) => run(async () => {
|
|
262
|
+
const { client, accountId } = await accountContext();
|
|
263
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages${queryString(queryOptions, query)}`));
|
|
264
|
+
})());
|
|
265
|
+
emails
|
|
266
|
+
.command('get')
|
|
267
|
+
.argument('<message-id>', 'Provider message ID')
|
|
268
|
+
.description('Get a complete message')
|
|
269
|
+
.action(async (messageId) => run(async () => {
|
|
270
|
+
const { client, accountId } = await accountContext();
|
|
271
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/${encodeURIComponent(messageId)}`));
|
|
272
|
+
})());
|
|
273
|
+
const send = addMessageContentOptions(emails.command('send').description('Send or schedule a message'))
|
|
274
|
+
.option('--draft <draft-id>', 'Send an existing draft')
|
|
275
|
+
.option('--send-at <timestamp>', 'Schedule delivery at an ISO timestamp')
|
|
276
|
+
.option('--idempotency-key <key>', 'Reuse a delivery request safely');
|
|
277
|
+
send.action(async (sendOptions) => run(async () => {
|
|
278
|
+
let request;
|
|
279
|
+
if (sendOptions.input) {
|
|
280
|
+
if (sendOptions.draft || sendOptions.sendAt || hasMessageContentOptions(sendOptions)) {
|
|
281
|
+
throw new EmailError('invalid_request', '--input cannot be combined with draft, scheduling, or message content options.');
|
|
282
|
+
}
|
|
283
|
+
request = readJsonInput(sendOptions.input);
|
|
284
|
+
}
|
|
285
|
+
else if (sendOptions.draft) {
|
|
286
|
+
if (hasMessageContentOptions(sendOptions)) {
|
|
287
|
+
throw new EmailError('invalid_request', '--draft cannot be combined with message content options.');
|
|
288
|
+
}
|
|
289
|
+
request = { draftId: sendOptions.draft, ...(sendOptions.sendAt ? { sendAt: sendOptions.sendAt } : {}) };
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
request = {
|
|
293
|
+
...messageRequest(sendOptions),
|
|
294
|
+
...(sendOptions.sendAt ? { sendAt: sendOptions.sendAt } : {}),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
const { client, accountId } = await accountContext();
|
|
298
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/send`, jsonRequest(request, { 'idempotency-key': sendOptions.idempotencyKey ?? randomUUID() })));
|
|
299
|
+
})());
|
|
300
|
+
const forward = emails
|
|
301
|
+
.command('forward')
|
|
302
|
+
.argument('<message-id>', 'Provider message ID')
|
|
303
|
+
.description('Forward a message')
|
|
304
|
+
.option('--to <address>', 'Add a To recipient; repeat as needed', collect, [])
|
|
305
|
+
.option('--cc <address>', 'Add a Cc recipient; repeat as needed', collect, [])
|
|
306
|
+
.option('--comment <text>', 'Add a comment above the forwarded message')
|
|
307
|
+
.option('--no-attachments', 'Do not include attachments from the original message')
|
|
308
|
+
.option('--idempotency-key <key>', 'Reuse a delivery request safely')
|
|
309
|
+
.option('--input <file>', 'Read an exact REST JSON body from a file, or pass - for stdin');
|
|
310
|
+
forward.action(async (messageId, forwardOptions) => run(async () => {
|
|
311
|
+
let request;
|
|
312
|
+
if (forwardOptions.input) {
|
|
313
|
+
if (forwardOptions.to.length ||
|
|
314
|
+
forwardOptions.cc.length ||
|
|
315
|
+
forwardOptions.comment !== undefined ||
|
|
316
|
+
forwardOptions.attachments === false) {
|
|
317
|
+
throw new EmailError('invalid_request', '--input cannot be combined with forwarding options.');
|
|
318
|
+
}
|
|
319
|
+
request = readJsonInput(forwardOptions.input);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
request = {
|
|
323
|
+
to: parseAddresses(forwardOptions.to),
|
|
324
|
+
...(forwardOptions.cc.length ? { cc: parseAddresses(forwardOptions.cc) } : {}),
|
|
325
|
+
...(forwardOptions.comment !== undefined ? { comment: forwardOptions.comment } : {}),
|
|
326
|
+
includeAttachments: forwardOptions.attachments,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
const { client, accountId } = await accountContext();
|
|
330
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/${encodeURIComponent(messageId)}/forward`, jsonRequest(request, { 'idempotency-key': forwardOptions.idempotencyKey ?? randomUUID() })));
|
|
331
|
+
})());
|
|
332
|
+
const modify = emails
|
|
333
|
+
.command('modify')
|
|
334
|
+
.argument('[action]', 'Message action, such as mark-read, archive, move, or add-labels')
|
|
335
|
+
.argument('[message-ids...]', 'Provider message IDs')
|
|
336
|
+
.description('Apply one action to one or more messages')
|
|
337
|
+
.option('--folder <folder>', 'Destination folder for move')
|
|
338
|
+
.option('--label <label>', 'Label or Outlook category; repeat as needed', collect, [])
|
|
339
|
+
.option('--input <file>', 'Read an exact REST JSON body from a file, or pass - for stdin');
|
|
340
|
+
modify.action(async (action, messageIds, modifyOptions) => run(async () => {
|
|
341
|
+
let request;
|
|
342
|
+
if (modifyOptions.input) {
|
|
343
|
+
if (action || messageIds.length || modifyOptions.folder || modifyOptions.label.length) {
|
|
344
|
+
throw new EmailError('invalid_request', '--input cannot be combined with action, message IDs, or options.');
|
|
345
|
+
}
|
|
346
|
+
request = readJsonInput(modifyOptions.input);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
if (!action || !messageIds.length) {
|
|
350
|
+
throw new EmailError('invalid_request', 'Pass an action and at least one message ID.');
|
|
351
|
+
}
|
|
352
|
+
const normalizedAction = MODIFY_ACTIONS[action];
|
|
353
|
+
if (!normalizedAction) {
|
|
354
|
+
throw new EmailError('invalid_request', `Unknown message action "${action}".`);
|
|
355
|
+
}
|
|
356
|
+
request = {
|
|
357
|
+
messageIds,
|
|
358
|
+
action: normalizedAction,
|
|
359
|
+
...(modifyOptions.folder ? { folder: modifyOptions.folder } : {}),
|
|
360
|
+
...(modifyOptions.label.length ? { labels: modifyOptions.label } : {}),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
const { client, accountId } = await accountContext();
|
|
364
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/actions`, jsonRequest(request)));
|
|
365
|
+
})());
|
|
366
|
+
const threads = program.command('threads').description('Read email threads');
|
|
367
|
+
threads
|
|
368
|
+
.command('get')
|
|
369
|
+
.argument('<thread-id>', 'Provider thread ID')
|
|
370
|
+
.description('Get a complete thread')
|
|
371
|
+
.action(async (threadId) => run(async () => {
|
|
372
|
+
const { client, accountId } = await accountContext();
|
|
373
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/threads/${encodeURIComponent(threadId)}`));
|
|
374
|
+
})());
|
|
375
|
+
const drafts = program.command('drafts').description('Create and manage drafts');
|
|
376
|
+
const createDraft = addMessageContentOptions(drafts.command('create').description('Create a draft'));
|
|
377
|
+
createDraft.action(async (draftOptions) => run(async () => {
|
|
378
|
+
const request = messageRequest(draftOptions);
|
|
379
|
+
const { client, accountId } = await accountContext();
|
|
380
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/drafts`, jsonRequest(request)));
|
|
381
|
+
})());
|
|
382
|
+
const updateDraft = addMessageContentOptions(drafts.command('update').argument('<draft-id>', 'Provider draft ID').description('Replace the content of a draft'));
|
|
383
|
+
updateDraft.action(async (draftId, draftOptions) => run(async () => {
|
|
384
|
+
const request = messageRequest(draftOptions);
|
|
385
|
+
const { client, accountId } = await accountContext();
|
|
386
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/drafts/${encodeURIComponent(draftId)}`, {
|
|
387
|
+
...jsonRequest(request),
|
|
388
|
+
method: 'PUT',
|
|
389
|
+
}));
|
|
390
|
+
})());
|
|
391
|
+
drafts
|
|
392
|
+
.command('delete')
|
|
393
|
+
.argument('<draft-id>', 'Provider draft ID')
|
|
394
|
+
.description('Delete a draft')
|
|
395
|
+
.action(async (draftId) => run(async () => {
|
|
396
|
+
const { client, accountId } = await accountContext();
|
|
397
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/drafts/${encodeURIComponent(draftId)}`, { method: 'DELETE' }));
|
|
398
|
+
})());
|
|
399
|
+
const scheduled = program.command('scheduled').description('Manage scheduled sends');
|
|
400
|
+
scheduled
|
|
401
|
+
.command('list')
|
|
402
|
+
.description('List scheduled sends')
|
|
403
|
+
.action(run(async () => {
|
|
404
|
+
const { client, accountId } = await accountContext();
|
|
405
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/scheduled-sends`));
|
|
406
|
+
}));
|
|
407
|
+
scheduled
|
|
408
|
+
.command('cancel')
|
|
409
|
+
.argument('<schedule-id>', 'Scheduled send ID')
|
|
410
|
+
.description('Cancel a scheduled send and keep its draft')
|
|
411
|
+
.action(async (scheduleId) => run(async () => {
|
|
412
|
+
const { client, accountId } = await accountContext();
|
|
413
|
+
await printEnvelope(client.jsonEnvelope(`/api/v1/accounts/${encodeURIComponent(accountId)}/scheduled-sends/${encodeURIComponent(scheduleId)}`, { method: 'DELETE' }));
|
|
414
|
+
})());
|
|
415
|
+
const attachments = program.command('attachments').description('Download message attachments');
|
|
416
|
+
attachments
|
|
417
|
+
.command('download')
|
|
418
|
+
.argument('<message-id>', 'Provider message ID')
|
|
419
|
+
.argument('<attachment-id>', 'Provider attachment ID')
|
|
420
|
+
.requiredOption('--output <path>', 'Write the attachment to this path')
|
|
421
|
+
.option('--force', 'Overwrite an existing file')
|
|
422
|
+
.description('Download an attachment')
|
|
423
|
+
.action(async (messageId, attachmentId, downloadOptions) => run(async () => {
|
|
424
|
+
const outputPath = path.resolve(downloadOptions.output);
|
|
425
|
+
if (!downloadOptions.force && existsSync(outputPath)) {
|
|
426
|
+
throw new EmailError('invalid_request', `Output file already exists: ${outputPath}`);
|
|
427
|
+
}
|
|
428
|
+
const { client, accountId } = await accountContext();
|
|
429
|
+
const response = await client.request(`/api/v1/accounts/${encodeURIComponent(accountId)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`);
|
|
430
|
+
if (!response.ok)
|
|
431
|
+
await responseError(response);
|
|
432
|
+
const content = Buffer.from(await response.arrayBuffer());
|
|
433
|
+
try {
|
|
434
|
+
writeFileSync(outputPath, content, { flag: downloadOptions.force ? 'w' : 'wx' });
|
|
435
|
+
}
|
|
436
|
+
catch (error) {
|
|
437
|
+
throw new EmailError('invalid_request', `Could not write attachment to ${outputPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
438
|
+
}
|
|
439
|
+
const warning = response.headers.get('fluxmail-warning');
|
|
440
|
+
printJson({
|
|
441
|
+
data: {
|
|
442
|
+
output: outputPath,
|
|
443
|
+
mimeType: response.headers.get('content-type') ?? 'application/octet-stream',
|
|
444
|
+
sizeBytes: content.length,
|
|
445
|
+
},
|
|
446
|
+
...(warning ? { warnings: [warning] } : {}),
|
|
447
|
+
});
|
|
448
|
+
})());
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=cliMail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliMail.js","sourceRoot":"","sources":["../src/cliMail.ts"],"names":[],"mappings":"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"}
|