@kernhq/module-mail 0.1.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/LICENSE +662 -0
- package/dist/contract.d.ts +285 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +115 -0
- package/dist/contract.js.map +1 -0
- package/dist/server/index.d.ts +29 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +189 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/providers/index.d.ts +13 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +36 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/mailgun.d.ts +9 -0
- package/dist/server/providers/mailgun.d.ts.map +1 -0
- package/dist/server/providers/mailgun.js +42 -0
- package/dist/server/providers/mailgun.js.map +1 -0
- package/dist/server/providers/postmark.d.ts +7 -0
- package/dist/server/providers/postmark.d.ts.map +1 -0
- package/dist/server/providers/postmark.js +38 -0
- package/dist/server/providers/postmark.js.map +1 -0
- package/dist/server/providers/resend.d.ts +7 -0
- package/dist/server/providers/resend.d.ts.map +1 -0
- package/dist/server/providers/resend.js +34 -0
- package/dist/server/providers/resend.js.map +1 -0
- package/dist/server/providers/ses.d.ts +9 -0
- package/dist/server/providers/ses.d.ts.map +1 -0
- package/dist/server/providers/ses.js +59 -0
- package/dist/server/providers/ses.js.map +1 -0
- package/dist/server/providers/smtp.d.ts +13 -0
- package/dist/server/providers/smtp.d.ts.map +1 -0
- package/dist/server/providers/smtp.js +36 -0
- package/dist/server/providers/smtp.js.map +1 -0
- package/dist/server/providers/types.d.ts +38 -0
- package/dist/server/providers/types.d.ts.map +1 -0
- package/dist/server/providers/types.js +2 -0
- package/dist/server/providers/types.js.map +1 -0
- package/dist/server/schema.d.ts +469 -0
- package/dist/server/schema.d.ts.map +1 -0
- package/dist/server/schema.js +40 -0
- package/dist/server/schema.js.map +1 -0
- package/dist/server/send.d.ts +32 -0
- package/dist/server/send.d.ts.map +1 -0
- package/dist/server/send.js +119 -0
- package/dist/server/send.js.map +1 -0
- package/dist/server/settings.d.ts +9 -0
- package/dist/server/settings.d.ts.map +1 -0
- package/dist/server/settings.js +35 -0
- package/dist/server/settings.js.map +1 -0
- package/dist/server/suppressions.d.ts +17 -0
- package/dist/server/suppressions.d.ts.map +1 -0
- package/dist/server/suppressions.js +46 -0
- package/dist/server/suppressions.js.map +1 -0
- package/dist/server/templates.d.ts +19 -0
- package/dist/server/templates.d.ts.map +1 -0
- package/dist/server/templates.js +55 -0
- package/dist/server/templates.js.map +1 -0
- package/migrations/0000_init.sql +39 -0
- package/migrations/0001_notes.sql +6 -0
- package/migrations/meta/0000_snapshot.json +288 -0
- package/migrations/meta/_journal.json +20 -0
- package/package.json +80 -0
- package/src/client/MailSettings.svelte +214 -0
- package/src/client/index.ts +29 -0
- package/templates/_layout.mjml +34 -0
- package/templates/invitation.mjml +16 -0
- package/templates/invitation.subject.txt +1 -0
- package/templates/invitation.txt +8 -0
- package/templates/magic-link.mjml +16 -0
- package/templates/magic-link.subject.txt +1 -0
- package/templates/magic-link.txt +6 -0
- package/templates/notification-digest.mjml +24 -0
- package/templates/notification-digest.subject.txt +1 -0
- package/templates/notification-digest.txt +8 -0
- package/templates/reset-password.mjml +16 -0
- package/templates/reset-password.subject.txt +1 -0
- package/templates/reset-password.txt +7 -0
- package/templates/test.mjml +12 -0
- package/templates/test.subject.txt +1 -0
- package/templates/test.txt +5 -0
- package/templates/verify-email.mjml +17 -0
- package/templates/verify-email.subject.txt +1 -0
- package/templates/verify-email.txt +7 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MailProvider, MailProviderConfig, PlatformMailEnv } from './types.js';
|
|
2
|
+
export * from './mailgun.js';
|
|
3
|
+
export * from './postmark.js';
|
|
4
|
+
export * from './resend.js';
|
|
5
|
+
export * from './ses.js';
|
|
6
|
+
export * from './smtp.js';
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Build the provider for a workspace config, falling back to the platform SMTP
|
|
10
|
+
* (SMTP_URL + MAIL_FROM) when the config is null or `provider: 'platform'`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function providerFor(config: MailProviderConfig | null, env?: PlatformMailEnv): MailProvider;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/providers/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEnF,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAE1B;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,GAAG,GAAE,eAA6B,GACjC,YAAY,CAkBd"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { KernError } from '@kernhq/kernel';
|
|
2
|
+
import { mailgunProvider } from './mailgun.js';
|
|
3
|
+
import { postmarkProvider } from './postmark.js';
|
|
4
|
+
import { resendProvider } from './resend.js';
|
|
5
|
+
import { sesProvider } from './ses.js';
|
|
6
|
+
import { smtpProvider } from './smtp.js';
|
|
7
|
+
export * from './mailgun.js';
|
|
8
|
+
export * from './postmark.js';
|
|
9
|
+
export * from './resend.js';
|
|
10
|
+
export * from './ses.js';
|
|
11
|
+
export * from './smtp.js';
|
|
12
|
+
export * from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Build the provider for a workspace config, falling back to the platform SMTP
|
|
15
|
+
* (SMTP_URL + MAIL_FROM) when the config is null or `provider: 'platform'`.
|
|
16
|
+
*/
|
|
17
|
+
export function providerFor(config, env = process.env) {
|
|
18
|
+
if (!config || config.provider === 'platform') {
|
|
19
|
+
if (!env.SMTP_URL)
|
|
20
|
+
throw new KernError('UNAVAILABLE', 'No mail provider configured and no platform SMTP_URL set');
|
|
21
|
+
return smtpProvider({ url: env.SMTP_URL, from: env.MAIL_FROM ?? 'kern@localhost' });
|
|
22
|
+
}
|
|
23
|
+
switch (config.provider) {
|
|
24
|
+
case 'smtp':
|
|
25
|
+
return smtpProvider(config);
|
|
26
|
+
case 'mailgun':
|
|
27
|
+
return mailgunProvider(config);
|
|
28
|
+
case 'ses':
|
|
29
|
+
return sesProvider(config);
|
|
30
|
+
case 'postmark':
|
|
31
|
+
return postmarkProvider(config);
|
|
32
|
+
case 'resend':
|
|
33
|
+
return resendProvider(config);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAE1B;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,MAAiC,EACjC,MAAuB,OAAO,CAAC,GAAG;IAElC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,QAAQ;YACf,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,0DAA0D,CAAC,CAAA;QAChG,OAAO,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC,CAAA;IACrF,CAAC;IACD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;QAChC,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;QAC5B,KAAK,UAAU;YACb,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACjC,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MailProvider } from './types.js';
|
|
2
|
+
export interface MailgunOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
domain: string;
|
|
5
|
+
region?: 'us' | 'eu';
|
|
6
|
+
from: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function mailgunProvider(opts: MailgunOptions): MailProvider;
|
|
9
|
+
//# sourceMappingURL=mailgun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailgun.d.ts","sourceRoot":"","sources":["../../../src/server/providers/mailgun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CA+BlE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function mailgunProvider(opts) {
|
|
2
|
+
const base = opts.region === 'eu' ? 'https://api.eu.mailgun.net' : 'https://api.mailgun.net';
|
|
3
|
+
const auth = `Basic ${Buffer.from(`api:${opts.apiKey}`).toString('base64')}`;
|
|
4
|
+
return {
|
|
5
|
+
name: 'mailgun',
|
|
6
|
+
from: opts.from,
|
|
7
|
+
async send(m) {
|
|
8
|
+
const form = new FormData();
|
|
9
|
+
form.set('from', m.from);
|
|
10
|
+
for (const to of m.to)
|
|
11
|
+
form.append('to', to);
|
|
12
|
+
for (const cc of m.cc ?? [])
|
|
13
|
+
form.append('cc', cc);
|
|
14
|
+
for (const bcc of m.bcc ?? [])
|
|
15
|
+
form.append('bcc', bcc);
|
|
16
|
+
form.set('subject', m.subject);
|
|
17
|
+
if (m.text)
|
|
18
|
+
form.set('text', m.text);
|
|
19
|
+
if (m.html)
|
|
20
|
+
form.set('html', m.html);
|
|
21
|
+
if (m.replyTo)
|
|
22
|
+
form.set('h:Reply-To', m.replyTo);
|
|
23
|
+
for (const [k, v] of Object.entries(m.headers ?? {}))
|
|
24
|
+
form.set(`h:${k}`, v);
|
|
25
|
+
for (const tag of m.tags ?? [])
|
|
26
|
+
form.append('o:tag', tag);
|
|
27
|
+
for (const a of m.attachments ?? [])
|
|
28
|
+
form.append('attachment', new Blob([new Uint8Array(a.content)], { type: a.contentType }), a.filename);
|
|
29
|
+
const res = await fetch(`${base}/v3/${opts.domain}/messages`, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { authorization: auth },
|
|
32
|
+
body: form,
|
|
33
|
+
});
|
|
34
|
+
if (!res.ok)
|
|
35
|
+
throw new Error(`mailgun ${res.status}: ${(await res.text()).slice(0, 500)}`);
|
|
36
|
+
const body = (await res.json());
|
|
37
|
+
// mailgun wraps the message id in angle brackets
|
|
38
|
+
return { messageId: body.id?.replace(/^<|>$/g, '') ?? null };
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=mailgun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailgun.js","sourceRoot":"","sources":["../../../src/server/providers/mailgun.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postmark.d.ts","sourceRoot":"","sources":["../../../src/server/providers/postmark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,YAAY,CAmCpE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function postmarkProvider(opts) {
|
|
2
|
+
return {
|
|
3
|
+
name: 'postmark',
|
|
4
|
+
from: opts.from,
|
|
5
|
+
async send(m) {
|
|
6
|
+
const res = await fetch('https://api.postmarkapp.com/email', {
|
|
7
|
+
method: 'POST',
|
|
8
|
+
headers: {
|
|
9
|
+
'content-type': 'application/json',
|
|
10
|
+
accept: 'application/json',
|
|
11
|
+
'x-postmark-server-token': opts.serverToken,
|
|
12
|
+
},
|
|
13
|
+
body: JSON.stringify({
|
|
14
|
+
From: m.from,
|
|
15
|
+
To: m.to.join(','),
|
|
16
|
+
Cc: m.cc?.join(','),
|
|
17
|
+
Bcc: m.bcc?.join(','),
|
|
18
|
+
ReplyTo: m.replyTo,
|
|
19
|
+
Subject: m.subject,
|
|
20
|
+
TextBody: m.text,
|
|
21
|
+
HtmlBody: m.html,
|
|
22
|
+
Tag: m.tags?.[0],
|
|
23
|
+
Headers: Object.entries(m.headers ?? {}).map(([Name, Value]) => ({ Name, Value })),
|
|
24
|
+
Attachments: m.attachments?.map((a) => ({
|
|
25
|
+
Name: a.filename,
|
|
26
|
+
ContentType: a.contentType,
|
|
27
|
+
Content: a.content.toString('base64'),
|
|
28
|
+
})),
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
const body = (await res.json().catch(() => ({})));
|
|
32
|
+
if (!res.ok)
|
|
33
|
+
throw new Error(`postmark ${res.status}: ${body.Message ?? 'send failed'}`);
|
|
34
|
+
return { messageId: body.MessageID ?? null };
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=postmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postmark.js","sourceRoot":"","sources":["../../../src/server/providers/postmark.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,gBAAgB,CAAC,IAAqB;IACpD,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,CAAC,IAAI,CAAC,CAAkB;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mCAAmC,EAAE;gBAC3D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;oBAC1B,yBAAyB,EAAE,IAAI,CAAC,WAAW;iBAC5C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;oBAClB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;oBACnB,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;oBACrB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,IAAI;oBAChB,QAAQ,EAAE,CAAC,CAAC,IAAI;oBAChB,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBAChB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAClF,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtC,IAAI,EAAE,CAAC,CAAC,QAAQ;wBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;qBACtC,CAAC,CAAC;iBACJ,CAAC;aACH,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA6C,CAAA;YAC7F,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC,CAAA;YACxF,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,CAAA;QAC9C,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../../src/server/providers/resend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CA+BhE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function resendProvider(opts) {
|
|
2
|
+
return {
|
|
3
|
+
name: 'resend',
|
|
4
|
+
from: opts.from,
|
|
5
|
+
async send(m) {
|
|
6
|
+
const res = await fetch('https://api.resend.com/emails', {
|
|
7
|
+
method: 'POST',
|
|
8
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.apiKey}` },
|
|
9
|
+
body: JSON.stringify({
|
|
10
|
+
from: m.from,
|
|
11
|
+
to: m.to,
|
|
12
|
+
cc: m.cc,
|
|
13
|
+
bcc: m.bcc,
|
|
14
|
+
reply_to: m.replyTo,
|
|
15
|
+
subject: m.subject,
|
|
16
|
+
text: m.text,
|
|
17
|
+
html: m.html,
|
|
18
|
+
headers: m.headers,
|
|
19
|
+
attachments: m.attachments?.map((a) => ({
|
|
20
|
+
filename: a.filename,
|
|
21
|
+
content: a.content.toString('base64'),
|
|
22
|
+
content_type: a.contentType,
|
|
23
|
+
})),
|
|
24
|
+
tags: m.tags?.map((t) => ({ name: t, value: 'true' })),
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
const body = (await res.json().catch(() => ({})));
|
|
28
|
+
if (!res.ok)
|
|
29
|
+
throw new Error(`resend ${res.status}: ${body.message ?? 'send failed'}`);
|
|
30
|
+
return { messageId: body.id ?? null };
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=resend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resend.js","sourceRoot":"","sources":["../../../src/server/providers/resend.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,cAAc,CAAC,IAAmB;IAChD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,CAAC,IAAI,CAAC,CAAkB;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+BAA+B,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;gBACvF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,QAAQ,EAAE,CAAC,CAAC,OAAO;oBACnB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtC,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBACrC,YAAY,EAAE,CAAC,CAAC,WAAW;qBAC5B,CAAC,CAAC;oBACH,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;iBACvD,CAAC;aACH,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsC,CAAA;YACtF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC,CAAA;YACtF,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;QACvC,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MailProvider } from './types.js';
|
|
2
|
+
export interface SesOptions {
|
|
3
|
+
accessKeyId: string;
|
|
4
|
+
secretAccessKey: string;
|
|
5
|
+
region: string;
|
|
6
|
+
from: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function sesProvider(opts: SesOptions): MailProvider;
|
|
9
|
+
//# sourceMappingURL=ses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ses.d.ts","sourceRoot":"","sources":["../../../src/server/providers/ses.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAoC1D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2';
|
|
2
|
+
import MailComposer from 'nodemailer/lib/mail-composer/index.js';
|
|
3
|
+
export function sesProvider(opts) {
|
|
4
|
+
const client = new SESv2Client({
|
|
5
|
+
region: opts.region,
|
|
6
|
+
credentials: { accessKeyId: opts.accessKeyId, secretAccessKey: opts.secretAccessKey },
|
|
7
|
+
});
|
|
8
|
+
return {
|
|
9
|
+
name: 'ses',
|
|
10
|
+
from: opts.from,
|
|
11
|
+
async send(m) {
|
|
12
|
+
const destination = { ToAddresses: m.to, CcAddresses: m.cc, BccAddresses: m.bcc };
|
|
13
|
+
// attachments and custom headers need a raw MIME message; plain messages use Simple content
|
|
14
|
+
const needsRaw = (m.attachments?.length ?? 0) > 0 || Object.keys(m.headers ?? {}).length > 0;
|
|
15
|
+
const command = needsRaw
|
|
16
|
+
? new SendEmailCommand({
|
|
17
|
+
FromEmailAddress: m.from,
|
|
18
|
+
Destination: destination,
|
|
19
|
+
Content: { Raw: { Data: await composeRaw(m) } },
|
|
20
|
+
})
|
|
21
|
+
: new SendEmailCommand({
|
|
22
|
+
FromEmailAddress: m.from,
|
|
23
|
+
Destination: destination,
|
|
24
|
+
ReplyToAddresses: m.replyTo ? [m.replyTo] : undefined,
|
|
25
|
+
Content: {
|
|
26
|
+
Simple: {
|
|
27
|
+
Subject: { Data: m.subject, Charset: 'UTF-8' },
|
|
28
|
+
Body: {
|
|
29
|
+
Text: m.text ? { Data: m.text, Charset: 'UTF-8' } : undefined,
|
|
30
|
+
Html: m.html ? { Data: m.html, Charset: 'UTF-8' } : undefined,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
const res = await client.send(command);
|
|
36
|
+
return { messageId: res.MessageId ?? null };
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async function composeRaw(m) {
|
|
41
|
+
const composer = new MailComposer({
|
|
42
|
+
from: m.from,
|
|
43
|
+
to: m.to,
|
|
44
|
+
cc: m.cc,
|
|
45
|
+
bcc: m.bcc,
|
|
46
|
+
replyTo: m.replyTo,
|
|
47
|
+
subject: m.subject,
|
|
48
|
+
text: m.text,
|
|
49
|
+
html: m.html,
|
|
50
|
+
headers: m.headers,
|
|
51
|
+
attachments: m.attachments?.map((a) => ({
|
|
52
|
+
filename: a.filename,
|
|
53
|
+
contentType: a.contentType,
|
|
54
|
+
content: a.content,
|
|
55
|
+
})),
|
|
56
|
+
});
|
|
57
|
+
return composer.compile().build();
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=ses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ses.js","sourceRoot":"","sources":["../../../src/server/providers/ses.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MailProvider } from './types.js';
|
|
2
|
+
export interface SmtpOptions {
|
|
3
|
+
/** smtp(s)://user:pass@host:port — overrides the individual fields */
|
|
4
|
+
url?: string;
|
|
5
|
+
host?: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
secure?: boolean;
|
|
8
|
+
user?: string;
|
|
9
|
+
pass?: string;
|
|
10
|
+
from: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function smtpProvider(opts: SmtpOptions): MailProvider;
|
|
13
|
+
//# sourceMappingURL=smtp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../../src/server/providers/smtp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAA;AAE3E,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAiC5D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import nodemailer, {} from 'nodemailer';
|
|
2
|
+
export function smtpProvider(opts) {
|
|
3
|
+
const transport = opts.url
|
|
4
|
+
? nodemailer.createTransport(opts.url)
|
|
5
|
+
: nodemailer.createTransport({
|
|
6
|
+
host: opts.host,
|
|
7
|
+
port: opts.port,
|
|
8
|
+
secure: opts.secure ?? true,
|
|
9
|
+
auth: opts.user ? { user: opts.user, pass: opts.pass ?? '' } : undefined,
|
|
10
|
+
});
|
|
11
|
+
return {
|
|
12
|
+
name: 'smtp',
|
|
13
|
+
from: opts.from,
|
|
14
|
+
async send(m) {
|
|
15
|
+
const info = await transport.sendMail({
|
|
16
|
+
from: m.from,
|
|
17
|
+
to: m.to,
|
|
18
|
+
cc: m.cc,
|
|
19
|
+
bcc: m.bcc,
|
|
20
|
+
replyTo: m.replyTo,
|
|
21
|
+
subject: m.subject,
|
|
22
|
+
text: m.text,
|
|
23
|
+
html: m.html,
|
|
24
|
+
headers: m.headers,
|
|
25
|
+
attachments: m.attachments?.map((a) => ({
|
|
26
|
+
filename: a.filename,
|
|
27
|
+
contentType: a.contentType,
|
|
28
|
+
content: a.content,
|
|
29
|
+
})),
|
|
30
|
+
});
|
|
31
|
+
return { messageId: info.messageId ?? null };
|
|
32
|
+
},
|
|
33
|
+
close: () => transport.close(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=smtp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smtp.js","sourceRoot":"","sources":["../../../src/server/providers/smtp.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,EAAE,EAAoB,MAAM,YAAY,CAAA;AAczD,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC5C,MAAM,SAAS,GAAgB,IAAI,CAAC,GAAG;QACrC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QACtC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;SACzE,CAAC,CAAA;IACN,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,CAAC,IAAI,CAAC,CAAkB;YAC3B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC;gBACpC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;aACJ,CAAC,CAAA;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,CAAA;QAC9C,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;KAC/B,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { core } from '@kernhq/contracts';
|
|
2
|
+
/** Fully resolved message, ready for a provider (attachments already fetched). */
|
|
3
|
+
export interface OutgoingMessage {
|
|
4
|
+
from: string;
|
|
5
|
+
to: string[];
|
|
6
|
+
cc?: string[];
|
|
7
|
+
bcc?: string[];
|
|
8
|
+
replyTo?: string;
|
|
9
|
+
subject: string;
|
|
10
|
+
text?: string;
|
|
11
|
+
html?: string;
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
attachments?: Array<{
|
|
14
|
+
filename: string;
|
|
15
|
+
contentType: string;
|
|
16
|
+
content: Buffer;
|
|
17
|
+
}>;
|
|
18
|
+
tags?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface SendResult {
|
|
21
|
+
/** provider message id, used to correlate webhook events; null when the provider returns none */
|
|
22
|
+
messageId: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface MailProvider {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly from: string;
|
|
27
|
+
send(message: OutgoingMessage): Promise<SendResult>;
|
|
28
|
+
/** close pooled connections (SMTP); optional */
|
|
29
|
+
close?(): void;
|
|
30
|
+
}
|
|
31
|
+
export type MailProviderConfig = core.MailProviderConfig;
|
|
32
|
+
/** Instance-level fallback used when a workspace has no provider configured. */
|
|
33
|
+
export interface PlatformMailEnv {
|
|
34
|
+
/** smtp(s)://user:pass@host:port */
|
|
35
|
+
SMTP_URL?: string;
|
|
36
|
+
MAIL_FROM?: string;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE7C,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,EAAE,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACnD,gDAAgD;IAChD,KAAK,CAAC,IAAI,IAAI,CAAA;CACf;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAA;AAExD,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/providers/types.ts"],"names":[],"mappings":""}
|