diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 5ffb0c5ab223..c7850ad2bb30 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -316,6 +316,7 @@
./services/logging/syslog-ng.nix
./services/logging/syslogd.nix
./services/mail/clamsmtp.nix
+ ./services/mail/davmail.nix
./services/mail/dkimproxy-out.nix
./services/mail/dovecot.nix
./services/mail/dspam.nix
diff --git a/nixos/modules/services/mail/davmail.nix b/nixos/modules/services/mail/davmail.nix
new file mode 100644
index 000000000000..a0cb81f84dac
--- /dev/null
+++ b/nixos/modules/services/mail/davmail.nix
@@ -0,0 +1,91 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.davmail;
+
+ configType = with types;
+ either (either (attrsOf configType) str) (either int bool) // {
+ description = "davmail config type (str, int, bool or attribute set thereof)";
+ };
+
+ toStr = val: if isBool val then boolToString val else toString val;
+
+ linesForAttrs = attrs: concatMap (name: let value = attrs.${name}; in
+ if isAttrs value
+ then map (line: name + "." + line) (linesForAttrs value)
+ else [ "${name}=${toStr value}" ]
+ ) (attrNames attrs);
+
+ configFile = pkgs.writeText "davmail.properties" (concatStringsSep "\n" (linesForAttrs cfg.config));
+
+in
+
+ {
+ options.services.davmail = {
+ enable = mkEnableOption "davmail, an MS Exchange gateway";
+
+ url = mkOption {
+ type = types.str;
+ description = "Outlook Web Access URL to access the exchange server, i.e. the base webmail URL.";
+ example = "https://outlook.office365.com/EWS/Exchange.asmx";
+ };
+
+ config = mkOption {
+ type = configType;
+ default = {};
+ description = ''
+ Davmail configuration. Refer to
+
+ and
+ for details on supported values.
+ '';
+ example = literalExample ''
+ {
+ davmail.allowRemote = true;
+ davmail.imapPort = 55555;
+ davmail.bindAddress = "10.0.1.2";
+ davmail.smtpSaveInSent = true;
+ davmail.folderSizeLimit = 10;
+ davmail.caldavAutoSchedule = false;
+ log4j.logger.rootLogger = "DEBUG";
+ }
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+
+ services.davmail.config.davmail = mapAttrs (name: mkDefault) {
+ server = true;
+ disableUpdateCheck = true;
+ logFilePath = "/var/log/davmail/davmail.log";
+ logFileSize = "1MB";
+ mode = "auto";
+ url = cfg.url;
+ caldavPort = 1080;
+ imapPort = 1143;
+ ldapPort = 1389;
+ popPort = 1110;
+ smtpPort = 1025;
+ };
+
+ systemd.services.davmail = {
+ description = "DavMail POP/IMAP/SMTP Exchange Gateway";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+
+ serviceConfig = {
+ Type = "simple";
+ ExecStart = "${pkgs.davmail}/bin/davmail ${configFile}";
+ Restart = "on-failure";
+ DynamicUser = "yes";
+ LogsDirectory = "davmail";
+ };
+ };
+
+ environment.systemPackages = [ pkgs.davmail ];
+ };
+ }