From c4e48328ee60335bf9a5e03aa9eb3a0914722c15 Mon Sep 17 00:00:00 2001 From: ogrechko Date: Wed, 7 Oct 2026 10:02:24 +0000 Subject: [PATCH] Add a separate "From" address for mailboxes that can't send as their own login MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Real error from the previously-silent delivery failure: "550 5.7.60 SMTP; Client does not have permissions to send as this sender" — Exchange Online's exact rejection when the authenticated identity doesn't match the asserted From address. Common in hybrid M365/on-prem AD setups: the SMTP login is the AD UPN (e.g. elsup@zag.lan), but the mailbox's actual permitted send-as address is a different, customer-facing domain. Added an optional mailbox_config.fromAddress, surfaced in the email settings form, defaulting to the login when unset so every existing setup is unaffected. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01Gh2UXUQUVBWroWEnn1FLFG --- .../settings/email/mailbox-settings-form.tsx | 28 +- src/app/api/mailbox/config/route.ts | 2 + .../0013_military_ezekiel_stane.sql | 1 + src/lib/db/migrations/meta/0013_snapshot.json | 1216 +++++++++++++++++ src/lib/db/migrations/meta/_journal.json | 7 + src/lib/db/schema.ts | 7 + src/lib/mail/config.ts | 6 + src/lib/mail/smtp.ts | 5 +- 8 files changed, 1269 insertions(+), 3 deletions(-) create mode 100644 src/lib/db/migrations/0013_military_ezekiel_stane.sql create mode 100644 src/lib/db/migrations/meta/0013_snapshot.json diff --git a/src/app/(admin)/settings/email/mailbox-settings-form.tsx b/src/app/(admin)/settings/email/mailbox-settings-form.tsx index 1c04479..5682169 100644 --- a/src/app/(admin)/settings/email/mailbox-settings-form.tsx +++ b/src/app/(admin)/settings/email/mailbox-settings-form.tsx @@ -9,6 +9,7 @@ interface Status { user: string | null; imapHost: string | null; allowInsecureTls: boolean; + fromAddress: string | null; verifiedAt: number | null; } @@ -19,6 +20,7 @@ export function MailboxSettingsForm({ initialStatus }: { initialStatus: Status } const [smtpPort, setSmtpPort] = useState("587"); const [user, setUser] = useState(initialStatus.user ?? ""); const [password, setPassword] = useState(""); + const [fromAddress, setFromAddress] = useState(initialStatus.fromAddress ?? ""); const [allowInsecureTls, setAllowInsecureTls] = useState(true); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -38,6 +40,7 @@ export function MailboxSettingsForm({ initialStatus }: { initialStatus: Status } user, password, allowInsecureTls, + fromAddress, }), }); @@ -48,7 +51,15 @@ export function MailboxSettingsForm({ initialStatus }: { initialStatus: Status } return; } - setStatus({ configured: true, enabled: true, user, imapHost: host, allowInsecureTls, verifiedAt: Date.now() }); + setStatus({ + configured: true, + enabled: true, + user, + imapHost: host, + allowInsecureTls, + fromAddress: fromAddress || null, + verifiedAt: Date.now(), + }); setPassword(""); } @@ -131,6 +142,21 @@ export function MailboxSettingsForm({ initialStatus }: { initialStatus: Status } /> + +