@bobfrankston/rmfmail 1.2.232 → 1.2.233
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/client/android-bootstrap.bundle.js +164 -152
- package/client/android-bootstrap.bundle.js.map +4 -4
- package/client/app.bundle.js +10 -104
- package/client/app.bundle.js.map +4 -4
- package/client/components/message-list.js +0 -60
- package/client/components/message-list.js.map +1 -1
- package/client/components/message-list.ts +0 -56
- package/client/compose/compose.bundle.js +1 -12
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/compose/compose.html +0 -8
- package/client/compose/ghost-text.js +0 -8
- package/client/compose/ghost-text.js.map +1 -1
- package/client/compose/ghost-text.ts +0 -6
- package/client/compose/spellcheck-core.js +0 -1
- package/client/compose/spellcheck-core.js.map +1 -1
- package/client/compose/spellcheck-core.ts +0 -1
- package/client/index.html +0 -8
- package/client/lib/local-service.js +0 -73
- package/client/lib/local-service.js.map +1 -1
- package/client/lib/local-service.ts +0 -71
- package/client/lib/local-store.js +0 -3
- package/client/lib/local-store.js.map +1 -1
- package/client/lib/local-store.ts +0 -4
- package/package.json +1 -3
- package/packages/mailx-host/index.d.ts +0 -1
- package/packages/mailx-host/index.d.ts.map +1 -1
- package/packages/mailx-host/index.js +0 -1
- package/packages/mailx-host/index.js.map +1 -1
- package/packages/mailx-host/index.ts +0 -1
- package/packages/mailx-host/package.json +1 -1
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +36 -139
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +36 -148
- package/packages/mailx-settings/cloud.d.ts +0 -5
- package/packages/mailx-settings/cloud.d.ts.map +1 -1
- package/packages/mailx-settings/cloud.js +0 -16
- package/packages/mailx-settings/cloud.js.map +1 -1
- package/packages/mailx-settings/cloud.ts +0 -12
- package/packages/mailx-settings/index.d.ts +0 -3
- package/packages/mailx-settings/index.d.ts.map +1 -1
- package/packages/mailx-settings/index.js +0 -5
- package/packages/mailx-settings/index.js.map +1 -1
- package/packages/mailx-settings/index.ts +0 -7
- package/packages/mailx-store-web/main-thread-host.d.ts +1 -1
- package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -1
- package/packages/mailx-store-web/main-thread-host.js +1 -38
- package/packages/mailx-store-web/main-thread-host.js.map +1 -1
- package/packages/mailx-store-web/main-thread-host.ts +0 -42
- package/packages/mailx-store-web/package.json +1 -1
- package/packages/mailx-store-web/web-service.d.ts.map +1 -1
- package/packages/mailx-store-web/web-service.js +28 -114
- package/packages/mailx-store-web/web-service.js.map +1 -1
- package/packages/mailx-store-web/web-service.ts +28 -124
- package/packages/mailx-store-web/web-settings.d.ts +0 -4
- package/packages/mailx-store-web/web-settings.d.ts.map +1 -1
- package/packages/mailx-store-web/web-settings.js +0 -29
- package/packages/mailx-store-web/web-settings.js.map +1 -1
- package/packages/mailx-store-web/web-settings.ts +0 -24
- package/packages/mailx-types/index.d.ts +2 -0
- package/packages/mailx-types/index.d.ts.map +1 -1
- package/packages/mailx-types/index.js +1 -0
- package/packages/mailx-types/index.js.map +1 -1
- package/packages/mailx-types/index.ts +2 -0
- package/packages/mailx-types/mime-build.d.ts +74 -0
- package/packages/mailx-types/mime-build.d.ts.map +1 -0
- package/packages/mailx-types/mime-build.js +160 -0
- package/packages/mailx-types/mime-build.js.map +1 -0
- package/packages/mailx-types/mime-build.ts +217 -0
- package/packages/mailx-types/package.json +1 -1
- package/packages/mailx-types/test/mime-build.test.mjs +200 -0
- package/client/components/calendar.js +0 -220
- package/client/components/calendar.js.map +0 -1
- package/client/components/calendar.ts +0 -213
- package/client/components/tasks.js +0 -261
- package/client/components/tasks.js.map +0 -1
- package/client/components/tasks.ts +0 -234
- package/packages/mailx-compose/.gitattributes +0 -10
- package/packages/mailx-compose/index.d.ts +0 -21
- package/packages/mailx-compose/index.d.ts.map +0 -1
- package/packages/mailx-compose/index.js +0 -66
- package/packages/mailx-compose/index.js.map +0 -1
- package/packages/mailx-compose/index.ts +0 -91
- package/packages/mailx-compose/package.json +0 -18
- package/packages/mailx-compose/tsconfig.json +0 -9
- package/packages/mailx-core/index.d.ts +0 -142
- package/packages/mailx-core/index.d.ts.map +0 -1
- package/packages/mailx-core/index.js +0 -430
- package/packages/mailx-core/index.js.map +0 -1
- package/packages/mailx-core/index.ts +0 -450
- package/packages/mailx-core/ipc.d.ts +0 -13
- package/packages/mailx-core/ipc.d.ts.map +0 -1
- package/packages/mailx-core/ipc.js +0 -56
- package/packages/mailx-core/ipc.js.map +0 -1
- package/packages/mailx-core/ipc.ts +0 -62
- package/packages/mailx-core/package.json +0 -18
- package/packages/mailx-core/tsconfig.json +0 -9
- package/packages/mailx-send/.gitattributes +0 -10
- package/packages/mailx-send/README.md +0 -217
- package/packages/mailx-send/cli-queue.d.ts +0 -11
- package/packages/mailx-send/cli-queue.d.ts.map +0 -1
- package/packages/mailx-send/cli-queue.js +0 -59
- package/packages/mailx-send/cli-queue.js.map +0 -1
- package/packages/mailx-send/cli-queue.ts +0 -62
- package/packages/mailx-send/cli-send.d.ts +0 -17
- package/packages/mailx-send/cli-send.d.ts.map +0 -1
- package/packages/mailx-send/cli-send.js +0 -75
- package/packages/mailx-send/cli-send.js.map +0 -1
- package/packages/mailx-send/cli-send.ts +0 -83
- package/packages/mailx-send/cli.d.ts +0 -22
- package/packages/mailx-send/cli.d.ts.map +0 -1
- package/packages/mailx-send/cli.js +0 -115
- package/packages/mailx-send/cli.js.map +0 -1
- package/packages/mailx-send/cli.ts +0 -126
- package/packages/mailx-send/index.d.ts +0 -77
- package/packages/mailx-send/index.d.ts.map +0 -1
- package/packages/mailx-send/index.js +0 -269
- package/packages/mailx-send/index.js.map +0 -1
- package/packages/mailx-send/index.ts +0 -338
- package/packages/mailx-send/mailsend/README.md +0 -133
- package/packages/mailx-send/mailsend/cli.d.ts +0 -12
- package/packages/mailx-send/mailsend/cli.d.ts.map +0 -1
- package/packages/mailx-send/mailsend/cli.js +0 -70
- package/packages/mailx-send/mailsend/cli.js.map +0 -1
- package/packages/mailx-send/mailsend/cli.ts +0 -81
- package/packages/mailx-send/mailsend/index.d.ts +0 -77
- package/packages/mailx-send/mailsend/index.d.ts.map +0 -1
- package/packages/mailx-send/mailsend/index.js +0 -264
- package/packages/mailx-send/mailsend/index.js.map +0 -1
- package/packages/mailx-send/mailsend/index.ts +0 -336
- package/packages/mailx-send/mailsend/package-lock.json +0 -65
- package/packages/mailx-send/mailsend/package.json +0 -26
- package/packages/mailx-send/mailsend/tsconfig.json +0 -21
- package/packages/mailx-send/package-lock.json +0 -65
- package/packages/mailx-send/package.json +0 -37
- package/packages/mailx-send/tsconfig.json +0 -21
- package/packages/mailx-server/.gitattributes +0 -10
- package/packages/mailx-server/index.d.ts +0 -8
- package/packages/mailx-server/index.d.ts.map +0 -1
- package/packages/mailx-server/index.js +0 -412
- package/packages/mailx-server/index.js.map +0 -1
- package/packages/mailx-server/index.ts +0 -445
- package/packages/mailx-server/package.json +0 -28
- package/packages/mailx-server/tsconfig.json +0 -9
- package/packages/mailx-server/tsconfig.tsbuildinfo +0 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-40260 → node_modules.npmglobalize-stash-40004}/.package-lock.json +0 -0
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @bobfrankston/mailx-core
|
|
3
|
-
* Core mail functions — callable directly via IPC or wrapped by Express.
|
|
4
|
-
* No HTTP, no Express, no WebSocket. Just plain async functions.
|
|
5
|
-
*/
|
|
6
|
-
import { MailxDB, FileMessageStore, Store, parseSerial } from "@bobfrankston/mailx-store";
|
|
7
|
-
import { ImapManager } from "@bobfrankston/mailx-imap";
|
|
8
|
-
import { loadSettings, saveSettings, loadAllowlist, saveAllowlist, getConfigDir, getStorePath, initLocalConfig } from "@bobfrankston/mailx-settings";
|
|
9
|
-
// ── Initialization ──
|
|
10
|
-
let db;
|
|
11
|
-
let imapManager;
|
|
12
|
-
const eventHandlers = [];
|
|
13
|
-
export function onEvent(handler) {
|
|
14
|
-
eventHandlers.push(handler);
|
|
15
|
-
}
|
|
16
|
-
function emit(event) {
|
|
17
|
-
for (const h of eventHandlers) {
|
|
18
|
-
try {
|
|
19
|
-
h(event);
|
|
20
|
-
}
|
|
21
|
-
catch { /* ignore handler errors */ }
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export async function initialize(transportFactory) {
|
|
25
|
-
initLocalConfig();
|
|
26
|
-
const dbDir = getConfigDir();
|
|
27
|
-
db = new MailxDB(dbDir);
|
|
28
|
-
const store = new Store(db, new FileMessageStore(getStorePath()));
|
|
29
|
-
imapManager = new ImapManager(store, transportFactory || (() => { throw new Error("No transport factory provided"); }));
|
|
30
|
-
// Seed contacts — async + chunked, runs in the background so it never
|
|
31
|
-
// blocks boot.
|
|
32
|
-
db.seedContactsFromMessages()
|
|
33
|
-
.then(seeded => { if (seeded > 0)
|
|
34
|
-
console.log(` Seeded ${seeded} contacts`); })
|
|
35
|
-
.catch(e => console.error(` contact seed failed: ${e?.message || e}`));
|
|
36
|
-
// Search index — only if empty
|
|
37
|
-
let ftsCount = 0;
|
|
38
|
-
try {
|
|
39
|
-
ftsCount = db.db.prepare("SELECT COUNT(*) as cnt FROM messages_fts").get()?.cnt || 0;
|
|
40
|
-
}
|
|
41
|
-
catch { /* */ }
|
|
42
|
-
if (ftsCount === 0) {
|
|
43
|
-
const indexed = db.rebuildSearchIndex();
|
|
44
|
-
if (indexed > 0)
|
|
45
|
-
console.log(` Search index: ${indexed} messages`);
|
|
46
|
-
}
|
|
47
|
-
// One-time background conversion of an existing index to the trigram
|
|
48
|
-
// tokenizer (substring search). Long-lived host only — no-op once done.
|
|
49
|
-
db.startFtsTrigramMigration();
|
|
50
|
-
// Add accounts
|
|
51
|
-
const settings = loadSettings();
|
|
52
|
-
for (const account of settings.accounts) {
|
|
53
|
-
if (!account.enabled)
|
|
54
|
-
continue;
|
|
55
|
-
try {
|
|
56
|
-
await imapManager.addAccount(account);
|
|
57
|
-
console.log(` Account added: ${account.name} (${account.id})`);
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
60
|
-
console.error(` Failed to add account ${account.id}: ${e.message}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Wire events to push notifications
|
|
64
|
-
imapManager.on("syncProgress", (accountId, phase, progress) => {
|
|
65
|
-
emit({ type: "syncProgress", accountId, phase, progress });
|
|
66
|
-
});
|
|
67
|
-
imapManager.on("folderCountsChanged", (accountId, counts) => {
|
|
68
|
-
emit({ type: "folderCountsChanged", accountId, counts });
|
|
69
|
-
});
|
|
70
|
-
// Initial sync + IDLE
|
|
71
|
-
if (settings.accounts.some(a => a.enabled)) {
|
|
72
|
-
console.log(" Starting initial sync...");
|
|
73
|
-
imapManager.syncAll().then(async () => {
|
|
74
|
-
console.log(" Initial sync complete");
|
|
75
|
-
await imapManager.startWatching();
|
|
76
|
-
imapManager.syncAllContacts().catch(e => console.error(` Google Contacts sync error: ${e.message}`));
|
|
77
|
-
}).catch(e => {
|
|
78
|
-
console.error(` Initial sync error: ${e.message}`);
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
imapManager.startPeriodicSync(settings.sync.intervalMinutes);
|
|
82
|
-
imapManager.startOutboxWorker();
|
|
83
|
-
}
|
|
84
|
-
export async function shutdown() {
|
|
85
|
-
imapManager?.stopPeriodicSync();
|
|
86
|
-
imapManager?.stopOutboxWorker();
|
|
87
|
-
await imapManager?.shutdown();
|
|
88
|
-
db?.close();
|
|
89
|
-
}
|
|
90
|
-
// ── HTML Sanitization ──
|
|
91
|
-
function sanitizeHtml(html) {
|
|
92
|
-
let hasRemoteContent = false;
|
|
93
|
-
let clean = html.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, "");
|
|
94
|
-
clean = clean.replace(/\s+on\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi, "");
|
|
95
|
-
clean = clean.replace(/<img\b([^>]*)\bsrc\s*=\s*("[^"]*"|'[^']*')/gi, (match, before, src) => {
|
|
96
|
-
const url = src.slice(1, -1);
|
|
97
|
-
if (url.startsWith("data:") || url.startsWith("cid:"))
|
|
98
|
-
return match;
|
|
99
|
-
hasRemoteContent = true;
|
|
100
|
-
return `<img${before}src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Crect fill='%23888' width='20' height='20' rx='3'/%3E%3Ctext x='10' y='14' text-anchor='middle' fill='white' font-size='12'%3E⊘%3C/text%3E%3C/svg%3E" data-blocked-src=${src} title="Remote image blocked"`;
|
|
101
|
-
});
|
|
102
|
-
clean = clean.replace(/<link\b[^>]*rel\s*=\s*["']stylesheet["'][^>]*>/gi, (match) => {
|
|
103
|
-
hasRemoteContent = true;
|
|
104
|
-
return `<!-- blocked: ${match.replace(/--/g, "")} -->`;
|
|
105
|
-
});
|
|
106
|
-
clean = clean.replace(/url\s*\(\s*(['"]?)(https?:\/\/[^)]+)\1\s*\)/gi, (_match, _q, url) => {
|
|
107
|
-
hasRemoteContent = true;
|
|
108
|
-
return `url("") /* blocked: ${url} */`;
|
|
109
|
-
});
|
|
110
|
-
clean = clean.replace(/<\/?form\b[^>]*>/gi, "");
|
|
111
|
-
clean = clean.replace(/<iframe\b[^>]*>[\s\S]*?<\/iframe>/gi, "");
|
|
112
|
-
return { html: clean, hasRemoteContent };
|
|
113
|
-
}
|
|
114
|
-
// ── API Functions ──
|
|
115
|
-
export function getAccounts() {
|
|
116
|
-
return db.getAccounts();
|
|
117
|
-
}
|
|
118
|
-
export function getFolders(params) {
|
|
119
|
-
return db.getFolders(params.accountId);
|
|
120
|
-
}
|
|
121
|
-
export function getMessages(params) {
|
|
122
|
-
return db.getMessages({
|
|
123
|
-
accountId: params.accountId,
|
|
124
|
-
folderId: params.folderId,
|
|
125
|
-
page: params.page || 1,
|
|
126
|
-
pageSize: params.pageSize || 50,
|
|
127
|
-
sort: params.sort || "date",
|
|
128
|
-
sortDir: params.sortDir || "desc",
|
|
129
|
-
search: params.search,
|
|
130
|
-
flaggedOnly: params.flaggedOnly,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
export function getUnifiedInbox(params) {
|
|
134
|
-
return db.getUnifiedInbox(params.page, params.pageSize);
|
|
135
|
-
}
|
|
136
|
-
export async function getMessage(params) {
|
|
137
|
-
const { accountId, uid } = params;
|
|
138
|
-
let allowRemote = params.allowRemote || false;
|
|
139
|
-
const envelope = db.getMessageByUid(accountId, uid, params.folderId);
|
|
140
|
-
if (!envelope)
|
|
141
|
-
throw new Error("Message not found");
|
|
142
|
-
let bodyHtml = "";
|
|
143
|
-
let bodyText = "";
|
|
144
|
-
let hasRemoteContent = false;
|
|
145
|
-
let attachments = [];
|
|
146
|
-
let deliveredTo = "";
|
|
147
|
-
let returnPath = "";
|
|
148
|
-
let listUnsubscribe = "";
|
|
149
|
-
let listUnsubscribeMail = "";
|
|
150
|
-
let listUnsubscribeHttp = "";
|
|
151
|
-
let listUnsubscribeOneClick = false;
|
|
152
|
-
const raw = await imapManager.fetchMessageBody(accountId, envelope.folderId, envelope.uid);
|
|
153
|
-
if (raw) {
|
|
154
|
-
const parsed = await parseSerial(raw);
|
|
155
|
-
bodyHtml = parsed.html || "";
|
|
156
|
-
bodyText = parsed.text || "";
|
|
157
|
-
attachments = (parsed.attachments || []).map((a, i) => ({
|
|
158
|
-
id: i,
|
|
159
|
-
filename: a.filename || `attachment-${i}`,
|
|
160
|
-
mimeType: a.contentType || "application/octet-stream",
|
|
161
|
-
size: a.size || 0,
|
|
162
|
-
contentId: a.contentId || "",
|
|
163
|
-
}));
|
|
164
|
-
// Extract useful headers for the UI
|
|
165
|
-
const hdr = (key) => {
|
|
166
|
-
let v = parsed.headers.get(key);
|
|
167
|
-
if (!v)
|
|
168
|
-
return "";
|
|
169
|
-
if (Array.isArray(v))
|
|
170
|
-
v = v[0];
|
|
171
|
-
if (typeof v === "string")
|
|
172
|
-
return v;
|
|
173
|
-
if (typeof v === "object" && v !== null) {
|
|
174
|
-
if ("text" in v)
|
|
175
|
-
return v.text || "";
|
|
176
|
-
if ("value" in v)
|
|
177
|
-
return String(v.value);
|
|
178
|
-
if ("address" in v)
|
|
179
|
-
return v.address || "";
|
|
180
|
-
}
|
|
181
|
-
return String(v);
|
|
182
|
-
};
|
|
183
|
-
// Get the real Delivered-To, skipping relay domains from account config.
|
|
184
|
-
// Prefix-strip is gone — mlproc cleans the header server-side now.
|
|
185
|
-
const settings = loadSettings();
|
|
186
|
-
const acctConfig = settings.accounts.find(a => a.id === accountId);
|
|
187
|
-
const relayDomains = acctConfig?.relayDomains || [];
|
|
188
|
-
const rawDelivered = parsed.headers.get("delivered-to");
|
|
189
|
-
if (rawDelivered) {
|
|
190
|
-
const deliveredList = Array.isArray(rawDelivered) ? rawDelivered : [rawDelivered];
|
|
191
|
-
// Iterate FIRST → last. Each delivery agent PREPENDS its own
|
|
192
|
-
// Delivered-To, so the first (topmost) header is the final
|
|
193
|
-
// delivery to the user's actual mailbox; later ones are earlier
|
|
194
|
-
// forwarding hops / internal routing artifacts. The old loop ran
|
|
195
|
-
// backwards and picked the LAST one — on a forwarded message that
|
|
196
|
-
// grabbed a stale hop (Bob 2026-05-21: a malformed two-@
|
|
197
|
-
// `…@elkin.ws@trap-prot` trap-protection address). Relay domains
|
|
198
|
-
// from account config are still skipped so a leading relay hop
|
|
199
|
-
// doesn't win over the real address.
|
|
200
|
-
for (let i = 0; i < deliveredList.length; i++) {
|
|
201
|
-
const d = deliveredList[i];
|
|
202
|
-
const addr = typeof d === "string" ? d : d?.text || d?.address || String(d);
|
|
203
|
-
if (!relayDomains.some((rd) => addr.includes(`@${rd}`))) {
|
|
204
|
-
deliveredTo = addr;
|
|
205
|
-
break;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
if (!deliveredTo && deliveredList.length > 0) {
|
|
209
|
-
// All entries were relay domains — fall back to the first.
|
|
210
|
-
const d = deliveredList[0];
|
|
211
|
-
deliveredTo = typeof d === "string" ? d : d?.text || d?.address || String(d);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
returnPath = hdr("return-path").replace(/[<>]/g, "");
|
|
215
|
-
({ listUnsubscribeMail, listUnsubscribeHttp, listUnsubscribeOneClick } =
|
|
216
|
-
parseListUnsubscribe(parsed.headers));
|
|
217
|
-
listUnsubscribe = listUnsubscribeHttp || listUnsubscribeMail;
|
|
218
|
-
}
|
|
219
|
-
if (bodyHtml && !allowRemote) {
|
|
220
|
-
const allowList = loadAllowlist();
|
|
221
|
-
const senderAddr = envelope.from?.address || "";
|
|
222
|
-
const senderDomain = senderAddr.split("@")[1] || "";
|
|
223
|
-
const toAddrs = (envelope.to || []).map((a) => a.address);
|
|
224
|
-
const isAllowed = allowList.senders.includes(senderAddr) ||
|
|
225
|
-
allowList.domains.includes(senderDomain) ||
|
|
226
|
-
toAddrs.some((a) => allowList.recipients?.includes(a));
|
|
227
|
-
if (isAllowed) {
|
|
228
|
-
allowRemote = true;
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
const result = sanitizeHtml(bodyHtml);
|
|
232
|
-
bodyHtml = result.html;
|
|
233
|
-
hasRemoteContent = result.hasRemoteContent;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
// Build .eml file path for "View Source"
|
|
237
|
-
const storePath = getStorePath();
|
|
238
|
-
const emlPath = `${storePath}/${accountId}/${envelope.folderId}/${envelope.uid}.eml`;
|
|
239
|
-
return { ...envelope, bodyHtml, bodyText, hasRemoteContent, remoteAllowed: allowRemote, attachments, deliveredTo, returnPath, listUnsubscribe, listUnsubscribeMail, listUnsubscribeHttp, listUnsubscribeOneClick, emlPath };
|
|
240
|
-
}
|
|
241
|
-
/** Parse `List-Unsubscribe` (RFC 2369) and `List-Unsubscribe-Post` (RFC 8058).
|
|
242
|
-
* Returns mailto URL, HTTPS URL, and whether one-click POST is allowed.
|
|
243
|
-
* mailparser only exposes ONE of mail/url even when both are present, so we
|
|
244
|
-
* also scan the raw header text for the full set of angle-bracketed URIs. */
|
|
245
|
-
function parseListUnsubscribe(headers) {
|
|
246
|
-
let mail = "";
|
|
247
|
-
let http = "";
|
|
248
|
-
let oneClick = false;
|
|
249
|
-
// Raw header scan — most reliable.
|
|
250
|
-
const raw = headers.get("list-unsubscribe");
|
|
251
|
-
const rawStr = typeof raw === "string" ? raw : (raw && typeof raw.text === "string" ? raw.text : "");
|
|
252
|
-
if (rawStr) {
|
|
253
|
-
const matches = rawStr.match(/<([^>]+)>/g) || [];
|
|
254
|
-
for (const m of matches) {
|
|
255
|
-
const url = m.slice(1, -1).trim();
|
|
256
|
-
if (!mail && /^mailto:/i.test(url))
|
|
257
|
-
mail = url;
|
|
258
|
-
else if (!http && /^https?:/i.test(url))
|
|
259
|
-
http = url;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
// mailparser fallback — for builds where headers.get returns the parsed object.
|
|
263
|
-
if (!mail && !http) {
|
|
264
|
-
const listHeaders = headers.get("list");
|
|
265
|
-
if (listHeaders?.unsubscribe) {
|
|
266
|
-
const unsub = listHeaders.unsubscribe;
|
|
267
|
-
if (unsub.url)
|
|
268
|
-
http = Array.isArray(unsub.url) ? unsub.url[0] : unsub.url;
|
|
269
|
-
if (unsub.mail)
|
|
270
|
-
mail = `mailto:${Array.isArray(unsub.mail) ? unsub.mail[0] : unsub.mail}`;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
const post = headers.get("list-unsubscribe-post");
|
|
274
|
-
const postStr = typeof post === "string" ? post : (post && typeof post.text === "string" ? post.text : "");
|
|
275
|
-
if (postStr && /one-?click/i.test(postStr))
|
|
276
|
-
oneClick = true;
|
|
277
|
-
return { listUnsubscribeMail: mail, listUnsubscribeHttp: http, listUnsubscribeOneClick: oneClick };
|
|
278
|
-
}
|
|
279
|
-
export async function updateFlags(params) {
|
|
280
|
-
const envelope = db.getMessageByUid(params.accountId, params.uid);
|
|
281
|
-
const folderId = envelope?.folderId || 0;
|
|
282
|
-
db.updateMessageFlags(params.accountId, folderId, params.uid, params.flags);
|
|
283
|
-
db.queueSyncAction(params.accountId, "flags", params.uid, folderId, { flags: params.flags });
|
|
284
|
-
// Best-effort drain; failures retry from the next reconciler pass.
|
|
285
|
-
imapManager.processSyncActions(params.accountId).catch(() => { });
|
|
286
|
-
}
|
|
287
|
-
export async function deleteMessage(params) {
|
|
288
|
-
const envelope = db.getMessageByUid(params.accountId, params.uid);
|
|
289
|
-
if (!envelope)
|
|
290
|
-
throw new Error("Message not found");
|
|
291
|
-
// mailx-core has its own DB/imapManager refs but no LocalStore — inline
|
|
292
|
-
// the trash + queue ops here. (This package is unused; see refactor notes.)
|
|
293
|
-
const folders = db.getFolders(params.accountId);
|
|
294
|
-
const trash = folders.find(f => f.specialUse === "trash" || f.path.toLowerCase() === "trash");
|
|
295
|
-
if (trash && trash.id !== envelope.folderId) {
|
|
296
|
-
db.moveMessageLocal(params.accountId, params.uid, envelope.folderId, trash.id);
|
|
297
|
-
db.queueSyncAction(params.accountId, "move", params.uid, envelope.folderId, { targetFolderId: trash.id });
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
db.deleteMessage(params.accountId, envelope.folderId, params.uid, "mailx-core deleteMessage (no trash)", "mailx-core");
|
|
301
|
-
db.queueSyncAction(params.accountId, "delete", params.uid, envelope.folderId);
|
|
302
|
-
}
|
|
303
|
-
imapManager.processSyncActions(params.accountId).catch(() => { });
|
|
304
|
-
}
|
|
305
|
-
export async function undeleteMessage(params) {
|
|
306
|
-
const folders = db.getFolders(params.accountId);
|
|
307
|
-
const trash = folders.find(f => f.specialUse === "trash" || f.path.toLowerCase() === "trash");
|
|
308
|
-
if (!trash)
|
|
309
|
-
throw new Error("No Trash folder configured");
|
|
310
|
-
db.moveMessageLocal(params.accountId, params.uid, trash.id, params.folderId);
|
|
311
|
-
db.queueSyncAction(params.accountId, "move", params.uid, trash.id, { targetFolderId: params.folderId });
|
|
312
|
-
imapManager.processSyncActions(params.accountId).catch(() => { });
|
|
313
|
-
}
|
|
314
|
-
export async function sendMessage(params) {
|
|
315
|
-
const settings = loadSettings();
|
|
316
|
-
const account = settings.accounts.find(a => a.id === params.from);
|
|
317
|
-
if (!account)
|
|
318
|
-
throw new Error(`Unknown account: ${params.from}`);
|
|
319
|
-
const to = params.to.map(a => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
|
|
320
|
-
const cc = params.cc?.map(a => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
|
|
321
|
-
const bcc = params.bcc?.map(a => a.name ? `${a.name} <${a.address}>` : a.address).join(", ");
|
|
322
|
-
const headers = [
|
|
323
|
-
`From: ${account.name} <${account.email}>`,
|
|
324
|
-
`To: ${to}`,
|
|
325
|
-
cc ? `Cc: ${cc}` : null,
|
|
326
|
-
bcc ? `Bcc: ${bcc}` : null,
|
|
327
|
-
`Subject: ${params.subject}`,
|
|
328
|
-
`Date: ${new Date().toUTCString()}`,
|
|
329
|
-
params.inReplyTo ? `In-Reply-To: ${params.inReplyTo}` : null,
|
|
330
|
-
params.references?.length ? `References: ${params.references.join(" ")}` : null,
|
|
331
|
-
`MIME-Version: 1.0`,
|
|
332
|
-
`Content-Type: text/html; charset=UTF-8`,
|
|
333
|
-
].filter(h => h !== null).join("\r\n");
|
|
334
|
-
const rawMessage = `${headers}\r\n\r\n${params.bodyHtml || params.bodyText || ""}`;
|
|
335
|
-
imapManager.queueOutgoingLocal(account.id, rawMessage);
|
|
336
|
-
for (const addr of params.to)
|
|
337
|
-
db.recordSentAddress(addr.name, addr.address);
|
|
338
|
-
if (params.cc)
|
|
339
|
-
for (const addr of params.cc)
|
|
340
|
-
db.recordSentAddress(addr.name, addr.address);
|
|
341
|
-
if (params.bcc)
|
|
342
|
-
for (const addr of params.bcc)
|
|
343
|
-
db.recordSentAddress(addr.name, addr.address);
|
|
344
|
-
}
|
|
345
|
-
export async function saveDraft(params) {
|
|
346
|
-
const settings = loadSettings();
|
|
347
|
-
const account = settings.accounts.find(a => a.id === params.accountId);
|
|
348
|
-
if (!account)
|
|
349
|
-
throw new Error(`Unknown account: ${params.accountId}`);
|
|
350
|
-
const headers = [
|
|
351
|
-
`From: ${account.name} <${account.email}>`,
|
|
352
|
-
params.to ? `To: ${params.to}` : null,
|
|
353
|
-
params.cc ? `Cc: ${params.cc}` : null,
|
|
354
|
-
`Subject: ${params.subject || "(no subject)"}`,
|
|
355
|
-
`Date: ${new Date().toUTCString()}`,
|
|
356
|
-
`MIME-Version: 1.0`,
|
|
357
|
-
`Content-Type: text/html; charset=UTF-8`,
|
|
358
|
-
].filter(h => h !== null).join("\r\n");
|
|
359
|
-
const raw = `${headers}\r\n\r\n${params.bodyHtml || params.bodyText || ""}`;
|
|
360
|
-
return await imapManager.saveDraft(params.accountId, raw, params.previousDraftUid);
|
|
361
|
-
}
|
|
362
|
-
export async function deleteDraft(params) {
|
|
363
|
-
await imapManager.deleteDraft(params.accountId, params.draftUid);
|
|
364
|
-
}
|
|
365
|
-
export function searchMessages(params) {
|
|
366
|
-
if (!params.query.trim())
|
|
367
|
-
return { items: [], total: 0, page: 1, pageSize: 50 };
|
|
368
|
-
return db.searchMessages(params.query, params.page || 1, params.pageSize || 50);
|
|
369
|
-
}
|
|
370
|
-
export function searchContacts(params) {
|
|
371
|
-
if (params.query.length < 1)
|
|
372
|
-
return [];
|
|
373
|
-
return db.searchContacts(params.query);
|
|
374
|
-
}
|
|
375
|
-
export async function syncAll() {
|
|
376
|
-
await imapManager.syncAll();
|
|
377
|
-
}
|
|
378
|
-
export function getSyncPending() {
|
|
379
|
-
return { pending: db.getTotalPendingSyncCount() };
|
|
380
|
-
}
|
|
381
|
-
export async function allowRemoteContent(params) {
|
|
382
|
-
const list = loadAllowlist();
|
|
383
|
-
if (params.type === "sender" && !list.senders.includes(params.value))
|
|
384
|
-
list.senders.push(params.value);
|
|
385
|
-
else if (params.type === "domain" && !list.domains.includes(params.value))
|
|
386
|
-
list.domains.push(params.value);
|
|
387
|
-
else if (params.type === "recipient") {
|
|
388
|
-
if (!list.recipients)
|
|
389
|
-
list.recipients = [];
|
|
390
|
-
if (!list.recipients.includes(params.value))
|
|
391
|
-
list.recipients.push(params.value);
|
|
392
|
-
}
|
|
393
|
-
await saveAllowlist(list);
|
|
394
|
-
}
|
|
395
|
-
export function getSettings() {
|
|
396
|
-
return loadSettings();
|
|
397
|
-
}
|
|
398
|
-
export function saveSettingsData(data) {
|
|
399
|
-
saveSettings(data);
|
|
400
|
-
}
|
|
401
|
-
export function rebuildSearchIndex() {
|
|
402
|
-
return db.rebuildSearchIndex();
|
|
403
|
-
}
|
|
404
|
-
export function seedContacts() {
|
|
405
|
-
return db.seedContactsFromMessages();
|
|
406
|
-
}
|
|
407
|
-
export async function syncGoogleContacts() {
|
|
408
|
-
await imapManager.syncAllContacts();
|
|
409
|
-
}
|
|
410
|
-
export function getVersion() {
|
|
411
|
-
return { server: "1.0.0", client: "1.0.0" }; // Updated by build
|
|
412
|
-
}
|
|
413
|
-
// ── Action dispatcher for IPC ──
|
|
414
|
-
const actions = {
|
|
415
|
-
getAccounts, getFolders, getMessages, getUnifiedInbox, getMessage,
|
|
416
|
-
updateFlags, deleteMessage, undeleteMessage, sendMessage,
|
|
417
|
-
saveDraft, deleteDraft, searchMessages, searchContacts,
|
|
418
|
-
syncAll, getSyncPending, allowRemoteContent,
|
|
419
|
-
getSettings, saveSettingsData, rebuildSearchIndex,
|
|
420
|
-
seedContacts, syncGoogleContacts, getVersion,
|
|
421
|
-
};
|
|
422
|
-
/** Dispatch an action by name — used by IPC and Express wrapper */
|
|
423
|
-
export async function dispatch(action, params = {}) {
|
|
424
|
-
const fn = actions[action];
|
|
425
|
-
if (!fn)
|
|
426
|
-
throw new Error(`Unknown action: ${action}`);
|
|
427
|
-
return await fn(params);
|
|
428
|
-
}
|
|
429
|
-
export { db, imapManager };
|
|
430
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|