@fluxmail/provider-imap 0.2.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/dist/body.d.ts +10 -0
- package/dist/body.d.ts.map +1 -0
- package/dist/body.js +56 -0
- package/dist/body.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/folders.d.ts +11 -0
- package/dist/folders.d.ts.map +1 -0
- package/dist/folders.js +93 -0
- package/dist/folders.js.map +1 -0
- package/dist/imapProvider.d.ts +73 -0
- package/dist/imapProvider.d.ts.map +1 -0
- package/dist/imapProvider.js +783 -0
- package/dist/imapProvider.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/mime.d.ts +8 -0
- package/dist/mime.d.ts.map +1 -0
- package/dist/mime.js +58 -0
- package/dist/mime.js.map +1 -0
- package/dist/query.d.ts +4 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +34 -0
- package/dist/query.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
package/dist/body.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AttachmentMeta, MessageBody } from '@fluxmail/core';
|
|
2
|
+
import type { ImapFlow, MessageStructureObject } from 'imapflow';
|
|
3
|
+
export interface BodyParts {
|
|
4
|
+
text?: string;
|
|
5
|
+
html?: string;
|
|
6
|
+
attachments: AttachmentMeta[];
|
|
7
|
+
}
|
|
8
|
+
export declare function inspectStructure(structure: MessageStructureObject | undefined): BodyParts;
|
|
9
|
+
export declare function downloadBody(client: ImapFlow, uid: number, parts: BodyParts): Promise<MessageBody>;
|
|
10
|
+
//# sourceMappingURL=body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,sBAAsB,GAAG,SAAS,GAAG,SAAS,CAiCzF;AAWD,wBAAsB,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAKxG"}
|
package/dist/body.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import iconv from 'iconv-lite';
|
|
2
|
+
export function inspectStructure(structure) {
|
|
3
|
+
const result = { attachments: [] };
|
|
4
|
+
if (!structure)
|
|
5
|
+
return result;
|
|
6
|
+
const visit = (node) => {
|
|
7
|
+
const part = node.part ?? (node === structure && !node.childNodes?.length ? '1' : undefined);
|
|
8
|
+
const disposition = node.disposition?.toLowerCase();
|
|
9
|
+
const filename = node.dispositionParameters?.filename ?? node.parameters?.name;
|
|
10
|
+
const mimeType = node.type.toLowerCase();
|
|
11
|
+
const attached = disposition === 'attachment' ||
|
|
12
|
+
Boolean(filename) ||
|
|
13
|
+
mimeType === 'message/rfc822' ||
|
|
14
|
+
(disposition === 'inline' && mimeType !== 'text/plain' && mimeType !== 'text/html') ||
|
|
15
|
+
(Boolean(node.id) && !mimeType.startsWith('text/'));
|
|
16
|
+
if (attached && part) {
|
|
17
|
+
result.attachments.push({
|
|
18
|
+
id: part,
|
|
19
|
+
filename: filename ?? 'attachment',
|
|
20
|
+
mimeType: node.type || 'application/octet-stream',
|
|
21
|
+
sizeBytes: node.size ?? 0,
|
|
22
|
+
...(node.id ? { contentId: node.id.replace(/^<|>$/g, '') } : {}),
|
|
23
|
+
disposition: disposition === 'inline' ? 'inline' : 'attachment',
|
|
24
|
+
});
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (part) {
|
|
28
|
+
if (mimeType === 'text/plain' && !result.text)
|
|
29
|
+
result.text = part;
|
|
30
|
+
if (mimeType === 'text/html' && !result.html)
|
|
31
|
+
result.html = part;
|
|
32
|
+
}
|
|
33
|
+
for (const child of node.childNodes ?? [])
|
|
34
|
+
visit(child);
|
|
35
|
+
};
|
|
36
|
+
visit(structure);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
async function readPart(client, uid, part) {
|
|
40
|
+
const { meta, content } = await client.download(uid, part, { uid: true });
|
|
41
|
+
const chunks = [];
|
|
42
|
+
for await (const chunk of content)
|
|
43
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
44
|
+
const bytes = Buffer.concat(chunks);
|
|
45
|
+
const charset = meta.charset && iconv.encodingExists(meta.charset) ? meta.charset : 'utf-8';
|
|
46
|
+
return iconv.decode(bytes, charset);
|
|
47
|
+
}
|
|
48
|
+
export async function downloadBody(client, uid, parts) {
|
|
49
|
+
const body = {};
|
|
50
|
+
if (parts.text)
|
|
51
|
+
body.text = await readPart(client, uid, parts.text);
|
|
52
|
+
if (parts.html)
|
|
53
|
+
body.html = await readPart(client, uid, parts.html);
|
|
54
|
+
return body;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=body.js.map
|
package/dist/body.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,gBAAgB,CAAC;AAE1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAWvD"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EmailError, isEmailError } from '@fluxmail/core';
|
|
2
|
+
export function mapImapError(error) {
|
|
3
|
+
if (isEmailError(error))
|
|
4
|
+
return error;
|
|
5
|
+
const value = error;
|
|
6
|
+
const message = value?.message ?? String(error);
|
|
7
|
+
if (value?.authenticationFailed || value?.code === 'EAUTH' || /auth|credential|login/i.test(message)) {
|
|
8
|
+
return new EmailError('auth_expired', `IMAP/SMTP authentication failed: ${message}`);
|
|
9
|
+
}
|
|
10
|
+
if (value?.code === 'EENVELOPE' || value?.code === 'EMESSAGE') {
|
|
11
|
+
return new EmailError('invalid_request', message);
|
|
12
|
+
}
|
|
13
|
+
return new EmailError('provider_unavailable', `IMAP/SMTP operation failed: ${message}`);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,KAAqG,CAAC;IACpH,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,KAAK,EAAE,oBAAoB,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrG,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,oCAAoC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,KAAK,EAAE,IAAI,KAAK,WAAW,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9D,OAAO,IAAI,UAAU,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,sBAAsB,EAAE,+BAA+B,OAAO,EAAE,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Folder, FolderRole } from '@fluxmail/core';
|
|
2
|
+
import type { ListResponse } from 'imapflow';
|
|
3
|
+
import type { FolderWarning, ImapCredentials } from './types.js';
|
|
4
|
+
export interface ResolvedFolders {
|
|
5
|
+
folders: Folder[];
|
|
6
|
+
paths: Partial<Record<FolderRole, string>>;
|
|
7
|
+
warnings: FolderWarning[];
|
|
8
|
+
selectablePaths: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveFolders(listing: ListResponse[], overrides?: ImapCredentials['folderOverrides']): ResolvedFolders;
|
|
11
|
+
//# sourceMappingURL=folders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../src/folders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBjE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAMD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EAAE,EACvB,SAAS,GAAE,eAAe,CAAC,iBAAiB,CAAM,GACjD,eAAe,CA8EjB"}
|
package/dist/folders.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const SPECIAL_USE = {
|
|
2
|
+
'\\Sent': 'sent',
|
|
3
|
+
'\\Drafts': 'drafts',
|
|
4
|
+
'\\Trash': 'trash',
|
|
5
|
+
'\\Archive': 'archive',
|
|
6
|
+
'\\Junk': 'spam',
|
|
7
|
+
};
|
|
8
|
+
const NAMES = {
|
|
9
|
+
sent: new Set(['sent', 'sent mail', 'sent items']),
|
|
10
|
+
drafts: new Set(['draft', 'drafts', 'draft messages']),
|
|
11
|
+
trash: new Set(['trash', 'deleted', 'deleted items', 'deleted messages']),
|
|
12
|
+
archive: new Set(['archive', 'archives']),
|
|
13
|
+
spam: new Set(['spam', 'junk', 'junk email', 'junk mail']),
|
|
14
|
+
};
|
|
15
|
+
function samePath(a, b) {
|
|
16
|
+
return a.localeCompare(b, undefined, { sensitivity: 'accent' }) === 0;
|
|
17
|
+
}
|
|
18
|
+
export function resolveFolders(listing, overrides = {}) {
|
|
19
|
+
const selectable = listing.filter((entry) => !entry.flags.has('\\Noselect') && !entry.flags.has('\\NonExistent'));
|
|
20
|
+
const roles = new Map();
|
|
21
|
+
const paths = {};
|
|
22
|
+
const warnings = [];
|
|
23
|
+
const inbox = selectable.find((entry) => /^inbox$/i.test(entry.path));
|
|
24
|
+
if (inbox) {
|
|
25
|
+
roles.set(inbox.path, { role: 'inbox', source: 'extension' });
|
|
26
|
+
paths.inbox = inbox.path;
|
|
27
|
+
}
|
|
28
|
+
for (const role of ['sent', 'drafts', 'trash', 'archive', 'spam']) {
|
|
29
|
+
const override = overrides?.[role];
|
|
30
|
+
if (override) {
|
|
31
|
+
const match = selectable.find((entry) => samePath(entry.path, override));
|
|
32
|
+
if (match) {
|
|
33
|
+
roles.set(match.path, { role, source: 'user' });
|
|
34
|
+
paths[role] = match.path;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
warnings.push({
|
|
38
|
+
role,
|
|
39
|
+
reason: 'stale_override',
|
|
40
|
+
message: `${role} folder override "${override}" does not match a selectable mailbox`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const extensionMatches = selectable.filter((entry) => SPECIAL_USE[entry.specialUse ?? ''] === role);
|
|
46
|
+
if (extensionMatches.length === 1) {
|
|
47
|
+
const match = extensionMatches[0];
|
|
48
|
+
roles.set(match.path, { role, source: 'extension' });
|
|
49
|
+
paths[role] = match.path;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (extensionMatches.length > 1) {
|
|
53
|
+
warnings.push({
|
|
54
|
+
role,
|
|
55
|
+
reason: 'ambiguous',
|
|
56
|
+
message: `multiple mailboxes advertise the ${role} role; configure the folder path explicitly`,
|
|
57
|
+
});
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const nameMatches = selectable.filter((entry) => NAMES[role].has(entry.name.trim().toLowerCase()));
|
|
61
|
+
if (nameMatches.length === 1) {
|
|
62
|
+
const match = nameMatches[0];
|
|
63
|
+
roles.set(match.path, { role, source: 'name' });
|
|
64
|
+
paths[role] = match.path;
|
|
65
|
+
}
|
|
66
|
+
else if (nameMatches.length > 1) {
|
|
67
|
+
warnings.push({
|
|
68
|
+
role,
|
|
69
|
+
reason: 'ambiguous',
|
|
70
|
+
message: `multiple mailbox names look like the ${role} folder; configure the folder path explicitly`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
warnings.push({ role, reason: 'missing', message: `no ${role} folder could be resolved` });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const all = selectable.find((entry) => entry.specialUse === '\\All');
|
|
78
|
+
if (all) {
|
|
79
|
+
roles.set(all.path, { role: 'all', source: 'extension' });
|
|
80
|
+
paths.all = all.path;
|
|
81
|
+
}
|
|
82
|
+
const folders = selectable.map((entry) => {
|
|
83
|
+
const resolved = roles.get(entry.path);
|
|
84
|
+
return {
|
|
85
|
+
id: entry.path,
|
|
86
|
+
name: entry.path,
|
|
87
|
+
...(resolved ? { role: resolved.role, roleSource: resolved.source } : {}),
|
|
88
|
+
...(typeof entry.status?.unseen === 'number' ? { unreadCount: entry.status.unseen } : {}),
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
return { folders, paths, warnings, selectablePaths: selectable.map((entry) => entry.path) };
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=folders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.js","sourceRoot":"","sources":["../src/folders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ImapFlow, type ImapFlowOptions } from 'imapflow';
|
|
2
|
+
import { type Transporter } from 'nodemailer';
|
|
3
|
+
import { type AttachmentMeta, type Capabilities, type DraftInput, type EmailProvider, type EmailQuery, type Folder, type GetMessageOpts, type Message, type ModifyAction, type Page, type PageOpts, type SendResult, type Thread } from '@fluxmail/core';
|
|
4
|
+
import type { FolderWarning, ImapCredentials, ImapStateStore } from './types.js';
|
|
5
|
+
export declare const POSTAL_OPTIONS: {
|
|
6
|
+
readonly maxNestingDepth: 100;
|
|
7
|
+
readonly maxHeadersSize: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const IMAP_CAPABILITIES: Capabilities;
|
|
10
|
+
export interface ImapProviderOptions {
|
|
11
|
+
accountId: string;
|
|
12
|
+
email: string;
|
|
13
|
+
displayName?: string;
|
|
14
|
+
credentials: ImapCredentials;
|
|
15
|
+
store: ImapStateStore;
|
|
16
|
+
imapFactory?: (options: ImapFlowOptions) => ImapFlow;
|
|
17
|
+
smtpFactory?: (credentials: ImapCredentials['smtp']) => Transporter;
|
|
18
|
+
}
|
|
19
|
+
export declare function smtpTransportOptions(config: ImapCredentials['smtp']): {
|
|
20
|
+
host: string;
|
|
21
|
+
port: number;
|
|
22
|
+
secure: boolean;
|
|
23
|
+
requireTLS: boolean;
|
|
24
|
+
auth: {
|
|
25
|
+
user: string;
|
|
26
|
+
pass: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare class ImapProvider implements EmailProvider {
|
|
30
|
+
private readonly options;
|
|
31
|
+
readonly capabilities: Capabilities;
|
|
32
|
+
private imap?;
|
|
33
|
+
private imapConnection?;
|
|
34
|
+
private smtp?;
|
|
35
|
+
private resolved?;
|
|
36
|
+
constructor(options: ImapProviderOptions);
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
private imapOptions;
|
|
39
|
+
private buildSmtp;
|
|
40
|
+
private client;
|
|
41
|
+
private refreshFolders;
|
|
42
|
+
getFolderWarnings(): Promise<FolderWarning[]>;
|
|
43
|
+
testConnection(): Promise<void>;
|
|
44
|
+
listFolders(): Promise<Folder[]>;
|
|
45
|
+
private rolePath;
|
|
46
|
+
private requireRole;
|
|
47
|
+
private withMailbox;
|
|
48
|
+
private toMessage;
|
|
49
|
+
listMessages(query: EmailQuery, page?: PageOpts): Promise<Page<Message>>;
|
|
50
|
+
private fetchLocation;
|
|
51
|
+
getMessage(id: string, options?: GetMessageOpts): Promise<Message>;
|
|
52
|
+
getThread(id: string): Promise<Thread>;
|
|
53
|
+
private threadingFor;
|
|
54
|
+
private compose;
|
|
55
|
+
private appendedLocation;
|
|
56
|
+
private appendDraft;
|
|
57
|
+
createDraft(input: DraftInput): Promise<Message>;
|
|
58
|
+
getDraft(draftId: string): Promise<Message>;
|
|
59
|
+
updateDraft(draftId: string, input: DraftInput): Promise<Message>;
|
|
60
|
+
deleteDraft(draftId: string): Promise<void>;
|
|
61
|
+
private deliver;
|
|
62
|
+
private appendSent;
|
|
63
|
+
private moveDraftToSent;
|
|
64
|
+
send(input: DraftInput | {
|
|
65
|
+
draftId: string;
|
|
66
|
+
}): Promise<SendResult>;
|
|
67
|
+
modify(ids: string[], action: ModifyAction): Promise<void>;
|
|
68
|
+
getAttachment(messageId: string, attachmentId: string): Promise<{
|
|
69
|
+
meta: AttachmentMeta;
|
|
70
|
+
content: Buffer;
|
|
71
|
+
}>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=imapProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imapProvider.d.ts","sourceRoot":"","sources":["../src/imapProvider.ts"],"names":[],"mappings":"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"}
|