Internal Server Error: Reattach this thread
by hasimoto@designet.co.jp
Hi,
In the archive, clicking "Reconnect this thread" causes an internal server error.
I received the following email, but I don't know how to solve it, please help me.
-- -- -- --
Subject: [Django] ERROR (EXTERNAL IP): Internal Server Error: /archives/list/testml@list1.example.com/thread/LQ6F7D7EVVUSIJJ7B5S675ZVSU5ZZCBU/reattach-suggest
-- -- -- --
Internal Server Error: /archives/list/testml@list1.example.com/thread/LQ6F7D7EVVUSIJJ7B5S675ZVSU5ZZCBU/reattach-suggest
AttributeError at /archives/list/testml@list1.example.com/thread/LQ6F7D7EVVUSIJJ7B5S675ZVSU5ZZCBU/reattach-suggest
'function' object has no attribute 'lower'
Request Method: GET
Request URL: http://mailman.example.com/archives/list/testml@list1.example.com/thread/LQ…
Django Version: 3.0.14
Python Executable: /opt/mailman/venv/bin/uwsgi
Python Version: 3.10.6
Python Path: ['.', '', '/etc/mailman3', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/opt/mailman/venv/lib/python3.10/site-packages']
Server time: 水, 19 10月 2022 01:07:28 +0000
Installed Applications:
['hyperkitty',
'postorius',
'django_mailman3',
'django.contrib.admin',
'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']
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django_mailman3.middleware.TimezoneMiddleware',
'postorius.middleware.PostoriusMiddleware')
Traceback (most recent call last):
File "/opt/mailman/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/opt/mailman/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/opt/mailman/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/mailman/venv/lib/python3.10/site-packages/hyperkitty/lib/view_helpers.py", line 134, in inner
return func(request, *args, **kwargs)
File "/opt/mailman/venv/lib/python3.10/site-packages/hyperkitty/views/thread.py", line 413, in reattach_suggest
default_search_query = stripped_subject(
File "/opt/mailman/venv/lib/python3.10/site-packages/hyperkitty/lib/utils.py", line 155, in stripped_subject
if subject.lower().startswith(mlist.subject_prefix.lower()):
Exception Type: AttributeError at /archives/list/testml@list1.example.com/thread/LQ6F7D7EVVUSIJJ7B5S675ZVSU5ZZCBU/reattach-suggest
Exception Value: 'function' object has no attribute 'lower'
Request information:
USER: admin
GET:
q = ''
POST: No POST data
FILES: No FILES data
COOKIES:
csrftoken = 'cBq9h8x7bG6BMboc89DB8ucQiToTRTpwijt0uJbVXq47ucV2cAGYh05TsaVARobK'
sessionid = 'upuj3rv0wkxafklk633lx2jppwgrco1t'
META:
CSRF_COOKIE = 'cBq9h8x7bG6BMboc89DB8ucQiToTRTpwijt0uJbVXq47ucV2cAGYh05TsaVARobK'
HTTP_ACCEPT = '*/*'
HTTP_ACCEPT_ENCODING = 'gzip, deflate'
HTTP_ACCEPT_LANGUAGE = 'ja,en-US;q=0.7,en;q=0.3'
HTTP_CONNECTION = 'close'
HTTP_COOKIE = 'csrftoken=cBq9h8x7bG6BMboc89DB8ucQiToTRTpwijt0uJbVXq47ucV2cAGYh05TsaVARobK; sessionid=upuj3rv0wkxafklk633lx2jppwgrco1t'
HTTP_HOST = 'mailman.example.com'
HTTP_REFERER = 'http://mailman.example.com/archives/list/testml@list1.example.com/thread/LQ…'
HTTP_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'
HTTP_X_FORWARDED_FOR = '192.168.30.94'
HTTP_X_REQUESTED_WITH = 'XMLHttpRequest'
PATH_INFO = '/archives/list/testml@list1.example.com/thread/LQ6F7D7EVVUSIJJ7B5S675ZVSU5ZZCBU/reattach-suggest'
QUERY_STRING = 'q='
REMOTE_ADDR = '127.0.0.1'
REQUEST_METHOD = 'GET'
REQUEST_URI = '/archives/list/testml@list1.example.com/thread/LQ6F7D7EVVUSIJJ7B5S675ZVSU5ZZCBU/reattach-suggest?q='
SCRIPT_NAME = ''
SERVER_NAME = 'ubuntu22'
SERVER_PORT = '8000'
SERVER_PROTOCOL = 'HTTP/1.0'
uwsgi.core = 0
uwsgi.node = b'ubuntu22'
uwsgi.version = b'2.0.20'
wsgi.errors = <_io.TextIOWrapper name=2 mode='w' encoding='UTF-8'>
wsgi.file_wrapper = ''
wsgi.input = <uwsgi._Input object at 0x7f4ac0d23570>
wsgi.multiprocess = True
wsgi.multithread = True
wsgi.run_once = False
wsgi.url_scheme = 'http'
wsgi.version = '(1, 0)'
Settings:
Using settings module settings
ABSOLUTE_URL_OVERRIDES = {}
ACCOUNT_AUTHENTICATION_METHOD = 'username_email'
ACCOUNT_DEFAULT_HTTP_PROTOCOL = 'http'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
ACCOUNT_UNIQUE_EMAIL = True
ADMINS = "(('Mailman Suite Admin', 'admin1(a)example.org'),)"
ALLOWED_HOSTS = ['127.0.0.1', 'mailman.example.com']
APPEND_SLASH = True
AUTHENTICATION_BACKENDS = "('django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend')"
AUTH_PASSWORD_VALIDATORS = '********************'
AUTH_USER_MODEL = 'auth.User'
BASE_DIR = PosixPath('/opt/mailman/web')
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_KEY_PREFIX = '********************'
CACHE_MIDDLEWARE_SECONDS = 600
COMPRESSORS = {'css': 'compressor.css.CssCompressor', 'js': 'compressor.js.JsCompressor'}
COMPRESS_CACHEABLE_PRECOMPILERS = '()'
COMPRESS_CACHE_BACKEND = 'default'
COMPRESS_CACHE_KEY_FUNCTION = '********************'
COMPRESS_CLEAN_CSS_ARGUMENTS = ''
COMPRESS_CLEAN_CSS_BINARY = 'cleancss'
COMPRESS_CLOSURE_COMPILER_ARGUMENTS = ''
COMPRESS_CLOSURE_COMPILER_BINARY = 'java -jar compiler.jar'
COMPRESS_CSS_HASHING_METHOD = 'mtime'
COMPRESS_DATA_URI_MAX_SIZE = 1024
COMPRESS_DEBUG_TOGGLE = None
COMPRESS_ENABLED = True
COMPRESS_FILTERS = {'css': ['compressor.filters.css_default.CssAbsoluteFilter', 'compressor.filters.cssmin.rCSSMinFilter'], 'js': ['compressor.filters.jsmin.rJSMinFilter']}
COMPRESS_JINJA2_GET_ENVIRONMENT = <function CompressorConf.JINJA2_GET_ENVIRONMENT at 0x7f4ac443e050>
COMPRESS_MINT_DELAY = 30
COMPRESS_MTIME_DELAY = 10
COMPRESS_OFFLINE = True
COMPRESS_OFFLINE_CONTEXT = {'STATIC_URL': '/static/'}
COMPRESS_OFFLINE_MANIFEST = 'manifest.json'
COMPRESS_OFFLINE_MANIFEST_STORAGE = 'compressor.storage.OfflineManifestFileStorage'
COMPRESS_OFFLINE_TIMEOUT = 31536000
COMPRESS_OUTPUT_DIR = 'CACHE'
COMPRESS_PARSER = 'compressor.parser.AutoSelectParser'
COMPRESS_PRECOMPILERS = "(('text/x-scss', 'sassc -t compressed {infile} {outfile}'), ('text/x-sass', 'sassc -t compressed {infile} {outfile}'))"
COMPRESS_REBUILD_TIMEOUT = 2592000
COMPRESS_ROOT = '/opt/mailman/web/static'
COMPRESS_STORAGE = 'compressor.storage.CompressorFileStorage'
COMPRESS_TEMPLATE_FILTER_CONTEXT = {'STATIC_URL': '/static/'}
COMPRESS_URL = '/static/'
COMPRESS_URL_PLACEHOLDER = '/__compressor_url_placeholder__/'
COMPRESS_VERBOSE = False
COMPRESS_YUGLIFY_BINARY = 'yuglify'
COMPRESS_YUGLIFY_CSS_ARGUMENTS = '--terminal'
COMPRESS_YUGLIFY_JS_ARGUMENTS = '--terminal'
COMPRESS_YUI_BINARY = 'java -jar yuicompressor.jar'
COMPRESS_YUI_CSS_ARGUMENTS = ''
COMPRESS_YUI_JS_ARGUMENTS = ''
CSRF_COOKIE_AGE = 31449600
CSRF_COOKIE_DOMAIN = None
CSRF_COOKIE_HTTPONLY = False
CSRF_COOKIE_NAME = 'csrftoken'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SAMESITE = 'Lax'
CSRF_COOKIE_SECURE = False
CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'
CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS = []
CSRF_USE_SESSIONS = False
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'mailmanweb', 'USER': 'mailman', 'PASSWORD': '********************', 'HOST': 'localhost', 'PORT': '5432', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'NAME': None, 'MIRROR': None}}}
DATABASE_ROUTERS = []
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440
DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000
DATETIME_FORMAT = 'N j, Y, P'
DATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%Y', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M', '%m/%d/%y']
DATE_FORMAT = 'N j, Y'
DATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']
DEBUG = False
DEBUG_PROPAGATE_EXCEPTIONS = False
DECIMAL_SEPARATOR = '.'
DEFAULT_CHARSET = 'utf-8'
DEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL = 'admin1(a)example.org'
DEFAULT_INDEX_TABLESPACE = ''
DEFAULT_TABLESPACE = ''
DISALLOWED_USER_AGENTS = []
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_HOST_PASSWORD = '********************'
EMAIL_HOST_USER = ''
EMAIL_PORT = 25
EMAIL_SSL_CERTFILE = None
EMAIL_SSL_KEYFILE = '********************'
EMAIL_SUBJECT_PREFIX = '[Django] '
EMAIL_TIMEOUT = None
EMAIL_USE_LOCALTIME = False
EMAIL_USE_SSL = False
EMAIL_USE_TLS = False
FILE_CHARSET = 'utf-8'
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
FILE_UPLOAD_PERMISSIONS = 420
FILE_UPLOAD_TEMP_DIR = None
FILTER_VHOST = False
FIRST_DAY_OF_WEEK = 0
FIXTURE_DIRS = []
FORCE_SCRIPT_NAME = None
FORMAT_MODULE_PATH = None
FORM_RENDERER = 'django.forms.renderers.DjangoTemplates'
HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 'PATH': 'fulltext_index'}}
HYPERKITTY_ENABLE_GRAVATAR = True
IGNORABLE_404_URLS = []
INSTALLED_APPS = ['hyperkitty', 'postorius', 'django_mailman3', 'django.contrib.admin', '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']
INTERNAL_IPS = []
LANGUAGES = [('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('hy', 'Armenian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('uz', 'Uzbek'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')]
LANGUAGES_BIDI = ['he', 'ar', 'fa', 'ur']
LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_AGE = None
LANGUAGE_COOKIE_DOMAIN = None
LANGUAGE_COOKIE_HTTPONLY = False
LANGUAGE_COOKIE_NAME = 'django_language'
LANGUAGE_COOKIE_PATH = '/'
LANGUAGE_COOKIE_SAMESITE = None
LANGUAGE_COOKIE_SECURE = False
LOCALE_PATHS = []
LOGGING = {'version': 1, 'disable_existing_loggers': False, 'filters': {'require_debug_false': {'()': 'django.utils.log.RequireDebugFalse'}}, 'handlers': {'mail_admins': {'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler'}, 'file': {'level': 'INFO', 'class': 'logging.handlers.WatchedFileHandler', 'filename': '/opt/mailman/web/logs/mailmanweb.log', 'formatter': 'verbose'}, 'console': {'class': 'logging.StreamHandler', 'formatter': 'simple'}}, 'loggers': {'django.request': {'handlers': ['mail_admins', 'file'], 'level': 'ERROR', 'propagate': True}, 'django': {'handlers': ['file'], 'level': 'ERROR', 'propagate': True}, 'hyperkitty': {'handlers': ['file'], 'level': 'DEBUG', 'propagate': True}, 'postorius': {'handlers': ['console', 'file'], 'level': 'INFO'}}, 'formatters': {'verbose': {'format': '%(levelname)s %(asctime)s %(process)d %(name)s %(message)s'}, 'simple': {'format': '%(levelname)s %(message)s'}}}
LOGGING_CONFIG = 'logging.config.dictConfig'
LOGIN_REDIRECT_URL = 'list_index'
LOGIN_URL = 'account_login'
LOGOUT_REDIRECT_URL = None
LOGOUT_URL = 'account_logout'
MAILMAN_ARCHIVER_FROM = "('127.0.0.1', '::1')"
MAILMAN_ARCHIVER_KEY = '********************'
MAILMAN_REST_API_PASS = '********************'
MAILMAN_REST_API_URL = '********************'
MAILMAN_REST_API_USER = '********************'
MANAGERS = []
MEDIA_ROOT = ''
MEDIA_URL = ''
MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
MESSAGE_TAGS = {40: 'danger'}
MIDDLEWARE = "('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django_mailman3.middleware.TimezoneMiddleware', 'postorius.middleware.PostoriusMiddleware')"
MIGRATION_MODULES = {}
MONTH_DAY_FORMAT = 'F j'
NUMBER_GROUPING = 0
PASSWORD_HASHERS = '********************'
PASSWORD_RESET_TIMEOUT_DAYS = '********************'
POSTORIUS_TEMPLATE_BASE_URL = 'http://mailman.example.com/mailman3/'
PREPEND_WWW = False
Q_CLUSTER = {'retry': 360, 'timeout': 300, 'save_limit': 100, 'orm': 'default'}
ROOT_URLCONF = 'mailman_web.urls'
SECRET_KEY = '********************'
SECURE_BROWSER_XSS_FILTER = False
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
SECURE_HSTS_PRELOAD = False
SECURE_HSTS_SECONDS = 0
SECURE_PROXY_SSL_HEADER = None
SECURE_REDIRECT_EXEMPT = []
SECURE_REFERRER_POLICY = None
SECURE_SSL_HOST = None
SECURE_SSL_REDIRECT = False
SERVER_EMAIL = 'admin1(a)example.org'
SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_AGE = 1209600
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_COOKIE_SECURE = False
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_FILE_PATH = None
SESSION_SAVE_EVERY_REQUEST = False
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
SETTINGS_MODULE = 'settings'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
SHORT_DATE_FORMAT = 'm/d/Y'
SIGNING_BACKEND = 'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS = []
SITE_ID = 1
SOCIALACCOUNT_PROVIDERS = {'openid': {'SERVERS': [{'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'}}
STATICFILES_DIRS = '()'
STATICFILES_FINDERS = "('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'compressor.finders.CompressorFinder')"
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT = '/opt/mailman/web/static'
STATIC_URL = '/static/'
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': {'context_processors': ['django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.media', 'django.template.context_processors.static', 'django.template.context_processors.tz', 'django.template.context_processors.csrf', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'django_mailman3.context_processors.common', 'hyperkitty.context_processors.common', 'postorius.context_processors.postorius']}}]
TEST_NON_SERIALIZED_APPS = []
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR = ','
TIME_FORMAT = 'P'
TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_THOUSAND_SEPARATOR = False
USE_TZ = True
USE_X_FORWARDED_HOST = False
USE_X_FORWARDED_PORT = False
WSGI_APPLICATION = 'mailman_web.wsgi.application'
X_FRAME_OPTIONS = 'DENY'
YEAR_MONTH_FORMAT = 'F Y'
-- -- -- --
Thank you.
3 years, 1 month
Re: Welcome message template errors
by Mark Sapiro
On 4/23/24 20:36, Mark wrote:
>
>> Did you delete and recreate the template after changing
>> POSTORIUS_TEMPLATE_BASE_URL? If not, the template table still has the
>> old URI.
>
> Yes. Every test is: delete template and users (via Postorius), make any
> config changes, restart everything, then new template and new user (via
> Postorius).
OK
>> What does `ps -fwwu mailman|grep runner` show?
>
> # ps -fwwu mailman|grep runner
> mailman 375726 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=archive:0:1
> mailman 375727 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=bounces:0:1
> mailman 375728 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=command:0:1
> mailman 375729 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=in:0:1
> mailman 375730 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=lmtp:0:1
> mailman 375731 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=nntp:0:1
> mailman 375732 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=out:0:1
> mailman 375733 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=pipeline:0:1
> mailman 375734 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=rest:0:1
> mailman 375735 375716 0 02:00 ? 00:00:00
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=retry:0:1
> mailman 375736 375716 0 02:00 ? 00:00:00
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=task:0:1
> mailman 375737 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=virgin:0:1
> mailman 375738 375716 0 02:00 ? 00:00:01
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=digest:0:1
> mailman 375790 375734 0 02:00 ? 00:00:00
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=rest:0:1
> mailman 375791 375734 0 02:00 ? 00:00:00
> /opt/mailman/venv/bin/python3 /opt/mailman/venv/bin/runner -C
> /etc/mailman3/mailman.cfg --runner=rest:0:1
So all the runners are running as user mailman. That's good. What
exactly is the issue now. Is it retrievals timing out or an empty
welcome message?
--
Mark Sapiro <mark(a)msapiro.net> The highway is for gamblers,
San Francisco Bay Area, California better use your sense - B. Dylan
1 year, 7 months
Re: MM3 Docker
by Odhiambo Washington
On Tue, 8 Jan 2019 at 03:29, Mark Sapiro <mark(a)msapiro.net> wrote:
> On 1/7/19 1:18 AM, Odhiambo Washington wrote:
> > On Sun, 6 Jan 2019 at 23:39, Mark Sapiro <mark(a)msapiro.net> wrote:
> >>
> >> Please help me understand what steps are missing and I will try to
> >> provide the information.
> >
> >
> > Okay.
> >
> > At the installation stage, you say the following:
> > "I already had some things set up in /opt/mailman including a git
> > subdirectory containing clones of the GitLab mailman, mailmanclient,
> > mailman-hyperkitty, hyperkitty, django-mailman3 and
> > postorius projects. On the third server I have added mailman-suite
> > because I use the settings.py from that project as the basis for mine."
> >
> > Please assume that the reader is a newbie to python3 virtualenv and give
> the
> > details of the commands they need to execute to (a) clone all the
> projects
> > needed
> > and (b) create the virtualenv.
> >
> > The next steps are:
> > mkdir /opt/mailman/mm
> >
> > Then you say "I then created a /opt/mailman/mm directory and within that
> a
> > Python 3.6 virtualenv"
> > What happens here is something that needs clarification, because you are
> > specific about "python3.6".
> > I have googled and realized that one has to be specific about the python
> > version they want to use in their virtualenv
> > as shown here ->
> >
> https://stackoverflow.com/questions/45293436/how-to-specify-python-version-…
> >
> > exact command to execute to create the /opt/mailman/mm/venv
> > exact command to execute to activate virtualenv
>
>
> I have added a comment to the page which I hope gives you what you want.
>
> I also added a section on templates instead of referring to a prior
> version of the page.
>
That makes it better.
However, as a newbie, something is not yet clear:
"When active in a particular shell, it can be deactivated with the command
deactivate
or by exiting that shell."
HI am trying to understand the effect of detaching from a venv. I am
assuming that a virtualenv is a container that is supposed to be always
active for the services within to be accessible. Is that right? So, how do
I ensure it's always running/up, or that does not matter as the scripts
which run the services will always refer to the files?
--
Best regards,
Odhiambo WASHINGTON,
Nairobi,KE
+254 7 3200 0004/+254 7 2274 3223
"Oh, the cruft.", grep ^[^#] :-)
6 years, 10 months
Re: My list has been switched from public to private archives, but they are still visible
by Enrique Terrazas
I am having a very similar issue. Here is what I have found:
There are basically three archive settings we can select via the postorious web front end for archives. These can be found in: Settings > Archiving and they are:
Public archives
Private archives
Do not archive this list
In the Django administrative interface we can find those same(?/similar?) settings here: Main Page > Hyperkitty > Mailing lists > Mailing List object(x) > Archive policy:
never
private
public
I’m not sure which of the two takes precedence. My guess is postorius since that is a list owner accessible setting and the Django administrative interface would typically not be accessible to list owners. We have noticed the following odd behavior, not sure if it is a bug. For existing lists with private archives, when switching to “Do not archive this list” in postorious, the desired effect of no longer archiving the list is instantaneous. However, after the daily cron job that syncs with Mailman Core happens, the existing archives now become publicly accessible. Is this behavior based on the assumption that the list will no longer be archived and will therefore be purged?
Enrique
> On Sep 19, 2019, at 1:08 PM, Abhilash Raj <maxking(a)asynchronous.in> wrote:
>
> On Thu, Sep 19, 2019, at 3:31 AM, Paul Arenson wrote:
>> Can anyone help with this?
>>
>> I set my list to private archives today. Up until then, it was pubic.
>> And yet, if you go to the list page, you will see that if you click
>> archives (top left), you can see them. (Filled with a bunch of tests
>> posts for now)
>
> This change takes a bit of time to sync up Hyperkitty. THere is a daily
> cron job which syncs this information from Mailman Core.
>
> I have made a change which should fix this problem and the process would
> become synchronous.
>
> You can run `python manage.py runjobs --daily` command to force sync
> that information.
>
>>
>> https://nam03.safelinks.protection.outlook.com/?url=https%3A%2F%2Flist.toky…
>>
>> Am I misunderstanding what a private archive is?
>
> Not really, your expectation is right.
>
>>
>> Is something wrong with my setup (which is hosted)?
>>
>> Thank you.
>> _______________________________________________
>> Mailman-users mailing list -- mailman-users(a)mailman3.org
>> To unsubscribe send an email to mailman-users-leave(a)mailman3.org
>> https://nam03.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.mai…
>>
>
> --
> 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://nam03.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.mai…
6 years, 2 months
Re: Changing subscription address
by Allan Hansen
Hi Steve,
My comments below:
On 3/15/21, 21:28 , "Stephen J. Turnbull" <turnbull.stephen.fw(a)u.tsukuba.ac.jp> wrote:
>I don't have the Postorius knowledge to do this in a reasonable amount
>of time to help your user immediately, but how about this design:
<
>In the 'Mailman Settings' screen, List-based Preferences' tab,
You may mean the 'Subscriptions' tab.
>currently each list has an active link at the list's posting address
>(which links to a page with the same options carefully documented), a
>plain text display of the subscribed address, and a row of options.
>Suppose we
>
>1. Add a popup menu of addresses and attach it to the
> displayed address for each subscription,
>2. Add a 'select subscription' checkbox to each subscription.
>3. Add an 'act on all selected subscriptions' fake subscription,
> whose checkbox has the effect of select or deselect all. I guess
> this should be at the top.[1]
>
>Does that seem like what you have in mind? Any other needs you want
>to mention? (Suggestions for feature design are welcome, but "I do
>this often and there's got to be a better way" is good too.)
The above will work fine, Steve, as it will cover the special needs of people
who have several addresses that they use for different lists. It's very
flexible.
For the other 99% of my users, something much simpler is needed:
Under 'User profile for <name>', under the 'E-mail Addresses', add button to ensure that 'Primary E-mail' is used for all lists.
Then they can
'Create account' if needed.
'Add E-mail'.
'Make Primary' the new e-mail.
'Use Primary For All Lists'.
'Remove' the old e-mail.
This requires them to set up an account, but I'm OK with asking them to do that.
And, indeed, new subscriptions should default to 'Use Primary.'
That would be fine, but it can be even simpler, which I would much prefer:
Instead of the 'Use Primary For All Lists', may I suggest a tool that lets me set all subscriptions to 'Use Primarry' where there either is no account or where the primary e-mail is already chosen as the subscription address (which together form the 99% I mentioned). In that case, the procedure becomes much easier for me to explain to them, and no new functionality needs to be added (although what you suggested is fine).
'Create account' If needed.
'Add E-mail'.
'Make Primary'.
"Remove' old email.
Is that possible now? Does a member have to have an account for me to set it up thus for them?
Thank you for considering this, Steven.
Yours,
Allan
4 years, 8 months
Re: Issue with Held Messages
by Jean-Luc Wasmer
On 2016-08-20 02:08, Mark Sapiro wrote:
> On 08/19/2016 10:39 PM, Jean-Luc Wasmer wrote:
>> On 2016-08-19 17:58, Mark Sapiro wrote:
>>> On 08/17/2016 09:17 PM, Jean-Luc Wasmer wrote:
>>>>
>>>> No matter what action I set for member posts (Hold for moderator,
>>>> Reject) they are always delivered.
>>>
>>>
>>> I don't know why this would be. Perhaps the member's moderation is
>>> set
>>> to Accept immediately - you can see this on ther member's options
>>> page
>>> in Postorius when logged in as a list owner.
>>
>> Apart from "Mode of Delivery" that is set to "Regular" for the user,
>> none of the following attributes are set:
>>
>> Mail Delivery
>> Receive own posts to the list
>> Receive acknowledgement mails
>> Conceal address from the subscriber list
>> Avoid duplicate copies of messages
>
>
> If you look at the user's options when logged in as a list owner, you
> should see an additional "Administration options" section below those
> with a "Moderation" setting. What is that set to?
I log in as the admin user created with "mailman-web-django-admin
createsuperuser", I created the list logged in as this admin user and
its email address is displayed in the "Owners" sections of the "Members"
tab.
I only have that 1 other member and when I check it settings, the last
section is "Avoid duplicate copies of messages?" and then there's the
"Save" button.
>> By the way, I didn't mention before but in Settings | Message
>> Acceptance, the "Acceptable aliases:" box contains "[]". When I try to
>> Save changes after modifying something, I gut "An error occured: []"
>> in
>> the yellow banner (instead of "The settings have been updated.").
>
>
> What happens if you clear the Acceptable aliases box before saving?
Then I get "The settings have been updated." after pressing "Save
changes".
But if I navigate elsewhere and come back, the brackets are back in the
form.
> You may find <https://wiki.list.org/x/17891998> of interest.
Indeed, I actually stumbled upon it yesterday. It would have helped me,
specially setting up Apache's vhost (the example provided in the bundler
only helped getting half of it working). One of the issues was the
permissions to the run/wsgi path.
Also, as I run on FreeBSD I had to create an rc script... I don't mind
sharing it, it's not super advanced but it does the job.
9 years, 3 months
Re: why owner mails rerouted to list
by Mark Sapiro
On 10/22/19 2:20 AM, Tamas HOLCZER via Mailman-users wrote:
> Hi All,
>
> we have moved to Mailman3 from Mailman2 recently, and have a quite
> strange problem:
>
> Every message sent to owners is forwarded to the lists instead of the
> owner's mail address.
...
> We are using GNU Mailman 3.2.1 (La Villa Strangiato) from the Debian
> Buster repo. As MTA we use exim4 (running on the same machine as
> Mailman), and have Amavisd on a separate machine for spam filtering.
This may be an exim configuration issue. You can stop the mail from
being delivered to the list by ensuring the Postorius Settings - Message
Acceptance -> Acceptable aliases is empty and Settings - Message
Acceptance -> Require Explicit Destination is Yes. This will cause the
messages to -owner, etc to be held.
First ensure exim, particularly the router for list messages is
configured as in
<https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html#exim4-co…>.
> From MYLIST-bounces(a)MYDOMAIN.COM Mon Oct 21 21:13:59 2019
> Return-path: <MYLIST-bounces(a)MYDOMAIN.COM>
> Envelope-to: MYADDRESS(a)MYDOMAIN.COM
> Delivery-date: Mon, 21 Oct 2019 21:13:59 +0200
> Received: from [SPAMFILTER] (helo=localhost)
> by MAILSERVER.MYDOMAIN.COM with esmtp (Exim 4.92)
> (envelope-from <MYLIST-bounces(a)MYDOMAIN.COM>)
> id 1iMd7u-0007pv-VR; Mon, 21 Oct 2019 21:13:59 +0200
> X-Virus-Scanned: by amavis-dc
> Received: from MAILSERVER.MYDOMAIN.COM ([MAILSERVER-LOCAL-IP])
> by localhost (spamfilter.MYDOMAIN.COM [SPAMFILTER]) (amavisd-new, port 10023)
> with ESMTP id Pe6CPG7d_0VR; Mon, 21 Oct 2019 21:13:57 +0200 (CEST)
> Received: from MAILSERVER2.MYDOMAIN.COM ([MAILSERVER-PUBLIC-IP] helo=MAILSERVER.MYDOMAIN.COM)
> by MAILSERVER.MYDOMAIN.COM with esmtp (Exim 4.92)
> (envelope-from <MYLIST-bounces(a)MYDOMAIN.COM>)
> id 1iMd7t-0007pn-Mu; Mon, 21 Oct 2019 21:13:57 +0200
It seems the issue occurs here. The Received: header below is the
receipt of the message from Mailman to MYLIST-owner. That header clearly
says the envelope recipient is MYLIST-owner(a)MYDOMAIN.COM.
Then the header above looks like the delivery of the message from the
Mailman list to one or more list members. What we don't see is the
intermediate step of LMTP delivery of the message to Mailman's LMTP
server. That delivery must have had envelope recipient
MYLIST(a)MYDOMAIN.COM rather than MYLIST-owner(a)MYDOMAIN.COM
I think what's missing is `rcpt_include_affixes = true` in the exim
transport for Mailman.
> Received: from MAILSERVER2.MYDOMAIN.COM ([MAILSERVER-PUBLIC-IP] helo=MAILSERVER.MYDOMAIN.COM)
> by MAILSERVER.MYDOMAIN.COM with esmtp (Exim 4.92)
> (envelope-from <MYLIST-bounces(a)MYDOMAIN.COM>)
> id 1iMd7r-0007pR-JZ
> for MYLIST-owner(a)MYDOMAIN.COM; Mon, 21 Oct 2019 21:13:55 +0200
> From: MYLIST-owner(a)MYDOMAIN.COM
> To: MYLIST-owner(a)MYDOMAIN.COM
--
Mark Sapiro <mark(a)msapiro.net> The highway is for gamblers,
San Francisco Bay Area, California better use your sense - B. Dylan
6 years, 1 month
One-click unsubscribe?
by Stephen J. Turnbull
Jered Floyd writes:
> Is there any way to provide personalized List-Unsubscribe header
> links,
Google should do it in their implementation -- they know which of
dozens of equivalent addresses the post was sent to, and it's quite
likely to be available in the header of the delivered post (and if not
it's easy to add).
For Mailman, not without adding a new feature. The current approach
takes the sender of the "unsubscribe" message as the address to
unsubscribe. While this is not currently hard to spoof, it does cut
down on mere mischief. If spoofing becomes a problem, it would be
sraightforward to check for From alignment, which should make spoofing
very hard, as the overwhelming majority of users use providers who
DKIM sign and check the login. An URL which specifies the address to
unsubscribe would need to be authenticated in a different way,
requiring a different command for a MAILTO URL, or a different scheme
such as HTTPS.
> or have Mailman ignore dots in gmail.com addresses...
I think we already canonicalize addresses to lowercase, and I'm
unaware of problems with that, as apparently essentially all providers
ignore case. Theoretically we could do that, but ... catering to
Google breakage?! I'll do it for money, maybe somebody else will
volunteer.
If we're talking about a new feature, I think the most straightforward
approach is to use RFC 8058[1] "one click" URLs. I believe it is
already implemented by Gmail and Yahoo, I don't know about Outlook or
the open source MUAs. This would require a substantial (but
straightforward[2]) addition of code, and of course personalized
delivery (I don't know if anyone balks at that any more, though).
> or... anything? I'm finding reported spam percentages
> in the Google Postmaster Dashboard exceeding 0.1%, which causes
> massive delivery blocking to GMail-based subscribers.
That's obnoxious. If they can get reported spam rates down to 0,1%,
almost certainly 90% of reports are subscriber malfeasance or
incompetence!
> While I would gladly ban everyone who uses gmail, that sadly
> accounts for about half of the Internet today and would be
> incredibly unproductive.
Aw, c'mon, be a hero! (^^) Gmail has gotten so enshittified, but it
just doesn't seem to matter, does it.
Footnotes:
[1] https://datatracker.ietf.org/doc/html/rfc8058
[2] That is, we'd need to add a new location in Postorius and code to
accept POST access to it, encrypt/decrypt functionality to handle an
opaque token (to prevent automated denial of service by folks without
access to the person's email) or a table of one-time tokens with
expiration (same purpose, and expiring so the database doesn't grow
infinitely). What we wouldn't need to do is to change any exsting
code.
10 months
Re: username
by Stephen J. Turnbull
bryan.kartzman(a)yu.edu writes:
> will do this. The university does use SSO for many applications and
> I was asked by upper management of the IT department to try and
> implement it here. I'm still trying to understand your reply to my
> SSO question from last week (my SSO knowledge is limited and I'll
> have to read up on Shibboleth, SAML, as well as Django) so for now
> I'm thinking to not use SSO
If they want to use it, pass the buck to them. I'm happy to help with
the Mailman side (on a time-available basis or as a paid consultant --
time available is probably a much better deal, though!) But I can't
know what the system in use is, so maybe you should get them to write
an outline of the system (what software, what requirements, what
ID-related attributes are available).
> then transition to SSO later.
I don't think that will be a problem technically, as long as the user
ids are the same for the same people. There will be UX issues though
in the configuration I use. I think people will accept them quickly,
but the UX will be different, which makes folks nervous if you don't
warn them and explain why it's OK.
> If you have any pointers as to
> where to read up on SSO, SAML, Shibboleth and also on Django please
> point me in the right direction.
For django, search "site:djangoproject.com REMOTE_USER". For
shibboleth, the relevant documentation is on the atlassian site.
Here's the main documentation for the "service provider" component
(this is the part that Postorius would be using indirectly):
https://shibboleth.atlassian.net/wiki/spaces/SP3/overview
search there for "REMOTE_USER" for the most relevant documentation.
The SAML protocol is above our pay grade. :-) There's an introduction
to the SAML architecture linked from the service provider
documentation. That's way more than you need for this task, I think,
so just skim it. Another guy did the Shibboleth config, so I'm a
little fuzzy on this, but again I think that's mostly IT/NOC
responsibility. (IIRC the main thing was getting the ID provider
credentials and our host certs from the NOC, you can't generate those
yourself!) The parts that hook into mailman are a list of
translations of ID attributes to Apache variables, some email
addresses for error reporting, and in Apache some translations of
Apache variables to HTTP headers.
But you need to make sure it's SAML. I'm no expert on this stuff, but
it seems like there are a bunch of these protocols, like OpenID and
OAuth2 out there. Django knows how to do those, too, but we need to
know which one!
Steve
2 years, 5 months
Re: Installing Mailman3 under a Python Virtual environment running on RHEL9
by Odhiambo Washington
On Tue, May 21, 2024 at 2:44 PM Andy Macheta <andy.macheta(a)gmail.com> wrote:
> Hi,
> So tried, without much success, to get Postorius working on my Mailman3
> server and every internet trick& tip I tried did not work so decided to
> take a new approach as recommended at
> https://lists.mailman3.org/archives/list/mailman-users@mailman3.org/thread/…
>
> Used this reference:
> https://docs.mailman3.org/en/latest/install/virtualenv.html#installing-depe…
> which I know is more for Debian/Ubuntu systems but I was hoping that 90%+
> would also work with Red Hat.
> Fell at the first hurdle with no packages available called "python3-dev"
> or "python3-venv"
>
The virtualenv method should work for all OSes, not just Debian/Ubuntu. I
use it on FreeBSD too.
I have never touched RHEL, but Google-foo tells me that you need to do:
yum install -y python3-devel
Alternatively, search for the package in yum , use the following command:
yum search python3 | grep devel
You could also search for the venv one by:
yum search python3 | grep env
Whatever else you'd need to install on the base OS, just use the above
search method and install it. Feel free to post questions here if you
aren't sure on what to install.
The documentation -
https://docs.mailman3.org/en/latest/install/virtualenv.html - requires you
to install the following in the base OS:
1. python3-dev python3-venv sassc lynx
2. A database server - could be PostgreSQL or MySQL. You can search for
them too :)
3. An MTA - could be Postfix or Exim. Your choice.
4. A webserver - could be Apache or Nginx
The challenge you're likely to face is probably to do with how to start the
MM3 core and MM3 web services, but you can figure that out, no?
Alternatively, just dump RHEL and use any Debian-based OS :)
Is there anyone that has managed to install a running version of Mailman3
> that has a working GUI whether it is on bare metal or Python virtual
> environment and if so, could they kindly let me know how they did it??
> The closest I've come is a running command line version of Mailman3 which
> is fine for me of course but not for anyone else as they like access via
> web browser.
>
Let's see if you can get this running in the next 3hrs. Do you use
WhatsApp? Let's chat on +254732000004
--
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