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 Augustyns and GitHub
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
mdwt and Claude 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 Augustyns and GitHub
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] and GitHub
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 Augustyns and GitHub
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