nixos/mailman: make Postfix support optional (provided you configure the MTA yourself)

Mailman can now work with MTAs other than Postfix. You'll have to configure
it yourself using the options in `services.mailman.settings.mta`.

This addition is reflected in the release notes for 21.03.
This commit is contained in:
Vika 2020-11-29 23:00:52 +03:00
parent 23a5371532
commit ad023b0c88
No known key found for this signature in database
GPG Key ID: 4F62CD07CE64796A
3 changed files with 79 additions and 9 deletions

View File

@ -250,6 +250,19 @@
<title>Other Notable Changes</title>
<itemizedlist>
<listitem>
<para>
The Mailman NixOS module (<literal>services.mailman</literal>) has a new
option <xref linkend="opt-services.mailman.enablePostfix" />, defaulting
to true, that controls integration with Postfix.
</para>
<para>
If this option is disabled, default MTA config becomes not set and you
should set the options in <literal>services.mailman.settings.mta</literal>
according to the desired configuration as described in
<link xlink:href="https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html">Mailman documentation</link>.
</para>
</listitem>
<listitem>
<para>
The default-version of <literal>nextcloud</literal> is <package>nextcloud20</package>.

View File

@ -38,7 +38,7 @@ let
webSettingsJSON = pkgs.writeText "settings.json" (builtins.toJSON webSettings);
# TODO: Should this be RFC42-ised so that users can set additional options without modifying the module?
mtaConfig = pkgs.writeText "mailman-postfix.cfg" ''
postfixMtaConfig = pkgs.writeText "mailman-postfix.cfg" ''
[postfix]
postmap_command: ${pkgs.postfix}/bin/postmap
transport_file_type: hash
@ -81,7 +81,7 @@ in {
enable = mkOption {
type = types.bool;
default = false;
description = "Enable Mailman on this host. Requires an active Postfix installation.";
description = "Enable Mailman on this host. Requires an active MTA on the host (e.g. Postfix).";
};
package = mkOption {
@ -92,6 +92,20 @@ in {
description = "Mailman package to use";
};
enablePostfix = mkOption {
type = types.bool;
default = true;
example = false;
description = ''
Enable Postfix integration. Requires an active Postfix installation.
If you want to use another MTA, set this option to false and configure
settings in services.mailman.settings.mta.
Refer to the Mailman manual for more info.
'';
};
siteOwner = mkOption {
type = types.str;
example = "postmaster@example.org";
@ -182,7 +196,7 @@ in {
pid_file = "/run/mailman/master.pid";
};
mta.configuration = lib.mkDefault "${mtaConfig}";
mta.configuration = lib.mkDefault (if cfg.enablePostfix then "${postfixMtaConfig}" else throw "When Mailman Postfix integration is disabled, set `services.mailman.settings.mta.configuration` to the path of the config file required to integrate with your MTA.");
"archiver.hyperkitty" = lib.mkIf cfg.hyperkitty.enable {
class = "mailman_hyperkitty.Archiver";
@ -211,14 +225,22 @@ in {
See <https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html>.
'';
};
in [
in (lib.optionals cfg.enablePostfix [
{ assertion = postfix.enable;
message = "Mailman requires Postfix";
message = ''
Mailman's default NixOS configuration requires Postfix to be enabled.
If you want to use another MTA, set services.mailman.enablePostfix
to false and configure settings in services.mailman.settings.mta.
Refer to <https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html>
for more info.
'';
}
(requirePostfixHash [ "relayDomains" ] "postfix_domains")
(requirePostfixHash [ "config" "transport_maps" ] "postfix_lmtp")
(requirePostfixHash [ "config" "local_recipient_maps" ] "postfix_lmtp")
];
]);
users.users.mailman = {
description = "GNU Mailman";
@ -275,7 +297,7 @@ in {
'';
}) ];
services.postfix = {
services.postfix = lib.mkIf cfg.enablePostfix {
recipientDelimiter = "+"; # bake recipient addresses in mail envelopes via VERP
config = {
owner_request_special = "no"; # Mailman handles -owner addresses on its own

View File

@ -13,9 +13,9 @@
</para>
<section xml:id="module-services-mailman-basic-usage">
<title>Basic usage</title>
<title>Basic usage with Postfix</title>
<para>
For a basic configuration, the following settings are suggested:
For a basic configuration with Postfix as the MTA, the following settings are suggested:
<programlisting>{ config, ... }: {
services.postfix = {
enable = true;
@ -56,4 +56,39 @@
necessary, but outside the scope of the Mailman module.
</para>
</section>
<section xml:id="module-services-mailman-other-mtas">
<title>Using with other MTAs</title>
<para>
Mailman also supports other MTA, though with a little bit more configuration. For example, to use Mailman with Exim, you can use the following settings:
<programlisting>{ config, ... }: {
services = {
mailman = {
enable = true;
siteOwner = "mailman@example.org";
<link linkend="opt-services.mailman.enablePostfix">enablePostfix</link> = false;
settings.mta = {
incoming = "mailman.mta.exim4.LMTP";
outgoing = "mailman.mta.deliver.deliver";
lmtp_host = "localhost";
lmtp_port = "8024";
smtp_host = "localhost";
smtp_port = "25";
configuration = "python:mailman.config.exim4";
};
};
exim = {
enable = true;
# You can configure Exim in a separate file to reduce configuration.nix clutter
config = builtins.readFile ./exim.conf;
};
};
}</programlisting>
</para>
<para>
The exim config needs some special additions to work with Mailman. Currently
NixOS can't manage Exim config with such granularity. Please refer to
<link xlink:href="https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html">Mailman documentation</link>
for more info on configuring Mailman for working with Exim.
</para>
</section>
</chapter>