Merge pull request #105397 from kisik21/mailman-other-mta-support

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

Changed files
+79 -9
nixos
doc
manual
release-notes
modules
services
+13
nixos/doc/manual/release-notes/rl-2103.xml
···
<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>.
Please note that it's <emphasis>not</emphasis> possible to upgrade <literal>nextcloud</literal>
across multiple major versions! This means that it's e.g. not possible to upgrade
+29 -7
nixos/modules/services/mail/mailman.nix
···
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
···
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 {
···
defaultText = "pkgs.mailman";
example = literalExample "pkgs.mailman.override { archivers = []; }";
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 {
···
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";
···
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";
···
'';
}) ];
-
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
+37 -2
nixos/modules/services/mail/mailman.xml
···
</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;
···
avoid spam -- a number of additional measures for authenticating
incoming and outgoing mails, such as SPF, DMARC and DKIM are
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>