summaryrefslogtreecommitdiff
path: root/home/mail/default.nix
blob: c858c29d8242c8f0346a3629c10d8ca8a98cf8f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{ config, lib, pkgs, ... }:
with lib; {
  options.local.mail = with types; {
    address = mkOption {
      type = str;
    };

    realName = mkOption {
      type = str;
    };

    sieve.enable = mkEnableOption "sieve filter";
  };

  config = mkIf (!config.home.isolation.active) {
    accounts.email = {
      maildirBasePath = "mail";

      accounts.local = {
        address = "${config.local.mail.address}@34project.org";
        userName = "${config.local.mail.address}@34project.org";
        inherit (config.local.mail) realName;

        primary = true;

        # ${maildirBasePath}/${maildir.path}
        maildir.path = "";
        folders.inbox = "";

        msmtp.enable = true;
        neomutt.enable = true;

        smtp = {
          host = "smtp.34project.org";

          tls = {
            enable = true;
            useStartTls = true;
          };
        };
      };
    };

    programs = {
      msmtp.enable = true;

      neomutt = {
        enable = true;
        vimKeys = true;

        settings = {
          record = "+.sent";
          postponed = "+.drafts";

          use_threads = "flat";
          index_format = "'%4C %Z %<[y?%<[m?%<[d?%[%H:%M ]&%[%a %d]>&%[%b %d]>&%[%m/%y ]> %-15.15L (%?l?%4l&%4c?) %s'";
        };
      };
    };

    # .dovecot.sieve tiene que ser un symlink tal que el readlink -f de su
    # dirname (no del symlink en sí) sea la misma cadena que el readlink -f
    # de ~/sieve. Dovecot verifica eso y tira "Invalid/unknown path to
    # storage" si este check frágil falla. Ni siquiera
    # mkOutOfStoreSymlink funciona. Ver código fuente de Dovecot:
    # pigeonhole/src/lib-sieve/storage/file/sieve-file-storage-active.c
    home =
      let
        sieve = pkgs.runCommandNoCCLocal "sieve" { src = ./sieve; } ''
          cp -r $src $out
          chmod -R u+w $out
          find $out -name '*.sieve' -exec ${pkgs.dovecot_pigeonhole}/bin/sievec -c /dev/null {} \;
        '';
      in
      mkIf config.local.mail.sieve.enable {
        file."sieve".source = sieve;

        activation.sieve = hm.dag.entryBetween [ "linkGeneration" ] [ "writeBoundary" ] ''
          $DRY_RUN_CMD ln -Tsf ${sieve}/mail.sieve .dovecot.sieve
          $DRY_RUN_CMD ln -Tsf ${sieve}/mail.svbin .dovecot.svbin
        '';
      };
  };
}