Plesk-Sync: Legacy-Mailgroup-Adressen synchronisierten nicht
Prod-Bug: zusätzliche Weiterleitung eintragen → Toast meldet Erfolg, Plesk übernimmt nichts. Plesk hat zwei unabhängige Verteil-Mechanismen, Mailgroup (alte CLI-Anlagen) und Forwarding (neue). Unser Sync schrieb nur in Forwarding, die alte Adresse lief aber via Mailgroup → set:-Befehle landeten in ungenutzter Tabelle. Stage funktionierte, weil dort frisch im Forwarding- Modus angelegt. - EmailExistsResult um mailgroupActive/Members + forwardingActive/ Targets erweitert. - pleskProvider.emailExists parst alle vier Felder aus --info- stdout (Mailgroup: true|false, Group member(s): ..., Forward request: ...). - pleskProvider.updateForwardTargets setzt -mailgroup false dazu – deaktiviert den Legacy-Mechanismus. - syncForwardingForEmail holt vorm Plesk-Update die bestehenden Mailgroup-Members und Forwarding-Targets ab und importiert sie in unsere additionalForwardingEmails-Liste (canonical-Key-Dedup). Verlustfrei – kein Empfänger fällt beim Umschalten raus. Smoke-Test mit echtem Plesk-stdout (User-Log): 3 Group-Members sauber geparst, leeres "Forward request" als [] erkannt.
This commit is contained in:
@@ -180,17 +180,56 @@ export class PleskEmailProvider implements IEmailProvider {
|
||||
|
||||
// Mailbox-Status aus stdout parsen (Format: "Mailbox: true" oder "Mailbox: false")
|
||||
let hasMailbox: boolean | undefined;
|
||||
let mailgroupActive: boolean | undefined;
|
||||
let mailgroupMembers: string[] | undefined;
|
||||
let forwardingActive: boolean | undefined;
|
||||
let forwardingTargets: string[] | undefined;
|
||||
if (exists && result.stdout) {
|
||||
const mailboxMatch = result.stdout.match(/Mailbox:\s*(true|false)/i);
|
||||
if (mailboxMatch) {
|
||||
hasMailbox = mailboxMatch[1].toLowerCase() === 'true';
|
||||
}
|
||||
|
||||
// Mailgroup-Status + Mitglieder. Plesk listet sie auf einer
|
||||
// Zeile, Adressen sind durch Whitespace getrennt.
|
||||
const mailgroupMatch = result.stdout.match(/Mailgroup:\s*(true|false)/i);
|
||||
if (mailgroupMatch) {
|
||||
mailgroupActive = mailgroupMatch[1].toLowerCase() === 'true';
|
||||
}
|
||||
const groupMembersMatch = result.stdout.match(/Group member\(s\):\s*([^\n]*)/i);
|
||||
if (groupMembersMatch) {
|
||||
mailgroupMembers = groupMembersMatch[1]
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.filter((m) => m.includes('@'));
|
||||
}
|
||||
|
||||
// Forwarding-Status + Ziele. Plesk druckt "Forward request: <addrs>".
|
||||
// Auf manchen Plesk-Versionen heißt das Feld auch "Forwarding".
|
||||
const forwardActiveMatch = result.stdout.match(/Forwarding:\s*(true|false)/i);
|
||||
if (forwardActiveMatch) {
|
||||
forwardingActive = forwardActiveMatch[1].toLowerCase() === 'true';
|
||||
}
|
||||
const forwardTargetsMatch = result.stdout.match(/Forward(?:ing)?(?: request)?:\s*([^\n]*)/i);
|
||||
if (forwardTargetsMatch) {
|
||||
forwardingTargets = forwardTargetsMatch[1]
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.filter((m) => m.includes('@'));
|
||||
if (forwardingActive === undefined) {
|
||||
forwardingActive = (forwardingTargets?.length ?? 0) > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
exists,
|
||||
email: exists ? email : undefined,
|
||||
hasMailbox,
|
||||
mailgroupActive,
|
||||
mailgroupMembers,
|
||||
forwardingActive,
|
||||
forwardingTargets,
|
||||
};
|
||||
} catch (error) {
|
||||
// HTTP-Fehler oder Netzwerkfehler
|
||||
@@ -458,11 +497,20 @@ export class PleskEmailProvider implements IEmailProvider {
|
||||
};
|
||||
}
|
||||
|
||||
// Plesk CLI API: Weiterleitungsziele aktualisieren
|
||||
// Format für -forwarding-addresses: "set:email1,email2" ersetzt alle Adressen
|
||||
// Plesk CLI API: Weiterleitungsziele aktualisieren.
|
||||
// Format für -forwarding-addresses: "set:email1,email2" ersetzt alle Adressen.
|
||||
//
|
||||
// WICHTIG: Mailgroup parallel deaktivieren. Plesk hat zwei
|
||||
// unabhängige Verteil-Mechanismen (Mailgroup vs. Forwarding).
|
||||
// Alt-Anlagen liefen oft via Mailgroup – unser `set:`-Befehl auf
|
||||
// forwarding-addresses ändert dann eine ungenutzte Tabelle und
|
||||
// Mails landen weiterhin bei den Mailgroup-Members.
|
||||
// Der Service-Layer importiert vorher die Mailgroup-Members in die
|
||||
// `targets`-Liste, damit beim Umschalten nichts verloren geht.
|
||||
await this.request('POST', '/api/v2/cli/mail/call', {
|
||||
params: [
|
||||
'--update', email,
|
||||
'-mailgroup', 'false',
|
||||
'-forwarding', 'true',
|
||||
'-forwarding-addresses', `set:${targets.join(',')}`,
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user