mailsystem: dovecot: Autolearn ham/spam when moving mails
This commit is contained in:
parent
d35763a8a2
commit
0ce3ecae52
3 changed files with 76 additions and 2 deletions
|
|
@ -92,6 +92,14 @@ with (import ./common.nix {inherit config;}); let
|
|||
chgrp "${cfg.vmailGroupName}" ${cfg.mailDirectory}
|
||||
chmod 02770 ${cfg.mailDirectory}
|
||||
'';
|
||||
|
||||
junkMailboxes = builtins.attrNames (lib.filterAttrs (n: v: v ? "specialUse" && v.specialUse == "Junk") dovecot2Cfg.mailboxes);
|
||||
junkMailboxNumber = builtins.length junkMailboxes;
|
||||
# The assertion guarantees that there is exactly one Junk mailbox.
|
||||
junkMailboxName =
|
||||
if junkMailboxNumber == 1
|
||||
then builtins.elemAt junkMailboxes 0
|
||||
else "";
|
||||
in {
|
||||
options.mailsystem.dovecot.dhparamSize = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
|
|
@ -101,12 +109,18 @@ in {
|
|||
|
||||
config = lib.mkIf cfg.enable {
|
||||
assertions =
|
||||
lib.mapAttrsToList (user: value: [
|
||||
[
|
||||
{
|
||||
assertion = junkMailboxNumber == 1;
|
||||
message = "mailnix requires exactly one dovecot mailbox with the 'special use' flag to 'Junk' (${builtins.toString junkMailboxNumber} have been found)";
|
||||
}
|
||||
]
|
||||
++ lib.mapAttrsToList (
|
||||
user: value: {
|
||||
assertion = value.hashedPasswordFile != null;
|
||||
message = "A file containing the hashed password for user ${user} needs to be set.";
|
||||
}
|
||||
])
|
||||
)
|
||||
cfg.accounts;
|
||||
|
||||
services.dovecot2 = {
|
||||
|
|
@ -136,6 +150,44 @@ in {
|
|||
sieve = "file:~/sieve;active=~/.dovecot.sieve";
|
||||
};
|
||||
|
||||
sieve = {
|
||||
extensions = [
|
||||
"fileinto"
|
||||
"mailbox"
|
||||
];
|
||||
|
||||
scripts.after = builtins.toFile "spam.sieve" ''
|
||||
require "fileinto";
|
||||
require "mailbox";
|
||||
|
||||
if header :is "X-Spam" "Yes" {
|
||||
fileinto :create "${junkMailboxName}";
|
||||
stop;
|
||||
}
|
||||
'';
|
||||
|
||||
pipeBins = map lib.getExe [
|
||||
(pkgs.writeShellScriptBin "learn-ham.sh"
|
||||
"exec ${pkgs.rspamd}/bin/rspamc -h ${rspamdControllerSocket} learn_ham")
|
||||
(pkgs.writeShellScriptBin "learn-spam.sh"
|
||||
"exec ${pkgs.rspamd}/bin/rspamc -h ${rspamdControllerSocket} learn_spam")
|
||||
];
|
||||
};
|
||||
|
||||
imapsieve.mailbox = [
|
||||
{
|
||||
name = junkMailboxName;
|
||||
causes = ["COPY" "APPEND"];
|
||||
before = ./dovecot/report-spam.sieve;
|
||||
}
|
||||
{
|
||||
name = "*";
|
||||
from = junkMailboxName;
|
||||
causes = ["COPY"];
|
||||
before = ./dovecot/report-ham.sieve;
|
||||
}
|
||||
];
|
||||
|
||||
# TODO: move configuration to default.nix?
|
||||
mailboxes = {
|
||||
Drafts = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue