feat: route Sent copy to shared-mailbox account on per-identity send

This commit is contained in:
Roman Oswald
2026-05-29 23:44:12 +02:00
committed by Linus Rath
parent f238ca5898
commit 7341e47a1b
+20 -14
View File
@@ -2153,7 +2153,13 @@ export class JMAPClient implements IJMAPClient {
): Promise<SendEmailResult> { ): Promise<SendEmailResult> {
const holdForSeconds = delayedUntil ? this.validateDelayedUntil(delayedUntil) : undefined; const holdForSeconds = delayedUntil ? this.validateDelayedUntil(delayedUntil) : undefined;
const emailId = `send-${Date.now()}`; const emailId = `send-${Date.now()}`;
const mailboxes = await this.getMailboxes(); const targetAccountId = (fromEmail && Object.keys(this.accounts).find(id =>
this.accounts[id]?.name?.toLowerCase() === fromEmail.toLowerCase()
)) || this.accountId;
const mboxResp = await this.request([
["Mailbox/get", { accountId: targetAccountId }, "0"]
]);
const mailboxes = (mboxResp.methodResponses?.[0]?.[1]?.list || []) as Mailbox[];
const sentMailbox = mailboxes.find(mb => mb.role === 'sent'); const sentMailbox = mailboxes.find(mb => mb.role === 'sent');
if (!sentMailbox) { if (!sentMailbox) {
throw new Error('No sent mailbox found'); throw new Error('No sent mailbox found');
@@ -2167,25 +2173,25 @@ export class JMAPClient implements IJMAPClient {
let identityReplyTo: EmailAddress[] | undefined; let identityReplyTo: EmailAddress[] | undefined;
{ {
const identityResponse = await this.request([ const identityResponse = await this.request([
["Identity/get", { accountId: this.accountId }, "0"] ["Identity/get", { accountId: targetAccountId }, "0"]
]); ]);
if (!finalIdentityId) { if (!finalIdentityId) {
finalIdentityId = this.accountId; finalIdentityId = targetAccountId;
} }
if (identityResponse.methodResponses?.[0]?.[0] === "Identity/get") { if (identityResponse.methodResponses?.[0]?.[0] === "Identity/get") {
const identities = (identityResponse.methodResponses[0][1].list || []) as Identity[]; const identities = (identityResponse.methodResponses[0][1].list || []) as Identity[];
if (identities.length > 0) { if (identities.length > 0) {
if (!identityId) { let matchingIdentity = identityId
? identities.find((id) => id.id === identityId)
: undefined;
if (!matchingIdentity) {
const target = fromEmail || this.username; const target = fromEmail || this.username;
const matchingIdentity = identities.find((id) => id.email === target) matchingIdentity = identities.find((id) => id.email === target)
|| (!target.includes('@') ? identities.find((id) => id.email.split('@')[0] === target) : undefined); || (!target.includes('@') ? identities.find((id) => id.email.split('@')[0] === target) : undefined);
finalIdentityId = matchingIdentity?.id || identities[0].id;
identityReplyTo = matchingIdentity?.replyTo || identities[0].replyTo;
} else {
const matchedIdentity = identities.find((id) => id.id === identityId);
identityReplyTo = matchedIdentity?.replyTo;
} }
finalIdentityId = matchingIdentity?.id || identities[0].id;
identityReplyTo = matchingIdentity?.replyTo || identities[0].replyTo;
} }
} }
} }
@@ -2278,21 +2284,21 @@ export class JMAPClient implements IJMAPClient {
destroy: [draftId], destroy: [draftId],
}, "0"]); }, "0"]);
methodCalls.push(["Email/set", { methodCalls.push(["Email/set", {
accountId: this.accountId, accountId: targetAccountId,
create: { [emailId]: emailCreate }, create: { [emailId]: emailCreate },
}, "1"]); }, "1"]);
methodCalls.push(["EmailSubmission/set", { methodCalls.push(["EmailSubmission/set", {
accountId: this.getSubmissionAccountId(), accountId: this.getSubmissionAccountId(targetAccountId),
create: buildSubmissionCreate("1"), create: buildSubmissionCreate("1"),
onSuccessUpdateEmail, onSuccessUpdateEmail,
}, "2"]); }, "2"]);
} else { } else {
methodCalls.push(["Email/set", { methodCalls.push(["Email/set", {
accountId: this.accountId, accountId: targetAccountId,
create: { [emailId]: emailCreate }, create: { [emailId]: emailCreate },
}, "0"]); }, "0"]);
methodCalls.push(["EmailSubmission/set", { methodCalls.push(["EmailSubmission/set", {
accountId: this.getSubmissionAccountId(), accountId: this.getSubmissionAccountId(targetAccountId),
create: buildSubmissionCreate("1"), create: buildSubmissionCreate("1"),
onSuccessUpdateEmail, onSuccessUpdateEmail,
}, "1"]); }, "1"]);