Haraka
Communication & EmailA highly scalable Node.js SMTP server with a modular plugin architecture for handling thousands of concurrent connections and delivering high‑throughput mail.
Features
- Modular plugin system enabling custom behavior via JavaScript hooks
- Highly scalable, supports thousands of concurrent SMTP connections
- Built‑in spam protection plugins (DNSBLs, DKIM, SpamAssassin, rspamd, etc.)
Recent releases
View all 8 releases →
v3.1.5
Bug fix
Fixed SMTP forward queue hook to call next() after delivery.
Full changelog
- fix(smtp_forward): update AUTH to match WHATWG URL API #3546
- fix(smtp_forward): queue hook now calls next() after delivery
— see haraka/message-stream#17 - deps(all): bump versions to latest
- test: refactor server, use smtp_client for all tests #3548
- test runner is now node --test #3547
- test(smtp_client, tls_socket, smtp_forward): 95% coverage #3546
- ci: added explicit minimal permissions
v3.1.4
Breaking risk
Fixed crash on duplicate QUIT commands in outbound connections.
Full changelog
Fixed
- fix: add ensure_body for late parse_body=true #3539
- fix(outbound): prevent ERR_UNHANDLED_ERROR crash #3538
- fix(txn): more robust handling of body filter additions #3537
- fix(conn): avoid connection fault when 2x QUIT sent #3536
- fix(txn): more robust handling of broken messages #3535
- fix(connection): pause after odd SMTP command sequence #3525
Changed
- chore(plugins): deleted deprecated core_require
- dep(rabbitmq): repackaged as NPM module #3526
- deps(all): bump versions
- doc(Plugins): add sections filter, enrichment, and logging #3534
- added dropbox-plugin #3543
- es2024: #3527, #3528
- outbound replace fs callback with promises and async/await #3528
- dep(async): remove dep by replacing async.map with Queue
- use startsWith instead of indexOf === 0
- use spread syntax instead of [].concat and {}.assign
- use implicit arrow function returns
- replace deprecated substr with slice or substring
- test(outbound/queue): added tests #3531
- test: fixes for test-fixtures 1.4 & local plugins that do require('./')
- TL;DR: bundled plugins don't need a special require any more
- fixtures/plugin behaves more like real one, test accordingly
- refactored connection, transaction, and outbound to
node --test#3541- transaction.js (48 → 62 tests)
- connection.js (24 → 51 tests)
- moved ./test/outbound_* to ./test/outbound/, and fixed race conditions
- move TLS tests to haraka-tls #3542
- improve coverage for transaction, rfc1869, xclient, and record_envelope_addresses #3524
v3.1.3
Breaking risk
Breaking changes
- Removed the 'graph' dependency which used the unmaintained sqlite3 library
Full changelog
- fix(config): spool_dir and spool_after belong in connection.ini #3518
- fix(outbound): aggregate error path #3519
- fix(haraka): getHooks regex to grab only hook names
- deps(graph): removed, sqlite3 library is unmaintained
- deps: bump all to latest
- doc: fix no plugin names displayed with haraka --order #3517
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
About
Stars
5,572
Forks
702
Languages
JavaScript
Shell
HTML
Downloads/week
6,109
↑31%
NPM Maintainers
4
Contributors
215
Install & Platforms
Install via
npm