@serve.zone/coremail 1.1.0 → 1.3.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/changelog.md +43 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.auth.d.ts +19 -0
- package/dist_ts/classes.auth.js +58 -1
- package/dist_ts/classes.coremail.d.ts +3 -0
- package/dist_ts/classes.coremail.js +11 -4
- package/dist_ts/classes.gateway.d.ts +11 -1
- package/dist_ts/classes.gateway.js +101 -63
- package/dist_ts/classes.inbound.d.ts +10 -1
- package/dist_ts/classes.inbound.js +45 -7
- package/dist_ts/classes.maintenance.js +16 -1
- package/dist_ts/classes.models.d.ts +24 -2
- package/dist_ts/classes.models.js +72 -2
- package/dist_ts/classes.server.d.ts +6 -2
- package/dist_ts/classes.server.js +18 -68
- package/dist_ts/classes.smtpsubmission.d.ts +85 -0
- package/dist_ts/classes.smtpsubmission.js +379 -0
- package/dist_ts/classes.storage.d.ts +9 -0
- package/dist_ts/classes.storage.js +44 -1
- package/dist_ts/classes.submissions.d.ts +27 -1
- package/dist_ts/classes.submissions.js +164 -14
- package/dist_ts/coremail.errors.d.ts +18 -0
- package/dist_ts/coremail.errors.js +84 -0
- package/dist_ts/coremail.log.d.ts +1 -1
- package/dist_ts/coremail.log.js +1 -1
- package/dist_ts/coremail.mime.d.ts +15 -0
- package/dist_ts/coremail.mime.js +76 -1
- package/dist_ts/coremail.persistence.d.ts +38 -1
- package/dist_ts/coremail.persistence.js +124 -40
- package/dist_ts/coremail.stats.d.ts +72 -0
- package/dist_ts/coremail.stats.js +242 -0
- package/dist_ts/coremail.validation.d.ts +15 -2
- package/dist_ts/coremail.validation.js +26 -78
- package/dist_ts/interfaces.d.ts +18 -0
- package/dist_ts/plugins.d.ts +1 -0
- package/dist_ts/plugins.js +2 -1
- package/package.json +12 -11
- package/readme.md +51 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.auth.ts +77 -0
- package/ts/classes.coremail.ts +20 -0
- package/ts/classes.gateway.ts +121 -66
- package/ts/classes.inbound.ts +71 -6
- package/ts/classes.maintenance.ts +14 -0
- package/ts/classes.models.ts +67 -1
- package/ts/classes.server.ts +23 -80
- package/ts/classes.smtpsubmission.ts +466 -0
- package/ts/classes.storage.ts +54 -0
- package/ts/classes.submissions.ts +247 -12
- package/ts/coremail.errors.ts +111 -0
- package/ts/coremail.log.ts +1 -0
- package/ts/coremail.mime.ts +89 -0
- package/ts/coremail.persistence.ts +196 -48
- package/ts/coremail.stats.ts +342 -0
- package/ts/coremail.validation.ts +31 -103
- package/ts/interfaces.ts +20 -0
- package/ts/plugins.ts +1 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { stableStringify } from './classes.gateway.js';
|
|
3
|
+
import { logCoreMailFailure } from './coremail.log.js';
|
|
4
|
+
import { CoreMailQuotaExceededError } from './coremail.quota.js';
|
|
5
|
+
/** Session grants live no longer than smartmta's own hook-grant window. */
|
|
6
|
+
const sessionTtlMs = 60 * 60 * 1000;
|
|
7
|
+
/** Hard cap mirroring smartmta's hook-grant table. */
|
|
8
|
+
const sessionMaximum = 4_096;
|
|
9
|
+
const reconcileIntervalMs = 1_000;
|
|
10
|
+
/** First retry delay after a failed start. */
|
|
11
|
+
const startBackoffBaseMs = 1_000;
|
|
12
|
+
/** Ceiling for the consecutive-failure backoff. */
|
|
13
|
+
const startBackoffMaximumMs = 60_000;
|
|
14
|
+
const waitForAbortableDelay = async (delayMsArg, signalArg) => {
|
|
15
|
+
if (signalArg.aborted)
|
|
16
|
+
return;
|
|
17
|
+
await new Promise((resolveArg) => {
|
|
18
|
+
const timer = setTimeout(() => {
|
|
19
|
+
signalArg.removeEventListener('abort', onAbort);
|
|
20
|
+
resolveArg();
|
|
21
|
+
}, delayMsArg);
|
|
22
|
+
const onAbort = () => {
|
|
23
|
+
clearTimeout(timer);
|
|
24
|
+
resolveArg();
|
|
25
|
+
};
|
|
26
|
+
signalArg.addEventListener('abort', onAbort, { once: true });
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* CoreMail's SMTP submission listener (MSA).
|
|
31
|
+
*
|
|
32
|
+
* smartmta owns the transport only: it terminates TLS, runs SMTP AUTH over an
|
|
33
|
+
* encrypted channel, and hands every accepted message to `onMessageData` as
|
|
34
|
+
* the exact received bytes. Nothing is stored, queued or forwarded by it —
|
|
35
|
+
* `onMessageData` returns without `continueProcessing`, so the message ends at
|
|
36
|
+
* `CoreMailSubmissionService.submitRaw` and CoreMail's own durable outbound
|
|
37
|
+
* pipeline. The `MemoryStorageManager` handed to smartmta is therefore
|
|
38
|
+
* expected to stay empty for the life of the process; a test asserts that.
|
|
39
|
+
*
|
|
40
|
+
* The listener fails closed. It runs only when the desired state enables it
|
|
41
|
+
* and both PEM secrets resolve, because smartmta's Rust listener refuses AUTH
|
|
42
|
+
* on a cleartext session (538 5.7.11) and a listener without certificate
|
|
43
|
+
* material would advertise neither STARTTLS nor AUTH.
|
|
44
|
+
*/
|
|
45
|
+
export class CoreMailSmtpSubmissionServer {
|
|
46
|
+
config;
|
|
47
|
+
auth;
|
|
48
|
+
submissions;
|
|
49
|
+
getDesiredState;
|
|
50
|
+
now;
|
|
51
|
+
server = null;
|
|
52
|
+
storageManager = null;
|
|
53
|
+
serverSignature = '';
|
|
54
|
+
stopController = new AbortController();
|
|
55
|
+
reconcileTask = null;
|
|
56
|
+
sessions = new Map();
|
|
57
|
+
unavailableReason = 'CoreMail SMTP listener has not started.';
|
|
58
|
+
loggedUnavailableSignature = '';
|
|
59
|
+
/** Signature of the configuration the last start was attempted for. */
|
|
60
|
+
attemptedSignature = '';
|
|
61
|
+
startFailures = 0;
|
|
62
|
+
reportedUnavailable = 0;
|
|
63
|
+
nextStartAttemptAt = 0;
|
|
64
|
+
constructor(config, auth, submissions, getDesiredState, now = Date.now) {
|
|
65
|
+
this.config = config;
|
|
66
|
+
this.auth = auth;
|
|
67
|
+
this.submissions = submissions;
|
|
68
|
+
this.getDesiredState = getDesiredState;
|
|
69
|
+
this.now = now;
|
|
70
|
+
}
|
|
71
|
+
start() {
|
|
72
|
+
this.reconcileTask ??= this.runReconciliationLoop();
|
|
73
|
+
}
|
|
74
|
+
async stop() {
|
|
75
|
+
this.stopController.abort();
|
|
76
|
+
await this.reconcileTask?.catch(() => undefined);
|
|
77
|
+
this.reconcileTask = null;
|
|
78
|
+
await this.shutdownServer();
|
|
79
|
+
this.sessions.clear();
|
|
80
|
+
this.resetStartBackoff('');
|
|
81
|
+
}
|
|
82
|
+
/** Whether the listener is currently accepting submissions. */
|
|
83
|
+
isReady() {
|
|
84
|
+
return this.server !== null && this.unavailableReason === null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Operator-facing view of the start-retry state. A listener that cannot bind
|
|
88
|
+
* (busy port, unusable key pair, missing mailer-bin) backs off instead of
|
|
89
|
+
* respawning the Rust bridge once per reconcile tick.
|
|
90
|
+
*/
|
|
91
|
+
getListenerDiagnostics() {
|
|
92
|
+
return {
|
|
93
|
+
startFailures: this.startFailures,
|
|
94
|
+
reportedUnavailable: this.reportedUnavailable,
|
|
95
|
+
nextStartAttemptAt: this.nextStartAttemptAt,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** In-memory storage handed to smartmta, for the emptiness assertion. */
|
|
99
|
+
getStorageManager() {
|
|
100
|
+
return this.storageManager;
|
|
101
|
+
}
|
|
102
|
+
async runReconciliationLoop() {
|
|
103
|
+
while (!this.stopController.signal.aborted) {
|
|
104
|
+
try {
|
|
105
|
+
await this.reconcile();
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
await logCoreMailFailure('smtp', 'RECONCILIATION_FAILED', error)
|
|
109
|
+
.catch(() => undefined);
|
|
110
|
+
}
|
|
111
|
+
await waitForAbortableDelay(reconcileIntervalMs, this.stopController.signal);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async reconcile() {
|
|
115
|
+
const desired = await this.getDesiredState();
|
|
116
|
+
const smtp = desired?.smtp;
|
|
117
|
+
if (!smtp || !smtp.enabled) {
|
|
118
|
+
await this.markUnavailable(smtp ? 'CoreMail SMTP listener is disabled.' : 'CoreMail SMTP listener is not configured.', stableStringify(smtp ?? null));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const material = this.resolveTlsMaterial(smtp);
|
|
122
|
+
if (!material) {
|
|
123
|
+
await this.markUnavailable('CoreMail SMTP listener TLS material does not resolve.', stableStringify(smtp));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const signature = stableStringify({ smtp, certPem: material.certPem });
|
|
127
|
+
if (this.server && signature === this.serverSignature)
|
|
128
|
+
return;
|
|
129
|
+
if (signature === this.attemptedSignature) {
|
|
130
|
+
// The same configuration failed already; wait out its backoff rather
|
|
131
|
+
// than spawning and tearing down the Rust bridge every tick.
|
|
132
|
+
if (this.now() < this.nextStartAttemptAt)
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
// A changed smtp section always restarts immediately.
|
|
137
|
+
this.resetStartBackoff(signature);
|
|
138
|
+
}
|
|
139
|
+
await this.shutdownServer();
|
|
140
|
+
if (this.stopController.signal.aborted)
|
|
141
|
+
return;
|
|
142
|
+
await this.startServer(smtp, material, signature);
|
|
143
|
+
}
|
|
144
|
+
resetStartBackoff(signatureArg) {
|
|
145
|
+
this.attemptedSignature = signatureArg;
|
|
146
|
+
this.startFailures = 0;
|
|
147
|
+
this.nextStartAttemptAt = 0;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Resolve both PEM secrets. A listener that cannot present a certificate
|
|
151
|
+
* must never come up: smartmta would then offer neither STARTTLS nor AUTH,
|
|
152
|
+
* and any client configured for submission would fail open into plaintext.
|
|
153
|
+
*/
|
|
154
|
+
resolveTlsMaterial(smtpArg) {
|
|
155
|
+
try {
|
|
156
|
+
const certPem = this.config.resolveRuntimeSecret(smtpArg.tls.certificatePemSecretKey);
|
|
157
|
+
const keyPem = this.config.resolveRuntimeSecret(smtpArg.tls.privateKeyPemSecretKey);
|
|
158
|
+
if (typeof certPem !== 'string'
|
|
159
|
+
|| !certPem.includes('BEGIN')
|
|
160
|
+
|| typeof keyPem !== 'string'
|
|
161
|
+
|| !keyPem.includes('BEGIN')) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
return { certPem, keyPem };
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Record why the listener is not serving and log it once per distinct
|
|
172
|
+
* reason. Repeating the same reason every reconcile tick would drown the
|
|
173
|
+
* operator in noise without adding information.
|
|
174
|
+
*/
|
|
175
|
+
async reportUnavailable(reasonArg, signatureArg, codeArg, errorArg) {
|
|
176
|
+
await this.shutdownServer();
|
|
177
|
+
this.unavailableReason = reasonArg;
|
|
178
|
+
const logSignature = `${codeArg}:${signatureArg}`;
|
|
179
|
+
if (this.loggedUnavailableSignature === logSignature)
|
|
180
|
+
return;
|
|
181
|
+
this.loggedUnavailableSignature = logSignature;
|
|
182
|
+
this.reportedUnavailable += 1;
|
|
183
|
+
await logCoreMailFailure('smtp', codeArg, errorArg, {
|
|
184
|
+
reason: reasonArg,
|
|
185
|
+
}).catch(() => undefined);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The configuration is not asking for a listener right now, so no start is
|
|
189
|
+
* pending and a later enable must take effect on its first tick.
|
|
190
|
+
*/
|
|
191
|
+
async markUnavailable(reasonArg, signatureArg) {
|
|
192
|
+
this.resetStartBackoff('');
|
|
193
|
+
await this.reportUnavailable(reasonArg, signatureArg, 'LISTENER_UNAVAILABLE');
|
|
194
|
+
}
|
|
195
|
+
async startServer(smtpArg, materialArg, signatureArg) {
|
|
196
|
+
const storageManager = new plugins.smartmta.MemoryStorageManager();
|
|
197
|
+
const server = new plugins.smartmta.UnifiedEmailServer({ storageManager }, {
|
|
198
|
+
ports: [smtpArg.port],
|
|
199
|
+
hostname: smtpArg.hostname,
|
|
200
|
+
// CoreMail hosts no inbound domain of its own here: this listener only
|
|
201
|
+
// relays authenticated submissions to the durable outbound pipeline.
|
|
202
|
+
domains: [],
|
|
203
|
+
routes: [{
|
|
204
|
+
name: 'submission',
|
|
205
|
+
match: { authenticated: true },
|
|
206
|
+
action: { type: 'process', allowRelay: true },
|
|
207
|
+
}],
|
|
208
|
+
persistRoutes: false,
|
|
209
|
+
dkimKeyProvisioning: 'caller-managed',
|
|
210
|
+
tls: { certPem: materialArg.certPem, keyPem: materialArg.keyPem },
|
|
211
|
+
auth: { required: true },
|
|
212
|
+
queue: { storageMode: 'memory' },
|
|
213
|
+
smtp: {
|
|
214
|
+
maxConcurrentMessages: 16,
|
|
215
|
+
recipientValidation: false,
|
|
216
|
+
authenticationTimeoutMs: 4_000,
|
|
217
|
+
messageAcceptanceTimeoutMs: 30_000,
|
|
218
|
+
},
|
|
219
|
+
maxMessageSize: plugins.serveZoneInterfaces.data.coreMailLimits.serializedMimeBytes,
|
|
220
|
+
hooks: {
|
|
221
|
+
onAuthenticate: (contextArg) => this.onAuthenticate(contextArg),
|
|
222
|
+
onMessageData: (contextArg) => this.onMessageData(contextArg),
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
try {
|
|
226
|
+
await server.start();
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
await server.stop().catch(() => undefined);
|
|
230
|
+
this.startFailures += 1;
|
|
231
|
+
this.nextStartAttemptAt = this.now() + Math.min(startBackoffMaximumMs, startBackoffBaseMs * 2 ** (this.startFailures - 1));
|
|
232
|
+
await this.reportUnavailable('CoreMail SMTP listener failed to start.', signatureArg, 'LISTENER_START_FAILED', error);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
this.server = server;
|
|
236
|
+
this.storageManager = storageManager;
|
|
237
|
+
this.serverSignature = signatureArg;
|
|
238
|
+
this.unavailableReason = null;
|
|
239
|
+
this.loggedUnavailableSignature = '';
|
|
240
|
+
this.startFailures = 0;
|
|
241
|
+
this.nextStartAttemptAt = 0;
|
|
242
|
+
}
|
|
243
|
+
async shutdownServer() {
|
|
244
|
+
const server = this.server;
|
|
245
|
+
this.server = null;
|
|
246
|
+
this.serverSignature = '';
|
|
247
|
+
this.sessions.clear();
|
|
248
|
+
if (!server)
|
|
249
|
+
return;
|
|
250
|
+
await server.stop().catch(async (error) => {
|
|
251
|
+
await logCoreMailFailure('smtp', 'LISTENER_SHUTDOWN_FAILED', error)
|
|
252
|
+
.catch(() => undefined);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
pruneSessions() {
|
|
256
|
+
const now = this.now();
|
|
257
|
+
for (const [sessionId, grant] of this.sessions) {
|
|
258
|
+
if (grant.expiresAt <= now)
|
|
259
|
+
this.sessions.delete(sessionId);
|
|
260
|
+
}
|
|
261
|
+
while (this.sessions.size > sessionMaximum) {
|
|
262
|
+
const oldest = this.sessions.keys().next();
|
|
263
|
+
if (oldest.done)
|
|
264
|
+
break;
|
|
265
|
+
this.sessions.delete(oldest.value);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async onAuthenticate(contextArg) {
|
|
269
|
+
// The SMTP username is the binding id; the password is any accepted
|
|
270
|
+
// credential secret of that binding.
|
|
271
|
+
const authenticated = await this.auth.authenticateSmtpSubmission(contextArg.username, contextArg.password);
|
|
272
|
+
if (!authenticated) {
|
|
273
|
+
return { accepted: false, message: 'CoreMail binding credential rejected.' };
|
|
274
|
+
}
|
|
275
|
+
const { binding } = authenticated;
|
|
276
|
+
const session = {
|
|
277
|
+
kind: 'workload',
|
|
278
|
+
peerId: `smtp:${contextArg.sessionId}`,
|
|
279
|
+
tenantId: binding.tenantId,
|
|
280
|
+
serviceId: binding.serviceId,
|
|
281
|
+
bindingId: binding.bindingId,
|
|
282
|
+
bindingRevision: binding.revision,
|
|
283
|
+
configEpoch: authenticated.configEpoch,
|
|
284
|
+
credentialId: authenticated.credentialId,
|
|
285
|
+
credentialVersion: authenticated.credentialVersion,
|
|
286
|
+
bindingState: binding.state === 'draining' ? 'draining' : 'active',
|
|
287
|
+
capabilities: [...binding.capabilities],
|
|
288
|
+
allowedOperations: [
|
|
289
|
+
...plugins.serveZoneInterfaces.data.resolveCoreMailWorkloadOperations(binding.state, binding.capabilities),
|
|
290
|
+
],
|
|
291
|
+
coreMailTransferOrigin: '-',
|
|
292
|
+
authenticatedAt: this.now(),
|
|
293
|
+
};
|
|
294
|
+
this.sessions.delete(contextArg.sessionId);
|
|
295
|
+
this.sessions.set(contextArg.sessionId, {
|
|
296
|
+
session,
|
|
297
|
+
binding,
|
|
298
|
+
expiresAt: this.now() + sessionTtlMs,
|
|
299
|
+
});
|
|
300
|
+
this.pruneSessions();
|
|
301
|
+
return {
|
|
302
|
+
accepted: true,
|
|
303
|
+
// smartmta enforces the same sender scope CoreMail enforces again in
|
|
304
|
+
// submitRaw, so an out-of-scope MAIL FROM is refused at RCPT time.
|
|
305
|
+
scope: { senders: [...binding.allowedSenders] },
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
async onMessageData(contextArg) {
|
|
309
|
+
const grant = this.sessions.get(contextArg.session.id);
|
|
310
|
+
if (!grant || grant.expiresAt <= this.now()) {
|
|
311
|
+
this.sessions.delete(contextArg.session.id);
|
|
312
|
+
return {
|
|
313
|
+
accepted: false,
|
|
314
|
+
smtpCode: 451,
|
|
315
|
+
smtpMessage: '4.7.1 Authentication scope unavailable; authenticate again',
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
// smartmta strips the CRLF that preceded the DATA terminator; the
|
|
320
|
+
// durable raw queue requires canonical CRLF-terminated bytes.
|
|
321
|
+
const rawMime = new Uint8Array(contextArg.rawMessage.byteLength + 2);
|
|
322
|
+
rawMime.set(contextArg.rawMessage, 0);
|
|
323
|
+
rawMime.set([0x0d, 0x0a], contextArg.rawMessage.byteLength);
|
|
324
|
+
await this.submissions.submitRaw(grant.session, grant.binding, {
|
|
325
|
+
envelope: {
|
|
326
|
+
from: contextArg.session.envelope.mailFrom.address,
|
|
327
|
+
to: contextArg.session.envelope.rcptTo.map((recipientArg) => recipientArg.address),
|
|
328
|
+
},
|
|
329
|
+
rawMime,
|
|
330
|
+
});
|
|
331
|
+
// No continueProcessing: smartmta stores, queues and forwards nothing.
|
|
332
|
+
return { accepted: true };
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
return this.refusalFor(error);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
refusalFor(errorArg) {
|
|
339
|
+
if (errorArg instanceof CoreMailQuotaExceededError) {
|
|
340
|
+
return {
|
|
341
|
+
accepted: false,
|
|
342
|
+
smtpCode: 452,
|
|
343
|
+
smtpMessage: '4.2.1 Mail quota exceeded; try again later',
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
const message = errorArg instanceof Error ? errorArg.message : '';
|
|
347
|
+
if (message.includes('sender is not authorized')) {
|
|
348
|
+
return {
|
|
349
|
+
accepted: false,
|
|
350
|
+
smtpCode: 553,
|
|
351
|
+
smtpMessage: '5.7.1 Sender address not permitted',
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
if (message.includes('byte budget')) {
|
|
355
|
+
return {
|
|
356
|
+
accepted: false,
|
|
357
|
+
smtpCode: 552,
|
|
358
|
+
smtpMessage: '5.3.4 Message exceeds its size limit',
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
if (errorArg instanceof Error
|
|
362
|
+
&& (errorArg.name === 'CoreMailCapabilityDeniedError'
|
|
363
|
+
|| errorArg.name === 'CoreMailAuthorizationError')) {
|
|
364
|
+
return {
|
|
365
|
+
accepted: false,
|
|
366
|
+
smtpCode: 550,
|
|
367
|
+
smtpMessage: '5.7.1 Submission is not permitted by this authority',
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
void logCoreMailFailure('smtp', 'SUBMISSION_FAILED', errorArg)
|
|
371
|
+
.catch(() => undefined);
|
|
372
|
+
return {
|
|
373
|
+
accepted: false,
|
|
374
|
+
smtpCode: 451,
|
|
375
|
+
smtpMessage: '4.3.0 Submission temporarily unavailable',
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbXRwc3VibWlzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc210cHN1Ym1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBVWpFLDJFQUEyRTtBQUMzRSxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNwQyxzREFBc0Q7QUFDdEQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBQzdCLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLDhDQUE4QztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQztBQUNqQyxtREFBbUQ7QUFDbkQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUM7QUFRckMsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLEVBQ2pDLFVBQWtCLEVBQ2xCLFNBQXNCLEVBQ1AsRUFBRTtJQUNqQixJQUFJLFNBQVMsQ0FBQyxPQUFPO1FBQUUsT0FBTztJQUM5QixNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDckMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM1QixTQUFTLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELFVBQVUsRUFBRSxDQUFDO1FBQ2YsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ25CLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixVQUFVLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQztRQUNGLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLE9BQU8sNEJBQTRCO0lBb0JwQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBdkJYLE1BQU0sR0FFSCxJQUFJLENBQUM7SUFDUixjQUFjLEdBRVgsSUFBSSxDQUFDO0lBQ1IsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUNaLGNBQWMsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2hELGFBQWEsR0FBeUIsSUFBSSxDQUFDO0lBQ2xDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBcUMsQ0FBQztJQUNqRSxpQkFBaUIsR0FBa0IseUNBQXlDLENBQUM7SUFDN0UsMEJBQTBCLEdBQUcsRUFBRSxDQUFDO0lBQ3hDLHVFQUF1RTtJQUMvRCxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDeEIsYUFBYSxHQUFHLENBQUMsQ0FBQztJQUNsQixtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFDeEIsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBRS9CLFlBQ21CLE1BQXVCLEVBQ3ZCLElBQWtCLEVBQ2xCLFdBQXNDLEVBQ3RDLGVBQW9ELEVBQ3BELE1BQW9CLElBQUksQ0FBQyxHQUFHO1FBSjVCLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLFNBQUksR0FBSixJQUFJLENBQWM7UUFDbEIsZ0JBQVcsR0FBWCxXQUFXLENBQTJCO1FBQ3RDLG9CQUFlLEdBQWYsZUFBZSxDQUFxQztRQUNwRCxRQUFHLEdBQUgsR0FBRyxDQUF5QjtJQUM1QyxDQUFDO0lBRUcsS0FBSztRQUNWLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCwrREFBK0Q7SUFDeEQsT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHNCQUFzQjtRQUszQixPQUFPO1lBQ0wsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7WUFDN0Msa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtTQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUNsRSxpQkFBaUI7UUFHdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCO1FBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxDQUFDO3FCQUM3RCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUIsQ0FBQztZQUNELE1BQU0scUJBQXFCLENBQ3pCLG1CQUFtQixFQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVM7UUFDckIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FDeEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLEVBQzFGLGVBQWUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQzlCLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQ3hCLHVEQUF1RCxFQUN2RCxlQUFlLENBQUMsSUFBSSxDQUFDLENBQ3RCLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkUsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU87UUFDOUQsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUMscUVBQXFFO1lBQ3JFLDZEQUE2RDtZQUM3RCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCO2dCQUFFLE9BQU87UUFDbkQsQ0FBQzthQUFNLENBQUM7WUFDTixzREFBc0Q7WUFDdEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQy9DLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxZQUFvQjtRQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxrQkFBa0IsQ0FDeEIsT0FBcUI7UUFFckIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FDcEMsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQ25DLENBQUM7WUFDRixJQUNFLE9BQU8sT0FBTyxLQUFLLFFBQVE7bUJBQ3hCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7bUJBQzFCLE9BQU8sTUFBTSxLQUFLLFFBQVE7bUJBQzFCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFDNUIsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxpQkFBaUIsQ0FDN0IsU0FBaUIsRUFDakIsWUFBb0IsRUFDcEIsT0FBeUQsRUFDekQsUUFBa0I7UUFFbEIsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxNQUFNLFlBQVksR0FBRyxHQUFHLE9BQU8sSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsS0FBSyxZQUFZO1lBQUUsT0FBTztRQUM3RCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsWUFBWSxDQUFDO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUM7UUFDOUIsTUFBTSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtZQUNsRCxNQUFNLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsZUFBZSxDQUMzQixTQUFpQixFQUNqQixZQUFvQjtRQUVwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUN2QixPQUFxQixFQUNyQixXQUFnRCxFQUNoRCxZQUFvQjtRQUVwQixNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRTtZQUN6RSxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3JCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQix1RUFBdUU7WUFDdkUscUVBQXFFO1lBQ3JFLE9BQU8sRUFBRSxFQUFFO1lBQ1gsTUFBTSxFQUFFLENBQUM7b0JBQ1AsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUU7b0JBQzlCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtpQkFDOUMsQ0FBQztZQUNGLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLG1CQUFtQixFQUFFLGdCQUFnQjtZQUNyQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUNqRSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBQ3hCLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUU7WUFDaEMsSUFBSSxFQUFFO2dCQUNKLHFCQUFxQixFQUFFLEVBQUU7Z0JBQ3pCLG1CQUFtQixFQUFFLEtBQUs7Z0JBQzFCLHVCQUF1QixFQUFFLEtBQUs7Z0JBQzlCLDBCQUEwQixFQUFFLE1BQU07YUFDbkM7WUFDRCxjQUFjLEVBQ1osT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CO1lBQ3JFLEtBQUssRUFBRTtnQkFDTCxjQUFjLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDO2dCQUMvRCxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO2FBQzlEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM3QyxxQkFBcUIsRUFDckIsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FDbkQsQ0FBQztZQUNGLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUMxQix5Q0FBeUMsRUFDekMsWUFBWSxFQUNaLHVCQUF1QixFQUN2QixLQUFLLENBQ04sQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxZQUFZLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxNQUFNLGtCQUFrQixDQUFDLE1BQU0sRUFBRSwwQkFBMEIsRUFBRSxLQUFLLENBQUM7aUJBQ2hFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxhQUFhO1FBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQy9DLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxHQUFHO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsSUFBSSxNQUFNLENBQUMsSUFBSTtnQkFBRSxNQUFNO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQzFCLFVBQXFEO1FBRXJELG9FQUFvRTtRQUNwRSxxQ0FBcUM7UUFDckMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUM5RCxVQUFVLENBQUMsUUFBUSxFQUNuQixVQUFVLENBQUMsUUFBUSxDQUNwQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxDQUFDO1FBQy9FLENBQUM7UUFDRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsYUFBYSxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUE2QjtZQUN4QyxJQUFJLEVBQUUsVUFBVTtZQUNoQixNQUFNLEVBQUUsUUFBUSxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ3RDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLGVBQWUsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUNqQyxXQUFXLEVBQUUsYUFBYSxDQUFDLFdBQVc7WUFDdEMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZO1lBQ3hDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxpQkFBaUI7WUFDbEQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDbEUsWUFBWSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLGlCQUFpQixFQUFFO2dCQUNqQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQ25FLE9BQU8sQ0FBQyxLQUFLLEVBQ2IsT0FBTyxDQUFDLFlBQVksQ0FDckI7YUFDRjtZQUNELHNCQUFzQixFQUFFLEdBQUc7WUFDM0IsZUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7U0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1lBQ3RDLE9BQU87WUFDUCxPQUFPO1lBQ1AsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZO1NBQ3JDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixPQUFPO1lBQ0wsUUFBUSxFQUFFLElBQUk7WUFDZCxxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1NBQ2hELENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FDekIsVUFBc0Q7UUFFdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFFBQVEsRUFBRSxHQUFHO2dCQUNiLFdBQVcsRUFBRSw0REFBNEQ7YUFDMUUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxrRUFBa0U7WUFDbEUsOERBQThEO1lBQzlELE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQzdELFFBQVEsRUFBRTtvQkFDUixJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU87b0JBQ2xELEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUN4QyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FDdkM7aUJBQ0Y7Z0JBQ0QsT0FBTzthQUNSLENBQUMsQ0FBQztZQUNILHVFQUF1RTtZQUN2RSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRU8sVUFBVSxDQUNoQixRQUFpQjtRQUVqQixJQUFJLFFBQVEsWUFBWSwwQkFBMEIsRUFBRSxDQUFDO1lBQ25ELE9BQU87Z0JBQ0wsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLDRDQUE0QzthQUMxRCxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFFBQVEsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO1lBQ2pELE9BQU87Z0JBQ0wsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLG9DQUFvQzthQUNsRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLHNDQUFzQzthQUNwRCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQ0UsUUFBUSxZQUFZLEtBQUs7ZUFDdEIsQ0FDRCxRQUFRLENBQUMsSUFBSSxLQUFLLCtCQUErQjttQkFDOUMsUUFBUSxDQUFDLElBQUksS0FBSyw0QkFBNEIsQ0FDbEQsRUFDRCxDQUFDO1lBQ0QsT0FBTztnQkFDTCxRQUFRLEVBQUUsS0FBSztnQkFDZixRQUFRLEVBQUUsR0FBRztnQkFDYixXQUFXLEVBQUUscURBQXFEO2FBQ25FLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxDQUFDO2FBQzNELEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixPQUFPO1lBQ0wsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsR0FBRztZQUNiLFdBQVcsRUFBRSwwQ0FBMEM7U0FDeEQsQ0FBQztJQUNKLENBQUM7Q0FDRiJ9
|
|
@@ -24,6 +24,15 @@ export declare class CoreMailStorage {
|
|
|
24
24
|
}>;
|
|
25
25
|
cancel: (reasonArg?: unknown) => Promise<void>;
|
|
26
26
|
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Read at most `headBytesArg` leading bytes of a stored object.
|
|
29
|
+
*
|
|
30
|
+
* The object's integrity was already proven when its transfer grant was
|
|
31
|
+
* consumed, so a header scan does not need to re-hash the whole payload — it
|
|
32
|
+
* reads a bounded prefix and cancels. The verified full-object readers above
|
|
33
|
+
* remain the only way to obtain content that is acted on as a whole.
|
|
34
|
+
*/
|
|
35
|
+
readObjectHeadBytes(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number, headBytesArg: number, signalArg?: AbortSignal): Promise<Uint8Array>;
|
|
27
36
|
getVerifiedBytes(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number): Promise<Uint8Array>;
|
|
28
37
|
verifyObject(objectKeyArg: string, lengthBytesArg: number, sha256Arg: TCoreMailSha256, maximumBytesArg: number, signalArg?: AbortSignal): Promise<void>;
|
|
29
38
|
}
|
|
@@ -269,6 +269,49 @@ export class CoreMailStorage {
|
|
|
269
269
|
signal: signalArg,
|
|
270
270
|
}, 'webstream'), maximumBytesArg, lengthBytesArg, sha256Arg, signalArg, plugins.serveZoneInterfaces.data.coreMailLimits.transferIdleTimeoutMs);
|
|
271
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* Read at most `headBytesArg` leading bytes of a stored object.
|
|
274
|
+
*
|
|
275
|
+
* The object's integrity was already proven when its transfer grant was
|
|
276
|
+
* consumed, so a header scan does not need to re-hash the whole payload — it
|
|
277
|
+
* reads a bounded prefix and cancels. The verified full-object readers above
|
|
278
|
+
* remain the only way to obtain content that is acted on as a whole.
|
|
279
|
+
*/
|
|
280
|
+
async readObjectHeadBytes(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, headBytesArg, signalArg) {
|
|
281
|
+
if (!Number.isSafeInteger(headBytesArg) || headBytesArg < 1) {
|
|
282
|
+
throw new Error('CoreMail object head read length is invalid.');
|
|
283
|
+
}
|
|
284
|
+
const verified = await this.getVerifiedStream(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, signalArg);
|
|
285
|
+
const reader = verified.stream.getReader();
|
|
286
|
+
const chunks = [];
|
|
287
|
+
let total = 0;
|
|
288
|
+
try {
|
|
289
|
+
while (total < headBytesArg) {
|
|
290
|
+
const next = await reader.read();
|
|
291
|
+
if (next.done)
|
|
292
|
+
break;
|
|
293
|
+
chunks.push(next.value);
|
|
294
|
+
total += next.value.byteLength;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
finally {
|
|
298
|
+
await reader.cancel().catch(() => undefined);
|
|
299
|
+
reader.releaseLock();
|
|
300
|
+
await verified.cancel().catch(() => undefined);
|
|
301
|
+
// The digest is deliberately not awaited: only a prefix was consumed.
|
|
302
|
+
verified.completion.catch(() => undefined);
|
|
303
|
+
}
|
|
304
|
+
const head = new Uint8Array(Math.min(total, headBytesArg));
|
|
305
|
+
let offset = 0;
|
|
306
|
+
for (const chunk of chunks) {
|
|
307
|
+
if (offset >= head.byteLength)
|
|
308
|
+
break;
|
|
309
|
+
const slice = chunk.subarray(0, head.byteLength - offset);
|
|
310
|
+
head.set(slice, offset);
|
|
311
|
+
offset += slice.byteLength;
|
|
312
|
+
}
|
|
313
|
+
return head;
|
|
314
|
+
}
|
|
272
315
|
async getVerifiedBytes(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg) {
|
|
273
316
|
const verified = await this.getVerifiedStream(objectKeyArg, lengthBytesArg, sha256Arg, maximumBytesArg, AbortSignal.timeout(plugins.serveZoneInterfaces.data.coreMailLimits.transferOverallTimeoutMs));
|
|
274
317
|
const reader = verified.stream.getReader();
|
|
@@ -314,4 +357,4 @@ export class CoreMailStorage {
|
|
|
314
357
|
}
|
|
315
358
|
export const createSha256 = (valueArg) => plugins.serveZoneInterfaces.data.normalizeCoreMailSha256(`sha256:${plugins.nodeCrypto.createHash('sha256').update(valueArg).digest('hex')}`);
|
|
316
359
|
export const createOpaqueToken = () => plugins.nodeCrypto.randomBytes(32).toString('base64url');
|
|
317
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBSXhDLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBcUIsRUFBbUIsRUFBRSxDQUM5RCxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUN0RCxVQUFVLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztBQUVKLE1BQU0sa0JBQWtCLEdBQUcsQ0FDekIsU0FBcUMsRUFDckMsZUFBdUIsRUFDdkIsaUJBQTBCLEVBQzFCLGlCQUFtQyxFQUNuQyxTQUF1QixFQUN2QixnQkFBeUIsRUFLekIsRUFBRTtJQUNGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLGlCQUdNLENBQUM7SUFDWCxJQUFJLGdCQUE0QyxDQUFDO0lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxDQUczQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUMzQixpQkFBaUIsR0FBRyxVQUFVLENBQUM7UUFDL0IsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDM0IsSUFBSSxTQUFTLEdBQXlDLElBQUksQ0FBQztJQUMzRCxNQUFN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
|
|
360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBSXhDLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBcUIsRUFBbUIsRUFBRSxDQUM5RCxPQUFPLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUN0RCxVQUFVLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDcEYsQ0FBQztBQUVKLE1BQU0sa0JBQWtCLEdBQUcsQ0FDekIsU0FBcUMsRUFDckMsZUFBdUIsRUFDdkIsaUJBQTBCLEVBQzFCLGlCQUFtQyxFQUNuQyxTQUF1QixFQUN2QixnQkFBeUIsRUFLekIsRUFBRTtJQUNGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLGlCQUdNLENBQUM7SUFDWCxJQUFJLGdCQUE0QyxDQUFDO0lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxDQUczQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUMzQixpQkFBaUIsR0FBRyxVQUFVLENBQUM7UUFDL0IsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDM0IsSUFBSSxTQUFTLEdBQXlDLElBQUksQ0FBQztJQUMzRCxNQUFN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
|
|
@@ -2,7 +2,7 @@ import * as plugins from './plugins.js';
|
|
|
2
2
|
import { type ICoreMailModels } from './classes.models.js';
|
|
3
3
|
import { CoreMailStorage } from './classes.storage.js';
|
|
4
4
|
import { CoreMailTransferService } from './classes.transfer.js';
|
|
5
|
-
import type { ICoreMailWorkloadSession } from './interfaces.js';
|
|
5
|
+
import type { ICoreMailRawSubmissionInput, ICoreMailWorkloadSession } from './interfaces.js';
|
|
6
6
|
type TBinding = plugins.serveZoneInterfaces.data.ICoreMailBindingDesiredState;
|
|
7
7
|
type TSubmission = plugins.serveZoneInterfaces.data.ICoreMailSubmission;
|
|
8
8
|
export declare class CoreMailSubmissionService {
|
|
@@ -16,6 +16,23 @@ export declare class CoreMailSubmissionService {
|
|
|
16
16
|
submission: TSubmission;
|
|
17
17
|
replayed: boolean;
|
|
18
18
|
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Accept an exact-byte SMTP submission from an authenticated MSA session.
|
|
21
|
+
*
|
|
22
|
+
* CoreMail never parses, rewrites, or re-encodes `rawMime`. The bytes become
|
|
23
|
+
* the submission's immutable MIME directly, so the existing outbound worker
|
|
24
|
+
* and gateway hand an SMTP submission off exactly as they hand off an API
|
|
25
|
+
* submission that `finalize()` has published.
|
|
26
|
+
*
|
|
27
|
+
* The write order mirrors `finalize()`: the record that owns the object key
|
|
28
|
+
* is committed first and only becomes worker-visible once the bytes are
|
|
29
|
+
* durably stored, so a failure between the two steps leaves a retirable
|
|
30
|
+
* record rather than an object no record refers to.
|
|
31
|
+
*/
|
|
32
|
+
submitRaw(sessionArg: ICoreMailWorkloadSession, bindingArg: TBinding, inputArg: ICoreMailRawSubmissionInput): Promise<{
|
|
33
|
+
submissionId: string;
|
|
34
|
+
submissionDigest: plugins.serveZoneInterfaces.data.TCoreMailSha256;
|
|
35
|
+
}>;
|
|
19
36
|
preparePartUpload(sessionArg: ICoreMailWorkloadSession, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailPrepareOutboundPartUpload['request']): Promise<{
|
|
20
37
|
grant: plugins.serveZoneInterfaces.data.ICoreMailUploadGrant;
|
|
21
38
|
}>;
|
|
@@ -25,6 +42,15 @@ export declare class CoreMailSubmissionService {
|
|
|
25
42
|
finalize(sessionArg: ICoreMailWorkloadSession, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailFinalizeOutboundSubmission['request']): Promise<{
|
|
26
43
|
submission: TSubmission;
|
|
27
44
|
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Publish an owned immutable MIME and hand the submission to the worker.
|
|
47
|
+
*
|
|
48
|
+
* The submitted counter is incremented in the same transaction as the
|
|
49
|
+
* transition that publishes, and only when `statsSubmittedCountedAt` is
|
|
50
|
+
* still absent. An interrupted publication that finalization later repeats
|
|
51
|
+
* therefore republishes without counting a second submission.
|
|
52
|
+
*/
|
|
53
|
+
private publishSubmission;
|
|
28
54
|
get(sessionArg: ICoreMailWorkloadSession, requestArg: plugins.serveZoneInterfaces.requests.coremail.IReq_CoreMailGetOutboundSubmission['request']): Promise<{
|
|
29
55
|
submission: TSubmission;
|
|
30
56
|
}>;
|