{ config, lib, pkgs, secrets, ... }: let cfg = config.dotfiles.email; in with lib; { options.dotfiles.email = { enable = mkEnableOption "enable email via mbsync"; address = mkOption { type = types.str; example = "email@example.com"; description = "The email address."; }; real_name = mkOption { type = types.str; default = "Chris Cummings"; example = "Chris Cummings"; description = "The name associated with the email address."; }; imap.host = mkOption { type = types.str; default = "imap.fastmail.com"; example = "imap.fastmail.com"; description = "the host url for imap for this email."; }; smtp.host = mkOption { type = types.str; default = "smtp.fastmail.com"; example = "smtp.fastmail.com"; description = "the host url for smtp for this email."; }; password_secret = mkOption { type = types.path; default = secrets.fastmail_password.path; example = ""; description = "use rage to encrypt secret, pass it to this variable."; }; }; config = mkIf cfg.enable { programs.mu.enable = mkDefault cfg.enable; programs.msmtp.enable = mkDefault cfg.enable; programs.mbsync = { enable = mkDefault cfg.enable; extraConfig = '' CopyArrivalDate yes ''; groups = { personal-inboxes = { "${cfg.address}" = []; }; }; }; services.mbsync = { enable = mkDefault cfg.enable; frequency = "*:0/10"; postExec = "${pkgs.mu}/bin/mu index"; }; # TODO create systemd oneshot job to run `mbsync --all` # and mu init # and mu index # so new systems are auto-setup # without having to run those commands manually accounts.email.accounts = { "${primaryAddress}" = { inherit (cfg) address; userName = cfg.address; realName = cfg.real_name; primary = true; mbsync = { enable = true; create = "both"; expunge = "both"; remove = "both"; extraConfig.account.PipelineDepth = 50; }; msmtp.enable = mkDefault cfg.enable; imap.host = cfg.imap.host; smtp.host = cfg.smtp.host; passwordCommand = let name = "mbsync-password-command"; in "${pkgs.writeShellApplication { inherit name; runtimeInputs = [pkgs.coreutils]; text = "cat ${cfg.password_secret}"; }}/bin/${name}"; }; }; }; }