···
1
+
import ./make-test.nix {
5
+
smtp1 = { pkgs, ... }: {
6
+
imports = [ common/user-account.nix ];
8
+
firewall.allowedTCPPorts = [ 25 ];
10
+
interfaces.eth1.ipv4.addresses = pkgs.lib.mkOverride 0 [
11
+
{ address = "192.168.1.1"; prefixLength = 24; }
14
+
environment.systemPackages = [ pkgs.opensmtpd ];
15
+
services.opensmtpd = {
17
+
extraServerArgs = [ "-v" ];
18
+
serverConfiguration = ''
20
+
# DO NOT DO THIS IN PRODUCTION!
21
+
# Setting up authentication requires a certificate which is painful in
22
+
# a test environment, but THIS WOULD BE DANGEROUS OUTSIDE OF A
23
+
# WELL-CONTROLLED ENVIRONMENT!
24
+
accept from any for any relay
29
+
smtp2 = { pkgs, ... }: {
30
+
imports = [ common/user-account.nix ];
32
+
firewall.allowedTCPPorts = [ 25 143 ];
34
+
interfaces.eth1.ipv4.addresses = pkgs.lib.mkOverride 0 [
35
+
{ address = "192.168.1.2"; prefixLength = 24; }
38
+
environment.systemPackages = [ pkgs.opensmtpd ];
39
+
services.opensmtpd = {
41
+
extraServerArgs = [ "-v" ];
42
+
serverConfiguration = ''
44
+
accept from any for local deliver to mda \
45
+
"${pkgs.dovecot}/libexec/dovecot/deliver -d %{user.username}"
48
+
services.dovecot2 = {
51
+
mailLocation = "maildir:~/mail";
52
+
protocols = [ "imap" ];
56
+
client = { pkgs, ... }: {
59
+
interfaces.eth1.ipv4.addresses = pkgs.lib.mkOverride 0 [
60
+
{ address = "192.168.1.3"; prefixLength = 24; }
63
+
environment.systemPackages = let
64
+
sendTestMail = pkgs.writeScriptBin "send-a-test-mail" ''
65
+
#!${pkgs.python3.interpreter}
68
+
with smtplib.SMTP('192.168.1.1') as smtp:
69
+
smtp.sendmail('alice@[192.168.1.1]', 'bob@[192.168.1.2]', """
78
+
checkMailLanded = pkgs.writeScriptBin "check-mail-landed" ''
79
+
#!${pkgs.python3.interpreter}
82
+
with imaplib.IMAP4('192.168.1.2', 143) as imap:
83
+
imap.login('bob', 'foobar')
85
+
status, refs = imap.search(None, 'ALL')
86
+
assert status == 'OK'
87
+
assert len(refs) == 1
88
+
status, msg = imap.fetch(refs[0], 'BODY[TEXT]')
89
+
assert status == 'OK'
91
+
print("===> content:", content)
92
+
split = content.split(b'\r\n')
93
+
print("===> split:", split)
94
+
lastline = split[-3]
95
+
print("===> lastline:", lastline)
96
+
assert lastline.strip() == b'Hello World'
98
+
in [ sendTestMail checkMailLanded ];
105
+
$client->waitForUnit("network.target");
106
+
$smtp1->waitForUnit('opensmtpd');
107
+
$smtp2->waitForUnit('opensmtpd');
108
+
$smtp2->waitForUnit('dovecot2');
110
+
$client->succeed('send-a-test-mail');
111
+
$smtp1->waitUntilFails('smtpctl show queue | egrep .');
112
+
$smtp2->waitUntilFails('smtpctl show queue | egrep .');
113
+
$client->succeed('check-mail-landed >&2');