- .gitea/workflows/publish.yml: build, test and deploy on push to main
(snapshot), on v* tags (release version from the tag) and manually;
authenticates with the REGISTRY_TOKEN secret
- demo app is excluded from deployment
- pin maven-deploy-plugin and versions-maven-plugin
- README: how to consume the package
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G71TQ5jDETVwdUJxGAwaiT
- delivery: PolicyResolver (address > *@domain > default), RecipientKeyResolver
(discovery + validation), DeliveryPlanner (REQUIRE refusal, SPLIT/FAIL,
own copy per Bcc with hidden key IDs), MessageAssembler with sender keys
for readable sent copies, EnvelopeMimeMessage for per-copy SMTP envelopes
- sender: SecureMailSender with BUILT_IN and RELAY implementations and a
per-recipient SendReport; relay passes the strictest policy as a header hint
- autoconfigure: mode, default-policy, mixed-mode, recipients, sender-keys
and relay properties; relay sender is not a bean so spring.mail stays intact
- demo: sends through SecureMailSender
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G71TQ5jDETVwdUJxGAwaiT
- validation: CertificateValidator checks revocation, expiry, matching
user ID, a valid communications encryption subkey and the algorithm
policy; uses the earlier expiry when PGPainless and Bouncy Castle disagree
- crypto: PgpEncryptor (ASCII armor, hidden recipients for Bcc)
- mime: PgpMimeEncryptor builds RFC 3156 multipart/encrypted from the
whole CRLF-canonical inner entity, keeping envelope headers in the clear
- autoconfigure: validator and encryptor beans
- demo: encrypts when a valid key is found, plaintext otherwise
- rename groupId and Java packages to pro.thinhha.mailsender
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G71TQ5jDETVwdUJxGAwaiT
- Maven multi-module build on JDK 27 and Spring Boot 4.1.1 (BOM import)
- core: WKD discovery (advanced -> direct fallback), HTTP fetcher with
timeouts, no redirects and a size limit, Caffeine cache with per-outcome
TTLs capped at key expiry, pinned keys, composite chain
- autoconfigure: mail.pgp.* properties and discovery beans
- demo: sends test mails (plaintext for now) and reports the WKD result
- docs/PLAN.md: design, decisions and milestones
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G71TQ5jDETVwdUJxGAwaiT