mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-02-18 08:33:41 +00:00
See the spam score for an email sent with these settings: https://www.mail-tester.com/test-jy6unbdzu Tests done: 1. Install the email app with version 4, then check out the files: ``` ls -la /var/lib/rspamd/dkim/ ; cat /etc/rspamd/local.d/dkim_signing.conf total 4 dr-x------ 1 _rspamd _rspamd 50 Jan 1 19:14 . drwxr-x--- 1 _rspamd _rspamd 16936 Jan 1 20:21 .. -r-------- 1 root root 1704 Jan 1 19:14 freedombox.local.dkim.key cat: /etc/rspamd/local.d/dkim_signing.conf: No such file or directory ``` 2. Apply the patches and update the app: ``` ls -la /var/lib/rspamd/dkim/ ; cat /etc/rspamd/local.d/dkim_signing.conf total 4 dr-x------ 1 _rspamd _rspamd 50 Jan 1 19:14 . drwxr-x--- 1 _rspamd _rspamd 16936 Jan 1 20:22 .. -r-------- 1 _rspamd _rspamd 1704 Jan 1 19:14 freedombox.local.dkim.key allow_username_mismatch = true; sign_authenticated = true; use_domain = "header"; domain { freedombox.local { path = "/var/lib/rspamd/dkim/freedombox.local.dkim.key"; selector = "dkim"; } } ``` 3. Configure example.com as a domain under Name Services, then also change the primary domain in the email app and confirm it completes without errors. Also see: ``` ls -la /var/lib/rspamd/dkim/ ; cat /etc/rspamd/local.d/dkim_signing.conf total 8 dr-x------ 1 _rspamd _rspamd 90 Jan 1 21:15 . drwxr-x--- 1 _rspamd _rspamd 16936 Jan 1 21:17 .. -r-------- 1 _rspamd _rspamd 1704 Jan 1 21:15 example.com.dkim.key -r-------- 1 _rspamd _rspamd 1704 Jan 1 19:14 freedombox.local.dkim.key allow_username_mismatch = true; sign_authenticated = true; use_domain = "header"; domain { example.com { path = "/var/lib/rspamd/dkim/example.com.dkim.key"; selector = "dkim"; } } ``` 4. Uninstall the app and perform a fresh install, confirm it completes succesfully. The configurations in /etc/rspamd/local.d/dkim_signing.conf have been verified to work on a throw-away VPS setup. Once merged, this should be mentioned here: https://discuss.freedombox.org/t/solved-email-messages-not-signed-with-dkim/2387 Signed-off-by: Benedek Nagy <contact@nbenedek.me> [sunil: Add comment explaining allow_username_mismatch option] [sunil: Drop an unused variable, added docstrings] Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org> Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""
|
|
Configures rspamd to handle incoming and outgoing spam.
|
|
|
|
See: http://www.postfix.org/MILTER_README.html
|
|
See: https://rspamd.com/doc/configuration/ucl.html
|
|
|
|
For testing DKIM signatures: https://www.mail-tester.com/
|
|
"""
|
|
|
|
import pathlib
|
|
import re
|
|
import subprocess
|
|
|
|
from plinth.actions import privileged
|
|
from plinth.modules.email import postfix
|
|
|
|
_milter_config = {
|
|
'smtpd_milters': 'inet:127.0.0.1:11332',
|
|
'non_smtpd_milters': 'inet:127.0.0.1:11332',
|
|
}
|
|
|
|
|
|
@privileged
|
|
def setup_spam():
|
|
"""Compile sieve filters and set rspamd/postfix configuration."""
|
|
_compile_sieve()
|
|
_setup_rspamd()
|
|
postfix.set_config(_milter_config)
|
|
|
|
|
|
def _compile_sieve():
|
|
"""Compile all .sieve script to binary format for performance."""
|
|
sieve_dir = '/etc/dovecot/freedombox-sieve-after/'
|
|
subprocess.run(['sievec', sieve_dir], check=True)
|
|
|
|
|
|
def _setup_rspamd():
|
|
"""Adjust configuration to include FreedomBox configuration files."""
|
|
configs = [('milter_headers.conf', 'freedombox-milter-headers.conf'),
|
|
('redis.conf', 'freedombox-redis.conf'),
|
|
('logging.inc', 'freedombox-logging.inc'),
|
|
('dkim_signing.conf', 'freedombox-dkim-signing.conf')]
|
|
base_path = pathlib.Path('/etc/rspamd/local.d')
|
|
for orig_path, include_path in configs:
|
|
_setup_local_include(base_path / orig_path, base_path / include_path)
|
|
|
|
|
|
def _setup_local_include(orig_path, include_path):
|
|
"""Adjust configuration to include a FreedomBox configuration file."""
|
|
lines = []
|
|
if orig_path.exists():
|
|
lines = orig_path.read_text().splitlines()
|
|
|
|
file_name = include_path.name
|
|
for line in lines:
|
|
if re.match(rf'\s*.include\(.*\)\s+".*/{file_name}"', line):
|
|
return
|
|
|
|
lines.append('.include(priority=2,duplicate=merge) '
|
|
f'"$LOCAL_CONFDIR/local.d/{file_name}"\n')
|
|
orig_path.write_text('\n'.join(lines))
|