feat(auth): codes go by mail, through the SMTP service an instance sets up

Email sign-in's codes are mailed over SMTP (pub.dev's mailer), through
whichever service the passwords name: emailSmtpHost, emailSmtpPort,
emailSmtpUser, emailSmtpPassword and emailFrom (EMAIL_SMTP_* and
EMAIL_FROM in deploy/.env, with EMAIL_SIGN_IN_PEPPER). TLS only:
STARTTLS, or TLS directly on 465. learn.halkyon.eu sends through Proton's
SMTP submission. Without a service, codes still go to the log in
development, and elsewhere there is no email sign-in.

The mail is plain text, in English or German: the code first and in the
subject, so it shows in the notification and the system can offer it,
the instance it signs in to, its 15 minutes, and that it can be ignored;
no links, no tracking, no HTML. A mail that couldn't be sent is a refusal
of its own (mailFailed): nothing of the request is kept, and the log
names the error's type only, as the service's answer may name the
address. A fake SMTP server on loopback drives the real mailer in the
tests: it delivers, and nothing goes to a server without TLS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-15 20:00:52 +02:00
commit 8075edb152
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -973,6 +973,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.20"
mailer:
dependency: transitive
description:
name: mailer
sha256: "9f7213f57272c2a047f13ae89e68652d492f929d84ded9a618424b38da328f97"
url: "https://pub.dev"
source: hosted
version: "7.2.0"
markdown:
dependency: transitive
description:
@ -1341,6 +1349,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.1"
punycoder:
dependency: transitive
description:
name: punycoder
sha256: "982734df864d9588eb13e28ac1c5a46b57e22117b3696032ac58739966cec190"
url: "https://pub.dev"
source: hosted
version: "0.3.0"
pure_zstd:
dependency: transitive
description:
@ -1852,6 +1868,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
unorm_dart:
dependency: transitive
description:
name: unorm_dart
sha256: b4f4d2aff27d65a5fc37f400d4c09e55d7535359315acbe3b895a9add4de3a23
url: "https://pub.dev"
source: hosted
version: "0.3.3"
uri_parser:
dependency: transitive
description: