What it is:EmailJobEffectTarget implements core's EffectTarget (QRun-IO/qqq#1191, spec section 2.13).
Delivery: the email goes to qbit-email's own outbox via EmailEffects.send with the effect's idempotency key, so it lands exactly once per key, with the fixed Message-ID. The result is SENT with the message id, or FAILED when refused.
Identity: delivery runs as the job owner (JobSessions.forJob). If the owner can no longer send, the result is FAILED, never UNKNOWN.
Reconcile: looks the message up by key (findByIdempotencyKey).
Effect type: IDEMPOTENT_EXTERNAL.
Registration:EmailQBitProducer registers it as target email when durable jobs are enabled.
This builds on QQQ 4.1.0-RC.7 and follows #12.
- **What it is:** `EmailJobEffectTarget` implements core's `EffectTarget` (QRun-IO/qqq#1191, spec section 2.13).
- **Delivery:** the email goes to qbit-email's own outbox via `EmailEffects.send` with the effect's idempotency key, so it lands exactly once per key, with the fixed Message-ID. The result is SENT with the message id, or FAILED when refused.
- **Identity:** delivery runs as the job owner (`JobSessions.forJob`). If the owner can no longer send, the result is FAILED, never UNKNOWN.
- **Reconcile:** looks the message up by key (`findByIdempotencyKey`).
- **Effect type:** IDEMPOTENT_EXTERNAL.
- **Registration:** `EmailQBitProducer` registers it as target `email` when durable jobs are enabled.
- **Payload keys:** to, cc, bcc, subject, templateName, markdownBody, htmlBody, textBody, variables, category, providerName, brandName, locale, from, fromAddressId, replyTo, sendAfter, linkedTableName, linkedRecordId.
- **Docs:** `docs/DURABLE-JOBS.md` shows how to declare and emit an email effect.
**Testing:** `./mvnw verify` passes 301 tests (14 new), with checkstyle on main and test clean and coverage at 95.4% / 100%.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
This builds on QQQ 4.1.0-RC.7 and follows #12.
EmailJobEffectTargetimplements core'sEffectTarget(QRun-IO/qqq#1191, spec section 2.13).EmailEffects.sendwith the effect's idempotency key, so it lands exactly once per key, with the fixed Message-ID. The result is SENT with the message id, or FAILED when refused.JobSessions.forJob). If the owner can no longer send, the result is FAILED, never UNKNOWN.findByIdempotencyKey).EmailQBitProducerregisters it as targetemailwhen durable jobs are enabled.docs/DURABLE-JOBS.mdshows how to declare and emit an email effect.Testing:
./mvnw verifypasses 301 tests (14 new), with checkstyle on main and test clean and coverage at 95.4% / 100%.🤖 Generated with Claude Code