feat(core): the e-mail program after Java, measured against Java

The program sends to its account's SMTP server, one connection for each
recipient, and fetches its mails by POP3; the server now sends mails on
to other domains by MX and returns notices to their senders. The
program's folders are in the snapshot and go back into the project.
EmailClientRun plays six stories with two servers; the mail oracles run
in the language's locale, so Java's notice dates match the core's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-01 19:38:44 +00:00
co-authored by Claude Opus 5.5
parent 015635926f
commit 058675a148
30 changed files with 58319 additions and 1724 deletions
+39
View File
@@ -725,3 +725,42 @@ Gemessen (01.10.2026):
Verbindung endet; nach `DELE` nummeriert `LIST` neu, `RETR` nicht.
* Die Größe in `STAT` und `LIST` ist Javas eigene: die Länge von Text,
Absender, Betreff, Empfängerliste (`[a, b]`) und Datum.
## E-Mail-Programm (F3.3b)
`EmailClientRun` lässt Javas E-Mail-Programm (`EmailAnwendung`) auf
`mail-lan` mit zwei Servern arbeiten: `filius.de` auf .30 (die Konten von
`EmailRun`), `andere.de` auf .31 (carla); der DNS-Server kennt die MX beider
Domains, und beide Server fragen ihn. Das Konto ist annas; eine Mail entsteht
wie im Fenster (Absender „Anna Muster <anna@filius.de>“, die Adressen der
Felder) und geht an den SMTP-Server des Kontos, Abholen fragt den
POP3-Server. Aufgezeichnet werden die Frames, was Programm und Server ihren
Fenstern sagen, und am Ende Posteingang, Gesendete und die Konten beider
Server. Alle Mail-Orakel laufen seitdem in einer JVM mit dem Gebietsschema
der Sprache (`-Duser.language=de -Duser.country=DE`, für die englischen Fälle
en_GB): die Benachrichtigung trägt das Datum aus `DateFormat`, dessen Länge
jede spätere Sequenznummer verschiebt.
Gemessen (01.10.2026):
* Das Programm baut für jeden Empfänger (An, Cc, Bcc) eine eigene Verbindung
zum SMTP-Server des Kontos auf, immer an Port 25 (der SMTP-Port des
Kontos wird nicht gelesen). Ein Name als Server wird bei jeder Verbindung
neu aufgelöst; die DNS-Anfrage geht noch vor dem FIN der letzten
Verbindung, das SYN der neuen danach.
* Der Server schickt Mails an fremde Domains in seinem eigenen Thread
weiter: MX nachschlagen, dann ein neuer SMTP-Client je Weiterleitung. Ohne
MX bekommt der Absender der eigenen Domain eine Benachrichtigung; ist der
Absender fremd, schickt der Server sie mit leerem Absender (`MAIL FROM:
<>`) an dessen Domain, nachgeschlagen im Mitarbeiter-Thread, der dafür
wartet.
* Abholen: `USER`, `PASS`, `STAT`, `LIST`, dann je Mail `RETR` und `DELE`,
`QUIT`. Eine Antwort, die nicht passt, kommt als Ausnahme ins Fenster
(`java.lang.Exception: -ERR user or password wrong`), ein
Verbindungsfehler ebenso (`TimeOutException`).
* Ohne Server schickt der Client nur ein SYN (bekannter Java-Fehler aus
`TcpRun`); ein unbekannter Servername kommt als
`VerbindungsException: Ziel konnte nicht bestimmt werden!`.
* Wer von zwei fast gleichzeitig gebauten Sockets die nächste
TCP-Startnummer zieht, entscheidet der Thread-Takt (Programm und
Weiterleitung des Servers, wenige Millisekunden auseinander).