Files
native/src/lib/compose-sender.ts
T

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 };
}