0
0
Fork 0
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-07-14 06:00:33 +03:00

nixos/mailpit: init

Simple module to configure a systemd service for mailpit.
This commit is contained in:
Maximilian Bosch 2024-07-24 15:48:20 +02:00
parent f7962e8d6b
commit a2437d8075
No known key found for this signature in database
GPG key ID: 797C8FD26F815B0E
5 changed files with 147 additions and 3 deletions

View file

@ -664,6 +664,7 @@
./services/mail/mailcatcher.nix
./services/mail/mailhog.nix
./services/mail/mailman.nix
./services/mail/mailpit.nix
./services/mail/mlmmj.nix
./services/mail/nullmailer.nix
./services/mail/offlineimap.nix

View file

@ -0,0 +1,103 @@
{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.mailpit;
inherit (lib)
cli
concatStringsSep
const
filterAttrs
getExe
mkEnableOption
mkIf
mkOption
types
;
isNonNull = v: v != null;
cliFlags = concatStringsSep " " (
cli.toGNUCommandLine { } (filterAttrs (const isNonNull) cfg.settings)
);
in
{
options.services.mailpit = {
enable = mkEnableOption "mailpit";
settings = mkOption {
default = { };
type = types.submodule {
freeformType = types.attrsOf (
types.oneOf [
types.str
types.int
types.bool
]
);
options = {
database = mkOption {
type = types.nullOr types.str;
default = null;
example = "mailpit.db";
description = ''
Specify the local database filename to store persistent data.
If `null`, a temporary file will be created that will be removed when the application stops.
It's recommended to specify a relative path. The database will be written into the service's
state directory then.
'';
};
max = mkOption {
type = types.ints.unsigned;
default = 500;
description = ''
Maximum number of emails to keep. If the number is exceeded, old emails
will be deleted.
Set to `0` to never prune old emails.
'';
};
listen = mkOption {
default = "0.0.0.0:8025";
type = types.str;
description = ''
HTTP bind interface and port for UI.
'';
};
smtp = mkOption {
default = "0.0.0.0:1025";
type = types.str;
description = ''
SMTP bind interface and port.
'';
};
};
};
description = ''
Attribute-set of all flags passed to mailpit. See
[upstream docs](https://mailpit.axllent.org/docs/configuration/runtime-options/)
for all available options.
'';
};
};
config = mkIf cfg.enable {
systemd.services.mailpit = {
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
wants = [ "network-online.target" ];
serviceConfig = {
DynamicUser = true;
StateDirectory = "mailpit";
WorkingDirectory = "%S/mailpit";
ExecStart = "${getExe pkgs.mailpit} ${cliFlags}";
Restart = "on-failure";
};
};
};
meta.maintainers = lib.teams.flyingcircus.members;
}

View file

@ -552,6 +552,7 @@ in {
magnetico = handleTest ./magnetico.nix {};
mailcatcher = handleTest ./mailcatcher.nix {};
mailhog = handleTest ./mailhog.nix {};
mailpit = handleTest ./mailpit.nix {};
mailman = handleTest ./mailman.nix {};
man = handleTest ./man.nix {};
mariadb-galera = handleTest ./mysql/mariadb-galera.nix {};

35
nixos/tests/mailpit.nix Normal file
View file

@ -0,0 +1,35 @@
import ./make-test-python.nix (
{ lib, ... }:
{
name = "mailpit";
meta.maintainers = lib.teams.flyingcircus.members;
nodes.machine =
{ pkgs, ... }:
{
services.mailpit.enable = true;
environment.systemPackages = with pkgs; [ swaks ];
};
testScript = ''
start_all()
from json import loads
machine.wait_for_unit("mailpit.service")
machine.wait_for_open_port(1025)
machine.wait_for_open_port(8025)
machine.succeed(
'echo "this is the body of the email" | swaks --to root@example.org --body - --server localhost:1025'
)
received = loads(machine.succeed("curl http://localhost:8025/api/v1/messages"))
assert received['total'] == 1
message = received["messages"][0]
assert len(message['To']) == 1
assert message['To'][0]['Address'] == 'root@example.org'
assert "this is the body of the email" in message['Snippet']
'';
}
)

View file

@ -10,6 +10,7 @@
fetchNpmDeps,
testers,
mailpit,
nixosTests,
}:
let
@ -78,9 +79,12 @@ buildGoModule {
cp -r ${ui} server/ui/dist
'';
passthru.tests.version = testers.testVersion {
package = mailpit;
command = "mailpit version";
passthru.tests = {
inherit (nixosTests) mailpit;
version = testers.testVersion {
package = mailpit;
command = "mailpit version";
};
};
passthru.updateScript = {