Haraka 3.1.2 → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/.prettierignore +2 -0
  2. package/CONTRIBUTORS.md +24 -2
  3. package/Changes.md +48 -0
  4. package/Plugins.md +81 -64
  5. package/README.md +1 -1
  6. package/bin/haraka +9 -7
  7. package/config/connection.ini +10 -0
  8. package/config/smtp.ini +0 -9
  9. package/connection.js +15 -19
  10. package/docs/CoreConfig.md +2 -3
  11. package/docs/Plugins.md +1 -1
  12. package/docs/plugins/aliases.md +0 -2
  13. package/docs/plugins/queue/qmail-queue.md +0 -1
  14. package/docs/tutorials/Migrating_from_v1_to_v2.md +1 -1
  15. package/logger.js +2 -2
  16. package/outbound/client_pool.js +1 -1
  17. package/outbound/hmail.js +76 -83
  18. package/outbound/index.js +36 -34
  19. package/outbound/queue.js +231 -176
  20. package/package.json +29 -31
  21. package/plugins/prevent_credential_leaks.js +2 -2
  22. package/plugins/process_title.js +1 -1
  23. package/plugins/queue/smtp_forward.js +1 -1
  24. package/plugins/status.js +8 -5
  25. package/plugins/tls.js +1 -1
  26. package/plugins.js +19 -14
  27. package/rfc1869.js +10 -10
  28. package/run_tests +20 -2
  29. package/server.js +15 -10
  30. package/smtp_client.js +2 -9
  31. package/test/config/tls/haraka.local.pem +47 -47
  32. package/test/connection.js +286 -147
  33. package/test/fixtures/line_socket.js +1 -0
  34. package/test/fixtures/util_hmailitem.js +1 -1
  35. package/test/outbound/bounce_net_errors.js +176 -0
  36. package/test/outbound/bounce_rfc3464.js +303 -0
  37. package/test/outbound/hmail.js +140 -104
  38. package/test/outbound/index.js +61 -101
  39. package/test/outbound/qfile.js +25 -25
  40. package/test/outbound/queue.js +233 -0
  41. package/test/plugins/queue/smtp_forward.js +1 -1
  42. package/test/plugins/record_envelope_addresses.js +93 -0
  43. package/test/plugins/tls.js +2 -2
  44. package/test/plugins/xclient.js +137 -0
  45. package/test/rfc1869.js +43 -0
  46. package/test/smtp_client.js +6 -6
  47. package/test/transaction.js +486 -201
  48. package/tls_socket.js +3 -3
  49. package/transaction.js +33 -10
  50. package/config/me +0 -1
  51. package/config/rabbitmq.ini +0 -10
  52. package/config/rabbitmq_amqplib.ini +0 -19
  53. package/config/tls_cert.pem +0 -23
  54. package/config/tls_key.pem +0 -28
  55. package/docs/plugins/queue/rabbitmq.md +0 -34
  56. package/docs/plugins/queue/rabbitmq_amqplib.md +0 -51
  57. package/plugins/queue/rabbitmq.js +0 -141
  58. package/plugins/queue/rabbitmq_amqplib.js +0 -96
  59. package/test/config/tls/ec.pem +0 -23
  60. package/test/config/tls/mismatched.pem +0 -49
  61. package/test/outbound_bounce_net_errors.js +0 -157
  62. package/test/outbound_bounce_rfc3464.js +0 -366
  63. package/test/queue/multibyte +0 -0
  64. package/test/queue/plain +0 -0
  65. package/test/test-queue/delete-me +0 -0
  66. package/test/tls_socket.js +0 -273
package/.prettierignore CHANGED
@@ -2,3 +2,5 @@ docs/*.md
2
2
  Changes.md
3
3
  CONTRIBUTORS.md
4
4
  Plugins.md
5
+ .github/copilot-instructions.md
6
+ .release/
package/CONTRIBUTORS.md CHANGED
@@ -2,11 +2,33 @@
2
2
 
3
3
  This handcrafted artisanal software is brought to you by:
4
4
 
5
- | <img height="80" src="https://avatars.githubusercontent.com/u/261635?v=4"><br><a href="https://github.com/msimerson">msimerson</a> (<a href="https://github.com/haraka/Haraka/commits?author=msimerson">1643</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/662371?v=4"><br><a href="https://github.com/baudehlo">baudehlo</a> (<a href="https://github.com/haraka/Haraka/commits?author=baudehlo">969</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/550490?v=4"><br><a href="https://github.com/smfreegard">smfreegard</a> (<a href="https://github.com/haraka/Haraka/commits?author=smfreegard">794</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/959600?v=4"><br><a href="https://github.com/godsflaw">godsflaw</a> (<a href="https://github.com/haraka/Haraka/commits?author=godsflaw">171</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/934254?v=4"><br><a href="https://github.com/analogic">analogic</a> (<a href="https://github.com/haraka/Haraka/commits?author=analogic">42</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1674289?v=4"><br><a href="https://github.com/Dexus">Dexus</a> (<a href="https://github.com/haraka/Haraka/commits?author=Dexus">42</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/82041?v=4"><br><a href="https://github.com/gramakri">gramakri</a> (<a href="https://github.com/haraka/Haraka/commits?author=gramakri">40</a>)|
5
+ | <img height="80" src="https://avatars.githubusercontent.com/u/261635?v=4"><br><a href="https://github.com/msimerson">msimerson</a> (<a href="https://github.com/haraka/Haraka/commits?author=msimerson">1662</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/662371?v=4"><br><a href="https://github.com/baudehlo">baudehlo</a> (<a href="https://github.com/haraka/Haraka/commits?author=baudehlo">969</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/550490?v=4"><br><a href="https://github.com/smfreegard">smfreegard</a> (<a href="https://github.com/haraka/Haraka/commits?author=smfreegard">794</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/959600?v=4"><br><a href="https://github.com/godsflaw">godsflaw</a> (<a href="https://github.com/haraka/Haraka/commits?author=godsflaw">171</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/934254?v=4"><br><a href="https://github.com/analogic">analogic</a> (<a href="https://github.com/haraka/Haraka/commits?author=analogic">42</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1674289?v=4"><br><a href="https://github.com/Dexus">Dexus</a> (<a href="https://github.com/haraka/Haraka/commits?author=Dexus">42</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/82041?v=4"><br><a href="https://github.com/gramakri">gramakri</a> (<a href="https://github.com/haraka/Haraka/commits?author=gramakri">40</a>)|
6
6
  | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
7
- | <img height="80" src="https://avatars.githubusercontent.com/u/203240?v=4"><br><a href="https://github.com/lnedry">lnedry</a> (<a href="https://github.com/haraka/Haraka/commits?author=lnedry">26</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/748075?v=4"><br><a href="https://github.com/celesteking">celesteking</a> (<a href="https://github.com/haraka/Haraka/commits?author=celesteking">21</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/791972?v=4"><br><a href="https://github.com/lpatters">lpatters</a> (<a href="https://github.com/haraka/Haraka/commits?author=lpatters">20</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/366268?v=4"><br><a href="https://github.com/chazomaticus">chazomaticus</a> (<a href="https://github.com/haraka/Haraka/commits?author=chazomaticus">19</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/123708?v=4"><br><a href="https://github.com/arlolra">arlolra</a> (<a href="https://github.com/haraka/Haraka/commits?author=arlolra">16</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/271024?v=4"><br><a href="https://github.com/hayesgm">hayesgm</a> (<a href="https://github.com/haraka/Haraka/commits?author=hayesgm">16</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1573133?v=4"><br><a href="https://github.com/gauravaror">gauravaror</a> (<a href="https://github.com/haraka/Haraka/commits?author=gauravaror">14</a>)|
7
+ | <img height="80" src="https://avatars.githubusercontent.com/u/203240?v=4"><br><a href="https://github.com/lnedry">lnedry</a> (<a href="https://github.com/haraka/Haraka/commits?author=lnedry">27</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/748075?v=4"><br><a href="https://github.com/celesteking">celesteking</a> (<a href="https://github.com/haraka/Haraka/commits?author=celesteking">21</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/791972?v=4"><br><a href="https://github.com/lpatters">lpatters</a> (<a href="https://github.com/haraka/Haraka/commits?author=lpatters">20</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/366268?v=4"><br><a href="https://github.com/chazomaticus">chazomaticus</a> (<a href="https://github.com/haraka/Haraka/commits?author=chazomaticus">19</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/123708?v=4"><br><a href="https://github.com/arlolra">arlolra</a> (<a href="https://github.com/haraka/Haraka/commits?author=arlolra">16</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/271024?v=4"><br><a href="https://github.com/hayesgm">hayesgm</a> (<a href="https://github.com/haraka/Haraka/commits?author=hayesgm">16</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1573133?v=4"><br><a href="https://github.com/gauravaror">gauravaror</a> (<a href="https://github.com/haraka/Haraka/commits?author=gauravaror">14</a>)|
8
8
  | <img height="80" src="https://avatars.githubusercontent.com/u/260607?v=4"><br><a href="https://github.com/typingArtist">typingArtist</a> (<a href="https://github.com/haraka/Haraka/commits?author=typingArtist">14</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/11343494?v=4"><br><a href="https://github.com/superman20">superman20</a> (<a href="https://github.com/haraka/Haraka/commits?author=superman20">13</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/158380?v=4"><br><a href="https://github.com/darkpixel">darkpixel</a> (<a href="https://github.com/haraka/Haraka/commits?author=darkpixel">12</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/9887966?v=4"><br><a href="https://github.com/KingNoosh">KingNoosh</a> (<a href="https://github.com/haraka/Haraka/commits?author=KingNoosh">11</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/5229495?v=4"><br><a href="https://github.com/tstonis">tstonis</a> (<a href="https://github.com/haraka/Haraka/commits?author=tstonis">10</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1746394?v=4"><br><a href="https://github.com/wltsmrz">wltsmrz</a> (<a href="https://github.com/haraka/Haraka/commits?author=wltsmrz">9</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/218741413?v=4"><br><a href="https://github.com/SamuelGrave">SamuelGrave</a> (<a href="https://github.com/haraka/Haraka/commits?author=SamuelGrave">9</a>)|
9
9
  | <img height="80" src="https://avatars.githubusercontent.com/u/2176651?v=4"><br><a href="https://github.com/fatalbanana">fatalbanana</a> (<a href="https://github.com/haraka/Haraka/commits?author=fatalbanana">9</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/231081?v=4"><br><a href="https://github.com/EyePulp">EyePulp</a> (<a href="https://github.com/haraka/Haraka/commits?author=EyePulp">8</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/81561?v=4"><br><a href="https://github.com/Synchro">Synchro</a> (<a href="https://github.com/haraka/Haraka/commits?author=Synchro">8</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/3957811?v=4"><br><a href="https://github.com/gene-hightower">gene-hightower</a> (<a href="https://github.com/haraka/Haraka/commits?author=gene-hightower">7</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/8224508?v=4"><br><a href="https://github.com/DarkSorrow">DarkSorrow</a> (<a href="https://github.com/haraka/Haraka/commits?author=DarkSorrow">6</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/103802?v=4"><br><a href="https://github.com/joshuathayer">joshuathayer</a> (<a href="https://github.com/haraka/Haraka/commits?author=joshuathayer">6</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/298453?v=4"><br><a href="https://github.com/zllovesuki">zllovesuki</a> (<a href="https://github.com/haraka/Haraka/commits?author=zllovesuki">5</a>)|
10
+ | <img height="80" src="https://avatars.githubusercontent.com/u/132251?v=4"><br><a href="https://github.com/schamane">schamane</a> (<a href="https://github.com/haraka/Haraka/commits?author=schamane">5</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/2158203?v=4"><br><a href="https://github.com/luto">luto</a> (<a href="https://github.com/haraka/Haraka/commits?author=luto">5</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/21576638?v=4"><br><a href="https://github.com/steflw">steflw</a> (<a href="https://github.com/haraka/Haraka/commits?author=steflw">5</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1263856?v=4"><br><a href="https://github.com/ricardopolo">ricardopolo</a> (<a href="https://github.com/haraka/Haraka/commits?author=ricardopolo">5</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1521113?v=4"><br><a href="https://github.com/hontas">hontas</a> (<a href="https://github.com/haraka/Haraka/commits?author=hontas">5</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/918201?v=4"><br><a href="https://github.com/DoobleD">DoobleD</a> (<a href="https://github.com/haraka/Haraka/commits?author=DoobleD">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/11270?v=4"><br><a href="https://github.com/swerter">swerter</a> (<a href="https://github.com/haraka/Haraka/commits?author=swerter">4</a>)|
11
+ | <img height="80" src="https://avatars.githubusercontent.com/u/791835?v=4"><br><a href="https://github.com/Juerd">Juerd</a> (<a href="https://github.com/haraka/Haraka/commits?author=Juerd">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/5351045?v=4"><br><a href="https://github.com/rhedshi">rhedshi</a> (<a href="https://github.com/haraka/Haraka/commits?author=rhedshi">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/7155684?v=4"><br><a href="https://github.com/rw251">rw251</a> (<a href="https://github.com/haraka/Haraka/commits?author=rw251">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/255701?v=4"><br><a href="https://github.com/abhas">abhas</a> (<a href="https://github.com/haraka/Haraka/commits?author=abhas">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/147893?v=4"><br><a href="https://github.com/Andrew565">Andrew565</a> (<a href="https://github.com/haraka/Haraka/commits?author=Andrew565">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1451395?v=4"><br><a href="https://github.com/bmonty">bmonty</a> (<a href="https://github.com/haraka/Haraka/commits?author=bmonty">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/308887?v=4"><br><a href="https://github.com/benjisg">benjisg</a> (<a href="https://github.com/haraka/Haraka/commits?author=benjisg">4</a>)|
12
+ | <img height="80" src="https://avatars.githubusercontent.com/u/5624708?v=4"><br><a href="https://github.com/Bramzor">Bramzor</a> (<a href="https://github.com/haraka/Haraka/commits?author=Bramzor">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/8285462?v=4"><br><a href="https://github.com/CalgaryMichael">CalgaryMichael</a> (<a href="https://github.com/haraka/Haraka/commits?author=CalgaryMichael">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/34087?v=4"><br><a href="https://github.com/fredjean">fredjean</a> (<a href="https://github.com/haraka/Haraka/commits?author=fredjean">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/13922268?v=4"><br><a href="https://github.com/jdai8">jdai8</a> (<a href="https://github.com/haraka/Haraka/commits?author=jdai8">4</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/6220422?v=4"><br><a href="https://github.com/dcharbonnier">dcharbonnier</a> (<a href="https://github.com/haraka/Haraka/commits?author=dcharbonnier">3</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/232225?v=4"><br><a href="https://github.com/soncodi">soncodi</a> (<a href="https://github.com/haraka/Haraka/commits?author=soncodi">3</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/2115696?v=4"><br><a href="https://github.com/AuspeXeu">AuspeXeu</a> (<a href="https://github.com/haraka/Haraka/commits?author=AuspeXeu">3</a>)|
13
+ | <img height="80" src="https://avatars.githubusercontent.com/u/6684599?v=4"><br><a href="https://github.com/acharkizakaria">acharkizakaria</a> (<a href="https://github.com/haraka/Haraka/commits?author=acharkizakaria">3</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1810178?v=4"><br><a href="https://github.com/pvsousalima">pvsousalima</a> (<a href="https://github.com/haraka/Haraka/commits?author=pvsousalima">3</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/759912?v=4"><br><a href="https://github.com/davebeyer">davebeyer</a> (<a href="https://github.com/haraka/Haraka/commits?author=davebeyer">3</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/706078?v=4"><br><a href="https://github.com/brunolm">brunolm</a> (<a href="https://github.com/haraka/Haraka/commits?author=brunolm">3</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/7008027?v=4"><br><a href="https://github.com/mkp7">mkp7</a> (<a href="https://github.com/haraka/Haraka/commits?author=mkp7">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1007551?v=4"><br><a href="https://github.com/unquietwiki">unquietwiki</a> (<a href="https://github.com/haraka/Haraka/commits?author=unquietwiki">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/10368105?v=4"><br><a href="https://github.com/mtrivera">mtrivera</a> (<a href="https://github.com/haraka/Haraka/commits?author=mtrivera">2</a>)|
14
+ | <img height="80" src="https://avatars.githubusercontent.com/u/1829326?v=4"><br><a href="https://github.com/slattery">slattery</a> (<a href="https://github.com/haraka/Haraka/commits?author=slattery">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/8569238?v=4"><br><a href="https://github.com/MuraraAllan">MuraraAllan</a> (<a href="https://github.com/haraka/Haraka/commits?author=MuraraAllan">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/994004?v=4"><br><a href="https://github.com/stefanocoding">stefanocoding</a> (<a href="https://github.com/haraka/Haraka/commits?author=stefanocoding">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/5483299?v=4"><br><a href="https://github.com/thihara">thihara</a> (<a href="https://github.com/haraka/Haraka/commits?author=thihara">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/43457281?v=4"><br><a href="https://github.com/benjamonnguyen">benjamonnguyen</a> (<a href="https://github.com/haraka/Haraka/commits?author=benjamonnguyen">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/15035337?v=4"><br><a href="https://github.com/gtech99">gtech99</a> (<a href="https://github.com/haraka/Haraka/commits?author=gtech99">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/3073292?v=4"><br><a href="https://github.com/joelchornik">joelchornik</a> (<a href="https://github.com/haraka/Haraka/commits?author=joelchornik">2</a>)|
15
+ | <img height="80" src="https://avatars.githubusercontent.com/u/1249760?v=4"><br><a href="https://github.com/andreis">andreis</a> (<a href="https://github.com/haraka/Haraka/commits?author=andreis">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/15694566?v=4"><br><a href="https://github.com/apoorv-mishra">apoorv-mishra</a> (<a href="https://github.com/haraka/Haraka/commits?author=apoorv-mishra">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/934178?v=4"><br><a href="https://github.com/vrevo">vrevo</a> (<a href="https://github.com/haraka/Haraka/commits?author=vrevo">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/563469?v=4"><br><a href="https://github.com/niieani">niieani</a> (<a href="https://github.com/haraka/Haraka/commits?author=niieani">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/196198?v=4"><br><a href="https://github.com/hathaway">hathaway</a> (<a href="https://github.com/haraka/Haraka/commits?author=hathaway">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/14928995?v=4"><br><a href="https://github.com/carolinaknoll">carolinaknoll</a> (<a href="https://github.com/haraka/Haraka/commits?author=carolinaknoll">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/654682?v=4"><br><a href="https://github.com/martin1yness">martin1yness</a> (<a href="https://github.com/haraka/Haraka/commits?author=martin1yness">2</a>)|
16
+ | <img height="80" src="https://avatars.githubusercontent.com/u/4955052?v=4"><br><a href="https://github.com/chasent">chasent</a> (<a href="https://github.com/haraka/Haraka/commits?author=chasent">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1346804?v=4"><br><a href="https://github.com/louis-lau">louis-lau</a> (<a href="https://github.com/haraka/Haraka/commits?author=louis-lau">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/598809?v=4"><br><a href="https://github.com/tojocky">tojocky</a> (<a href="https://github.com/haraka/Haraka/commits?author=tojocky">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/5428603?v=4"><br><a href="https://github.com/Illirgway">Illirgway</a> (<a href="https://github.com/haraka/Haraka/commits?author=Illirgway">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/444769?v=4"><br><a href="https://github.com/dweekly">dweekly</a> (<a href="https://github.com/haraka/Haraka/commits?author=dweekly">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/48384?v=4"><br><a href="https://github.com/dalibor">dalibor</a> (<a href="https://github.com/haraka/Haraka/commits?author=dalibor">2</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/2956870?v=4"><br><a href="https://github.com/catroll">catroll</a> (<a href="https://github.com/haraka/Haraka/commits?author=catroll">1</a>)|
17
+ | <img height="80" src="https://avatars.githubusercontent.com/u/2609361?v=4"><br><a href="https://github.com/zereraz">zereraz</a> (<a href="https://github.com/haraka/Haraka/commits?author=zereraz">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/38491?v=4"><br><a href="https://github.com/darobin">darobin</a> (<a href="https://github.com/haraka/Haraka/commits?author=darobin">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/928787?v=4"><br><a href="https://github.com/Infern1">Infern1</a> (<a href="https://github.com/haraka/Haraka/commits?author=Infern1">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/11057526?v=4"><br><a href="https://github.com/Currerius">Currerius</a> (<a href="https://github.com/haraka/Haraka/commits?author=Currerius">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/6680615?v=4"><br><a href="https://github.com/ckcr4lyf">ckcr4lyf</a> (<a href="https://github.com/haraka/Haraka/commits?author=ckcr4lyf">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/857880?v=4"><br><a href="https://github.com/feisuzhu">feisuzhu</a> (<a href="https://github.com/haraka/Haraka/commits?author=feisuzhu">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/3337824?v=4"><br><a href="https://github.com/pvandijk">pvandijk</a> (<a href="https://github.com/haraka/Haraka/commits?author=pvandijk">1</a>)|
18
+ | <img height="80" src="https://avatars.githubusercontent.com/u/651048?v=4"><br><a href="https://github.com/Wesitos">Wesitos</a> (<a href="https://github.com/haraka/Haraka/commits?author=Wesitos">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/114246?v=4"><br><a href="https://github.com/pedroaxl">pedroaxl</a> (<a href="https://github.com/haraka/Haraka/commits?author=pedroaxl">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/600097?v=4"><br><a href="https://github.com/pstadler">pstadler</a> (<a href="https://github.com/haraka/Haraka/commits?author=pstadler">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/163142?v=4"><br><a href="https://github.com/patchlog">patchlog</a> (<a href="https://github.com/haraka/Haraka/commits?author=patchlog">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/109316?v=4"><br><a href="https://github.com/PAStheLoD">PAStheLoD</a> (<a href="https://github.com/haraka/Haraka/commits?author=PAStheLoD">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/3527052?v=4"><br><a href="https://github.com/pjeby">pjeby</a> (<a href="https://github.com/haraka/Haraka/commits?author=pjeby">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/11526146?v=4"><br><a href="https://github.com/noopnik">noopnik</a> (<a href="https://github.com/haraka/Haraka/commits?author=noopnik">1</a>)|
19
+ | <img height="80" src="https://avatars.githubusercontent.com/u/10524529?v=4"><br><a href="https://github.com/nmummau">nmummau</a> (<a href="https://github.com/haraka/Haraka/commits?author=nmummau">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1811410?v=4"><br><a href="https://github.com/blackrosezy">blackrosezy</a> (<a href="https://github.com/haraka/Haraka/commits?author=blackrosezy">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/913734?v=4"><br><a href="https://github.com/discretepackets">discretepackets</a> (<a href="https://github.com/haraka/Haraka/commits?author=discretepackets">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/69902?v=4"><br><a href="https://github.com/mfogel">mfogel</a> (<a href="https://github.com/haraka/Haraka/commits?author=mfogel">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/139480?v=4"><br><a href="https://github.com/mjpearson">mjpearson</a> (<a href="https://github.com/haraka/Haraka/commits?author=mjpearson">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/92839?v=4"><br><a href="https://github.com/mjackson">mjackson</a> (<a href="https://github.com/haraka/Haraka/commits?author=mjackson">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/19753510?v=4"><br><a href="https://github.com/michacassola">michacassola</a> (<a href="https://github.com/haraka/Haraka/commits?author=michacassola">1</a>)|
20
+ | <img height="80" src="https://avatars.githubusercontent.com/u/16570127?v=4"><br><a href="https://github.com/greenlighttec">greenlighttec</a> (<a href="https://github.com/haraka/Haraka/commits?author=greenlighttec">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/118732?v=4"><br><a href="https://github.com/mcreenan">mcreenan</a> (<a href="https://github.com/haraka/Haraka/commits?author=mcreenan">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/803496?v=4"><br><a href="https://github.com/mskrajnowski">mskrajnowski</a> (<a href="https://github.com/haraka/Haraka/commits?author=mskrajnowski">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/6382246?v=4"><br><a href="https://github.com/yeya">yeya</a> (<a href="https://github.com/haraka/Haraka/commits?author=yeya">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/18624942?v=4"><br><a href="https://github.com/jackwellsxyz">jackwellsxyz</a> (<a href="https://github.com/haraka/Haraka/commits?author=jackwellsxyz">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/115237?v=4"><br><a href="https://github.com/silverwind">silverwind</a> (<a href="https://github.com/haraka/Haraka/commits?author=silverwind">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/24767512?v=4"><br><a href="https://github.com/shurli">shurli</a> (<a href="https://github.com/haraka/Haraka/commits?author=shurli">1</a>)|
21
+ | <img height="80" src="https://avatars.githubusercontent.com/u/46054769?v=4"><br><a href="https://github.com/sathishvenkataraman">sathishvenkataraman</a> (<a href="https://github.com/haraka/Haraka/commits?author=sathishvenkataraman">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/8831920?v=4"><br><a href="https://github.com/qhxin">qhxin</a> (<a href="https://github.com/haraka/Haraka/commits?author=qhxin">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/18039170?v=4"><br><a href="https://github.com/pekapl">pekapl</a> (<a href="https://github.com/haraka/Haraka/commits?author=pekapl">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/4928168?v=4"><br><a href="https://github.com/nfnty">nfnty</a> (<a href="https://github.com/haraka/Haraka/commits?author=nfnty">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/21057453?v=4"><br><a href="https://github.com/inmula">inmula</a> (<a href="https://github.com/haraka/Haraka/commits?author=inmula">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/22168943?v=4"><br><a href="https://github.com/mathquis">mathquis</a> (<a href="https://github.com/haraka/Haraka/commits?author=mathquis">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/320906?v=4"><br><a href="https://github.com/martinvd">martinvd</a> (<a href="https://github.com/haraka/Haraka/commits?author=martinvd">1</a>)|
22
+ | <img height="80" src="https://avatars.githubusercontent.com/u/217669830?v=4"><br><a href="https://github.com/lmacayo">lmacayo</a> (<a href="https://github.com/haraka/Haraka/commits?author=lmacayo">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/181014?v=4"><br><a href="https://github.com/k2s">k2s</a> (<a href="https://github.com/haraka/Haraka/commits?author=k2s">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/650890?v=4"><br><a href="https://github.com/zombified">zombified</a> (<a href="https://github.com/haraka/Haraka/commits?author=zombified">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1024137?v=4"><br><a href="https://github.com/dhager7">dhager7</a> (<a href="https://github.com/haraka/Haraka/commits?author=dhager7">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/25018388?v=4"><br><a href="https://github.com/ayankel">ayankel</a> (<a href="https://github.com/haraka/Haraka/commits?author=ayankel">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/3277165?v=4"><br><a href="https://github.com/X-Ryl669">X-Ryl669</a> (<a href="https://github.com/haraka/Haraka/commits?author=X-Ryl669">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/952007?v=4"><br><a href="https://github.com/szepeviktor">szepeviktor</a> (<a href="https://github.com/haraka/Haraka/commits?author=szepeviktor">1</a>)|
23
+ | <img height="80" src="https://avatars.githubusercontent.com/u/20950126?v=4"><br><a href="https://github.com/varunzxzx">varunzxzx</a> (<a href="https://github.com/haraka/Haraka/commits?author=varunzxzx">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/95691?v=4"><br><a href="https://github.com/noogen">noogen</a> (<a href="https://github.com/haraka/Haraka/commits?author=noogen">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/209270?v=4"><br><a href="https://github.com/TimWolla">TimWolla</a> (<a href="https://github.com/haraka/Haraka/commits?author=TimWolla">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/29933243?v=4"><br><a href="https://github.com/tiagorlampert">tiagorlampert</a> (<a href="https://github.com/haraka/Haraka/commits?author=tiagorlampert">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/912257?v=4"><br><a href="https://github.com/tomscytale">tomscytale</a> (<a href="https://github.com/haraka/Haraka/commits?author=tomscytale">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/5239282?v=4"><br><a href="https://github.com/sriccio">sriccio</a> (<a href="https://github.com/haraka/Haraka/commits?author=sriccio">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/783006?v=4"><br><a href="https://github.com/samnegri">samnegri</a> (<a href="https://github.com/haraka/Haraka/commits?author=samnegri">1</a>)|
24
+ | <img height="80" src="https://avatars.githubusercontent.com/u/18592942?v=4"><br><a href="https://github.com/mnsilva">mnsilva</a> (<a href="https://github.com/haraka/Haraka/commits?author=mnsilva">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/44905?v=4"><br><a href="https://github.com/fcoelho">fcoelho</a> (<a href="https://github.com/haraka/Haraka/commits?author=fcoelho">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/8796466?v=4"><br><a href="https://github.com/erickpece">erickpece</a> (<a href="https://github.com/haraka/Haraka/commits?author=erickpece">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/354409?v=4"><br><a href="https://github.com/endreszabo">endreszabo</a> (<a href="https://github.com/haraka/Haraka/commits?author=endreszabo">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/548763?v=4"><br><a href="https://github.com/duanefields">duanefields</a> (<a href="https://github.com/haraka/Haraka/commits?author=duanefields">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/6936055?v=4"><br><a href="https://github.com/DomAmato">DomAmato</a> (<a href="https://github.com/haraka/Haraka/commits?author=DomAmato">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/26029735?v=4"><br><a href="https://github.com/lavieennoir">lavieennoir</a> (<a href="https://github.com/haraka/Haraka/commits?author=lavieennoir">1</a>)|
25
+ | <img height="80" src="https://avatars.githubusercontent.com/u/166466?v=4"><br><a href="https://github.com/dspangenberg">dspangenberg</a> (<a href="https://github.com/haraka/Haraka/commits?author=dspangenberg">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/100674?v=4"><br><a href="https://github.com/d--j">d--j</a> (<a href="https://github.com/haraka/Haraka/commits?author=d--j">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/81616?v=4"><br><a href="https://github.com/damoxc">damoxc</a> (<a href="https://github.com/haraka/Haraka/commits?author=damoxc">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/37262317?v=4"><br><a href="https://github.com/dkmaker">dkmaker</a> (<a href="https://github.com/haraka/Haraka/commits?author=dkmaker">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/805639?v=4"><br><a href="https://github.com/cbestall">cbestall</a> (<a href="https://github.com/haraka/Haraka/commits?author=cbestall">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/962436?v=4"><br><a href="https://github.com/txase">txase</a> (<a href="https://github.com/haraka/Haraka/commits?author=txase">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1430118?v=4"><br><a href="https://github.com/thetrompf">thetrompf</a> (<a href="https://github.com/haraka/Haraka/commits?author=thetrompf">1</a>)|
26
+ | <img height="80" src="https://avatars.githubusercontent.com/u/623363?v=4"><br><a href="https://github.com/bmatson">bmatson</a> (<a href="https://github.com/haraka/Haraka/commits?author=bmatson">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/47733?v=4"><br><a href="https://github.com/ardiesaeidi">ardiesaeidi</a> (<a href="https://github.com/haraka/Haraka/commits?author=ardiesaeidi">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/47601131?v=4"><br><a href="https://github.com/AprilGrimoire">AprilGrimoire</a> (<a href="https://github.com/haraka/Haraka/commits?author=AprilGrimoire">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/14093131?v=4"><br><a href="https://github.com/andbar">andbar</a> (<a href="https://github.com/haraka/Haraka/commits?author=andbar">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/2813838?v=4"><br><a href="https://github.com/amirkarimi">amirkarimi</a> (<a href="https://github.com/haraka/Haraka/commits?author=amirkarimi">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/332898?v=4"><br><a href="https://github.com/alessioalex">alessioalex</a> (<a href="https://github.com/haraka/Haraka/commits?author=alessioalex">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/124756761?v=4"><br><a href="https://github.com/littleslicebigcity">littleslicebigcity</a> (<a href="https://github.com/haraka/Haraka/commits?author=littleslicebigcity">1</a>)|
27
+ | <img height="80" src="https://avatars.githubusercontent.com/u/1177304?v=4"><br><a href="https://github.com/mildsunrise">mildsunrise</a> (<a href="https://github.com/haraka/Haraka/commits?author=mildsunrise">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/30565?v=4"><br><a href="https://github.com/ajimix">ajimix</a> (<a href="https://github.com/haraka/Haraka/commits?author=ajimix">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/58205701?v=4"><br><a href="https://github.com/adarshasp87">adarshasp87</a> (<a href="https://github.com/haraka/Haraka/commits?author=adarshasp87">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/284925?v=4"><br><a href="https://github.com/64kps">64kps</a> (<a href="https://github.com/haraka/Haraka/commits?author=64kps">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/6890321?v=4"><br><a href="https://github.com/httpstersk">httpstersk</a> (<a href="https://github.com/haraka/Haraka/commits?author=httpstersk">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/28440072?v=4"><br><a href="https://github.com/leadbi">leadbi</a> (<a href="https://github.com/haraka/Haraka/commits?author=leadbi">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/22004482?v=4"><br><a href="https://github.com/kajes">kajes</a> (<a href="https://github.com/haraka/Haraka/commits?author=kajes">1</a>)|
28
+ | <img height="80" src="https://avatars.githubusercontent.com/u/51789698?v=4"><br><a href="https://github.com/Young-Lord">Young-Lord</a> (<a href="https://github.com/haraka/Haraka/commits?author=Young-Lord">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/11235022?v=4"><br><a href="https://github.com/kzub">kzub</a> (<a href="https://github.com/haraka/Haraka/commits?author=kzub">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/510957?v=4"><br><a href="https://github.com/kevinmartin">kevinmartin</a> (<a href="https://github.com/haraka/Haraka/commits?author=kevinmartin">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/75720?v=4"><br><a href="https://github.com/kgoess">kgoess</a> (<a href="https://github.com/haraka/Haraka/commits?author=kgoess">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/5689132?v=4"><br><a href="https://github.com/mr-karan">mr-karan</a> (<a href="https://github.com/haraka/Haraka/commits?author=mr-karan">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/7114909?v=4"><br><a href="https://github.com/tyranron">tyranron</a> (<a href="https://github.com/haraka/Haraka/commits?author=tyranron">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/49093?v=4"><br><a href="https://github.com/jplock">jplock</a> (<a href="https://github.com/haraka/Haraka/commits?author=jplock">1</a>)|
29
+ | <img height="80" src="https://avatars.githubusercontent.com/u/411338?v=4"><br><a href="https://github.com/josteink">josteink</a> (<a href="https://github.com/haraka/Haraka/commits?author=josteink">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/646768?v=4"><br><a href="https://github.com/nebulade">nebulade</a> (<a href="https://github.com/haraka/Haraka/commits?author=nebulade">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/6860647?v=4"><br><a href="https://github.com/GuroKung">GuroKung</a> (<a href="https://github.com/haraka/Haraka/commits?author=GuroKung">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/2649838?v=4"><br><a href="https://github.com/stanek0j">stanek0j</a> (<a href="https://github.com/haraka/Haraka/commits?author=stanek0j">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/55651?v=4"><br><a href="https://github.com/jaredj">jaredj</a> (<a href="https://github.com/haraka/Haraka/commits?author=jaredj">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/397735?v=4"><br><a href="https://github.com/jrb">jrb</a> (<a href="https://github.com/haraka/Haraka/commits?author=jrb">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/1560587?v=4"><br><a href="https://github.com/jkroepke">jkroepke</a> (<a href="https://github.com/haraka/Haraka/commits?author=jkroepke">1</a>)|
30
+ | <img height="80" src="https://avatars.githubusercontent.com/u/5376280?v=4"><br><a href="https://github.com/Chopinsky">Chopinsky</a> (<a href="https://github.com/haraka/Haraka/commits?author=Chopinsky">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/195918?v=4"><br><a href="https://github.com/hperrin">hperrin</a> (<a href="https://github.com/haraka/Haraka/commits?author=hperrin">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/376721?v=4"><br><a href="https://github.com/urlund">urlund</a> (<a href="https://github.com/haraka/Haraka/commits?author=urlund">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/7700727?v=4"><br><a href="https://github.com/gwieshammer">gwieshammer</a> (<a href="https://github.com/haraka/Haraka/commits?author=gwieshammer">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/914107?v=4"><br><a href="https://github.com/gpetrioli">gpetrioli</a> (<a href="https://github.com/haraka/Haraka/commits?author=gpetrioli">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/140875?v=4"><br><a href="https://github.com/fabiob">fabiob</a> (<a href="https://github.com/haraka/Haraka/commits?author=fabiob">1</a>)| <img height="80" src="https://avatars.githubusercontent.com/u/400795?v=4"><br><a href="https://github.com/felixrabe">felixrabe</a> (<a href="https://github.com/haraka/Haraka/commits?author=felixrabe">1</a>)|
31
+ | <img height="80" src="https://avatars.githubusercontent.com/u/48409110?v=4"><br><a href="https://github.com/felixauringer">felixauringer</a> (<a href="https://github.com/haraka/Haraka/commits?author=felixauringer">1</a>)
10
32
 
11
33
  <sub>this file is generated by [.release](https://github.com/msimerson/.release).
12
34
  Contribute to this project to get your GitHub profile included here.</sub>
package/Changes.md CHANGED
@@ -4,6 +4,52 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/).
4
4
 
5
5
  ### Unreleased
6
6
 
7
+ ### [3.1.4] - 2026-03-30
8
+
9
+ #### Fixed
10
+
11
+ - fix: add ensure_body for late parse_body=true #3539
12
+ - fix(outbound): prevent ERR_UNHANDLED_ERROR crash #3538
13
+ - fix(txn): more robust handling of body filter additions #3537
14
+ - fix(conn): avoid connection fault when 2x QUIT sent #3536
15
+ - fix(txn): more robust handling of broken messages #3535
16
+ - fix(connection): pause after odd SMTP command sequence #3525
17
+
18
+ #### Changed
19
+
20
+ - sunset: remove dot_stuffing (now dot_stuffed)
21
+ - chore(plugins): deleted deprecated core_require
22
+ - dep(rabbitmq): repackaged as NPM module #3526
23
+ - deps(all): bump versions
24
+ - doc(Plugins): add sections filter, enrichment, and logging #3534
25
+ - added dropbox-plugin #3543
26
+ - es2024: #3527, #3528
27
+ - outbound replace fs callback with promises and async/await #3528
28
+ - dep(async): remove dep by replacing async.map with Queue
29
+ - use startsWith instead of indexOf === 0
30
+ - use spread syntax instead of [].concat and {}.assign
31
+ - use implicit arrow function returns
32
+ - replace deprecated substr with slice or substring
33
+ - test: fixes for test-fixtures 1.4 & local plugins that do require('./')
34
+ - outbound/queue: added tests #3531
35
+ - TL;DR: bundled plugins don't need a special require any more
36
+ - fixtures/plugin behaves more like real one, test accordingly
37
+ - refactored connection, transaction, and outbound to `node --test` #3541
38
+ - transaction.js (48 → 62 tests)
39
+ - connection.js (24 → 51 tests)
40
+ - moved ./test/outbound_* to ./test/outbound/, and fixed race conditions
41
+ - move TLS tests to haraka-tls #3542
42
+ - improve coverage for transaction, rfc1869, xclient, and record_envelope_addresses #3524
43
+
44
+ ### [3.1.3] - 2026-02-06
45
+
46
+ - deps(graph): removed, sqlite3 library is unmaintained
47
+ - deps: bump all to latest
48
+ - outbound: fix aggregate error path #3519
49
+ - doc: fix no plugin names displayed with haraka --order #3517
50
+ - haraka: fixed getHooks regex to grab only hook names
51
+ - config: spool_dir and spool_after belong in connection.ini
52
+
7
53
  ### [3.1.2] - 2026-01-02
8
54
 
9
55
  - smtp_forward: [domain selector] : user + domain #3501
@@ -1749,3 +1795,5 @@ config files.
1749
1795
  [3.1.1]: https://github.com/haraka/Haraka/releases/tag/v3.1.1
1750
1796
  [3.1.0]: https://github.com/haraka/Haraka/releases/tag/v3.1.0
1751
1797
  [3.1.2]: https://github.com/haraka/Haraka/releases/tag/v3.1.2
1798
+ [3.1.3]: https://github.com/haraka/Haraka/releases/tag/v3.1.3
1799
+ [3.1.4]: https://github.com/haraka/Haraka/releases/tag/v3.1.4
package/Plugins.md CHANGED
@@ -35,6 +35,52 @@ A comprehensive list of known plugins. Create a PR to add yours to these lists.
35
35
  | [opendkim][url-opendkim] | DKIM sign and verify email messages |
36
36
  | [spf][url-spf] | Perform SPF checks |
37
37
 
38
+ ### Enrichment Plugins
39
+
40
+ | Name | Description |
41
+ | ------------------------------ | ------------------------------------------ |
42
+ | [ASN][url-asn] | Get ASN info for remote senders |
43
+ | [fcrdns][url-fcrdns] | Forward Confirmed reverse DNS |
44
+ | [geoip][url-geoip] | get geographic information about mail senders |
45
+ | [p0f][url-p0f] | TCP Fingerprinting |
46
+ | [karma][url-karma] | Dynamic scoring of incoming connections |
47
+ | [known-senders][url-known-senders] | Reward emails from those you send mail to |
48
+ | [record_envelope_addresses][url-recordenv] | Adds message headers with ENV recips |
49
+
50
+ ### Filtering Plugins
51
+
52
+ | Name | Description |
53
+ | ------------------------------ | ------------------------------------------ |
54
+ | [attachment][url-attach] | Restrict attachment types |
55
+ | [block_me][url-blockme] | Populate block list via forwarded emails |
56
+ | [avg][url-avg] | AVG antivirus scanner |
57
+ | [clamd][url-clamd] | Anti-Virus scanning with ClamAV |
58
+ | [data.signatures][url-sigs] | Block emails whose bodies match signatures |
59
+ | [dcc][url-dcc] | Distributed Checksum Clearinghouse |
60
+ | [dns-list][url-dns-list] | Check against DNS and reputation lists |
61
+ | [early_talker][url-early] | Reject remotes that talk early |
62
+ | [esets][url-esets] | Virus scanning with ESET Mail Security |
63
+ | [greylist][url-greylist] | Greylisting |
64
+ | [helo.checks][url-helo] | Validity checks of the HELO string |
65
+ | [mail_from.is_resolvable][url-mfres] | Verifies the MAIL FROM domain resolves to a MX |
66
+ | [messagesniffer][url-msgsniff] | Anti-spam via [MessageSniffer][url-ms] |
67
+ | [milter][url-milter] | milter support |
68
+ | [rspamd][url-rspamd] | Scan emails with rspamd |
69
+ | [spamassassin][url-spamass] | Scan emails with SpamAssassin |
70
+ | [uribl][url-uribl] | Block based on URI blacklists |
71
+
72
+ ### Logging & Telemetry
73
+
74
+ | Name | Description |
75
+ | -------------------------------- | ------------------------------------------------------------------------ |
76
+ | [accounting_files][url-acc-files] | Retrieve, Store and Archive custom information of outbound traffic |
77
+ | [elasticsearch][url-elastic] | Store message metadata in Elasticsearch |
78
+ | [log reader][url-logreader] | extract log entries from the haraka log file |
79
+ | [outbound-logger][url-outbound-logger] | JSON logging of outbound email. Logs metadata about delivered/bounced emails |
80
+ | [process_title][url-proctitle] | Populate `ps` output with activity counters |
81
+ | [syslog][url-syslog] | Log to syslog |
82
+ | [watch][url-watch] | Watch live SMTP traffic in a web interface |
83
+
38
84
  ### Queue Plugins
39
85
 
40
86
  | Name | Description |
@@ -53,72 +99,43 @@ A comprehensive list of known plugins. Create a PR to add yours to these lists.
53
99
  | [smtp_proxy][url-qproxy] | Proxy SMTP connections to another MTA |
54
100
  | [wildduck][url-wildduck] | queue messages to Wild Duck |
55
101
 
56
- ### Filtering Plugins
102
+ ### Recipient Validation
57
103
 
58
- | Name | Description |
59
- | ------------------------------ | ------------------------------------------ |
60
- | [attachment][url-attach] | Restrict attachment types |
61
- | [avg][url-avg] | AVG antivirus scanner |
62
- | [clamd][url-clamd] | Anti-Virus scanning with ClamAV |
63
- | [data.signatures][url-sigs] | Block emails whose bodies match signatures |
64
- | [dcc][url-dcc] | Distributed Checksum Clearinghouse |
65
- | [esets][url-esets] | Virus scanning with ESET Mail Security |
66
- | [messagesniffer][url-msgsniff] | Anti-spam via [MessageSniffer][url-ms] |
67
- | [milter][url-milter] | milter support |
68
- | [rspamd][url-rspamd] | Scan emails with rspamd |
69
- | [spamassassin][url-spamass] | Scan emails with SpamAssassin |
70
- | [uribl][url-uribl] | Block based on URI blacklists |
104
+ | Name | Description |
105
+ | -----------------------------------| ----------------------------------------------------- |
106
+ | [dovecot][url-dovecot] | Recipient validation & SMTP AUTH against dovecot |
107
+ | [LDAP][url-ldap] | Aliases, Auth, and Recipient validation from LDAP |
108
+ | [recipient-routes][url-rroutes] | Route emails based on their recipient(s) |
109
+ | [rcpt_to.in_host_list][url-rhost] | Define local email domains in a file |
110
+ | [rcpt_to.ldap][url-rcpt-ldap] | Validate recipients against LDAP |
111
+ | [rcpt-postgresql][url-postgres] | validate recipients against PostgreSQL |
112
+ | [qmail-deliverable][url-rqmd] | Validate recipients against Qmail-Deliverable |
113
+ | [vmta][url-vmta] | Virtual MTA management |
114
+ | [wildduck][url-wildduck] | provides recipient checks against Wild Duck |
71
115
 
72
116
  ### Every other Plugin
73
117
 
74
- | Name | Description |
75
- | ------------------------------------------ | ------------------------------------------------------------------------------------------- |
76
- | [access][url-access] | ACLs based on IPs, domains, email addrs, etc. |
77
- | [accounting_files][url-acc-files] | Retrieve, Store and Archive custom information of outbound traffic |
78
- | [aliases][url-aliases] | Email aliases |
79
- | [ASN][url-asn] | Get ASN info for remote senders |
80
- | [block_me][url-blockme] | Populate block list via forwarded emails |
81
- | [bounce][url-bounce] | Many options for bounce processing |
82
- | [delay_deny][url-delay] | Delays all pre-DATA 'deny' results |
83
- | [dns-list][url-dns-list] | Check remote MTAs against DNS black, white, and karma lists |
84
- | [dovecot][url-dovecot] | Recipient validation & SMTP AUTH against dovecot |
85
- | [early_talker][url-early] | Reject remotes that talk early |
86
- | [fcrdns][url-fcrdns] | Forward Confirmed reverse DNS |
87
- | [geoip][url-geoip] | get geographic information about mail senders |
88
- | [greylist][url-greylist] | Greylisting |
89
- | [headers][url-headers] | Inspect and verify various email headers |
90
- | [helo.checks][url-helo] | Validity checks of the HELO string |
91
- | [karma][url-karma] | Dynamic scoring of incoming connections |
92
- | [known-senders][url-known-senders] | Reward emails from those you send mail to |
93
- | [LDAP][url-ldap] | Aliases, Auth, and Recipient validation from LDAP |
94
- | [Limit][url-limit] | Apply many types of limits to SMTP connections |
95
- | [elasticsearch][url-elastic] | Store message metadata in Elasticsearch |
96
- | [log reader][url-logreader] | extract log entries from the haraka log file |
97
- | [syslog][url-syslog] | Log to syslog |
98
- | [mail_from.is_resolvable][url-mfres] | Verifies the MAIL FROM domain resolves to a MX |
99
- | [outbound-logger][url-outbound-logger] | JSON logging of outbound email traffic. Logs useful metadata about delivered/bounced emails |
100
- | [p0f][url-p0f] | TCP Fingerprinting |
101
- | [prevent_credential_leaks][url-creds] | Prevent users from emailing their credentials |
102
- | [process_title][url-proctitle] | Populate `ps` output with activity counters |
103
- | [recipient-routes][url-rroutes] | Route emails based on their recipient(s) |
104
- | [redis][url-redis] | multi-purpose Redis db connection(s) |
105
- | [rcpt_to.in_host_list][url-rhost] | Define local email domains in a file |
106
- | [rcpt_to.ldap][url-rcpt-ldap] | Validate recipients against LDAP |
107
- | [rcpt-postgresql][url-postgres] | validate recipients against PostgreSQL |
108
- | [qmail-deliverable][url-rqmd] | Validate recipients against Qmail-Deliverable |
109
- | [record_envelope_addresses][url-recordenv] | Adds message headers with ENV recips |
110
- | [relay][url-relay] | Manage relay permissions |
111
- | [reseed_rng][url-rng] | Reseed the RNG |
112
- | [batv-srs][url-batv] | BATV & SRS |
113
- | [srs][url-srs] | Sender Rewriting Scheme |
114
- | [tarpit][url-tarpit] | Slow down connections |
115
- | [tls][url-tls] | Implements TLS |
116
- | [toobusy][url-toobusy] | Defers connections when too busy |
117
- | [vmta][url-vmta] | Virtual MTA management |
118
- | [watch][url-watch] | Watch live SMTP traffic in a web interface |
119
- | [wildduck][url-wildduck] | provides recipient checks against Wild Duck |
120
- | [xclient][url-xclient] | Implements XCLIENT |
121
- | [save-sent][url-save-sent] | Save sent emails on the serverside to a mailbox of the sender |
118
+ | Name | Description |
119
+ | ------------------------------------------ | --------------------------------------------------------------- |
120
+ | [access][url-access] | ACLs based on IPs, domains, email addrs, etc. |
121
+ | [aliases][url-aliases] | Email aliases |
122
+ | [bounce][url-bounce] | Many options for bounce processing |
123
+ | [delay_deny][url-delay] | Delays all pre-DATA 'deny' results |
124
+ | [dovecot][url-dovecot] | Recipient validation & SMTP AUTH against dovecot |
125
+ | [headers][url-headers] | Inspect and verify various email headers |
126
+ | [Limit][url-limit] | Apply many types of limits to SMTP connections |
127
+ | [prevent_credential_leaks][url-creds] | Prevent users from emailing their credentials |
128
+ | [redis][url-redis] | multi-purpose Redis db connection(s) |
129
+ | [relay][url-relay] | Manage relay permissions |
130
+ | [reseed_rng][url-rng] | Reseed the RNG |
131
+ | [batv-srs][url-batv] | BATV & SRS |
132
+ | [srs][url-srs] | Sender Rewriting Scheme |
133
+ | [tarpit][url-tarpit] | Slow down connections |
134
+ | [tls][url-tls] | Implements TLS |
135
+ | [toobusy][url-toobusy] | Defers connections when too busy |
136
+ | [xclient][url-xclient] | Implements XCLIENT |
137
+ | [save-sent][url-save-sent] | Save sent emails on the serverside to a mailbox of the sender |
138
+ | [dropbox][url-dropbox] | Forward incoming emails to configured Dropbox webhook URLs. |
122
139
 
123
140
  <!-- URLs tucked safely out of the way -->
124
141
 
@@ -178,8 +195,7 @@ A comprehensive list of known plugins. Create a PR to add yours to these lists.
178
195
  [url-qlmtp]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/lmtp.md
179
196
  [url-qmail]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/qmail-queue.md
180
197
  [url-qquart]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/quarantine.md
181
- [url-qrabbit]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/rabbitmq.md
182
- [url-qrabbita]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/rabbitmq_amqplib.md
198
+ [url-qrabbit]: https://github.com/haraka/haraka-plugin-queue-rabbitmq
183
199
  [url-qbridge]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/smtp_bridge.md
184
200
  [url-qforward]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/smtp_forward.md
185
201
  [url-qproxy]: https://github.com/haraka/Haraka/blob/master/docs/plugins/queue/smtp_proxy.md
@@ -208,3 +224,4 @@ A comprehensive list of known plugins. Create a PR to add yours to these lists.
208
224
  [url-kafka]: https://github.com/benjamonnguyen/haraka-plugin-queue-kafka
209
225
  [url-mailauth]: https://www.npmjs.com/package/haraka-plugin-mailauth
210
226
  [url-save-sent]: https://github.com/AprilGrimoire/haraka-plugin-save-sent
227
+ [url-dropbox]: https://github.com/dspangenberg/haraka-plugin-dropbox
package/README.md CHANGED
@@ -10,7 +10,7 @@ in asynchronous JS and are very fast.
10
10
 
11
11
  Haraka has very good spam protection (see [plugins][4]) and works
12
12
  well as a filtering [MTA][3]. It also works well as a [MSA][5] running on
13
- port 587 with auth and [dkim_sign][6] plugins enabled.
13
+ port 587 with auth and [dkim][6] plugins enabled.
14
14
 
15
15
  Haraka makes no attempt to be a mail store (like Exchange or Postfix/Exim/Qmail),
16
16
  a [LDA][7], nor an IMAP server (like Dovecot or Courier). Haraka is
package/bin/haraka CHANGED
@@ -239,8 +239,8 @@ function getHooks() {
239
239
  .toString()
240
240
  .split('## Available Hooks')[1] // discard everything before this string
241
241
  .split('### rcpt')[0] // discard everything after this string
242
- .match(/[*\-]\s(\S+)/gm) // grab the first word of lines starting with '* ' or '- '
243
- .map((a) => a.replace(/^\* /, '').replace(/\\/g, '')) // strip list prefix and escapes
242
+ .match(/^-\s+\w+/gmu) // grab hook names from lines starting with '- '
243
+ .map((a) => a.replace(/^-\s+/u, '')) // strip list prefix
244
244
  }
245
245
 
246
246
  let config
@@ -286,7 +286,7 @@ if (parsed.version) {
286
286
  if (process.env.PAGER) {
287
287
  const pager_split = process.env.PAGER.split(/ +/)
288
288
  pager = pager_split.shift()
289
- md_path = pager_split.concat(md_path)
289
+ md_path = [...pager_split, ...md_path]
290
290
  }
291
291
 
292
292
  const less = child.spawn(pager, md_path, { stdio: 'inherit' })
@@ -310,7 +310,8 @@ if (parsed.version) {
310
310
  logger = require(path.join(base, 'logger'))
311
311
  if (!parsed.verbose) logger.log = noop // disable logging
312
312
  outbound = require(path.join(base, 'outbound'))
313
- outbound.list_queue(function (err, qlist) {
313
+ ;(async () => {
314
+ const qlist = await outbound.list_queue()
314
315
  for (const todo of qlist) {
315
316
  console.log(
316
317
  sprintf(
@@ -323,7 +324,7 @@ if (parsed.version) {
323
324
  )
324
325
  }
325
326
  process.exit()
326
- })
327
+ })()
327
328
  } else if (parsed.qstat) {
328
329
  if (!parsed.configs) fail('qstat option requires config path')
329
330
 
@@ -331,10 +332,11 @@ if (parsed.version) {
331
332
  logger = require(path.join(base, 'logger'))
332
333
  if (!parsed.verbose) logger.log = noop // disable logging
333
334
  outbound = require(path.join(base, 'outbound'))
334
- outbound.stat_queue(function (err, stats) {
335
+ ;(async () => {
336
+ const stats = await outbound.stat_queue()
335
337
  console.log(stats)
336
338
  process.exit()
337
- })
339
+ })()
338
340
  } else if (parsed.qunstick) {
339
341
  if (!parsed.configs) fail('qunstick option requires config path')
340
342
  const domain = parsed.qunstick.toLowerCase()
@@ -1,6 +1,16 @@
1
1
  ;
2
2
  [main]
3
3
 
4
+ ; Spooling
5
+ ; Save memory by spooling large messages to disk
6
+ ; directory to create temporary spool files in (default: /tmp - see https://github.com/haraka/message-stream)
7
+ ; spool_dir=/var/spool/haraka
8
+ ; Specify -1 to never spool to disk (default)
9
+ ; Specify 0 to always spool to disk
10
+ ; Otherwise specify a size in bytes, once reached the
11
+ ; message will be spooled to disk to save memory.
12
+ ; spool_after=
13
+
4
14
  ; Require senders to conform to RFC 1869 and RFC 821 when sending the MAIL FROM and RCPT TO commands. In particular, the inclusion of spurious spaces or missing angle brackets will be rejected.
5
15
  ; strict_rfc1869 = false
6
16
 
package/config/smtp.ini CHANGED
@@ -30,15 +30,6 @@
30
30
  ;daemon_log_file=/var/log/haraka.log
31
31
  ;daemon_pid_file=/var/run/haraka.pid
32
32
 
33
- ; Spooling
34
- ; Save memory by spooling large messages to disk
35
- ;spool_dir=/var/spool/haraka
36
- ; Specify -1 to never spool to disk
37
- ; Specify 0 to always spool to disk
38
- ; Otherwise specify a size in bytes, once reached the
39
- ; message will be spooled to disk to save memory.
40
- ;spool_after=
41
-
42
33
  ; Force Shutdown Timeout
43
34
  ; - Haraka tries to close down gracefully, but if everything is shut down
44
35
  ; after this time it will hard close. 30s is usually long enough to