mirror of
https://github.com/bulwarkmail/native.git
synced 2026-11-03 08:06:59 +00:00
53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import type { EmailAddress, Identity } from '../api/types';
|
|
import { generateSubAddress } from './sub-addressing';
|
|
import { sanitizeDisplayName } from './rfc5322-mailbox';
|
|
|
|
export interface FromOverride {
|
|
name: string;
|
|
email: string;
|
|
}
|
|
|
|
/**
|
|
* The composer's custom From, or null when the organisation turned custom
|
|
* From off (`customFromEnabled`, webmail email-composer.tsx
|
|
* fromOverrideEnabled). An override set earlier, by hand or by the reply
|
|
* identity match, then no longer applies.
|
|
*/
|
|
export function activeFromOverride(
|
|
override: FromOverride | null,
|
|
customFromEnabled: boolean,
|
|
): FromOverride | null {
|
|
return customFromEnabled && override ? override : null;
|
|
}
|
|
|
|
/**
|
|
* The From header and envelope sender of an outgoing message: the custom From
|
|
* when one applies, else the identity's address with its sub-address tag. A
|
|
* From that isn't the identity's own address still goes out through the
|
|
* identity's envelope sender.
|
|
*/
|
|
export function composeSenderAddress(
|
|
identity: Identity,
|
|
opts: {
|
|
fromOverride: FromOverride | null;
|
|
customFromEnabled: boolean;
|
|
subAddressTag: string;
|
|
subAddressDelimiter?: string;
|
|
},
|
|
): { from: EmailAddress; envelopeMailFrom?: string } {
|
|
const override = activeFromOverride(opts.fromOverride, opts.customFromEnabled);
|
|
let from: EmailAddress;
|
|
if (override?.email.trim()) {
|
|
const overrideName = sanitizeDisplayName(override.name);
|
|
from = overrideName ? { name: overrideName, email: override.email.trim() } : { email: override.email.trim() };
|
|
} else {
|
|
const name = sanitizeDisplayName(identity.name);
|
|
const email = opts.subAddressTag
|
|
? generateSubAddress(identity.email, opts.subAddressTag, opts.subAddressDelimiter)
|
|
: identity.email;
|
|
from = name ? { name, email } : { email };
|
|
}
|
|
const envelopeMailFrom = from.email.toLowerCase() !== identity.email.toLowerCase() ? identity.email : undefined;
|
|
return { from, envelopeMailFrom };
|
|
}
|