@softure-ai/mailing 0.1.7 → 0.1.9
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/CHANGELOG.md +41 -0
- package/README.md +131 -23
- package/dist/cli/run.d.ts +6 -2
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +297 -40
- package/dist/cli/run.js.map +1 -1
- package/dist/contract.d.ts +35 -5
- package/dist/contract.d.ts.map +1 -1
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/next/import-deliveries.d.ts +4 -0
- package/dist/next/import-deliveries.d.ts.map +1 -0
- package/dist/next/import-deliveries.js +9 -0
- package/dist/next/import-deliveries.js.map +1 -0
- package/dist/next/index.d.ts +1 -0
- package/dist/next/index.d.ts.map +1 -1
- package/dist/next/index.js +1 -0
- package/dist/next/index.js.map +1 -1
- package/dist/next/route.d.ts +3 -2
- package/dist/next/route.d.ts.map +1 -1
- package/dist/next/route.js +5 -4
- package/dist/next/route.js.map +1 -1
- package/dist/options.d.ts +19 -2
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +30 -6
- package/dist/options.js.map +1 -1
- package/dist/schema.d.ts +17 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -1
- package/dist/server/campaigns.d.ts +5 -0
- package/dist/server/campaigns.d.ts.map +1 -1
- package/dist/server/campaigns.js +10 -0
- package/dist/server/campaigns.js.map +1 -1
- package/dist/server/deliveries.d.ts +9 -5
- package/dist/server/deliveries.d.ts.map +1 -1
- package/dist/server/deliveries.js +9 -7
- package/dist/server/deliveries.js.map +1 -1
- package/dist/server/dns.d.ts +48 -1
- package/dist/server/dns.d.ts.map +1 -1
- package/dist/server/dns.js +124 -15
- package/dist/server/dns.js.map +1 -1
- package/dist/server/import-deliveries.d.ts +68 -0
- package/dist/server/import-deliveries.d.ts.map +1 -0
- package/dist/server/import-deliveries.js +105 -0
- package/dist/server/import-deliveries.js.map +1 -0
- package/dist/server/index.d.ts +4 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/suppressions.d.ts.map +1 -1
- package/dist/server/suppressions.js +9 -6
- package/dist/server/suppressions.js.map +1 -1
- package/dist/server/unsubscribe-link.d.ts +3 -2
- package/dist/server/unsubscribe-link.d.ts.map +1 -1
- package/dist/server/unsubscribe-link.js +12 -3
- package/dist/server/unsubscribe-link.js.map +1 -1
- package/migrations/0004_allow_imported_deliveries.sql +20 -0
- package/module.json +1 -1
- package/package.json +1 -1
- package/src/cli/run.ts +311 -39
- package/src/contract.ts +30 -5
- package/src/index.ts +4 -1
- package/src/next/import-deliveries.ts +9 -0
- package/src/next/index.ts +1 -0
- package/src/next/route.ts +5 -4
- package/src/options.ts +36 -7
- package/src/schema.ts +2 -0
- package/src/server/campaigns.ts +13 -0
- package/src/server/deliveries.ts +15 -8
- package/src/server/dns.ts +174 -16
- package/src/server/import-deliveries.ts +149 -0
- package/src/server/index.ts +21 -0
- package/src/server/suppressions.ts +15 -8
- package/src/server/unsubscribe-link.ts +10 -3
package/dist/cli/run.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// `softure-mail`: sends a campaign from a content file
|
|
2
|
-
//
|
|
3
|
-
// bundler packs for a container:
|
|
1
|
+
// `softure-mail`: sends a campaign from a content file, imports an app's delivery history into the
|
|
2
|
+
// ledger and checks the sender domain's DNS. The app passes its validated config, so the same
|
|
3
|
+
// function serves the bin and an app script that a bundler packs for a container:
|
|
4
4
|
//
|
|
5
5
|
// // scripts/mail.ts
|
|
6
6
|
// import { runMailCli } from "@softure-ai/mailing/cli";
|
|
@@ -10,10 +10,12 @@ import { readFile } from "node:fs/promises";
|
|
|
10
10
|
import { dirname, resolve } from "node:path";
|
|
11
11
|
import { parseArgs } from "node:util";
|
|
12
12
|
import { systemClock } from "@softure-ai/core";
|
|
13
|
+
import { z } from "zod";
|
|
13
14
|
import { openCommandDatabase } from "@softure-ai/db";
|
|
14
15
|
import { parseCampaignFile, parseRecipientList } from "../server/campaign-file.js";
|
|
15
|
-
import { planCampaign, sendCampaign } from "../server/campaigns.js";
|
|
16
|
-
import { checkSenderDns, getSenderDomain } from "../server/dns.js";
|
|
16
|
+
import { listConfiguredCampaignRecipients, planCampaign, sendCampaign } from "../server/campaigns.js";
|
|
17
|
+
import { checkSenderDns, getSenderDomain, resendReturnPath } from "../server/dns.js";
|
|
18
|
+
import { checkImportedDeliveries, importDeliveries } from "../server/import-deliveries.js";
|
|
17
19
|
import { getMailingOptions } from "../server/options.js";
|
|
18
20
|
import { MIN_UNSUBSCRIBE_SECRET_LENGTH, readUnsubscribeSecrets, UNSUBSCRIBE_SECRET_ENV } from "../server/unsubscribe-link.js";
|
|
19
21
|
export const EXIT_OK = 0;
|
|
@@ -22,31 +24,61 @@ export const EXIT_USAGE = 2;
|
|
|
22
24
|
/** Pause between sends: Resend's default limit is two requests per second. */
|
|
23
25
|
export const DEFAULT_PAUSE_MS = 500;
|
|
24
26
|
export const MAIL_USAGE = `Usage:
|
|
25
|
-
softure-mail campaign <content-file> --recipients <file> [--dry-run] [--pause-ms <ms>] [--resend-uncertain]
|
|
27
|
+
softure-mail campaign <content-file> [--recipients <file>] [--dry-run] [--pause-ms <ms>] [--resend-uncertain]
|
|
28
|
+
softure-mail import <history-file> [--dry-run]
|
|
26
29
|
softure-mail dns [--domain <domain>] [--dkim-selector <name>]... [--spf-host <host>]...
|
|
30
|
+
[--dmarc-policy <p>] [--dmarc-sp <p>] [--dmarc-adkim <a>] [--dmarc-aspf <a>]
|
|
31
|
+
[--reply-to <address>] [--return-path <host>]... [--resend-return-path]
|
|
27
32
|
|
|
28
33
|
campaign Sends the campaign in <content-file> (frontmatter id, kind, subject, optional html,
|
|
29
34
|
then the text body) to every address in the recipients file (one per line), at most
|
|
30
|
-
once each.
|
|
31
|
-
|
|
35
|
+
once each. Without --recipients, the recipients come from listCampaignRecipients in
|
|
36
|
+
the mailing options. Re-running sends only to recipients without an outcome yet. A
|
|
37
|
+
refused API key or a spent quota stops the run; the rest go out on the next one.
|
|
38
|
+
--recipients <file> the recipients, one address per line
|
|
32
39
|
--dry-run count what would be sent and change nothing
|
|
33
40
|
--pause-ms <ms> pause after every send (default ${String(DEFAULT_PAUSE_MS)})
|
|
34
41
|
--resend-uncertain also send to recipients whose send was interrupted long ago
|
|
35
42
|
(it may have gone out: they may get the mail twice)
|
|
36
43
|
|
|
44
|
+
import Writes deliveries the app made before it adopted the module into the ledger, so
|
|
45
|
+
later sends skip them. <history-file> holds one JSON object per line: scope,
|
|
46
|
+
address, status (sent or rejected), finishedAt, and optional providerMessageId,
|
|
47
|
+
reason, kind. Rows already in the ledger are left as they are; any invalid row
|
|
48
|
+
stops the import before anything is written.
|
|
49
|
+
--dry-run check the file and change nothing
|
|
50
|
+
|
|
37
51
|
dns Checks SPF, DKIM and DMARC for the sender domain (default: the domain of "from").
|
|
38
52
|
--domain <domain> check this domain instead
|
|
39
53
|
--dkim-selector <name> DKIM selector to look up (default resend; repeatable)
|
|
40
54
|
--spf-host <host> where SPF is published (default the domain; repeatable;
|
|
41
55
|
Resend publishes it on send.<domain>)
|
|
56
|
+
--dmarc-policy <p> require at least this DMARC policy (quarantine or reject)
|
|
57
|
+
and pct=100; a weaker record fails
|
|
58
|
+
--dmarc-sp <p> require at least this subdomain policy (sp, else p)
|
|
59
|
+
--dmarc-adkim <a> require this DKIM alignment (r or s; absent counts as r)
|
|
60
|
+
--dmarc-aspf <a> require this SPF alignment (r or s; absent counts as r)
|
|
61
|
+
--reply-to <address> check that this address's domain accepts mail (MX, one SPF)
|
|
62
|
+
(default: replyTo of the config, when --domain is not given)
|
|
63
|
+
--return-path <host> a return-path host that must be a CNAME or have MX (repeatable)
|
|
64
|
+
--resend-return-path check Resend's send.<domain> and rsend.<domain> CNAMEs
|
|
42
65
|
|
|
43
|
-
Options for
|
|
66
|
+
Options for all:
|
|
44
67
|
--config <file> the app's softure.config file (bin only)
|
|
45
|
-
--help show this help
|
|
68
|
+
--help show this help
|
|
69
|
+
|
|
70
|
+
A file given as - is read from standard input (one of them per command), e.g.
|
|
71
|
+
docker compose exec -T app npx softure-mail campaign - < launch.md`;
|
|
46
72
|
const consoleOutput = {
|
|
47
73
|
log: (line) => console.log(line),
|
|
48
74
|
error: (line) => console.error(line),
|
|
49
75
|
};
|
|
76
|
+
const DMARC_POLICIES = ["quarantine", "reject"];
|
|
77
|
+
const DMARC_ALIGNMENTS = ["r", "s"];
|
|
78
|
+
/** A file name that means standard input. */
|
|
79
|
+
const STDIN = "-";
|
|
80
|
+
const CAMPAIGN_ONLY_OPTIONS = ["recipients", "pause-ms", "resend-uncertain"];
|
|
81
|
+
const DNS_ONLY_OPTIONS = ["domain", "dkim-selector", "spf-host", "dmarc-policy", "dmarc-sp", "dmarc-adkim", "dmarc-aspf", "reply-to", "return-path", "resend-return-path"];
|
|
50
82
|
/** Runs the command and returns the process exit code: 0 done, 1 failed or incomplete, 2 usage error. */
|
|
51
83
|
export async function runMailCli(options) {
|
|
52
84
|
const output = options.output ?? consoleOutput;
|
|
@@ -64,16 +96,18 @@ export async function runMailCli(options) {
|
|
|
64
96
|
return runDns(command, options, output);
|
|
65
97
|
case "campaign":
|
|
66
98
|
return runCampaign(command, options, output);
|
|
99
|
+
case "import":
|
|
100
|
+
return runImport(command, options, output);
|
|
67
101
|
}
|
|
68
102
|
}
|
|
69
103
|
function parseCommand(argv) {
|
|
70
104
|
const [name, ...rest] = argv;
|
|
71
105
|
if (name === undefined)
|
|
72
|
-
return "missing command; use campaign or dns";
|
|
106
|
+
return "missing command; use campaign, import or dns";
|
|
73
107
|
if (name === "--help")
|
|
74
108
|
return { kind: "help" };
|
|
75
|
-
if (name !== "campaign" && name !== "dns")
|
|
76
|
-
return `unknown command "${name}"; use campaign or dns`;
|
|
109
|
+
if (name !== "campaign" && name !== "import" && name !== "dns")
|
|
110
|
+
return `unknown command "${name}"; use campaign, import or dns`;
|
|
77
111
|
let parsed;
|
|
78
112
|
try {
|
|
79
113
|
parsed = parseCommandArgs(rest);
|
|
@@ -85,14 +119,37 @@ function parseCommand(argv) {
|
|
|
85
119
|
if (values.help === true)
|
|
86
120
|
return { kind: "help" };
|
|
87
121
|
if (name === "dns") {
|
|
88
|
-
const misplaced = [
|
|
122
|
+
const misplaced = [...CAMPAIGN_ONLY_OPTIONS, "dry-run"].filter((option) => values[option] !== undefined);
|
|
89
123
|
if (misplaced.length > 0)
|
|
90
124
|
return `dns does not take --${misplaced.join(", --")}`;
|
|
91
125
|
if (positionals.length > 0)
|
|
92
126
|
return `dns takes no file, got "${positionals.join(" ")}"`;
|
|
93
|
-
|
|
127
|
+
const expectDmarc = parseDmarcExpectation(values);
|
|
128
|
+
if (typeof expectDmarc === "string")
|
|
129
|
+
return expectDmarc;
|
|
130
|
+
return {
|
|
131
|
+
kind: "dns",
|
|
132
|
+
domain: values.domain,
|
|
133
|
+
dkimSelectors: values["dkim-selector"],
|
|
134
|
+
spfHosts: values["spf-host"],
|
|
135
|
+
expectDmarc,
|
|
136
|
+
replyTo: values["reply-to"],
|
|
137
|
+
returnPathHosts: values["return-path"] ?? [],
|
|
138
|
+
resendReturnPath: values["resend-return-path"] === true,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (name === "import") {
|
|
142
|
+
const misplaced = [...CAMPAIGN_ONLY_OPTIONS, ...DNS_ONLY_OPTIONS].filter((option) => values[option] !== undefined);
|
|
143
|
+
if (misplaced.length > 0)
|
|
144
|
+
return `import does not take --${misplaced.join(", --")}`;
|
|
145
|
+
const [historyFile, ...extra] = positionals;
|
|
146
|
+
if (historyFile === undefined)
|
|
147
|
+
return "import needs a history file (- for standard input)";
|
|
148
|
+
if (extra.length > 0)
|
|
149
|
+
return `import takes one history file, got also "${extra.join(" ")}"`;
|
|
150
|
+
return { kind: "import", historyFile, dryRun: values["dry-run"] === true };
|
|
94
151
|
}
|
|
95
|
-
const misplaced =
|
|
152
|
+
const misplaced = DNS_ONLY_OPTIONS.filter((option) => values[option] !== undefined);
|
|
96
153
|
if (misplaced.length > 0)
|
|
97
154
|
return `campaign does not take --${misplaced.join(", --")}`;
|
|
98
155
|
const [contentFile, ...extra] = positionals;
|
|
@@ -100,12 +157,12 @@ function parseCommand(argv) {
|
|
|
100
157
|
return "campaign needs a content file";
|
|
101
158
|
if (extra.length > 0)
|
|
102
159
|
return `campaign takes one content file, got also "${extra.join(" ")}"`;
|
|
103
|
-
if (values.recipients ===
|
|
104
|
-
return "campaign
|
|
160
|
+
if (contentFile === STDIN && values.recipients === STDIN)
|
|
161
|
+
return "campaign can read only one of the content file and --recipients from standard input";
|
|
105
162
|
const pauseMs = values["pause-ms"] === undefined ? DEFAULT_PAUSE_MS : Number(values["pause-ms"]);
|
|
106
163
|
if (!Number.isInteger(pauseMs) || pauseMs < 0 || pauseMs > 60_000)
|
|
107
164
|
return `--pause-ms expects whole milliseconds from 0 to 60000, got "${values["pause-ms"] ?? ""}"`;
|
|
108
|
-
return { kind: "campaign", contentFile, recipientsFile: values.recipients, dryRun: values["dry-run"] === true, pauseMs, resendUncertain: values["resend-uncertain"] === true };
|
|
165
|
+
return { kind: "campaign", contentFile, recipientsFile: values.recipients ?? null, dryRun: values["dry-run"] === true, pauseMs, resendUncertain: values["resend-uncertain"] === true };
|
|
109
166
|
}
|
|
110
167
|
function parseCommandArgs(args) {
|
|
111
168
|
return parseArgs({
|
|
@@ -118,42 +175,101 @@ function parseCommandArgs(args) {
|
|
|
118
175
|
domain: { type: "string" },
|
|
119
176
|
"dkim-selector": { type: "string", multiple: true },
|
|
120
177
|
"spf-host": { type: "string", multiple: true },
|
|
178
|
+
"dmarc-policy": { type: "string" },
|
|
179
|
+
"dmarc-sp": { type: "string" },
|
|
180
|
+
"dmarc-adkim": { type: "string" },
|
|
181
|
+
"dmarc-aspf": { type: "string" },
|
|
182
|
+
"reply-to": { type: "string" },
|
|
183
|
+
"return-path": { type: "string", multiple: true },
|
|
184
|
+
"resend-return-path": { type: "boolean" },
|
|
121
185
|
help: { type: "boolean" },
|
|
122
186
|
},
|
|
123
187
|
strict: true,
|
|
124
188
|
allowPositionals: true,
|
|
125
189
|
});
|
|
126
190
|
}
|
|
191
|
+
/** One choice of a fixed list, case-insensitive; `undefined` when the option was not given. */
|
|
192
|
+
function pickChoice(values, option, allowed) {
|
|
193
|
+
const given = values[option];
|
|
194
|
+
if (given === undefined)
|
|
195
|
+
return { value: undefined };
|
|
196
|
+
const found = allowed.find((candidate) => candidate === given.trim().toLowerCase());
|
|
197
|
+
return found === undefined ? `--${option} expects ${allowed.join(" or ")}, got "${given}"` : { value: found };
|
|
198
|
+
}
|
|
199
|
+
function parseDmarcExpectation(values) {
|
|
200
|
+
const policy = pickChoice(values, "dmarc-policy", DMARC_POLICIES);
|
|
201
|
+
if (typeof policy === "string")
|
|
202
|
+
return policy;
|
|
203
|
+
const subdomainPolicy = pickChoice(values, "dmarc-sp", DMARC_POLICIES);
|
|
204
|
+
if (typeof subdomainPolicy === "string")
|
|
205
|
+
return subdomainPolicy;
|
|
206
|
+
const adkim = pickChoice(values, "dmarc-adkim", DMARC_ALIGNMENTS);
|
|
207
|
+
if (typeof adkim === "string")
|
|
208
|
+
return adkim;
|
|
209
|
+
const aspf = pickChoice(values, "dmarc-aspf", DMARC_ALIGNMENTS);
|
|
210
|
+
if (typeof aspf === "string")
|
|
211
|
+
return aspf;
|
|
212
|
+
const expectation = {
|
|
213
|
+
...(policy.value === undefined ? {} : { policy: policy.value }),
|
|
214
|
+
...(subdomainPolicy.value === undefined ? {} : { subdomainPolicy: subdomainPolicy.value }),
|
|
215
|
+
...(adkim.value === undefined ? {} : { adkim: adkim.value }),
|
|
216
|
+
...(aspf.value === undefined ? {} : { aspf: aspf.value }),
|
|
217
|
+
};
|
|
218
|
+
return Object.keys(expectation).length === 0 ? undefined : expectation;
|
|
219
|
+
}
|
|
127
220
|
async function runDns(command, options, output) {
|
|
128
221
|
let domain = command.domain;
|
|
222
|
+
let replyTo = command.replyTo;
|
|
129
223
|
if (domain === undefined) {
|
|
130
224
|
if (options.config === undefined) {
|
|
131
225
|
output.error("softure-mail dns: pass --domain <domain>, or run it with the app's config to check the sender's domain");
|
|
132
226
|
return EXIT_FAILED;
|
|
133
227
|
}
|
|
134
|
-
|
|
228
|
+
const mailing = getMailingOptions(options.config);
|
|
229
|
+
domain = getSenderDomain(mailing.from);
|
|
230
|
+
replyTo ??= mailing.replyTo;
|
|
135
231
|
}
|
|
232
|
+
const returnPath = [...(command.resendReturnPath ? resendReturnPath(domain) : []), ...command.returnPathHosts.map((host) => ({ host }))];
|
|
136
233
|
const report = await checkSenderDns(domain, {
|
|
137
234
|
...(command.dkimSelectors === undefined ? {} : { dkimSelectors: command.dkimSelectors }),
|
|
138
235
|
...(command.spfHosts === undefined ? {} : { spfHosts: command.spfHosts }),
|
|
236
|
+
...(command.expectDmarc === undefined ? {} : { expectDmarc: command.expectDmarc }),
|
|
237
|
+
...(replyTo === undefined ? {} : { replyTo }),
|
|
238
|
+
returnPath,
|
|
139
239
|
...(options.resolveTxt === undefined ? {} : { resolveTxt: options.resolveTxt }),
|
|
240
|
+
...(options.resolveMx === undefined ? {} : { resolveMx: options.resolveMx }),
|
|
241
|
+
...(options.resolveCname === undefined ? {} : { resolveCname: options.resolveCname }),
|
|
140
242
|
});
|
|
141
|
-
const
|
|
243
|
+
const authentication = [
|
|
142
244
|
["SPF", report.spf],
|
|
143
245
|
["DKIM", report.dkim],
|
|
144
246
|
["DMARC", report.dmarc],
|
|
145
247
|
];
|
|
248
|
+
const reply = report.replyTo === null ? [] : [["REPLY", report.replyTo]];
|
|
249
|
+
const paths = report.returnPath.map((check) => ["PATH", check]);
|
|
146
250
|
output.log(`sender domain ${report.domain}`);
|
|
147
|
-
for (const [name, check] of
|
|
148
|
-
const line = `${name.padEnd(6)}${check.status.padEnd(6)}${check.finding
|
|
251
|
+
for (const [name, check] of [...authentication, ...reply, ...paths]) {
|
|
252
|
+
const line = `${name.padEnd(6)}${check.status.padEnd(6)}${`${check.finding} `.padEnd(15)}${check.host}${check.record === null ? "" : ` ${check.record}`}`;
|
|
149
253
|
if (check.status === "fail")
|
|
150
254
|
output.error(line);
|
|
151
255
|
else
|
|
152
256
|
output.log(line);
|
|
153
257
|
}
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
258
|
+
const countFailed = (checks) => checks.filter(([, check]) => check.status === "fail").length;
|
|
259
|
+
const failedAuthentication = countFailed(authentication);
|
|
260
|
+
const failedReply = countFailed(reply);
|
|
261
|
+
const failedPaths = countFailed(paths);
|
|
262
|
+
if (failedAuthentication + failedReply + failedPaths === 0) {
|
|
263
|
+
output.log("receivers can authenticate mail from this domain");
|
|
264
|
+
return EXIT_OK;
|
|
265
|
+
}
|
|
266
|
+
if (failedAuthentication > 0)
|
|
267
|
+
output.log(`${String(failedAuthentication)} check(s) failed: list mail from this domain will land in spam or be refused`);
|
|
268
|
+
if (failedReply > 0)
|
|
269
|
+
output.log("the reply-to domain does not accept mail: replies will bounce");
|
|
270
|
+
if (failedPaths > 0)
|
|
271
|
+
output.log(`${String(failedPaths)} return-path host(s) failed: the provider cannot use them for bounces`);
|
|
272
|
+
return EXIT_FAILED;
|
|
157
273
|
}
|
|
158
274
|
async function runCampaign(command, options, output) {
|
|
159
275
|
const cwd = options.cwd ?? process.cwd();
|
|
@@ -162,9 +278,19 @@ async function runCampaign(command, options, output) {
|
|
|
162
278
|
output.error("softure-mail campaign: needs the app's config");
|
|
163
279
|
return EXIT_FAILED;
|
|
164
280
|
}
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
281
|
+
const input = createInputReader(cwd, options.readStdin ?? readProcessStdin);
|
|
282
|
+
const content = await loadCampaignContent(command.contentFile, input);
|
|
283
|
+
if (typeof content === "string") {
|
|
284
|
+
output.error(`softure-mail campaign: ${content}`);
|
|
285
|
+
return EXIT_FAILED;
|
|
286
|
+
}
|
|
287
|
+
const listed = command.recipientsFile === null ? null : await loadRecipientFile(command.recipientsFile, input);
|
|
288
|
+
if (typeof listed === "string") {
|
|
289
|
+
output.error(`softure-mail campaign: ${listed}`);
|
|
290
|
+
return EXIT_FAILED;
|
|
291
|
+
}
|
|
292
|
+
if (listed === null && getMailingOptions(config).listCampaignRecipients === undefined) {
|
|
293
|
+
output.error("softure-mail campaign: pass --recipients <file>, or set listCampaignRecipients in the mailing options");
|
|
168
294
|
return EXIT_FAILED;
|
|
169
295
|
}
|
|
170
296
|
if (!command.dryRun && readUnsubscribeSecrets(options.env ?? process.env).current === null) {
|
|
@@ -185,6 +311,7 @@ async function runCampaign(command, options, output) {
|
|
|
185
311
|
}
|
|
186
312
|
const ctx = { db: opened.handle.db, clock: systemClock, config };
|
|
187
313
|
try {
|
|
314
|
+
const loaded = { campaign: content, recipients: listed ?? (await collectRecipients(ctx, content)) };
|
|
188
315
|
return command.dryRun
|
|
189
316
|
? await reportPlan(ctx, loaded, command.resendUncertain, output)
|
|
190
317
|
: await reportSend(ctx, loaded, { pauseMs: command.pauseMs, sleep: options.sleep, retakeUncertain: command.resendUncertain }, output);
|
|
@@ -198,27 +325,151 @@ async function runCampaign(command, options, output) {
|
|
|
198
325
|
await opened.close();
|
|
199
326
|
}
|
|
200
327
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
328
|
+
function createInputReader(cwd, readStdin) {
|
|
329
|
+
return {
|
|
330
|
+
read: async (file) => {
|
|
331
|
+
if (file === STDIN)
|
|
332
|
+
return { text: await readStdin(), name: "standard input", dir: cwd };
|
|
333
|
+
const path = resolve(cwd, file);
|
|
334
|
+
return { text: await readText(path), name: path, dir: dirname(path) };
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
async function loadCampaignContent(file, input) {
|
|
339
|
+
const source = await input.read(file);
|
|
340
|
+
if (source.text === null)
|
|
341
|
+
return `cannot read the content file ${source.name}`;
|
|
342
|
+
const parsed = parseCampaignFile(source.text);
|
|
206
343
|
if (!parsed.ok)
|
|
207
|
-
return `${
|
|
344
|
+
return `${source.name} is not a campaign:\n ${parsed.problems.join("\n ")}`;
|
|
208
345
|
const { htmlPath, ...content } = parsed.value;
|
|
209
346
|
let html = null;
|
|
210
347
|
if (htmlPath !== null) {
|
|
211
|
-
|
|
348
|
+
// Next to the content file; for standard input, the working directory.
|
|
349
|
+
const htmlFile = resolve(source.dir, htmlPath);
|
|
212
350
|
html = await readText(htmlFile);
|
|
213
351
|
if (html === null)
|
|
214
352
|
return `cannot read the HTML body ${htmlFile}`;
|
|
215
353
|
if (html.trim() === "")
|
|
216
354
|
return `the HTML body ${htmlFile} is empty`;
|
|
217
355
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
356
|
+
return { ...content, html };
|
|
357
|
+
}
|
|
358
|
+
async function loadRecipientFile(file, input) {
|
|
359
|
+
const list = await input.read(file);
|
|
360
|
+
if (list.text === null)
|
|
361
|
+
return `cannot read the recipients file ${list.name}`;
|
|
362
|
+
return parseRecipientList(list.text);
|
|
363
|
+
}
|
|
364
|
+
/** The recipients from `listCampaignRecipients`, which the caller checked is set. */
|
|
365
|
+
async function collectRecipients(ctx, campaign) {
|
|
366
|
+
const recipients = [];
|
|
367
|
+
const source = await listConfiguredCampaignRecipients(ctx, campaign);
|
|
368
|
+
if (source === null)
|
|
369
|
+
return recipients;
|
|
370
|
+
for await (const address of source)
|
|
371
|
+
recipients.push(address);
|
|
372
|
+
return recipients;
|
|
373
|
+
}
|
|
374
|
+
/** One line of a history file. Unknown keys are refused, so a typo does not drop a field. */
|
|
375
|
+
const historyRowSchema = z.strictObject({
|
|
376
|
+
scope: z.string(),
|
|
377
|
+
address: z.string(),
|
|
378
|
+
status: z.enum(["sent", "rejected"]),
|
|
379
|
+
finishedAt: z.string(),
|
|
380
|
+
providerMessageId: z.string().optional(),
|
|
381
|
+
reason: z.enum(["mailing.invalid_input", "mailing.rejected", "mailing.unavailable", "mailing.suppressed"]).optional(),
|
|
382
|
+
kind: z.string().optional(),
|
|
383
|
+
});
|
|
384
|
+
async function runImport(command, options, output) {
|
|
385
|
+
const config = options.config;
|
|
386
|
+
if (config === undefined) {
|
|
387
|
+
output.error("softure-mail import: needs the app's config");
|
|
388
|
+
return EXIT_FAILED;
|
|
389
|
+
}
|
|
390
|
+
const source = await createInputReader(options.cwd ?? process.cwd(), options.readStdin ?? readProcessStdin).read(command.historyFile);
|
|
391
|
+
if (source.text === null) {
|
|
392
|
+
output.error(`softure-mail import: cannot read the history file ${source.name}`);
|
|
393
|
+
return EXIT_FAILED;
|
|
394
|
+
}
|
|
395
|
+
const parsed = parseHistory(source.text);
|
|
396
|
+
if (parsed.problems.length > 0)
|
|
397
|
+
return reportImportProblems(parsed.problems, output);
|
|
398
|
+
const rows = parsed.rows.map((row) => row.delivery);
|
|
399
|
+
const lineOf = (problem) => parsed.rows[problem.index]?.line ?? 0;
|
|
400
|
+
// Checked before the database is opened, so a bad file costs no connection.
|
|
401
|
+
const checked = checkImportedDeliveries({ clock: systemClock }, rows);
|
|
402
|
+
if (!checked.ok)
|
|
403
|
+
return reportImportProblems(checked.problems.map((problem) => ({ line: lineOf(problem), problem: problem.problem })), output);
|
|
404
|
+
if (command.dryRun) {
|
|
405
|
+
output.log(`import, dry run: nothing written; rows ${String(rows.length)}, duplicates ${String(checked.value.duplicates)}`);
|
|
406
|
+
return EXIT_OK;
|
|
407
|
+
}
|
|
408
|
+
if (config.database === null) {
|
|
409
|
+
output.error("softure-mail import: the config has no database; set database.url in softure.config");
|
|
410
|
+
return EXIT_FAILED;
|
|
411
|
+
}
|
|
412
|
+
let opened;
|
|
413
|
+
try {
|
|
414
|
+
opened = await openDatabase(config.database, options.openDatabase);
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
output.error(`softure-mail import: ${describeError(error)}`);
|
|
418
|
+
return EXIT_FAILED;
|
|
419
|
+
}
|
|
420
|
+
try {
|
|
421
|
+
const result = await importDeliveries({ db: opened.handle.db, clock: systemClock, config }, rows);
|
|
422
|
+
if (!result.ok)
|
|
423
|
+
return reportImportProblems(result.problems.map((problem) => ({ line: lineOf(problem), problem: problem.problem })), output);
|
|
424
|
+
const summary = result.value;
|
|
425
|
+
output.log(`import: rows ${String(summary.rows)}, imported ${String(summary.imported)}, already present ${String(summary.alreadyPresent)}, duplicates ${String(summary.duplicates)}`);
|
|
426
|
+
return EXIT_OK;
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
output.error(`softure-mail import: ${describeError(error)} (did softure migrate run?)`);
|
|
430
|
+
return EXIT_FAILED;
|
|
431
|
+
}
|
|
432
|
+
finally {
|
|
433
|
+
await opened.close();
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/** The history file's rows with their line numbers; problems name lines and fields, never values. */
|
|
437
|
+
function parseHistory(text) {
|
|
438
|
+
const rows = [];
|
|
439
|
+
const problems = [];
|
|
440
|
+
text.split(/\r?\n/).forEach((source, index) => {
|
|
441
|
+
const line = index + 1;
|
|
442
|
+
if (source.trim() === "")
|
|
443
|
+
return;
|
|
444
|
+
let value;
|
|
445
|
+
try {
|
|
446
|
+
value = JSON.parse(source);
|
|
447
|
+
}
|
|
448
|
+
catch {
|
|
449
|
+
problems.push({ line, problem: "not a JSON object" });
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
const parsed = historyRowSchema.safeParse(value);
|
|
453
|
+
if (!parsed.success) {
|
|
454
|
+
for (const issue of parsed.error.issues) {
|
|
455
|
+
const field = issue.path.length === 0 ? "row" : issue.path.join(".");
|
|
456
|
+
problems.push({ line, problem: issue.code === "unrecognized_keys" ? `unknown field(s) ${issue.keys.join(", ")}` : `${field}: ${issue.message}` });
|
|
457
|
+
}
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
const { providerMessageId, reason, kind, ...required } = parsed.data;
|
|
461
|
+
rows.push({
|
|
462
|
+
line,
|
|
463
|
+
delivery: { ...required, ...(providerMessageId === undefined ? {} : { providerMessageId }), ...(reason === undefined ? {} : { reason }), ...(kind === undefined ? {} : { kind }) },
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
return { rows, problems };
|
|
467
|
+
}
|
|
468
|
+
function reportImportProblems(problems, output) {
|
|
469
|
+
output.error(`softure-mail import: nothing written, ${String(problems.length)} problem(s):`);
|
|
470
|
+
for (const { line, problem } of problems)
|
|
471
|
+
output.error(` line ${String(line)}: ${problem}`);
|
|
472
|
+
return EXIT_FAILED;
|
|
222
473
|
}
|
|
223
474
|
async function reportPlan(ctx, loaded, retakeUncertain, output) {
|
|
224
475
|
const plan = await planCampaign(ctx, loaded, { retakeUncertain });
|
|
@@ -298,6 +549,12 @@ async function openDatabase(database, open) {
|
|
|
298
549
|
const handle = await open(database.url);
|
|
299
550
|
return { handle, close: handle.close };
|
|
300
551
|
}
|
|
552
|
+
async function readProcessStdin() {
|
|
553
|
+
const chunks = [];
|
|
554
|
+
for await (const chunk of process.stdin)
|
|
555
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
556
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
557
|
+
}
|
|
301
558
|
async function readText(path) {
|
|
302
559
|
try {
|
|
303
560
|
return await readFile(path, "utf8");
|
package/dist/cli/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
package/dist/contract.d.ts
CHANGED
|
@@ -24,11 +24,22 @@ export type UnsubscribeErrorCode = "mailing.invalid_link";
|
|
|
24
24
|
export declare const TRANSACTIONAL_KIND = "transactional";
|
|
25
25
|
/** How an opt-out arrived: a mail client's one-click POST, the page's button, or an operator. */
|
|
26
26
|
export type SuppressionSource = "one-click" | "page" | "operator";
|
|
27
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* The link an unsubscribe came through, once verified: the module's signed link, or a legacy link with the values
|
|
29
|
+
* the app's `verify` accepted (only the names the link carried), so a hook can find the row that link named.
|
|
30
|
+
*/
|
|
31
|
+
export type VerifiedUnsubscribeLink = {
|
|
32
|
+
readonly scheme: "signed";
|
|
33
|
+
} | {
|
|
34
|
+
readonly scheme: "legacy";
|
|
35
|
+
readonly values: Readonly<Record<string, string>>;
|
|
36
|
+
};
|
|
37
|
+
/** What `onUnsubscribed` receives: who opted out (never the address), how, and through which link. */
|
|
28
38
|
export interface UnsubscribeEvent {
|
|
29
39
|
/** The recipient key of the link: privacy's email key of the same address (`getEmailKey`). */
|
|
30
40
|
readonly recipientKey: string;
|
|
31
41
|
readonly source: Exclude<SuppressionSource, "operator">;
|
|
42
|
+
readonly link: VerifiedUnsubscribeLink;
|
|
32
43
|
}
|
|
33
44
|
/**
|
|
34
45
|
* Called on every verified unsubscribe, in the suppression's transaction (`ctx.db` is that
|
|
@@ -52,14 +63,33 @@ export interface CampaignRecipient {
|
|
|
52
63
|
* A throw stops the campaign, like a database failure. Set in `mailing({ filterCampaignRecipient })`.
|
|
53
64
|
*/
|
|
54
65
|
export type CampaignRecipientFilter = (recipient: CampaignRecipient, ctx: ModuleContext<Queryable>) => Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Lists the addresses a campaign goes to, from the app's own data (e.g. the people who opted in to its kind), so a
|
|
68
|
+
* campaign can run where the database is without a recipients file. Duplicates are fine; `filterCampaignRecipient`
|
|
69
|
+
* and the suppression list still apply. A throw stops the campaign. Set in `mailing({ listCampaignRecipients })`.
|
|
70
|
+
*/
|
|
71
|
+
export type CampaignRecipientSource = (campaign: {
|
|
72
|
+
readonly id: string;
|
|
73
|
+
readonly kind: string;
|
|
74
|
+
}, ctx: ModuleContext<Queryable>) => Iterable<string> | AsyncIterable<string> | Promise<Iterable<string>>;
|
|
75
|
+
/**
|
|
76
|
+
* The query names of a legacy link. An array lists names the link must all carry. The object form adds names it
|
|
77
|
+
* may carry: a link is legacy when it has every `required` name, and the `optional` ones it has go to `verify` too.
|
|
78
|
+
* At most 8 names in all, none repeated, never `r` or `status`.
|
|
79
|
+
*/
|
|
80
|
+
export type LegacyUnsubscribeParams = readonly string[] | {
|
|
81
|
+
readonly required: readonly string[];
|
|
82
|
+
readonly optional?: readonly string[];
|
|
83
|
+
};
|
|
55
84
|
/**
|
|
56
85
|
* Unsubscribe links an app sent before it adopted the module, in its own scheme. `params` are the query names of
|
|
57
|
-
* such a link; `verify` receives
|
|
58
|
-
*
|
|
59
|
-
*
|
|
86
|
+
* such a link; `verify` receives the values the link carried (every required name, the optional names that are
|
|
87
|
+
* present and non-empty, each at most 512 characters) and returns the recipient's address when the link is genuine,
|
|
88
|
+
* else `null`. It must check the link's signature itself: whatever address it returns is unsubscribed. A throw
|
|
89
|
+
* reads as a failure (the person may try again), not as a bad link.
|
|
60
90
|
*/
|
|
61
91
|
export interface LegacyUnsubscribe {
|
|
62
|
-
readonly params:
|
|
92
|
+
readonly params: LegacyUnsubscribeParams;
|
|
63
93
|
readonly verify: (values: Readonly<Record<string, string>>, ctx: ModuleContext<Queryable>) => Promise<string | null>;
|
|
64
94
|
}
|
|
65
95
|
/** One mail to one recipient. A mail to a list is a loop over recipients, never a list in `to`. */
|