From cfa06c3f3866fdc708d5e9f7aa6a2f59759a1c61 Mon Sep 17 00:00:00 2001 From: Matthieu Coudron Date: Mon, 6 Aug 2018 19:02:49 +0900 Subject: [PATCH] msmtp: add module msmtp is a simple mail transfer agent (MTA). --- modules/accounts/email.nix | 1 + modules/misc/news.nix | 7 +++ modules/modules.nix | 1 + modules/programs/msmtp-accounts.nix | 25 ++++++++++ modules/programs/msmtp.nix | 77 +++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+) create mode 100644 modules/programs/msmtp-accounts.nix create mode 100644 modules/programs/msmtp.nix diff --git a/modules/accounts/email.nix b/modules/accounts/email.nix index 640edc59b..74bb84acf 100644 --- a/modules/accounts/email.nix +++ b/modules/accounts/email.nix @@ -318,6 +318,7 @@ in type = types.attrsOf (types.submodule [ mailAccountOpts (import ../programs/mbsync-accounts.nix) + (import ../programs/msmtp-accounts.nix) (import ../programs/notmuch-accounts.nix) ]); default = {}; diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 680df4186..bcf0c766b 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -758,6 +758,13 @@ in A new modules is available: 'programs.chromium'. ''; } + + { + time = "2018-08-20T20:27:26+00:00"; + message = '' + A new module is available: 'programs.msmtp'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index c50ed931e..d08a418e3 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -45,6 +45,7 @@ let ./programs/man.nix ./programs/mbsync.nix ./programs/mercurial.nix + ./programs/msmtp.nix ./programs/neovim.nix ./programs/newsboat.nix ./programs/notmuch.nix diff --git a/modules/programs/msmtp-accounts.nix b/modules/programs/msmtp-accounts.nix new file mode 100644 index 000000000..d4d4663f8 --- /dev/null +++ b/modules/programs/msmtp-accounts.nix @@ -0,0 +1,25 @@ +{ config, lib, ... }: + +with lib; + +{ + options.msmtp = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to enable msmtp. + + If enabled then it is possible to use the + command line option to send a + message for a given account using the msmtp + or msmtpq tool. For example, + msmtp --account=private + would send using the account defined in + . If the + option is not given then the + primary account will be used. + ''; + }; + }; +} diff --git a/modules/programs/msmtp.nix b/modules/programs/msmtp.nix new file mode 100644 index 000000000..4d0099155 --- /dev/null +++ b/modules/programs/msmtp.nix @@ -0,0 +1,77 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.programs.msmtp; + + dag = config.lib.dag; + + msmtpAccounts = filter (a: a.msmtp.enable) + (attrValues config.accounts.email.accounts); + + onOff = p: if p then "on" else "off"; + + accountStr = account: with account; + concatStringsSep "\n" ( + [ "account ${name}" ] + ++ mapAttrsToList (n: v: n + " " + v) ( + { + host = smtp.host; + from = address; + auth = "on"; + user = userName; + tls = onOff smtp.tls.enable; + tls_starttls = onOff smtp.tls.useStartTls; + tls_trust_file = smtp.tls.certificatesFile; + } + // optionalAttrs (smtp.port != null) { + port = toString smtp.port; + } + // optionalAttrs (passwordCommand != null) { + # msmtp requires the password to finish with a newline. + passwordeval = ''${pkgs.bash}/bin/bash -c "${toString passwordCommand}; echo"''; + } + ) + ++ optional primary "\naccount default : ${name}" + ); + + configFile = mailAccounts: '' + # Generated by Home Manager. + + ${cfg.extraConfig} + + ${concatStringsSep "\n\n" (map accountStr mailAccounts)} + ''; + +in + +{ + + options = { + programs.msmtp = { + enable = mkEnableOption "msmtp"; + + extraConfig = mkOption { + type = types.lines; + default = ""; + description = '' + Extra configuration lines to add to ~/.msmtprc. + See for examples. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + home.packages = [ pkgs.msmtp ]; + + home.file.".msmtprc".text = configFile msmtpAccounts; + + home.sessionVariables = { + MSMTP_QUEUE = "${config.xdg.dataHome}/msmtp/queue"; + MSMTP_LOG = "${config.xdg.dataHome}/msmtp/queue.log"; + }; + }; +}