Re: Why is it so difficult to setup Mailman3?
by Stephen J. Turnbull
alain williams writes:
> On Wed, Apr 08, 2026 at 11:07:42PM +0900, Stephen J. Turnbull wrote:
>
> > To the best of my knowledge, the recommended installation documents at
> > https://docs.mailman3.org/en/latest/install/virtualenv.html are
> > complete and straightforward for "typical" one-domain installations.
>
> No they are not. I struggled, part of the reason is that I am not imbued in
> the python mindset and the documentation is written assuming that background.
*shrug* This is Un*x server software. Core is configured in .ini
style. Most of the *necessary* configuration is basic mail stuff:
hosts and ports. Some of it is authentication for the REST API. I
can't think of anything that's really Python-specific. (And in fact,
Mailman 2's configuration was Python! mm_cfg.py)
The website configuration is done in Python because Django does it
that way. Pretty sure Barry would have preferred .ini (I don't think
TOML was a thing back then), but it would have been a lot of work to
write a translator, and probably even less intelligible, because so
much Django configuration is hierarchical. I'm surprised you talk
about "python mindset" though. The Django configuration is mostly
strings, nested lists and dicts, and ints -- which is basically JSON.
> So I used the Debian package
Which we recommend against, for good reason. We don't (can't, really)
do a good job of supporting other vendors' versions, and ... well,
they don't, either. :-(
> are still problems: it is a resource hog and parts crash -
> generating large numbers of incomprehensible emails (I have talked
> about here, no real help).
Pointers to those conversations?
I don't know about crashes besides the OOM-killer in resource-
constrained environments. Most exceptions are handled internally so
you get a traceback in the logs, but that normally doesn't kill
processes. And I don't know why crashes would generate "large numbers
of incomprehensible emails". I don't think Mailman sends email when
there is a problem. I think the default Django configuration may do
so, though.
> Mailman2 was a dream, simple to install and just worked.
I assure you 25 years ago it was no different from today's Mailman 3
(ie, a few years after the first production use of the software).
Back then, people complained that the CGIs were a resource hog, and it
sure didn't "just work" in the face of non-ASCII mail and spam --
that's why I got involved in Mailman, and later Python, development.
> MM3 has some nice features (eg using a SQL database) but is a pig
> -- far more than it should be.
I *really* don't want to hear "should" from someone who doesn't hack
Python. You're welcome to wish it was smaller, we all do. But if you
can't tell me *how* to do it, don't tell me we "should".
And, seriously, the "hardware" needed is a $24/month 4GB Linode.
Maybe less: I ran a (not-mission-critical) Mailman installation (and
not much else!) on a 2GB DigitalOcean droplet with Ubuntu for several
months. That's borderline -- I know because something would get
OOM-killed once or twice a week and I'd have to restart Mailman. So
something a little bit bigger than that would do. I think Linode with
Debian might stretch enough to run Mailman suite, PostgreSQL, and
nothing else in 2GB ($12/mo). Everyone I knew in university labs was
running it in 5 or 10 year old otherwise useless hardware with 8 or 16
GB of RAM. Overkill!! ;-)
Anyway, in 2012, we wanted to scale to Fortune 100 company-sized
installations without them having to hack the core. A couple years
ago I worked on a site with more than 50K users and 20K lists,
processing more than 1M messages (incoming) per month (heaven knows
how many outgoing). It requires $24/month worth of Linode (running
several extra processes to slice the out queue and a largish
PostgreSQL by dedicated-to-Mailman SQL standards -- they did use
HyperKitty and had several TB of archives). That's a lot of scaling
for very cheap compute!
So Barry split up the core processing into runners handling queues of
email messages, and of course HyperKitty and Postorius were split out
into separate applications. In core, thread-per-runner was not an
option then (Python had threads but the GIL was a problem), nor was
async (the keywords didn't exist, the alternatives were Twisted or
greenlets, and we only had one developer who could hack that stuff).
So Barry went with the tried and true multiprocess model. The problem
with that is that just getting the master process running gets you up
to 75MB on a 64-bit machine, so you end up forking up to 20 processes
x 75MB each, some of which might grow up to 125MB or so over time. At
most 15-20MB of that is shared. (I think like 2 of those processes
manage the web UIs and HyperKitty's background scheduler.) Doesn't
fit into a Nanode, I admit.
> I know other sysadmins who gave up and went with different list
> managers; if I was starting again I would do likewise.
That's always an option. At least with ListServs I have subscriptions
on you give up a lot of functionality. Don't know about Sympa. But
it's an option.
But I know that thousands of people have successfully installed
Mailman 3, I assume most have migrated lists from Mailman 2. Many
others are using Mailman 3 on hosting platforms.
> Help here has been good & responsive (thank you) but several times
> I was told that because I had not followed the virtualenv
> instructions help was limited.
Yes, that's true. We'll give what advice we can, but if it's not a
bug in our software (and it rarely is at installation, those usually
show up later!), we often end up working at cross-purposes with the
vendor's configuration software. Distros usually have reasons for
doing it their way, but we don't know about that, and so sometimes our
suggestions don't work as expected. And of course anything that
involves files requires figuring out where they are, which is quite
different in an FHS setup vs the virtual environment install where
they're all in one place, /opt-style.
> Oh: I wanted several domains, friends who also have mail list
> servers all seem to handle several domains so 'typical' is not what
> I see.
Well, single domain is a common use case from families to Fortune 100
companies. At the university where I used to work I knew of 7
single-domain installations, and I'm pretty sure there were several
others. The computing services department offered Mailman lists, but
that was also single-domain (still running Mailman 2 last I looked).
They would also let you run your own Mailman on a VM.
Sure, I would imagine that someone who bills themselves as a "mail
systems consultant" would know a lot of people managing multi-domain
systems :-) but I would expect multi-domain is something you see
mostly at hosting services. By nature that's going to be a relatively
small installed base although they probably handle a majority of
mailman lists, maybe a majority of mailman domains.
> Say Hi to Mark Taylor for me
Will do.
--
GNU Mailman consultant (installation, migration, customization)
Sirius Open Source https://www.siriusopensource.com/
Software systems consulting in Europe, North America, and Japan
6 months, 2 weeks
Re: Reg Archive Inactive Status
by Nirmal J
DNS Report for that list1.iitm.ac.in is 10.24.5.52
-----Original Message-----
From: Nirmal <nirmal(a)iitm.ac.in>
To: Nirmal <nirmal(a)iitm.ac.in>
Cc: Stephen <steve(a)turnbull.jp>; mailman-users <mailman-users(a)mailman3.org>
Date: Friday, 26 September 2025 3:28 PM IST
Subject: Re: [MM3-users] Re: Reg Archive Inactive Status
Yes I have it. I am also sharing that also settings_local.py file
# This file is imported by the Mailman Suite. It is used to override
# the default settings from /usr/share/mailman3-web/settings.py.
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'vWzgIJ1Hvjgy4yXJz7l71vpxX6+pJcBLMdv8mWNNAd0ajVr1'
ADMINS = (
('Mailman Suite Admin', 'nirmal(a)iitm.ac.in'),
)
# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.8/ref/settings/#allowed-hosts
# Set to '*' per default in the Deian package to allow all hostnames. Mailman3
# is meant to run behind a webserver reverse proxy anyway.
ALLOWED_HOSTS = [
#"localhost", # Archiving API from Mailman, keep it.
# "lists.your-domain.org",
# Add here all production URLs you may have.
'*'
]
# Mailman API credentials
MAILMAN_REST_API_URL = 'http://localhost:8001'
MAILMAN_REST_API_USER = 'restadmin'
MAILMAN_REST_API_PASS = '/EqNGU+Mj8udFpw4ueIkhWXzAy3kJIy17wwzChrXb3P8Vh4e'
MAILMAN_ARCHIVER_KEY = 'n/ZZnR5bRgNdUEyNK4p731C1+gWJLw0/'
MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1', '10.24.5.52')
# Application definition
INSTALLED_APPS = (
'hyperkitty',
'postorius',
'django_mailman3',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_gravatar',
'compressor', 'haystack',
'django_extensions',
'django_q',
'allauth',
'allauth.account',
'allauth.socialaccount',
'django_mailman3.lib.auth.fedora',
#'allauth.socialaccount.providers.openid',
#'allauth.socialaccount.providers.github',
#'allauth.socialaccount.providers.gitlab',
#'allauth.socialaccount.providers.google',
#'allauth.socialaccount.providers.facebook',
#'allauth.socialaccount.providers.twitter',
#'allauth.socialaccount.providers.stackexchange',
)
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
'default': {
# Use 'sqlite3', 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'ENGINE': 'django.db.backends.sqlite3',
#'ENGINE': 'django.db.backends.postgresql_psycopg2',
#'ENGINE': 'django.db.backends.mysql',
# DB name or path to database file if using sqlite3.
'NAME': '/var/lib/mailman3/web/mailman3web.db',
# The following settings are not used with sqlite3:
'USER': '',
'PASSWORD': '',
# HOST: empty for localhost through domain sockets or '127.0.0.1' for
# localhost through TCP.
'HOST': '',
# PORT: set to empty string for default.
'PORT': '',
# OPTIONS: Extra parameters to use when connecting to the database.
'OPTIONS': {
# Set sql_mode to 'STRICT_TRANS_TABLES' for MySQL. See
# https://docs.djangoproject.com/en/1.11/ref/ # databases/#setting-sql-mode
#'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
# If you're behind a proxy, use the X-Forwarded-Host header
# See https://docs.djangoproject.com/en/1.8/ref/settings/#use-x-forwarded-host
USE_X_FORWARDED_HOST = True
# And if your proxy does your SSL encoding for you, set SECURE_PROXY_SSL_HEADER
# https://docs.djangoproject.com/en/1.8/ref/settings/#secure-proxy-ssl-header
# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https')
# Other security settings
# SECURE_SSL_REDIRECT = True
# If you set SECURE_SSL_REDIRECT to True, make sure the SECURE_REDIRECT_EXEMPT
# contains at least this line:
# SECURE_REDIRECT_EXEMPT = [
# "archives/api/mailman/.*", # Request from Mailman.
# ]
# SESSION_COOKIE_SECURE = True
# SECURE_CONTENT_TYPE_NOSNIFF = True
# SECURE_BROWSER_XSS_FILTER = True
# CSRF_COOKIE_SECURE = True
# CSRF_COOKIE_HTTPONLY = True
# X_FRAME_OPTIONS = 'DENY'
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/ LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Set default domain for email addresses.
EMAILNAME = 'list1.iitm.ac.in'
# If you enable internal authentication, this is the address that the emails
# will appear to be coming from. Make sure you set a valid domain name,
# otherwise the emails may get rejected.
# https://docs.djangoproject.com/en/1.8/ref/settings/#default-from-email
# DEFAULT_FROM_EMAIL = "mailing-lists(a)you-domain.org"
DEFAULT_FROM_EMAIL = 'postorius@{}'.format(EMAILNAME)
# If you enable email reporting for error messages, this is where those emails
# will appear to be coming from. Make sure you set a valid domain name,
# otherwise the emails may get rejected.
# https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-SERVER_EMAIL
# SERVER_EMAIL = 'root(a)your-domain.org'
SERVER_EMAIL = 'root@{}'.format(EMAILNAME)
# Django Allauth
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"
#
# Social auth
#
SOCIALACCOUNT_PROVIDERS = {
#'openid': {
# 'SERVERS': [
# dict(id='yahoo',
# name='Yahoo',
# openid_url='http://me.yahoo.com'),
# ],
#},
#'google': {
# 'SCOPE': ['profile', 'email'],
# 'AUTH_PARAMS': {'access_type': 'online'},
#}, #'facebook': {
# 'METHOD': 'oauth2',
# 'SCOPE': ['email'],
# 'FIELDS': [
# 'email',
# 'name',
# 'first_name',
# 'last_name',
# 'locale',
# 'timezone',
# ],
# 'VERSION': 'v2.4',
#},
}
# On a production setup, setting COMPRESS_OFFLINE to True will bring a
# significant performance improvement, as CSS files will not need to be
# recompiled on each requests. It means running an additional "compress"
# management command after each code upgrade.
# http://django-compressor.readthedocs.io/en/latest/usage/#offline-compression
COMPRESS_OFFLINE = True
POSTORIUS_TEMPLATE_BASE_URL = 'http://localhost/mailman3/'
SITE_ID = 2
import ldap
from django_auth_ldap.config import LDAPSearch # LDAP server URI
AUTH_LDAP_SERVER_URI = "ldap://127.0.0.1"
# Bind DN & password (service account from IITM LDAP admin)
AUTH_LDAP_BIND_DN = "cn=ldapreader,ou=Services,dc=iitm,dc=ac,dc=in"
AUTH_LDAP_BIND_PASSWORD = "642126"
# Where to search for users
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"ou=People,dc=iitm,dc=ac,dc=in",
ldap.SCOPE_SUBTREE,
"(uid=%(user)s)"
)
# Map LDAP attributes to Django user fields
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "cn",
"last_name": "sn",
# "email": "mail" # optional if not present
}
# Authentication backends (LDAP first, fallback to Django DB)
AUTHENTICATION_BACKENDS = [
"django_auth_ldap.backend.LDAPBackend",
"django.contrib.auth.backends.ModelBackend",
]
import logging
logger = logging.getLogger('django_auth_ldap')
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
-----Original Message-----
From: Nirmal <nirmal(a)iitm.ac.in>
To: Stephen <steve(a)turnbull.jp>
Cc: mailman-users <mailman-users(a)mailman3.org>
Date: Friday, 26 September 2025 3:27 PM IST
Subject: Re: [MM3-users] Re: Reg Archive Inactive Status
Yes I have it. I am also sharing that also settings_local.py
-----Original Message-----
From: Stephen <steve(a)turnbull.jp>
To: Nirmal <nirmal(a)iitm.ac.in>
Cc: mailman-users <mailman-users(a)mailman3.org>
Date: Friday, 26 September 2025 3:09 PM IST
Subject: [MM3-users] Re: Reg Archive Inactive Status
Nirmal J via Mailman-users writes:
> Hereby I am sharing the full settings.py file.
Are you sure this is the settings.py being used by your installation?
It appears to be the distribution file, unchanged.
> MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1')# Application definition
If this is from the installed settings.py, it isn't going to work,
since you specified a routable domain (I think, although
"list1.iitm.ac.in" is not in the public DNS), which will have a
routable address, not localhost.
What IP does your DNS report for "list1.iitm.ac.in"?
> HOSTNAME = 'localhost.local'
That isn't what you told Mailman via hyperkitty.cfg. I'm not sure it
matters, but I think you should make sure all the config files agree
on the name of the host.
> # If you enable email reporting for error messages, this is where those emails
> # will appear to be coming from. Make sure you set a valid domain name,
> # otherwise the emails may get rejected.
> # https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-SERVER_EMAIL
> # SERVER_EMAIL = 'root(a)your-domain.org'
> SERVER_EMAIL = 'root@{}'.format(HOSTNAME)
This can be problematic, at least if you enable error messages by email.
> try:
> from settings_local import *
> except ImportError:
> pass
Do you have a "settings_local.py" file?
--
GNU Mailman consultant (installation, migration, customization)
Sirius Open Source https://www.siriusopensource.com/
Software systems consulting in Europe, North America, and Japan
1 year
Re: Updating from Ubuntu-20.04 LTE installation
by Abhilash Raj
On Sat, May 23, 2020, at 8:28 PM, Mark Sapiro wrote:
> On 5/23/20 7:02 PM, Peter Adebahr via Mailman-users wrote:
> >
> > Our installation was done by "apt-get install" in Ubuntu 20, thus still
> > running MM 3.2.2 (and python 3.8.2).
> >
> > Do you have any advise, how to upgrade from there to your current
> > version? I know this might be a bit dangerous, but with today's VMs the
> > risk is much less than it used to be:
>
>
> It shouldn't be difficult, but I can't give you details because I don't
> know exactly how the Debian/Ubuntu package installs things. Also I don't
> know whether "current version" refers to the 3.3.1 release or the head
> of the https://gitlab.com/mailman/mailman master branch.
>
>
> > Do you think it would be possible, just to replace the code and library
> > parts, keeping the database and config files as is?
>
>
> Yes. It should be fairly straightforward. You first need to find where
> the Mailman Core package is. You should be able to just replace the
> contents of the `mailman` package directory with ours. You may be able
> to do this via pip
>
> pip install --upgrade mailman
>
> globally or within Mailman's virtualenv if it is installed in a virtualenv.
This is probably not a good idea, global install quite often breaks a lot of stuff (Like I broke Yum on my work computer since I wanted something newer than 10yo python packages).
A better idea would be to install Mailman from scratch inside a virtualenv somewhere in /opt/mailman and then letting it consume the same configurations. I think Ubuntu/Debian have their configurations in `/etc/mailman3/` and Mailman Core installed anywhere should just pick that up without any special work.
Same goes for Postorius/Django stuff. You can switch to a different Django project and just point to Debian/Ubuntu's settings.py (location of which should be in README.debian of the Debian package I presume).
> However, there are caveats. There are Debian patches at
> <https://sources.debian.org/patches/mailman3/3.2.2-1/>. The big `0002`
> patch replaces importlib_resources with importlib.resources because
> importlib_resources is not available in Debian. Most of the patches
> apply to tests, and for the actual working code, we fixed this
> differently as of Mailman 3.3.1, so I don't think you need the Debian
> patches.
>
>
> --
> Mark Sapiro <mark(a)msapiro.net> The highway is for gamblers,
> San Francisco Bay Area, California better use your sense - B. Dylan
> _______________________________________________
> Mailman-users mailing list -- mailman-users(a)mailman3.org
> To unsubscribe send an email to mailman-users-leave(a)mailman3.org
> https://lists.mailman3.org/mailman3/lists/mailman-users.mailman3.org/
>
--
thanks,
Abhilash Raj (maxking)
6 years, 4 months
Hyperkitty issue(s)
by Bryan Loniewski
Hello --
I'm stuck trying to integrate Hyperkitty. I see the following errors in mailman.log and mailmansuite.log respectively:
<snipped>
[2020-05-27 16:42:11 -0400] [5140] [ERROR] Error handling request /3.1/lists/bry_test4.lists-test.rutgers.edu/archivers
Traceback (most recent call last):
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 134, in handle
self.handle_request(listener, req, client, addr)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 175, in handle_request
respiter = self.wsgi(environ, resp.start_response)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/mailman/database/transaction.py", line 50, in wrapper
rtn = function(*args, **kws)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/mailman/rest/wsgiapp.py", line 193, in __call__
return super().__call__(environ, start_response)
File "falcon/api.py", line 274, in falcon.api.API.__call__
File "falcon/api.py", line 269, in falcon.api.API.__call__
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/mailman/rest/lists.py", line 406, in on_get
for archiver in archiver_set.archivers
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/mailman/rest/lists.py", line 407, in <dictcomp>
if archiver.system_archiver.is_enabled}
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/mailman/model/mailinglist.py", line 587, in system_archiver
raise AssertionError('Archiver not found: {}'.format(self.name))
AssertionError: Archiver not found: hyperkitty
and
<snipped>
Traceback (most recent call last):
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/postorius/middleware.py", line 42, in __call__
return self.get_response(request)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 36, in inner
response = response_for_exception(request, exc)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 125, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/django/views/debug.py", line 89, in technical_500_response
reporter = ExceptionReporter(request, exc_type, exc_value, tb)
File "/opt/mailman/mm/venv/lib/python3.6/site-packages/django/views/debug.py", line 254, in __init__
self.template_info = getattr(self.exc_value, 'template_debug', None)
File "/opt/mailman/mm/venv/lib/python3.6/tempfile.py", line 479, in __getattr__
file = self.__dict__['file']
KeyError: 'file'
Note that I've kinda followed the Virtualenv route along with using Mark's helpful webpage re: his experiences.
Some relevant? config files...
mailman.cfg:
<snip>
[archiver.prototype]
enable: yes
[archiver.hyperkitty]
class: mailman_hyperkitty.Archiver
enable: yes
configuration: /opt/mailman/mm/mailman-hyperkitty.cfg
<snip>
mailman-hyperkitty.cfg:
[general]
base_url: https://a_real_domain/mm3/hyperkitty
api_key: <movealong>
I can provide additional conf file setups if warranted? I am curious (and perhaps this is in fact the issue) why when I run mailman conf I don't see the archiver.hyperkittty section even though its in the mailman.cfg file? While at the same time I do see archiver.{mail_archive,mhonarc}? I know it's reading my mailman.cfg based on other sections I've already setup/manipulated.
Another data point:
$ grep -i hyperkitty requirements.txt
HyperKitty==1.3.2
mailman-hyperkitty==1.1.0
Any suggestions?
________________________
Bryan Loniewski
Rutgers University
OIT:EAS:Messaging and Collaboration Services
System Administrator
6 years, 4 months
Re: HYPERKITTY_ATTACHMENT_FOLDER
by Ugnius S
Could You please confirm that this parameter should be placed in
mailman-hyperkitty.cfg file?
I have checked mailman/postorius/hyperkitty owner user can write files
there and web user group
has privileges to write and to read, but *no any files appear there*.
Mailman works, it is possible to download
attachments from hyperkitty. Mailman restarted, uwsgi restarted, runjobs
restarted. No files in
/full/path/to/folder/
File looks like:
[general]
base_url: https://flistserv.example.com/hyperkitty/
api_key: BlaBlabla
HYPERKITTY_ATTACHMENT_FOLDER = /full/path/to/folder/
BR
Ugnius
2019-09-11, tr, 21:21 Ugnius S <ugniusviln(a)gmail.com> rašė:
> Thank You so much.
>
> 1) https://hyperkitty.readthedocs.io/en/latest/install.html
> Close to the end before the "UPDATE" topic, chapter "Customization".
>
> 2)
> https://buildmedia.readthedocs.org/media/pdf/hyperkitty/stable/hyperkitty.p…
> Page 10, chapter 2.8 "Customization"
>
> BR
> Ugnius
>
> 2019-09-11, tr, 20:16 Abhilash Raj <maxking(a)asynchronous.in> rašė:
>
>>
>>
>> On Wed, Sep 11, 2019, at 9:52 AM, Ugnius S wrote:
>> > Hi.
>> >
>> > Can anybody send example how to set it? It is mentioned in
>> documentation,
>> > but very vaguely.
>>
>> If you can point out where did you find it in docs, I can update it.
>> Information is kind of duplicated in a few places.
>>
>> > HYPERKITTY_ATTACHMENT_FOLDER = /full/unix/path
>>
>> This is the right value.
>>
>> It is a path on the filesystem, where the user running Hyperkitty is
>> allowed to write.
>>
>> >
>> > HYPERKITTY_ATTACHMENT_FOLDER = http://localhost:8000/something
>> >
>> > HYPERKITTY_ATTACHMENT_FOLDER = ./var/data/something/
>> >
>> > Has anybody experience of using this, maybe have recommendations of
>> using
>> > it? Better under project user or better under web content owner where
>> the
>> > static content is. I would like to store attachments separately to avoid
>> > growing database.
>> > Hyperkitty documentation:
>> > By default, HyperKitty stores the email attachments in the database.
>> If
>> > you would rather have them stored on the filesystem, you can set the
>> > HYPERKITTY_ATTACHMENT_FOLDER configuration value to a directory.
>> > Make sure that the user running the Django process (for example, apache
>> or
>> > www-data) has the permissions to write in this directory.
>> >
>> > -------------
>> > _______________________________________________
>> > Mailman-users mailing list -- mailman-users(a)mailman3.org
>> > To unsubscribe send an email to mailman-users-leave(a)mailman3.org
>> > https://lists.mailman3.org/mailman3/lists/mailman-users.mailman3.org/
>> >
>>
>> --
>> thanks,
>> Abhilash Raj (maxking)
>> _______________________________________________
>> Mailman-users mailing list -- mailman-users(a)mailman3.org
>> To unsubscribe send an email to mailman-users-leave(a)mailman3.org
>> https://lists.mailman3.org/mailman3/lists/mailman-users.mailman3.org/
>>
>
7 years, 1 month
Re: Newbie hyperkitty question
by Stephen Daniel
Thanks. Very helpful.
On Tue, Jan 11, 2022 at 2:03 PM Mark Sapiro <mark(a)msapiro.net> wrote:
> On 1/11/22 8:27 AM, Stephen Daniel wrote:
> > Mailman users --
> >
> > I am setting up a new mailman3 installation, and this is my first
> > experience with the suite. All of the software is up and running, but I
> > cannot tell if hyperkitty is actually running.
>
>
> In Postorius, in the list's `info` view can you click the Archives
> button and see archived messages? That's HyperKitty.
>
> If the messages aren't there with the hyperkitty archiving option
> enabled, check `mailman.log` for why.
>
> Also do messages from the list have an Archived-At: header?
>
>
> > When I look at my test mailing list, two archive options are available,
> > hyperkitty and "prototype", and both are enabled. I can see that my
> email
> > is being archived, but I think "prototype" is what is doing the
> archiving.
> > I see that a test message will end up in
> >
> /opt/mailman/mm/var/archives/prototype/<LISTNAME>@<LISTDOMAIN.org>/new/164....
> > and nowhere else. This suggests that "prototype" is archiving, but
> > hyperkitty is not.
>
>
> No this says the prototype archiver is working. It says nothing about
> Hyperkitty.
>
>
> > So, this opens up a raft of questions on hyperkitty:
>
>
> David Newman has answered some of this, but ...
>
>
> > - How do I tell if hyperkitty is actually running?
>
>
> It doesn't actually run. it is a Django web UI and a web API that serves
> things on request.
>
>
> > - Does hyperkitty have a web-UI for admins or users? How would I
> access
> > it?
>
> See above.
>
>
> > - I can not find any documentation on hyperkitty, other than
> > installation instructions and change logs. Does documentation exist?
>
> No, not really.
>
>
> > - How do I set policies on how long archives are kept?
> > - Assuming I want to back up my archives, what do I need to back up?
>
>
> Messages are kept forever unless you do something to delete them.
> HyperKitty's messages are stored in the database configured in the
> DATABASES setting in your Django settings. How you backup the database
> depends on the database manager. You already found the prototype
> archiver's messages.
>
>
> --
> Mark Sapiro <mark(a)msapiro.net> The highway is for gamblers,
> San Francisco Bay Area, California better use your sense - B. Dylan
> _______________________________________________
> Mailman-users mailing list -- mailman-users(a)mailman3.org
> To unsubscribe send an email to mailman-users-leave(a)mailman3.org
> https://lists.mailman3.org/mailman3/lists/mailman-users.mailman3.org/
>
4 years, 9 months
Re: About to Install MM3 -- Seeking clarification
by Onyeibo Oku
Help!
Regards
Onyeibo
On Thu Oct 13, 2022 at 6:03 AM WAT, Onyeibo Oku wrote:
> On Wed, 12 Oct 2022 17:52:47 -0700
> Mark Sapiro <mark(a)msapiro.net> wrote:
>
> Thanks Eggert and Sapiro.
>
> >
> > As Eggert suggests, see
> > https://docs.mailman3.org/en/latest/install/virtualenv.html and
> > follow that.
>
> I already started out on the above route. Its an adaptation because I
> am running Fedora. I had no problem with system-wide installations via
> dnf package management. However, some parts of the documentation does
> not add up.
>
> > You don't need to download the source from GitLab.
> > Following that doc will get the latest releases from PyPI via pip.
> > Those are still somewhat out of date - we really should make new
> > releases - so if you want the latest from GitLab, there are a couple
> > of ways to do it. Perhaps the easiest is to just run the various `pip
> > install` commands as documented and then upgrade Mailman core in your
> > venv with ```
> > pip install --upgrade git+https://gitlab.com/mailman/mailman@master
> > ```
> > and update the various mailman web packages with
> > ```
> > pip install --upgrade git+https://gitlab.com/mailman/xxx@master
> > ```
> > where xxx is mailman-web, mailman-hyperkitty, django-mailman3,
> > postorius, hyperkitty. I.e., run it 5 times, once for each value of
> > xxx.
> >
>
> I will come to this eventually (assuming that does not break things
> later). I aim to get it all working with regular pip packages first. I
> have installed mailman core already.
>
> Fedora expects mailman files to reside at /usr/lib/mailman. It appears
> to ship with a mailman unix user. I adapted to those system defaults.
>
> Now I observe that "su - mailman" gives me the proper prompt but
> .bashrc doesn't kick in. I still have to manually change to the
> virtual environment despite setting the automatic change in .bashrc.
> However, "su mailman" runs .bashrc but the prompt says "bash X.XX $".
> Is this normal?
>
> Subsequent parts of the doc show the path "/opt/mailman/mm/var/*" which
> should correspond to "/usr/lib/mailman/mm/var/*" on my instance.
> However, I don't see any instructions on how to get the "/mm" folder
> and the associated sub-folders. I just have "/usr/lib/mailman"
>
> I am lost
>
> "pip list" within the venv environment confirms that I have "mailman
> 3.3.5". What am I missing?
>
> Regards
> Onyeibo
>
>
> _______________________________________________
> Mailman-users mailing list -- mailman-users(a)mailman3.org
> To unsubscribe send an email to mailman-users-leave(a)mailman3.org
> https://lists.mailman3.org/mailman3/lists/mailman-users.mailman3.org/
4 years
Re: Missing Base64 encoding from control message reply
by Jana Berger
On 22.09.2023 18:32, Stephen J. Turnbull wrote:
> lists-mailman3(a)janaberger.de writes:
>
> > I have a setup with GNU Mailman 3.3.8 where a user tried to
> > subscribe. When replying to the "confirm" message, the user
> > received a completely garbled response, like so:
> >
> > N?z?????zf???&???j?????u?[zZ0:???v???,j?z???k?e?0
> >
> 4D???r?^b??r?????*'???y????{ax?L?X????0:???v???,j?z???k?d?m?-???zz?rn??l]y+???-E?(
> >
> ?^N??'??M???t???Mz?????^i?????}?o?\????6sN?zf??????r??z?????????b?{h?????f?r?ne==
>
> To diagnose, we really need to see that in context of the raw message
> as received by the user.
You can see the same or similar result by opening the EML I quoted. Does
the list support attachments? Then I will attach the file directly.
>
> > The user then forwarded the .eml file to me, which clearly shows
> > the contents of the mail as plain text while being announced as
> > base64 (Content-Transfer-Encoding: base64):
>
> It also clearly doesn't show anything like the mojibake above. What
> is the relation between the two?
Sorry, I should have made that clearer - when opening the EML file with
e.g. Thunderbird, the contents (message text) of the mail as displayed
is the garbled string. I assume it is the result of Thunderbird trying
to process the contents as base64-encoded, which it is not.
>
> While the problems could be related to Mailman, it could also be any
> MTA along the way or the user's mail client.
>
> I suspect that the .eml file has been significantly altered by
> intervening software. As far as I know, the Python email package does
> not MIME-encode plain ASCII text as you see in the email's subject.
I have multiple control messages, all received from my instance which
all contain the "Content-Transfer-Encoding: base64" marker, their
contents is plain text (Content-Type: text/plain; charset="utf-8"), but
they are still encoded using base64.
Of course that is not proof, but an indication that it is either done by
the mail server itself or widely across MUAs.
>
> The only other thing I can think of is it might have something to do
> with your internationalization settings. What is the default language
> of the list? (This is available in Postorius.) Have you changed the
> default encoding for English on your site? (I think you need to look
> in mailman.cfg for this.) What is the default language of the site?
Global "Preferred language" is "English (USA)", which is not overridden
by the list in question. I have not changed the default encoding. Is
there a surefire way to detect this?
My mailman.cfg has no section pertaining to encoding, and all related
files also do not mention encoding.
3 years
Re: mailman3 on new Debian 12 installation, got ssl apache working on all URLs except /mailman3
by Odhiambo Washington
On Fri, Mar 28, 2025 at 12:06 AM Philip Bondi <pjbondi(a)systemdatabase.com>
wrote:
> LE and certbot created those paths for me, somehow. Both on CentOS and
> Debian. Don't know why. Checked my putty logs. Cannot find the first
> emergence of strange path. You guys are superheroes.
>
> Debian 12:
>
> <PRE>
> pjbondi@shackleton12:~$ sudo -i
> root@shackleton12:~# cat /etc/os-release
> PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
> NAME="Debian GNU/Linux"
> VERSION_ID="12"
> VERSION="12 (bookworm)"
> VERSION_CODENAME=bookworm
> ID=debian
> HOME_URL="https://www.debian.org/"
> SUPPORT_URL="https://www.debian.org/support"
> BUG_REPORT_URL="https://bugs.debian.org/"
> root@shackleton12:~# ls -alF /etc/letsencrypt/live/
> total 32
> drwx------ 7 root root 4096 Nov 29 07:57 ./
> drwxr-xr-x 9 root root 4096 Mar 27 15:02 ../
> -rw-r--r-- 1 root root 740 Nov 27 10:27 README
> drwxr-xr-x 2 root root 4096 Mar 6 09:03 systemdatabase.ca/
> drwxr-xr-x 2 root root 4096 Mar 6 09:03 systemdatabase.ca-0001/
> drwxr-xr-x 2 root root 4096 Mar 6 09:04 systemdatabase.com/
> drwxr-xr-x 2 root root 4096 Mar 6 09:04 systemdatabase.com-0001/
> drwxr-xr-x 2 root root 4096 Mar 6 09:04 systemdatabase.homelinux.com/
> root@shackleton12:~#
> </PRE>
>
> CentOS 7:
>
> <PRE>
> [1004] $ cat /etc/os-release
> NAME="CentOS Linux"
> VERSION="7 (Core)"
> ID="centos"
> ID_LIKE="rhel fedora"
> VERSION_ID="7"
> PRETTY_NAME="CentOS Linux 7 (Core)"
> ANSI_COLOR="0;31"
> CPE_NAME="cpe:/o:centos:centos:7"
> HOME_URL="https://www.centos.org/"
> BUG_REPORT_URL="https://bugs.centos.org/"
>
> CENTOS_MANTISBT_PROJECT="CentOS-7"
> CENTOS_MANTISBT_PROJECT_VERSION="7"
> REDHAT_SUPPORT_PRODUCT="centos"
> REDHAT_SUPPORT_PRODUCT_VERSION="7"
>
> [1005] $ ls -alF /etc/letsencrypt/live/
> total 4
> drwx------. 7 root root 168 Aug 15 2023 ./
> drwxr-xr-x. 9 root root 108 Jan 19 03:22 ../
> -rw-r--r--. 1 root root 740 Jul 2 2020 README
> drwxr-xr-x. 2 root root 93 Jan 19 2023 systemdatabase.ca/
> drwxr-xr-x. 2 root root 112 Jan 19 03:22 systemdatabase.ca-0001/
> drwxr-xr-x. 2 root root 112 Feb 5 2021 systemdatabase.com/
> drwxr-xr-x. 2 root root 112 Jan 19 03:21 systemdatabase.com-0001/
> drwxr-xr-x. 2 root root 112 Jan 19 03:20 systemdatabase.homelinux.com/
> </PRE>
>
> Again. We're almost there with ssl apache configs.
> - works for LE challenge and Subversion https://systemdatabase.ca/
> - 6 paths work for MM3 https://systemdatabase.ca/postorius/, etc
> - But https://systemdatabase.ca/mailman3 fails
>
So, might you be having a file named /etc/mailman3/urls.py and what does it
contain?
--
Best regards,
Odhiambo WASHINGTON,
Nairobi,KE
+254 7 3200 0004/+254 7 2274 3223
In an Internet failure case, the #1 suspect is a constant: DNS.
"Oh, the cruft.", egrep -v '^$|^.*#' ¯\_(ツ)_/¯ :-)
[How to ask smart questions:
http://www.catb.org/~esr/faqs/smart-questions.html]
1 year, 6 months
Re: Archive not updated
by Marc SCHAEFER
Hello,
On Mon, Sep 02, 2024 at 09:08:09AM -0000, mailman3--- via Mailman-users wrote:
> Debian bookworm
Archival works here.
Here is my simplified auto-deployement script (some might not be useful to you, I am using a local Postfix):
PS: replace services_install by apt-get install
djangoauth=@@@REPLACE
# this is a bash array: server, user, pw
psqlauth=@@@REPLACE
services_install postfix
(while read line
do
case $line in
*=*) postconf -e "$line";;
*) echo "TOSSING: $line" >&2;;
esac
done) <<EOF
myhostname = $lists
mydestination = $lists
mynetworks = 127.0.0.0/8
inet_protocols = ipv4
inet_interfaces = all
transport_maps = hash:/var/lib/mailman3/data/postfix_lmtp
local_recipient_maps = hash:/var/lib/mailman3/data/postfix_lmtp
relay_domains = hash:/var/lib/mailman3/data/postfix_domains
relayhost = @@@REPLACE
EOF
cat >> /etc/aliases <<EOF
postorius: root
www-data: root
root: ${djangoauth[1]}
EOF
newaliases
services_install dbconfig-pgsql
cat > /etc/dbconfig-common/mailman3.conf <<EOF
dbc_install='true'
dbc_upgrade='true'
dbc_remove='false'
dbc_dbtype='pgsql'
dbc_dbuser='${psqlauth[1]}'
dbc_dbpass='${psqlauth[2]}'
dbc_dbserver='${psqlauth[0]}'
dbc_dbname='mailman'
dbc_dbadmin='postgres'
EOF
sed < /etc/dbconfig-common/mailman3.conf \
> /etc/dbconfig-common/mailman3-web.conf \
"s/^dbc_dbname=.*/dbc_dbname='mailmanweb'/"
chmod 600 /etc/dbconfig-common/mailman3.conf \
/etc/dbconfig-common/mailman3-web.conf
services_install mailman3-full mailman3-web
sed --in-place "s/^site_owner: .*/site_owner: ${djangoauth[1]}/" \
/etc/mailman3/mailman.cfg
# archiving mails from mailing-lists automatically
cat >> /etc/mailman3/mailman.cfg <<'EOF'
[archiver.hyperkitty]
class: mailman_hyperkitty.Archiver
enable: yes
configuration: /etc/mailman3/mailman-hyperkitty.cfg
[styles]
default: private-default
EOF
# enable archiver key
sed -i "s%^api_key:.*%api_key: $(egrep MAILMAN_ARCHIVER_KEY /etc/mailman3/mailman-web.py | awk '{print $NF;}' | sed "s/'//g")%" /etc/mailman3/mailman-hyperkitty.cfg
# work-around: SQLAlchemy no longer supports "postgres"
sed --in-place "s%^url: postgres://%url: postgresql://%" \
/etc/mailman3/mailman.cfg
sed --in-place "s/.*'Mailman Suite Admin', 'root@localhost').*/('Mailman Suite Admin', '${djangoauth[1]}'),/;s/^EMAILNAME\s*=.*/EMAILNAME = '$lists'/;/django_mailman3.lib.auth.fedora/d" /etc/mailman3/mailman-web.py
# aliases mailman <-> postfix
mkdir -p /var/lib/mailman3/data
chown list:list /var/lib/mailman3/data
for i in postfix_lmtp postfix_lmtp postfix_domains
do
touch /var/lib/mailman3/data/$i
postmap /var/lib/mailman3/data/$i
done
chown list:list /var/lib/mailman3/data/postfix_*
# work-around for django_q
# (does not seem to work, and DEFAULT_AUTO_FIELD should be also
# configured to django.db.models.BigAutoField)
dpkg-divert --rename /usr/lib/python3/dist-packages/django_q/conf.py
sed < /usr/lib/python3/dist-packages/django_q/conf.py.distrib \
> /usr/lib/python3/dist-packages/django_q/conf.py \
's%TIMEOUT = conf.get("timeout", None)%TIMEOUT = conf.get("timeout", 59)%'
pkill -e -2 --full 'python3 manage.py qcluster' || true
# fix example.com
PGPASSWORD=${psqlauth[2]} psql -h ds-services-psql -U ${psqlauth[1]} mailmanweb -c "UPDATE django_site SET domain = '$lists', name = '$lists' WHERE id = 1"
# workaround required?
#chgrp list /var/lib/mailman3/locks/
#chmod g+rwx /var/lib/mailman3/locks/
chgrp list /var/log/mailman3/*.log
# https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-create…
env DJANGO_SUPERUSER_PASSWORD=${djangoauth[3]} \
DJANGO_SUPERUSER_USERNAME=${djangoauth[2]} \
DJANGO_SUPERUSER_EMAIL=${djangoauth[1]} \
mailman-web createsuperuser --noinput \
|| echo "django super user already exists in DB, ignored"
# then I migrate the lists
2 years, 1 month