Commit Graph
177 Commits
Author SHA1 Message Date
Matthias Endler 11c428d4ff fix(ses): emit List-Unsubscribe inside the header section, not the body
The raw MIME template in sendRawEmail produced a blank line between Content-Type and List-Unsubscribe whenever no custom headers were passed, because the ternary for custom headers expanded to an empty string surrounded by newlines.

Per RFC 5322 §2.1 a blank line terminates the header section, so List-Unsubscribe ended up as the first line of the body. Lenient clients (Gmail, Outlook) recover; strict clients (Thunderbird) do not, breaking one-click unsubscribe and degrading Gmail/Yahoo bulk-sender deliverability signals.

Collect optional headers (custom + List-Unsubscribe) into an array, filter empties, and append them to the Content-Type line with a single newline separator. No codepath can now produce a blank line inside the header block.
2026-04-30 15:20:06 +02:00
Dries Augustyns 2eb407993b feat: add configurable attachment limits for email service
Closes #358
2026-04-29 08:48:03 +02:00
Dries Augustyns 10946511b0 feat: enhance contact data handling by filtering empty strings and allowing null to delete fields 2026-04-27 16:59:18 +02:00
Dries Augustyns d7eb85ffdd fix: update project disabled messages for clarity and consistency 2026-04-24 19:21:07 +02:00
Dries Augustyns c910d20bb7 feat: Enhance ease of use of workflow editor 2026-04-24 11:56:43 +02:00
Dries Augustyns 1637d54e1b fix: add project name and sender email parameters to phishing content check 2026-04-22 22:03:57 +02:00
Dries Augustyns 15294a40d8 fix: add project name and sender email parameters to phishing content check 2026-04-22 22:03:53 +02:00
Dries Augustyns bb78c86c40 fix: update phishing confidence threshold to 95% 2026-04-22 21:59:34 +02:00
Dries Augustyns 208c809a90 fix: Add in-memory cache for lower-confidence phishing checks 2026-04-22 07:40:23 +02:00
Dries Augustyns b7eb2549d4 fix: turn warning into success log 2026-04-21 22:08:07 +02:00
Dries Augustyns 91d0d2d297 fix: update response format for phishing analysis and improve JSON parsing comment 2026-04-21 21:53:16 +02:00
Dries Augustyns 862875428d fix: log message for projects passing phishing checks 2026-04-21 21:49:57 +02:00
Dries Augustyns 2da8b065d0 feat: implement phishing detection using OpenRouter API with configurable sampling rate 2026-04-21 21:28:31 +02:00
Dries Augustyns e048fc1570 feat: implement meter event processing with queue for Stripe billing 2026-04-20 21:30:52 +02:00
Dries Augustyns 4322de929a fix: reconcile totalRecipients in CampaignService to prevent stuck campaigns
closes #348
2026-04-20 20:15:56 +02:00
Dries Augustyns b79d416667 feat: implement AWS SNS signature verification in SecurityService 2026-04-20 18:40:19 +02:00
Dries Augustyns 5e62f517fc feat: Update new project bounce thresholds for stricter email handling 2026-04-16 08:05:56 +02:00
Dries Augustyns 44c86572c2 feat: Block domain changes for disabled projects with appropriate error handling 2026-04-16 07:56:41 +02:00
Dries Augustyns effdfdb6d6 test: Update absolute count ceilings tests for established projects with project aging logic 2026-04-15 21:04:53 +02:00
Dries Augustyns c0b2abaeca feat: Enhance security metrics handling with new thresholds and improved messaging 2026-04-15 20:55:42 +02:00
Dries Augustyns e3395083db feat: Enhance email processing to include parsed HTML body content in inbound email records
Closes #342
2026-04-13 17:58:52 +02:00
Dries Augustyns ae64c2dbb5 feat: Add emailId field to webhook events for better correlation with send requests
Closes #344
2026-04-13 17:15:41 +02:00
Dries Augustyns 52cb2b6c77 fix: Refactor date filtering logic for pagination in ActivityFeed and ActivityService 2026-04-13 17:06:22 +02:00
Dries Augustyns 9e2400c6de fix: Enhance email processing to support campaign types and improve unsubscribe logic 2026-04-02 14:09:01 +02:00
Dries Augustyns fb5aa8796a feat: Add headless template type 2026-04-02 12:43:27 +02:00
Dries Augustyns 284838279d test: Mock DNS lookup in integration tests for WorkflowExecutionService 2026-04-02 07:56:54 +02:00
Dries Augustyns 2c5a71518d fix: Implement SSRF protection in webhook handling with safeFetch method 2026-04-02 07:48:43 +02:00
Dries Augustyns d24259e8d2 feat: Add type to campaign 2026-04-01 18:49:51 +02:00
Dries Augustyns 3343e891bd feat: Disable projects on failed payment 2026-04-01 18:07:08 +02:00
Mathias Schüpany 7b6540a748 fix: Adapt SNS Webhook validation regex pattern to also support AWS eusc partition 2026-03-29 11:32:04 +02:00
Edvin 3b39d847cd fix: add alt text to email badge image 2026-03-23 09:08:24 +00:00
Dries Augustyns a99cde8839 fix: Enhance email step configuration validation and recipient handling 2026-03-19 15:18:40 +01:00
Dries AugustynsandGitHub f44d987bc9 Merge pull request #310 from mdwt/feature/multi-branch-conditions 2026-03-14 16:21:25 +01:00
Dries Augustyns b9d692cf5b fix: normalize field references and handle undefined values in JSON 2026-03-13 20:26:28 +01:00
Mikkel Svartveit 4451e921ca fix: visual editor preview 2026-03-11 14:04:47 +01:00
mdwtandClaude Opus 4.6 92949b7596 feat: Add multi-branch workflow conditions (switch/case)
Add a `mode: 'multi'` variant to CONDITION steps that allows matching a
field against multiple values, each routing to its own named branch.
Branches are evaluated in order; first match wins. A `default` branch
catches unmatched contacts.

- Schema: z.union for legacy binary + multi-branch condition configs
- Backend: executeCondition handles multi-branch evaluation with stable
  branch IDs, falls back to default when no branch matches
- Builder: Dynamic branch rendering with per-branch colors/labels,
  dagre layout spreads branches horizontally
- Config UI: Mode toggle (Simple If/Else vs Multi-branch Switch),
  dynamic branch list with add/remove
- Tests: 8 new multi-branch tests covering matching, ordering, default
  fallback, mixed operators, and transition routing
- Full backward compatibility: all changes gated on config.mode === 'multi'

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 12:57:05 +02:00
Dries Augustyns 1dc423a1c4 chore: Enhance image upload validation with magic byte checks 2026-03-10 20:10:13 +01:00
Dries Augustyns cc7fcdb4ef fix: Align preview and actual email for templates and campaigns 2026-03-05 19:45:28 +01:00
Dries AugustynsandGitHub 9b15b93b96 Merge pull request #281 from 5h0ov/multipart/related-support-embed-image
feat(api): support inline images in emails using Content-ID
2026-03-05 11:26:41 +01:00
dependabot[bot]andGitHub d162f255c2 chore(deps): bump multer from 2.0.2 to 2.1.1
Bumps [multer](https://github.com/expressjs/multer) from 2.0.2 to 2.1.1.
- [Release notes](https://github.com/expressjs/multer/releases)
- [Changelog](https://github.com/expressjs/multer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/expressjs/multer/compare/v2.0.2...v2.1.1)

---
updated-dependencies:
- dependency-name: multer
  dependency-version: 2.1.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-05 07:56:38 +00:00
Dries Augustyns b8f1ad9ab5 fix: Verify SNS URL before sending fetch request 2026-03-03 08:02:36 +01:00
Dries Augustyns ec1f4c9374 fix: Support any locale on creation 2026-02-26 20:57:14 +01:00
Dries Augustyns 5528288c7b Merge branch 'next' of https://github.com/useplunk/plunk into next 2026-02-23 21:45:25 +01:00
Dries Augustyns 7bd098bdd0 fix: Add support for STATIC segment type in CampaignService 2026-02-23 21:45:17 +01:00
Dries AugustynsandGitHub cbea263a91 Merge pull request #298 from josephsellers/fix/cookie-domain-local-tld 2026-02-23 14:17:36 +01:00
Dries Augustyns 4b51e386e3 feat: Static segments 2026-02-23 13:57:32 +01:00
josephsellers 59aa7845ba fix: correct cookie domain for .local TLD hostnames
getCookieDomain() returns '.localhost' for hostnames ending in '.local'
(e.g., app.plunk.local), causing the browser to reject the cookie
because the domain doesn't match the request origin.

Split the .localhost and .local cases so that .local hostnames return
the actual base domain (e.g., .plunk.local).
2026-02-22 16:01:25 +00:00
Dries Augustyns 21af8fe05e fix: Correctly set domain status on manual verify 2026-02-21 08:41:24 +01:00
Dries Augustyns 2c4d95e604 fix: Do not unsubscribe existing contacts 2026-02-20 16:58:17 +01:00
Dries Augustyns 573e2e8449 security: Enhance job status retrieval with project authorization 2026-02-19 19:51:22 +01:00