Status: Draft pending the open technical and content decisions in ../../project/PROJECT.md.
.mdb path/provider/bitness; from/reply address; minimum queue interval; send mode; display time zone; template root and image policy; opt-out review cadence; and business postal address. Store campaign-specific settings, template and image versions, contacts, suppressions, queue state, and opt-out review status in the .mdb. Store the SMTP password as a DPAPI-protected value in the .mdb, configured through a setup action. No operational value is hard-coded..mdb, and schema version. If any check fails, show a specific error and do not open the sending UI. Recheck the connection before dispatch after any database error.| ID | Priority | User story | Acceptance criteria / independent demo |
|---|---|---|---|
| S1 | P1 | As the owner, I can import business contacts so I can prepare a campaign. | Given a CSV with valid, invalid, and duplicate rows, preview counts and reasons; commit only valid unique contacts with source and import time. |
| S2 | P1 | As the owner, I can suppress an address so it receives no more marketing. | Given an address is suppressed before dispatch, every queued campaign skips it; importing it again does not unsuppress it. |
| S3 | P1 | As the owner, I can import, select, and preview reusable HTML templates so I know what a recipient will see. | Imported .html files appear in a template library; a safe preview includes required sender/opt-out details; active content and missing required fields block approval; approving a campaign freezes its selected version. |
| S4 | P1 | As the owner, I can test and approve a campaign so live sends are intentional. | Test send targets only an approved internal address; campaign starts only after review of recipient count and final template. |
| S5 | P1 | As the owner, I can schedule sends so contacts receive messages at the chosen pace. | At most one attempted recipient per interval across campaigns while the HTA is open; reopening does not cause a burst or auto-resume. |
| S6 | P1 | As the owner, I can pause or cancel a campaign so no further sends start. | After pause/cancel is committed, a new attempt does not begin; in-flight provider response is still recorded. |
| S7 | P1 | As the owner, I can see outcomes so I can fix failures. | Accepted, failed, and uncertain are distinct; report shows attempts and provider identifiers without exposing credentials. |
| S8 | P1 | As the owner, I can reconcile uncertain attempts so retries do not create avoidable duplicates. | Sender stops automatic retry on an ambiguous response; operator may mark verified sent or explicitly authorize one retry. |
| S9 | P1 | As a recipient, I can opt out so I receive no further marketing. | Every campaign names the monitored reply mailbox; the owner can record a request during the daily review; once recorded, all queued campaigns honor it before another attempt. |
| S10 | P2 | As the owner, I can receive bounce/complaint events so bad addresses are removed promptly. | A hard bounce or complaint suppresses the address before another campaign can send; duplicate events are harmless. |
| S11 | P2 | As the owner, I can personalize messages so each business sees relevant content. | Unknown merge fields and empty required values fail preflight; HTML values are escaped. |
| S12 | P2 | As the owner, I can export reports so I can review campaign results. | CSV export includes campaign, recipient, attempt time, provider result, and suppression reason. |
| S13 | P1 | As the owner, I can change system-wide settings without editing code. | The app loads the documented INI keys for SMTP, Access provider/path/bitness, pacing, open-window send mode, template/image policy, reply address, review cadence, and postal address; invalid values block startup, approval, or sending with a clear error; password rotation stores only protected bytes in the .mdb. |
| S14 | P1 | As the owner, I can use local images in an HTML template so my design appears in the email. | Import resolves supported template-relative images, snapshots their bytes, previews them, and sends them as inline MIME resources referenced by cid: URLs; changing or deleting source images after approval does not change queued mail. |
| S15 | P1 | As the owner, I get a clear database-driver check before the app opens so I can fix a 32-bit/64-bit mismatch. | A launcher tests the configured provider in the selected architecture, opens the real .mdb, checks schema version, and starts the HTA only on success; a missing or wrong-bitness provider produces an actionable error. |
.mdb schema creation, and a safe test mailbox. Exit: one internal test message with an embedded image through the proposed adapter and a successful startup gate on the target PC..mdb storage, with an inline image and verified suppression path.Sprint lengths and estimates should be set after the provider and deployment constraints are known.
Powered by TurnKey Linux.