PageSourceSearch

https://docs.rspamd.com/assets/js/27222ad6.e276c311.js

js rspamd.com collected 2026-10-02 02:30:28 UTC 9,155 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkrspamd_docs=self.webpackChunkrspamd_docs||[]).push([[5571],{28453:(e,s,i)=>{i.d(s,{R:()=>n,x:()=>l});var t=i(96540);const r={},d=t.createContext(r);function n(e){const s=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:n(e.components),t.createElement(d.Provider,{value:s},e.children)}},55467:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>n,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"modules/replies","title":"Replies module","description":"This module gathers the message-id header of emails that authenticated users have sent and saves the corresponding hashes to Redis. These hashes expire after a predetermined length of time, which can be set to a maximum of 24 hours by default. Additionally, the module creates hashes of the in-reply-to headers of all received messages and checks them for matches, i.e., messages that were sent in response to messages that our system initiated. After that it approves all recipients of the current sender and adds them to the local replies set of this sender (default maximum size is 20). local replies set is used to check approved recipients for current sender. This local replies set has the time to expire (default is 1 day) after which it is removed from the redis. After this all recipients are also added to the global replies set (default maximum size is 30). global replies set is used to determine whether the sender is approved. The module then generates a symbol that can be used to adjust the scoring or force an action, such as accepting the message with no action taken, depending on the configuration.","source":"@site/docs/modules/replies.md","sourceDirName":"modules","slug":"/modules/replies","permalink":"/modules/replies","draft":false,"unlisted":false,"editUrl":"https://github.com/rspamd/docs.rspamd.com/edit/master/docs/modules/replies.md","tags":[],"version":"current","frontMatter":{"title":"Replies module"},"sidebar":"docs","previous":{"title":"Regexp module","permalink":"/modules/regexp"},"next":{"title":"Reputation module","permalink":"/modules/reputation"}}');var r=i(74848),d=i(28453);const n={title:"Replies module"},l="Replies module",a={},o=[{value:"Configuration",id:"configuration",level:2},{value:"Example",id:"example",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"replies-module",children:"Replies module"})}),"\n",(0,r.jsxs)(s.p,{children:["This module gathers the ",(0,r.jsx)(s.code,{children:"message-id"})," header of emails that authenticated users have sent and saves the corresponding hashes to Redis. These hashes expire after a predetermined length of time, which can be set to a maximum of 24 hours by default. Additionally, the module creates hashes of the ",(0,r.jsx)(s.code,{children:"in-reply-to"})," headers of all received messages and checks them for matches, i.e., messages that were sent in response to messages that our system initiated. After that it approves all recipients of the current sender and adds them to the ",(0,r.jsx)(s.code,{children:"local replies set"})," of this sender (default maximum size is 20). ",(0,r.jsx)(s.code,{children:"local replies set"})," is used to check approved recipients for current sender. This ",(0,r.jsx)(s.code,{children:"local replies set"})," has the time to expire (default is 1 day) after which it is removed from the redis. After this all recipients are also added to the ",(0,r.jsx)(s.code,{children:"global replies set"})," (default maximum size is 30). ",(0,r.jsx)(s.code,{children:"global replies set"})," is used to determine whether the sender is approved. The module then generates a symbol that can be used to adjust the scoring or force an action, such as accepting the message with no action taken, depending on the configuration."]}),"\n",(0,r.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsx)(s.p,{children:"Settings for the module are described below (default values are indicated in brackets)."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"action"}),': apply the given action to messages identified as replies (should typically be set to "no action" to accept)']}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"expire"}),": time, in seconds, after which to expire records (default is one day)."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"key_prefix"}),": string prefixed to keys in Redis (default ",(0,r.jsx)(s.code,{children:"rr"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"key_size"}),": length of hash keys (default 20)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"sender_prefix"}),": string prefixed to replies sets (default ",(0,r.jsx)(s.code,{children:"rsrk"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"sender_key_global"}),": string that is used as a key to the global replies set (default ",(0,r.jsx)(s.code,{children:"verified_senders"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"sender_key_size"}),": length of hash key for the global replies set key (default 20); per-sender local set keys always use a hard-coded 8-character hash and are not affected by this 
1setting"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"message"}),": message passed as the pre-result reason when ",(0,r.jsx)(s.code,{children:"action"})," is set (default ",(0,r.jsx)(s.code,{children:"Message is reply to one we originated"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"symbol"}),": symbol yielded on messages identified as replies (default ",(0,r.jsx)(s.code,{children:"REPLY"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"score"}),": default score for the symbol (default -4)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"max_local_size"}),": maximum number of recipients stored in each per-sender local replies set (default is 20)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"max_global_size"}),": maximum number of recipients stored in the global replies set (default is 30)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"use_auth"}),": track replies for authenticated users (default true)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"use_local"}),": track replies for local IPs (default true)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"min_message_id"}),": minimum length of message-id header to consider (default 2)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"cookie"}),": enable DKIM-like reply cookie in message-id"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"cookie_key"}),": key for cookie generation"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"cookie_is_pattern"}),": treat cookie as a pattern"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"cookie_valid_time"}),": how long cookie is valid (default ",(0,r.jsx)(s.code,{children:"2w"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"reply_sender_privacy"}),": enable sender address obfuscation in Redis (default false)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"reply_sender_privacy_alg"}),": hash algorithm for obfuscation (default ",(0,r.jsx)(s.code,{children:"blake2"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"reply_sender_privacy_prefix"}),": prefix for obfuscated addresses (default ",(0,r.jsx)(s.code,{children:"obf"}),")"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.code,{children:"reply_sender_privacy_length"}),": length of obfuscated hash (default 16)"]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["Additionally, you will need to set up Redis servers to store data, such as ",(0,r.jsx)(s.code,{children:"servers"})," or ",(0,r.jsx)(s.code,{children:"read_servers"})," and ",(0,r.jsx)(s.code,{children:"write_servers"}),". You can specify all standard Redis arguments, including password, timeout, database, and so on."]}),"\n",(0,r.jsx)(s.h2,{id:"example",children:"Example"}),"\n",(0,r.jsxs)(s.p,{children:["Configuration should be added to ",(0,r.jsx)(s.code,{children:"/etc/rspamd/local.d/replies.conf"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-hcl",children:'# This setting is non-default & may be desirable\n#action = "no action";\n# These are default settings you may want to change\nexpire = 1d;\nkey_prefix = "rr";\nsender_prefix = "rsrk";\nmessage = "Message is reply to one we originated";\nsymbol = "REPLY";\nmax_local_size = 20;\nmax_global_size = 30;\n# Module specific redis configuration\n#servers = "localhost";\n'})})]})}function h(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.