Haraka 3.1.3 → 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 (55) hide show
  1. package/.prettierignore +2 -0
  2. package/CONTRIBUTORS.md +23 -1
  3. package/Changes.md +38 -0
  4. package/Plugins.md +81 -64
  5. package/README.md +1 -1
  6. package/bin/haraka +7 -5
  7. package/connection.js +15 -19
  8. package/docs/Plugins.md +1 -1
  9. package/docs/plugins/aliases.md +0 -2
  10. package/docs/plugins/queue/qmail-queue.md +0 -1
  11. package/logger.js +2 -2
  12. package/outbound/hmail.js +76 -83
  13. package/outbound/index.js +36 -34
  14. package/outbound/queue.js +231 -176
  15. package/package.json +25 -26
  16. package/plugins/prevent_credential_leaks.js +2 -2
  17. package/plugins/process_title.js +1 -1
  18. package/plugins/queue/smtp_forward.js +1 -1
  19. package/plugins/status.js +8 -5
  20. package/plugins/tls.js +1 -1
  21. package/plugins.js +19 -14
  22. package/rfc1869.js +10 -10
  23. package/run_tests +20 -2
  24. package/server.js +15 -10
  25. package/smtp_client.js +2 -9
  26. package/test/config/tls/haraka.local.pem +47 -47
  27. package/test/connection.js +286 -147
  28. package/test/fixtures/line_socket.js +1 -0
  29. package/test/fixtures/util_hmailitem.js +1 -1
  30. package/test/outbound/bounce_net_errors.js +176 -0
  31. package/test/outbound/bounce_rfc3464.js +303 -0
  32. package/test/outbound/hmail.js +140 -104
  33. package/test/outbound/index.js +61 -101
  34. package/test/outbound/qfile.js +25 -25
  35. package/test/outbound/queue.js +233 -0
  36. package/test/plugins/queue/smtp_forward.js +1 -1
  37. package/test/plugins/record_envelope_addresses.js +93 -0
  38. package/test/plugins/tls.js +2 -2
  39. package/test/plugins/xclient.js +137 -0
  40. package/test/rfc1869.js +43 -0
  41. package/test/smtp_client.js +6 -6
  42. package/test/transaction.js +486 -201
  43. package/tls_socket.js +3 -3
  44. package/transaction.js +33 -10
  45. package/config/rabbitmq.ini +0 -10
  46. package/config/rabbitmq_amqplib.ini +0 -19
  47. package/docs/plugins/queue/rabbitmq.md +0 -34
  48. package/docs/plugins/queue/rabbitmq_amqplib.md +0 -51
  49. package/plugins/queue/rabbitmq.js +0 -141
  50. package/plugins/queue/rabbitmq_amqplib.js +0 -96
  51. package/test/config/tls/ec.pem +0 -23
  52. package/test/config/tls/mismatched.pem +0 -49
  53. package/test/outbound_bounce_net_errors.js +0 -157
  54. package/test/outbound_bounce_rfc3464.js +0 -366
  55. 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">1646</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
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,43 @@ 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
+
7
44
  ### [3.1.3] - 2026-02-06
8
45
 
9
46
  - deps(graph): removed, sqlite3 library is unmaintained
@@ -1759,3 +1796,4 @@ config files.
1759
1796
  [3.1.0]: https://github.com/haraka/Haraka/releases/tag/v3.1.0
1760
1797
  [3.1.2]: https://github.com/haraka/Haraka/releases/tag/v3.1.2
1761
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
@@ -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()
package/connection.js CHANGED
@@ -191,11 +191,7 @@ class Connection {
191
191
  })
192
192
 
193
193
  const ha_list = net.isIPv6(self.remote.ip) ? haproxy_hosts_ipv6 : haproxy_hosts_ipv4
194
- if (
195
- ha_list.some((element, index, array) => {
196
- return ipaddr.parse(self.remote.ip).match(element[0], element[1])
197
- })
198
- ) {
194
+ if (ha_list.some((element) => ipaddr.parse(self.remote.ip).match(element[0], element[1]))) {
199
195
  self.proxy.allowed = true
200
196
  // Wait for PROXY command
201
197
  self.proxy.timer = setTimeout(() => {
@@ -302,7 +298,7 @@ class Connection {
302
298
  /* eslint no-control-regex: 0 */
303
299
  if (/[^\x00-\x7F]/.test(this.current_line)) {
304
300
  // See if this is a TLS handshake
305
- const buf = Buffer.from(this.current_line.substr(0, 3), 'binary')
301
+ const buf = Buffer.from(this.current_line.slice(0, 3), 'binary')
306
302
  if (
307
303
  buf[0] === 0x16 &&
308
304
  buf[1] === 0x03 &&
@@ -348,10 +344,13 @@ class Connection {
348
344
  } else if (this.state === states.LOOP) {
349
345
  // Allow QUIT
350
346
  if (this.current_line.toUpperCase() === 'QUIT') {
347
+ this.state = states.PAUSE_SMTP
351
348
  this.cmd_quit()
352
349
  } else {
353
350
  this.respond(this.loop_code, this.loop_msg)
354
351
  }
352
+ } else if (this.state === states.PAUSE_SMTP) {
353
+ // Do nothing
355
354
  } else {
356
355
  throw new Error(`unknown state ${this.state}`)
357
356
  }
@@ -516,9 +515,7 @@ class Connection {
516
515
  } else {
517
516
  messages = msg.slice()
518
517
  }
519
- messages = messages.filter((msg2) => {
520
- return /\S/.test(msg2)
521
- })
518
+ messages = messages.filter((msg2) => /\S/.test(msg2))
522
519
 
523
520
  // Multiline AUTH PLAIN as in RFC-4954 page 8.
524
521
  if (code === 334 && !messages.length) {
@@ -530,7 +527,7 @@ class Connection {
530
527
  if (cfg.uuid.deny_chars) {
531
528
  uuid = (this.transaction || this).uuid
532
529
  if (cfg.uuid.deny_chars > 1) {
533
- uuid = uuid.substr(0, cfg.uuid.deny_chars)
530
+ uuid = uuid.slice(0, cfg.uuid.deny_chars)
534
531
  }
535
532
  }
536
533
  }
@@ -673,10 +670,10 @@ class Connection {
673
670
  resume() {
674
671
  if (this.state >= states.DISCONNECTING) return
675
672
  this.client.resume()
676
- if (this.prev_state) {
673
+ if (this.prev_state && this.state === states.PAUSE_DATA) {
677
674
  this.state = this.prev_state
678
- this.prev_state = null
679
675
  }
676
+ this.prev_state = null
680
677
  setImmediate(() => this._process_data())
681
678
  }
682
679
  /////////////////////////////////////////////////////////////////////////////
@@ -793,12 +790,12 @@ class Connection {
793
790
  greeting = [...cfg.message.greeting]
794
791
  greeting[0] = `${this.local.host} ESMTP ${greeting[0]}`
795
792
  if (cfg.uuid.banner_chars) {
796
- greeting[0] += ` (${this.uuid.substr(0, cfg.uuid.banner_chars)})`
793
+ greeting[0] += ` (${this.uuid.slice(0, cfg.uuid.banner_chars)})`
797
794
  }
798
795
  } else {
799
796
  greeting = `${this.local.host} ESMTP ${this.local.info} ready`
800
797
  if (cfg.uuid.banner_chars) {
801
- greeting += ` (${this.uuid.substr(0, cfg.uuid.banner_chars)})`
798
+ greeting += ` (${this.uuid.slice(0, cfg.uuid.banner_chars)})`
802
799
  }
803
800
  }
804
801
  this.respond(220, msg || greeting)
@@ -964,7 +961,7 @@ class Connection {
964
961
  let addr = sender.format()
965
962
  if (addr.length > 2) {
966
963
  // all but null sender
967
- addr = addr.substr(1, addr.length - 2) // trim off < >
964
+ addr = addr.slice(1, -1) // trim off < >
968
965
  }
969
966
  this.transaction.results.add(
970
967
  { name: 'mail_from' },
@@ -1012,7 +1009,7 @@ class Connection {
1012
1009
 
1013
1010
  const addr = rcpt.format()
1014
1011
  const recipient = {
1015
- address: addr.substr(1, addr.length - 2),
1012
+ address: addr.slice(1, -1),
1016
1013
  action,
1017
1014
  }
1018
1015
 
@@ -1446,10 +1443,9 @@ class Connection {
1446
1443
  }
1447
1444
 
1448
1445
  // assemble the new header
1449
- let header = [this.local.host]
1450
- header = header.concat(this.notes.authentication_results)
1446
+ let header = [this.local.host, ...this.notes.authentication_results]
1451
1447
  if (has_tran === true) {
1452
- header = header.concat(this.transaction.notes.authentication_results)
1448
+ header = [...header, ...this.transaction.notes.authentication_results]
1453
1449
  }
1454
1450
  if (header.length === 1) return '' // no results
1455
1451
  return header.join(';\r\n\t')
package/docs/Plugins.md CHANGED
@@ -166,7 +166,7 @@ These are the hook and their parameters (next excluded):
166
166
  - rcpt_ok (to)
167
167
  - data - called at the DATA command
168
168
  - data_post - called at the end-of-data marker
169
- - max_data_exceeded - called when the message exceeds connection.max_bytes
169
+ - max_data_exceeded - called when the message exceeds connection.max.bytes
170
170
  - queue - called to queue the mail
171
171
  - queue_outbound - called to queue the mail when connection.relaying is set
172
172
  - queue_ok - called when a mail has been queued successfully
@@ -97,7 +97,6 @@ WARNING: DO NOT USE THIS PLUGIN WITH queue/smtp_proxy.
97
97
  - action (required)
98
98
 
99
99
  The following is a list of supported actions, and the options they require.
100
-
101
100
  - drop
102
101
 
103
102
  This action simply drops a message, while pretending everything was
@@ -110,7 +109,6 @@ WARNING: DO NOT USE THIS PLUGIN WITH queue/smtp_proxy.
110
109
  "to" option. A note about matching in addition to the note
111
110
  about wildcard '-' above. When we match an alias, we store the
112
111
  hostname of the match for a shortcut substitution syntax later.
113
-
114
112
  - to (required)
115
113
 
116
114
  This option is the full address, or local part at matched hostname
@@ -10,7 +10,6 @@ for both inbound and outbound delivery.
10
10
  The path to the `qmail-queue` binary. Default: `/var/qmail/bin/qmail-queue`
11
11
 
12
12
  - qmail-queue.ini
13
-
14
13
  - enable_outbound=true
15
14
 
16
15
  Deliver outbound email to qmail. Set to false to use Haraka's