fix(mail): align queue, outbound hostname, and DKIM selector behavior across the mail server APIs

This commit is contained in:
2026-04-14 12:17:50 +00:00
parent 04e73c366c
commit 65ecd94540
15 changed files with 387 additions and 147 deletions

View File

@@ -1,12 +1,13 @@
import { logger } from '../../logger.js';
import { DKIMCreator } from '../security/classes.dkimcreator.js';
import { hasStorageManagerMethods, type IStorageManagerLike } from '../interfaces.storage.js';
import { DomainRegistry } from './classes.domain.registry.js';
import { RustSecurityBridge } from '../../security/classes.rustsecuritybridge.js';
import { Email } from '../core/classes.email.js';
/** External DcRouter interface shape used by DkimManager */
interface DcRouter {
storageManager: any;
storageManager?: IStorageManagerLike;
dnsServer?: any;
}
@@ -39,11 +40,19 @@ export class DkimManager {
let keyPair: { privateKey: string; publicKey: string };
try {
keyPair = await this.dkimCreator.readDKIMKeys(domain);
keyPair = selector === 'default'
? await this.dkimCreator.readDKIMKeys(domain)
: await this.dkimCreator.readDKIMKeysForSelector(domain, selector);
logger.log('info', `Using existing DKIM keys for domain: ${domain}`);
} catch (error) {
keyPair = await this.dkimCreator.createDKIMKeys();
await this.dkimCreator.createAndStoreDKIMKeys(domain);
} catch {
await this.dkimCreator.handleDKIMKeysForSelector(
domain,
selector,
domainConfig.dkim?.keySize || 2048,
);
keyPair = selector === 'default'
? await this.dkimCreator.readDKIMKeys(domain)
: await this.dkimCreator.readDKIMKeysForSelector(domain, selector);
logger.log('info', `Generated new DKIM keys for domain: ${domain}`);
}
@@ -106,10 +115,12 @@ export class DkimManager {
logger.log('info', `DKIM DNS handler registered for new selector: ${newSelector}._domainkey.${domain}`);
await this.dcRouter.storageManager.set(
`/email/dkim/${domain}/public.key`,
keyPair.publicKey
);
if (hasStorageManagerMethods(this.dcRouter.storageManager, ['set'])) {
await this.dcRouter.storageManager.set(
`/email/dkim/${domain}/public.key`,
keyPair.publicKey
);
}
}
this.dkimCreator.cleanupOldKeys(domain, 30).catch(error => {
@@ -127,8 +138,10 @@ export class DkimManager {
async handleDkimSigning(email: Email, domain: string, selector: string): Promise<void> {
try {
await this.dkimCreator.handleDKIMKeysForDomain(domain);
const { privateKey } = await this.dkimCreator.readDKIMKeys(domain);
await this.dkimCreator.handleDKIMKeysForSelector(domain, selector);
const { privateKey } = selector === 'default'
? await this.dkimCreator.readDKIMKeys(domain)
: await this.dkimCreator.readDKIMKeysForSelector(domain, selector);
const rawEmail = email.toRFC822String();
// Detect key type from PEM header