updated and merge conflicts fixed for mailu master

This commit is contained in:
OutBackDingo
2025-05-23 08:45:00 +07:00
50 changed files with 1330 additions and 682 deletions

View File

@@ -0,0 +1,26 @@
name: 'Lock closed issues'
# Workflow that automatically locks already closed issues,
# pull requests and discussions.
on:
schedule:
- cron: '30 6 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
discussions: write
concurrency:
group: lock-threads
jobs:
action:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v5
with:
issue-inactive-days: 21
pr-inactive-days: 28
discussion-inactive-days: 28

View File

@@ -9,10 +9,11 @@ module.exports = {
mode: 'production', mode: 'production',
entry: { entry: {
app: { app: {
import: ['./assets/app.css', './assets/mailu.png', './assets/app.js'], import: ['./assets/app.css', './assets/app.js'],
dependOn: 'vendor', dependOn: 'vendor',
}, },
vendor: './assets/vendor.js', vendor: './assets/vendor.js',
logo: './assets/mailu.png',
}, },
output: { output: {
path: path.resolve(__dirname, 'static/'), path: path.resolve(__dirname, 'static/'),

View File

@@ -1,3 +1,2 @@
[python: **.py] [python: **.py]
[jinja2: **/templates/**.html] [jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

View File

@@ -242,8 +242,7 @@ class User(Resource):
if 'forward_enabled' in data: if 'forward_enabled' in data:
user_found.forward_enabled = data['forward_enabled'] user_found.forward_enabled = data['forward_enabled']
if 'forward_destination' in data and len(data['forward_destination']) > 0: if 'forward_destination' in data and len(data['forward_destination']) > 0:
if len(data['forward_destination']) == 0: user_found.forward_destination = data['forward_destination']
user_found.forward_destination = data['forward_destination']
if 'forward_keep' in data: if 'forward_keep' in data:
user_found.forward_keep = data['forward_keep'] user_found.forward_keep = data['forward_keep']
if 'reply_enabled' in data: if 'reply_enabled' in data:

View File

@@ -25,6 +25,7 @@ DEFAULT_CONFIG = {
'DB_PW': None, 'DB_PW': None,
'DB_HOST': 'database', 'DB_HOST': 'database',
'DB_NAME': 'mailu', 'DB_NAME': 'mailu',
'DB_APPENDIX': '',
'SQLITE_DATABASE_FILE': 'data/main.db', 'SQLITE_DATABASE_FILE': 'data/main.db',
'SQLALCHEMY_DATABASE_URI': 'sqlite:////data/main.db', 'SQLALCHEMY_DATABASE_URI': 'sqlite:////data/main.db',
'SQLALCHEMY_DATABASE_URI_ROUNDCUBE': 'sqlite:////data/roundcube.db', 'SQLALCHEMY_DATABASE_URI_ROUNDCUBE': 'sqlite:////data/roundcube.db',
@@ -95,7 +96,7 @@ DEFAULT_CONFIG = {
'SESSION_TIMEOUT': 3600, 'SESSION_TIMEOUT': 3600,
'PERMANENT_SESSION_LIFETIME': 30*24*3600, 'PERMANENT_SESSION_LIFETIME': 30*24*3600,
'SESSION_COOKIE_SECURE': None, 'SESSION_COOKIE_SECURE': None,
'CREDENTIAL_ROUNDS': 12, 'CREDENTIAL_ROUNDS': 13,
'TLS_PERMISSIVE': True, 'TLS_PERMISSIVE': True,
'TZ': 'Etc/UTC', 'TZ': 'Etc/UTC',
'DEFAULT_SPAM_THRESHOLD': 80, 'DEFAULT_SPAM_THRESHOLD': 80,
@@ -114,8 +115,8 @@ class ConfigManager:
DB_TEMPLATES = { DB_TEMPLATES = {
'sqlite': 'sqlite:////{SQLITE_DATABASE_FILE}', 'sqlite': 'sqlite:////{SQLITE_DATABASE_FILE}',
'postgresql': 'postgresql://{DB_USER}:{DB_PW}@{DB_HOST}/{DB_NAME}', 'postgresql': 'postgresql://{DB_USER}:{DB_PW}@{DB_HOST}/{DB_NAME}{DB_APPENDIX}',
'mysql': 'mysql+mysqlconnector://{DB_USER}:{DB_PW}@{DB_HOST}/{DB_NAME}', 'mysql': 'mysql+mysqlconnector://{DB_USER}:{DB_PW}@{DB_HOST}/{DB_NAME}{DB_APPENDIX}',
} }
def __init__(self): def __init__(self):

View File

@@ -106,6 +106,7 @@ def handle_authentication(headers):
ip = urllib.parse.unquote(headers["Client-Ip"]) ip = urllib.parse.unquote(headers["Client-Ip"])
except: except:
app.logger.warning(f'Received undecodable user/password from front: {headers.get("Auth-User", "")!r}') app.logger.warning(f'Received undecodable user/password from front: {headers.get("Auth-User", "")!r}')
# app.logger.warn(f'Received undecodable user/password from front: {headers.get("Auth-User", "")!r}')
else: else:
try: try:
user = models.User.query.get(user_email) if '@' in user_email else None user = models.User.query.get(user_email) if '@' in user_email else None

View File

@@ -31,7 +31,7 @@ def autoconfig_mozilla():
<username>%EMAILADDRESS%</username> <username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication> <authentication>password-cleartext</authentication>
<addThisServer>true</addThisServer> <addThisServer>true</addThisServer>
<useGlobalPreferredServer>true</useGlobalPreferredServer> <useGlobalPreferredServer>false</useGlobalPreferredServer>
</outgoingServer> </outgoingServer>
<documentation url="https://{hostname}/admin/client"> <documentation url="https://{hostname}/admin/client">

View File

@@ -2,6 +2,7 @@ from mailu import models
from mailu.internal import internal from mailu.internal import internal
import flask import flask
import idna
def vault_error(*messages, status=404): def vault_error(*messages, status=404):
return flask.make_response(flask.jsonify({'errors':messages}), status) return flask.make_response(flask.jsonify({'errors':messages}), status)
@@ -19,7 +20,16 @@ def rspamd_dkim_key(domain_name):
if key := domain.dkim_key: if key := domain.dkim_key:
selectors.append( selectors.append(
{ {
'domain' : domain.name, 'domain' : idna.encode(domain.name.lower()).decode('ascii'),
'key' : key.decode('utf8'),
'selector': flask.current_app.config.get('DKIM_SELECTOR', 'dkim'),
}
)
elif domain := models.Alternative.query.get(domain_name):
if key := domain.domain.dkim_key:
selectors.append(
{
'domain' : idna.encode(domain.name.lower()).decode('ascii'),
'key' : key.decode('utf8'), 'key' : key.decode('utf8'),
'selector': flask.current_app.config.get('DKIM_SELECTOR', 'dkim'), 'selector': flask.current_app.config.get('DKIM_SELECTOR', 'dkim'),
} }

View File

@@ -358,6 +358,54 @@ class Alternative(Base):
domain = db.relationship(Domain, domain = db.relationship(Domain,
backref=db.backref('alternatives', cascade='all, delete-orphan')) backref=db.backref('alternatives', cascade='all, delete-orphan'))
@property
def dns_dkim(self):
""" return DKIM record for domain """
if self.domain.dkim_key:
selector = app.config['DKIM_SELECTOR']
return f'{selector}._domainkey.{self.name}. 600 IN TXT "v=DKIM1; k=rsa; p={self.domain.dkim_publickey}"'
@cached_property
def dns_dmarc(self):
""" return DMARC record for domain """
if self.domain.dkim_key:
domain = app.config['DOMAIN']
rua = app.config['DMARC_RUA']
rua = f' rua=mailto:{rua}@{domain};' if rua else ''
ruf = app.config['DMARC_RUF']
ruf = f' ruf=mailto:{ruf}@{domain};' if ruf else ''
return f'_dmarc.{self.name}. 600 IN TXT "v=DMARC1; p=reject;{rua}{ruf} adkim=s; aspf=s"'
@cached_property
def dns_dmarc_report(self):
""" return DMARC report record for mailu server """
if self.domain.dkim_key:
domain = app.config['DOMAIN']
return f'{self.name}._report._dmarc.{domain}. 600 IN TXT "v=DMARC1;"'
@cached_property
def dns_mx(self):
""" return MX record for domain """
hostname = app.config['HOSTNAME']
return f'{self.name}. 600 IN MX 10 {hostname}.'
@cached_property
def dns_spf(self):
""" return SPF record for domain """
hostname = app.config['HOSTNAME']
return f'{self.name}. 600 IN TXT "v=spf1 mx a:{hostname} ~all"'
def check_mx(self):
""" checks if MX record for domain points to mailu host """
try:
hostnames = set(app.config['HOSTNAMES'].split(','))
return any(
rset.exchange.to_text().rstrip('.') in hostnames
for rset in dns.resolver.resolve(self.name, 'MX')
)
except dns.exception.DNSException:
return False
class Relay(Base): class Relay(Base):
""" Relayed mail domain. """ Relayed mail domain.

View File

@@ -1148,7 +1148,7 @@ class TokenSchema(BaseSchema):
sibling = True sibling = True
password = PasswordField(required=True, metadata={'model': models.User}) password = PasswordField(required=True, metadata={'model': models.User})
hash_password = fields.Boolean(load_only=True, missing=False) hash_password = fields.Boolean(load_only=True, load_default=False)
@mapped @mapped
@@ -1193,7 +1193,7 @@ class UserSchema(BaseSchema):
fetches = fields.Nested(FetchSchema, many=True) fetches = fields.Nested(FetchSchema, many=True)
password = PasswordField(required=True, metadata={'model': models.User}) password = PasswordField(required=True, metadata={'model': models.User})
hash_password = fields.Boolean(load_only=True, missing=False) hash_password = fields.Boolean(load_only=True, load_default=False)
@mapped @mapped

View File

@@ -5,11 +5,11 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: Mailu 2024.06\n"
"Report-Msgid-Bugs-To: translate@s474n.com\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-05-22 18:47+0200\n" "POT-Creation-Date: 2024-06-20 12:30+0000\n"
"PO-Revision-Date: 2023-02-21 16:14+0100\n" "PO-Revision-Date: 2024-09-10 17:16+0200\n"
"Last-Translator: S474N <translate@s474n.com>\n" "Last-Translator: kunago <miris@kunago.com>\n"
"Language-Team: Czech\n" "Language-Team: Czech\n"
"Language: cs_CZ\n" "Language: cs_CZ\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -17,23 +17,39 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n"
"Generated-By: Babel 2.3.4\n" "Generated-By: Babel 2.3.4\n"
"X-Generator: Poedit 3.2.2\n" "X-Generator: Poedit 3.5\n"
#: mailu/sso/forms.py:8 mailu/ui/forms.py:79 #: mailu/sso/forms.py:8 mailu/ui/forms.py:91
msgid "E-mail" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: mailu/sso/forms.py:9 mailu/ui/forms.py:80 mailu/ui/forms.py:93 #: mailu/sso/forms.py:9 mailu/ui/forms.py:92 mailu/ui/forms.py:108
#: mailu/ui/forms.py:112 mailu/ui/forms.py:166 #: mailu/ui/forms.py:128 mailu/ui/forms.py:135 mailu/ui/forms.py:197
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:57 #: mailu/ui/templates/client.html:31 mailu/ui/templates/client.html:56
msgid "Password" msgid "Password"
msgstr "Heslo" msgstr "Heslo"
#: mailu/sso/forms.py:10 mailu/sso/forms.py:11 mailu/sso/templates/login.html:4 #: mailu/sso/forms.py:11 mailu/sso/forms.py:12 mailu/sso/templates/login.html:4
#: mailu/ui/templates/sidebar.html:142 #: mailu/sso/templates/sidebar_sso.html:42 mailu/ui/templates/sidebar.html:144
msgid "Sign in" msgid "Sign in"
msgstr "Přihlásit se" msgstr "Přihlásit se"
#: mailu/sso/forms.py:15 mailu/ui/forms.py:134
msgid "Current password"
msgstr "Současné heslo"
#: mailu/sso/forms.py:16
msgid "New password"
msgstr "Nové heslo"
#: mailu/sso/forms.py:17
msgid "New password (again)"
msgstr "Nové heslo (znovu)"
#: mailu/sso/forms.py:19
msgid "Change password"
msgstr "Změnit heslo"
#: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8 #: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8
msgid "Admin page for" msgid "Admin page for"
msgstr "Admin stránka pro" msgstr "Admin stránka pro"
@@ -46,255 +62,301 @@ msgstr "přepnout postranní panel"
msgid "change language" msgid "change language"
msgstr "změnit jazyk" msgstr "změnit jazyk"
#: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:94 #: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:96
msgid "Go to" msgid "Go to"
msgstr "Jít" msgstr "Přejít"
#: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4 #: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4
#: mailu/ui/templates/sidebar.html:50 mailu/ui/templates/sidebar.html:107 #: mailu/ui/templates/sidebar.html:52 mailu/ui/templates/sidebar.html:109
msgid "Client setup" msgid "Client setup"
msgstr "Nastavení klienta" msgstr "Nastavení klienta"
#: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:114 #: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:116
msgid "Website" msgid "Website"
msgstr "Webová stránka" msgstr "Webová stránka"
#: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:120 #: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:122
msgid "Help" msgid "Help"
msgstr "Pomoc" msgstr "Pomoc"
#: mailu/sso/templates/sidebar_sso.html:35 #: mailu/sso/templates/sidebar_sso.html:35
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:127 #: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:129
msgid "Register a domain" msgid "Register a domain"
msgstr "Registrovat doménu" msgstr "Registrovat doménu"
#: mailu/sso/templates/sidebar_sso.html:49 mailu/ui/forms.py:95 #: mailu/sso/templates/sidebar_sso.html:55 mailu/ui/forms.py:111
#: mailu/ui/templates/sidebar.html:149 mailu/ui/templates/user/signup.html:4 #: mailu/ui/templates/sidebar.html:151 mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4 #: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up" msgid "Sign up"
msgstr "Registrovat se" msgstr "Registrovat se"
#: mailu/ui/forms.py:33 mailu/ui/forms.py:36 #: mailu/sso/views/base.py:48
msgid "Invalid email address." msgid "Too many attempts from your IP (rate-limit)"
msgstr "Špatná mailová adresa." msgstr "Příliš mnoho pokusů z vaší IP adresy (omezení rychlosti)"
#: mailu/ui/forms.py:45 #: mailu/sso/views/base.py:51
msgid "Too many attempts for this user (rate-limit)"
msgstr "Příliš mnoho pokusů tohoto uživatele (omezení rychlosti)"
#: mailu/sso/views/base.py:69
msgid "Wrong e-mail or password"
msgstr "Chybný e-mail nebo heslo"
#: mailu/sso/views/base.py:85
msgid "The new password can't be the same as the old password"
msgstr "Nové heslo nemůže být shodné s původním"
#: mailu/sso/views/base.py:88
msgid "The new passwords don't match"
msgstr "Nová hesla se neshodují"
#: mailu/sso/views/base.py:100
msgid "The current password is incorrect!"
msgstr "Současné heslo není správné!"
#: mailu/ui/forms.py:34 mailu/ui/forms.py:37
msgid "Invalid email address."
msgstr "Neplatná e-mailová adresa."
#: mailu/ui/forms.py:47
msgid "Invalid list of folders."
msgstr "Neplatný seznam složek."
#: mailu/ui/forms.py:56
msgid "Confirm" msgid "Confirm"
msgstr "Potvrdit" msgstr "Potvrdit"
#: mailu/ui/forms.py:48 mailu/ui/forms.py:58 #: mailu/ui/forms.py:59 mailu/ui/forms.py:69
#: mailu/ui/templates/domain/details.html:26 #: mailu/ui/templates/domain/details.html:26
#: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18 #: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18
msgid "Domain name" msgid "Domain name"
msgstr "Název domény" msgstr "Název domény"
#: mailu/ui/forms.py:49 #: mailu/ui/forms.py:60
msgid "Maximum user count" msgid "Maximum user count"
msgstr "Maximální počet uživatelů" msgstr "Maximální počet uživatelů"
#: mailu/ui/forms.py:50 #: mailu/ui/forms.py:61
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "Maximální počet aliasů" msgstr "Maximální počet aliasů"
#: mailu/ui/forms.py:51 #: mailu/ui/forms.py:62
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Maximální uživatelská kvóta" msgstr "Maximální kvóta uživatele"
#: mailu/ui/forms.py:52 #: mailu/ui/forms.py:63 mailu/ui/templates/domain/list.html:24
msgid "Enable sign-up" msgid "Enable sign-up"
msgstr "Povolit registraci" msgstr "Povolit registraci"
#: mailu/ui/forms.py:53 mailu/ui/forms.py:74 mailu/ui/forms.py:86 #: mailu/ui/forms.py:64 mailu/ui/forms.py:86 mailu/ui/forms.py:100
#: mailu/ui/forms.py:132 mailu/ui/forms.py:144 #: mailu/ui/forms.py:155 mailu/ui/forms.py:175
#: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:22 #: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:23
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:20 #: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
#: mailu/ui/templates/user/list.html:24 #: mailu/ui/templates/user/list.html:24
msgid "Comment" msgid "Comment"
msgstr "Komentář" msgstr "Komentář"
#: mailu/ui/forms.py:54 mailu/ui/forms.py:68 mailu/ui/forms.py:75 #: mailu/ui/forms.py:65 mailu/ui/forms.py:80 mailu/ui/forms.py:87
#: mailu/ui/forms.py:88 mailu/ui/forms.py:136 mailu/ui/forms.py:145 #: mailu/ui/forms.py:103 mailu/ui/forms.py:159 mailu/ui/forms.py:176
msgid "Save" msgid "Save"
msgstr "Uložit" msgstr "Uložit"
#: mailu/ui/forms.py:59 #: mailu/ui/forms.py:70
msgid "Initial admin" msgid "Initial admin"
msgstr "Hlavní admin" msgstr "Výchozí admin"
#: mailu/ui/forms.py:60 #: mailu/ui/forms.py:71
msgid "Admin password" msgid "Admin password"
msgstr "Heslo admina" msgstr "Heslo admina"
#: mailu/ui/forms.py:61 mailu/ui/forms.py:81 mailu/ui/forms.py:94 #: mailu/ui/forms.py:72 mailu/ui/forms.py:93 mailu/ui/forms.py:109
msgid "Confirm password" msgid "Confirm password"
msgstr "Potvrdit heslo" msgstr "Potvrdit heslo"
#: mailu/ui/forms.py:63 #: mailu/ui/forms.py:75
msgid "Create" msgid "Create"
msgstr "Vytvořit" msgstr "Vytvořit"
#: mailu/ui/forms.py:67 #: mailu/ui/forms.py:79
msgid "Alternative name" msgid "Alternative name"
msgstr "Alternativní jméno" msgstr "Alternativní jméno"
#: mailu/ui/forms.py:72 #: mailu/ui/forms.py:84
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "Seznam předávaných domén" msgstr "Seznam předávaných domén"
#: mailu/ui/forms.py:73 mailu/ui/templates/relay/list.html:19 #: mailu/ui/forms.py:85 mailu/ui/templates/relay/list.html:19
msgid "Remote host" msgid "Remote host"
msgstr "Vzdálený hostitel" msgstr "Vzdálený hostitel"
#: mailu/ui/forms.py:82 mailu/ui/templates/user/list.html:23 #: mailu/ui/forms.py:95 mailu/ui/templates/domain/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16 #: mailu/ui/templates/user/list.html:23
#: mailu/ui/templates/user/signup_domain.html:17
msgid "Quota" msgid "Quota"
msgstr "Kvóta" msgstr "Kvóta"
#: mailu/ui/forms.py:83 #: mailu/ui/forms.py:96
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Povolit přístup IMAP" msgstr "Povolit přístup IMAP"
#: mailu/ui/forms.py:84 #: mailu/ui/forms.py:97
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Povolit přístup POP3" msgstr "Povolit přístup POP3"
#: mailu/ui/forms.py:85 mailu/ui/forms.py:101 #: mailu/ui/forms.py:98
msgid "Allow the user to spoof the sender (send email as anyone)"
msgstr "Povolit uživateli napodobit odesílatele (odeslat e-mail jako kdokoli)"
#: mailu/ui/forms.py:99 mailu/ui/forms.py:117
#: mailu/ui/templates/user/settings.html:15 #: mailu/ui/templates/user/settings.html:15
msgid "Displayed name" msgid "Displayed name"
msgstr "Zobrazené jméno" msgstr "Zobrazené jméno"
#: mailu/ui/forms.py:87 #: mailu/ui/forms.py:101
msgid "Enabled" msgid "Enabled"
msgstr "Povoleno" msgstr "Povoleno"
#: mailu/ui/forms.py:92
msgid "Email address"
msgstr "Emailová adresa"
#: mailu/ui/forms.py:102 #: mailu/ui/forms.py:102
msgid "Force password change at next login"
msgstr "Vynutit změnu hesla při příštím přihlášení"
#: mailu/ui/forms.py:107
msgid "Email address"
msgstr "E-mailová adresa"
#: mailu/ui/forms.py:118
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Povolit filtr spamu" msgstr "Povolit filtr spamu"
#: mailu/ui/forms.py:103 #: mailu/ui/forms.py:119
msgid "Enable marking spam mails as read" msgid "Enable marking spam mails as read"
msgstr "Povolit označování spamových e-mailů jako přečtených" msgstr "Povolit označování spamových e-mailů jako přečtených"
#: mailu/ui/forms.py:104 #: mailu/ui/forms.py:120
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "Tolerance spamového filtru" msgstr "Tolerance spamového filtru"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:121
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Povolit přeposílání" msgstr "Povolit přeposílání"
#: mailu/ui/forms.py:106 #: mailu/ui/forms.py:122
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Zachovat kopii e-mailů" msgstr "Zachovat kopii e-mailů"
#: mailu/ui/forms.py:107 mailu/ui/forms.py:143 #: mailu/ui/forms.py:123 mailu/ui/forms.py:174
#: mailu/ui/templates/alias/list.html:21 #: mailu/ui/templates/alias/list.html:21
msgid "Destination" msgid "Destination"
msgstr "Cíl" msgstr "Cíl"
#: mailu/ui/forms.py:108 #: mailu/ui/forms.py:124
msgid "Save settings" msgid "Save settings"
msgstr "Uložit nastavení" msgstr "Uložit nastavení"
#: mailu/ui/forms.py:113 #: mailu/ui/forms.py:129 mailu/ui/forms.py:136
msgid "Password check" msgid "Password check"
msgstr "Kontrola hesla" msgstr "Kontrola hesla"
#: mailu/ui/forms.py:114 mailu/ui/templates/sidebar.html:25 #: mailu/ui/forms.py:131 mailu/ui/forms.py:138
#: mailu/ui/templates/sidebar.html:25
msgid "Update password" msgid "Update password"
msgstr "Aktualizovat heslo" msgstr "Aktualizovat heslo"
#: mailu/ui/forms.py:118 #: mailu/ui/forms.py:141
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Povolit automatickou odpověď" msgstr "Povolit automatickou odpověď"
#: mailu/ui/forms.py:119 #: mailu/ui/forms.py:142
msgid "Reply subject" msgid "Reply subject"
msgstr "Předmět odpovědi" msgstr "Předmět odpovědi"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:143
msgid "Reply body" msgid "Reply body"
msgstr "Tělo odpovědi" msgstr "Tělo odpovědi"
#: mailu/ui/forms.py:122 #: mailu/ui/forms.py:145
msgid "Start of vacation" msgid "Start of vacation"
msgstr "Začátek dovolené" msgstr "Začátek dovolené"
#: mailu/ui/forms.py:123 #: mailu/ui/forms.py:146
msgid "End of vacation" msgid "End of vacation"
msgstr "Konec dovolené" msgstr "Konec dovolené"
#: mailu/ui/forms.py:124 #: mailu/ui/forms.py:147
msgid "Update" msgid "Update"
msgstr "Aktualizovat" msgstr "Aktualizovat"
#: mailu/ui/forms.py:129 #: mailu/ui/forms.py:152
msgid "Your token (write it down, as it will never be displayed again)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Váš token (zapište si ho, protože se již nikdy nezobrazí)" msgstr "Váš token (zapište si ho, protože se již nikdy nezobrazí)"
#: mailu/ui/forms.py:134 mailu/ui/templates/token/list.html:21 #: mailu/ui/forms.py:157 mailu/ui/templates/token/list.html:22
msgid "Authorized IP" msgid "Authorized IP"
msgstr "Autorizovaná IP" msgstr "Autorizovaná IP"
#: mailu/ui/forms.py:140 #: mailu/ui/forms.py:171
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:142 #: mailu/ui/forms.py:173
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Použít syntaxi jako SQL (např. pro doménové koše)" msgstr "Použít syntaxi SQL LIKE (např. pro doménové koše)"
#: mailu/ui/forms.py:149 #: mailu/ui/forms.py:180
msgid "Admin email" msgid "Admin email"
msgstr "Email admina" msgstr "E-mail admina"
#: mailu/ui/forms.py:150 mailu/ui/forms.py:155 mailu/ui/forms.py:168 #: mailu/ui/forms.py:181 mailu/ui/forms.py:186 mailu/ui/forms.py:201
msgid "Submit" msgid "Submit"
msgstr "Poslat" msgstr "Odeslat"
#: mailu/ui/forms.py:154 #: mailu/ui/forms.py:185
msgid "Manager email" msgid "Manager email"
msgstr "E-mail manažera" msgstr "E-mail manažera"
#: mailu/ui/forms.py:159 #: mailu/ui/forms.py:190
msgid "Protocol" msgid "Protocol"
msgstr "Protokol" msgstr "Protokol"
#: mailu/ui/forms.py:162 #: mailu/ui/forms.py:193
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Hostitel nebo IP" msgstr "Hostitel nebo IP"
#: mailu/ui/forms.py:163 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:194 mailu/ui/templates/client.html:19
#: mailu/ui/templates/client.html:45 #: mailu/ui/templates/client.html:44
msgid "TCP port" msgid "TCP port"
msgstr "TCP port" msgstr "TCP port"
#: mailu/ui/forms.py:164 #: mailu/ui/forms.py:195
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Povolit TLS" msgstr "Povolit TLS"
#: mailu/ui/forms.py:165 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:196 mailu/ui/templates/client.html:27
#: mailu/ui/templates/client.html:53 mailu/ui/templates/fetch/list.html:21 #: mailu/ui/templates/client.html:52 mailu/ui/templates/fetch/list.html:21
msgid "Username" msgid "Username"
msgstr "Uživatelské jméno" msgstr "Uživatelské jméno"
#: mailu/ui/forms.py:167 #: mailu/ui/forms.py:198
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "Zachovat e-maily na serveru" msgstr "Ponechat e-maily na serveru"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:199
msgid "Rescan emails locally"
msgstr "Přeskenovat e-maily lokálně"
#: mailu/ui/forms.py:200
msgid "Folders to fetch on the server"
msgstr "Složky na serveru určené ke stažení"
#: mailu/ui/forms.py:205
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Předmět oznámení" msgstr "Předmět oznámení"
#: mailu/ui/forms.py:174 #: mailu/ui/forms.py:207
msgid "Announcement body" msgid "Announcement body"
msgstr "Tělo oznámení" msgstr "Tělo oznámení"
#: mailu/ui/forms.py:176 #: mailu/ui/forms.py:209
msgid "Send" msgid "Send"
msgstr "Poslat" msgstr "Poslat"
@@ -302,7 +364,7 @@ msgstr "Poslat"
msgid "Public announcement" msgid "Public announcement"
msgstr "Veřejné oznámení" msgstr "Veřejné oznámení"
#: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:80 #: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:82
#: mailu/ui/templates/user/settings.html:19 #: mailu/ui/templates/user/settings.html:19
msgid "Antispam" msgid "Antispam"
msgstr "Antispam" msgstr "Antispam"
@@ -315,22 +377,30 @@ msgstr "Stavová stránka RSPAMD"
msgid "configure your email client" msgid "configure your email client"
msgstr "nakonfigurovat e-mailového klienta" msgstr "nakonfigurovat e-mailového klienta"
#: mailu/ui/templates/client.html:13 #: mailu/ui/templates/client.html:12
msgid "Incoming mail" msgid "Incoming mail"
msgstr "Příchozí mail" msgstr "Příchozí mail"
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:41 #: mailu/ui/templates/client.html:15 mailu/ui/templates/client.html:40
msgid "Mail protocol" msgid "Mail protocol"
msgstr "Poštovní protokol" msgstr "Poštovní protokol"
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:49 #: mailu/ui/templates/client.html:23 mailu/ui/templates/client.html:48
msgid "Server name" msgid "Server name"
msgstr "Název serveru" msgstr "Název serveru"
#: mailu/ui/templates/client.html:38 #: mailu/ui/templates/client.html:37
msgid "Outgoing mail" msgid "Outgoing mail"
msgstr "Odchozí pošta" msgstr "Odchozí pošta"
#: mailu/ui/templates/client.html:62
msgid "If you use an Apple device,"
msgstr "Pokud používáte zařízení Apple,"
#: mailu/ui/templates/client.html:63
msgid "click here to auto-configure it."
msgstr "klepněte zde pro automatické nastavení."
#: mailu/ui/templates/confirm.html:4 #: mailu/ui/templates/confirm.html:4
msgid "Confirm action" msgid "Confirm action"
msgstr "Potvrdit akci" msgstr "Potvrdit akci"
@@ -348,7 +418,7 @@ msgstr "Chyba Dockeru"
msgid "An error occurred while talking to the Docker server." msgid "An error occurred while talking to the Docker server."
msgstr "Při komunikaci se serverem Docker došlo k chybě." msgstr "Při komunikaci se serverem Docker došlo k chybě."
#: mailu/ui/templates/macros.html:129 #: mailu/ui/templates/macros.html:128
msgid "copy to clipboard" msgid "copy to clipboard"
msgstr "zkopírovat do schránky" msgstr "zkopírovat do schránky"
@@ -356,48 +426,48 @@ msgstr "zkopírovat do schránky"
msgid "My account" msgid "My account"
msgstr "Můj účet" msgstr "Můj účet"
#: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:37 #: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:36
msgid "Settings" msgid "Settings"
msgstr "Nastavení" msgstr "Nastavení"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:38 #: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:37
msgid "Auto-reply" msgid "Auto-reply"
msgstr "Automatická odpověď" msgstr "Automatická odpověď"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:37 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:38
#: mailu/ui/templates/user/list.html:39 #: mailu/ui/templates/user/list.html:39
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "Fetched účty" msgstr "Stažené účty"
#: mailu/ui/templates/sidebar.html:43 mailu/ui/templates/token/list.html:4 #: mailu/ui/templates/sidebar.html:45 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens" msgid "Authentication tokens"
msgstr "Autentizační tokeny" msgstr "Autentizační tokeny"
#: mailu/ui/templates/sidebar.html:56 #: mailu/ui/templates/sidebar.html:58
msgid "Administration" msgid "Administration"
msgstr "Administrace" msgstr "Administrace"
#: mailu/ui/templates/sidebar.html:62 #: mailu/ui/templates/sidebar.html:64
msgid "Announcement" msgid "Announcement"
msgstr "Oznámení" msgstr "Oznámení"
#: mailu/ui/templates/sidebar.html:68 #: mailu/ui/templates/sidebar.html:70
msgid "Administrators" msgid "Administrators"
msgstr "Administrátoři" msgstr "Administrátoři"
#: mailu/ui/templates/sidebar.html:74 #: mailu/ui/templates/sidebar.html:76
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Relayované domény" msgstr "Relayované domény"
#: mailu/ui/templates/sidebar.html:88 #: mailu/ui/templates/sidebar.html:90
msgid "Mail domains" msgid "Mail domains"
msgstr "Poštovní domény" msgstr "Poštovní domény"
#: mailu/ui/templates/sidebar.html:99 #: mailu/ui/templates/sidebar.html:101
msgid "Webmail" msgid "Webmail"
msgstr "Webmail" msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:135 #: mailu/ui/templates/sidebar.html:137
msgid "Sign out" msgid "Sign out"
msgstr "Odhlásit se" msgstr "Odhlásit se"
@@ -411,7 +481,7 @@ msgstr "Přidat globálního administrátora"
#: mailu/ui/templates/admin/list.html:4 #: mailu/ui/templates/admin/list.html:4
msgid "Global administrators" msgid "Global administrators"
msgstr "Globální administrátor" msgstr "Globální administrátoři"
#: mailu/ui/templates/admin/list.html:9 #: mailu/ui/templates/admin/list.html:9
msgid "Add administrator" msgid "Add administrator"
@@ -429,14 +499,20 @@ msgstr "Akce"
#: mailu/ui/templates/admin/list.html:18 mailu/ui/templates/alias/list.html:20 #: mailu/ui/templates/admin/list.html:18 mailu/ui/templates/alias/list.html:20
#: mailu/ui/templates/manager/list.html:20 mailu/ui/templates/user/list.html:21 #: mailu/ui/templates/manager/list.html:20 mailu/ui/templates/user/list.html:21
msgid "Email" msgid "Email"
msgstr "Email" msgstr "E-mail"
#: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:32 #: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:31
#: mailu/ui/templates/alternative/list.html:29 #: mailu/ui/templates/domain/list.html:35 mailu/ui/templates/fetch/list.html:35
#: mailu/ui/templates/domain/list.html:34 mailu/ui/templates/fetch/list.html:34
#: mailu/ui/templates/manager/list.html:27 #: mailu/ui/templates/manager/list.html:27
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:30 #: mailu/ui/templates/relay/list.html:29 mailu/ui/templates/user/list.html:33
#: mailu/ui/templates/user/list.html:34 msgid "Edit"
msgstr "Upravit"
#: mailu/ui/templates/admin/list.html:26 mailu/ui/templates/alias/list.html:32
#: mailu/ui/templates/alternative/list.html:29
#: mailu/ui/templates/domain/list.html:36 mailu/ui/templates/fetch/list.html:36
#: mailu/ui/templates/manager/list.html:28
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:31
msgid "Delete" msgid "Delete"
msgstr "Vymazat" msgstr "Vymazat"
@@ -458,26 +534,20 @@ msgstr "Přidat alias"
#: mailu/ui/templates/alias/list.html:23 #: mailu/ui/templates/alias/list.html:23
#: mailu/ui/templates/alternative/list.html:21 #: mailu/ui/templates/alternative/list.html:21
#: mailu/ui/templates/domain/list.html:23 mailu/ui/templates/fetch/list.html:25 #: mailu/ui/templates/domain/list.html:25 mailu/ui/templates/fetch/list.html:27
#: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:22 #: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:23
#: mailu/ui/templates/user/list.html:25 #: mailu/ui/templates/user/list.html:25
msgid "Created" msgid "Created"
msgstr "Vytvořeno" msgstr "Vytvořeno"
#: mailu/ui/templates/alias/list.html:24 #: mailu/ui/templates/alias/list.html:24
#: mailu/ui/templates/alternative/list.html:22 #: mailu/ui/templates/alternative/list.html:22
#: mailu/ui/templates/domain/list.html:24 mailu/ui/templates/fetch/list.html:26 #: mailu/ui/templates/domain/list.html:26 mailu/ui/templates/fetch/list.html:28
#: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:23 #: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:24
#: mailu/ui/templates/user/list.html:26 #: mailu/ui/templates/user/list.html:26
msgid "Last edit" msgid "Last edit"
msgstr "Poslední úprava" msgstr "Poslední úprava"
#: mailu/ui/templates/alias/list.html:31 mailu/ui/templates/domain/list.html:33
#: mailu/ui/templates/fetch/list.html:33 mailu/ui/templates/relay/list.html:29
#: mailu/ui/templates/user/list.html:33
msgid "Edit"
msgstr "Upravit"
#: mailu/ui/templates/alternative/create.html:4 #: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain" msgid "Create alternative domain"
msgstr "Vytvořit alternativní doménu" msgstr "Vytvořit alternativní doménu"
@@ -511,6 +581,10 @@ msgstr "Obnovit klíče"
msgid "Generate keys" msgid "Generate keys"
msgstr "Generovat klíče" msgstr "Generovat klíče"
#: mailu/ui/templates/domain/details.html:19
msgid "Download zonefile"
msgstr "Stáhnout zonefile"
#: mailu/ui/templates/domain/details.html:30 #: mailu/ui/templates/domain/details.html:30
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "Záznam DNS MX" msgstr "Záznam DNS MX"
@@ -520,24 +594,20 @@ msgid "DNS SPF entries"
msgstr "Záznamy DNS SPF" msgstr "Záznamy DNS SPF"
#: mailu/ui/templates/domain/details.html:40 #: mailu/ui/templates/domain/details.html:40
msgid "DKIM public key"
msgstr "Veřejný klíč DKIM"
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "Záznam DNS DKIM" msgstr "Záznam DNS DKIM"
#: mailu/ui/templates/domain/details.html:48 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "Záznam DNS DMARC" msgstr "Záznam DNS DMARC"
#: mailu/ui/templates/domain/details.html:58 #: mailu/ui/templates/domain/details.html:53
msgid "DNS TLSA entry" msgid "DNS TLSA entry"
msgstr "Záznam DNS TLSA" msgstr "Záznam DNS TLSA"
#: mailu/ui/templates/domain/details.html:63 #: mailu/ui/templates/domain/details.html:58
msgid "DNS client auto-configuration entries" msgid "DNS client auto-configuration entries"
msgstr "Položky automatické konfigurace klienta DNS" msgstr "Položky automatického nastavení klienta DNS"
#: mailu/ui/templates/domain/edit.html:4 #: mailu/ui/templates/domain/edit.html:4
msgid "Edit domain" msgid "Edit domain"
@@ -559,25 +629,35 @@ msgstr "Počet poštovních schránek"
msgid "Alias count" msgid "Alias count"
msgstr "Počet aliasů" msgstr "Počet aliasů"
#: mailu/ui/templates/domain/list.html:31 #: mailu/ui/templates/domain/list.html:33
msgid "Details" msgid "Details"
msgstr "Podrobnosti" msgstr "Podrobnosti"
#: mailu/ui/templates/domain/list.html:38
msgid "Users"
msgstr "Uživatelů"
#: mailu/ui/templates/domain/list.html:39
msgid "Aliases"
msgstr "Aliasů"
#: mailu/ui/templates/domain/list.html:40 #: mailu/ui/templates/domain/list.html:40
msgid "Managers" msgid "Users"
msgstr "Manažerů" msgstr "Uživatelé"
#: mailu/ui/templates/domain/list.html:41
msgid "Aliases"
msgstr "Aliasy"
#: mailu/ui/templates/domain/list.html:42 #: mailu/ui/templates/domain/list.html:42
msgid "Managers"
msgstr "Manažeři"
#: mailu/ui/templates/domain/list.html:44
msgid "Alternatives" msgid "Alternatives"
msgstr "Alternativ" msgstr "Alternativy"
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "yes"
msgstr "ano"
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "no"
msgstr "ne"
#: mailu/ui/templates/domain/signup.html:13 #: mailu/ui/templates/domain/signup.html:13
msgid "" msgid ""
@@ -585,7 +665,7 @@ msgid ""
" domain zone so that the domain <code>MX</code> points to this server" " domain zone so that the domain <code>MX</code> points to this server"
msgstr "" msgstr ""
"Chcete-li zaregistrovat novou doménu, musíte nejprve nastavit\n" "Chcete-li zaregistrovat novou doménu, musíte nejprve nastavit\n"
" zónu domény tak, aby doménový <code>MX</code> záznam ukazovala na tento " " zónu domény tak, aby doménový <code>MX</code> záznam odkazoval na tento "
"server" "server"
#: mailu/ui/templates/domain/signup.html:18 #: mailu/ui/templates/domain/signup.html:18
@@ -598,19 +678,18 @@ msgid ""
" expires." " expires."
msgstr "" msgstr ""
"Pokud nevíte, jak nastavit <code>MX</code> záznam pro zónu DNS,\n" "Pokud nevíte, jak nastavit <code>MX</code> záznam pro zónu DNS,\n"
" kontaktujte svého poskytovatele DNS nebo správce. Také prosím počkejte " " kontaktujte svého poskytovatele DNS nebo správce. Dále prosím počkejte\n"
"a\n" " několik minut po nastavení <code>MX</code> záznamu, aby se vymazal z "
" několik minut po <code>MX</code> tak, aby vypršela v mezipaměti " "mezipaměti\n"
"místního\n" " místního serveru."
" serveru."
#: mailu/ui/templates/fetch/create.html:4 #: mailu/ui/templates/fetch/create.html:4
msgid "Add a fetched account" msgid "Add a fetched account"
msgstr "Přidejte fetched účet" msgstr "Přidejte stanovaný účet"
#: mailu/ui/templates/fetch/edit.html:4 #: mailu/ui/templates/fetch/edit.html:4
msgid "Update a fetched account" msgid "Update a fetched account"
msgstr "Aktualizujte fetched účet" msgstr "Aktualizujte stahovaný účet"
#: mailu/ui/templates/fetch/list.html:12 #: mailu/ui/templates/fetch/list.html:12
msgid "Add an account" msgid "Add an account"
@@ -622,23 +701,23 @@ msgstr "Koncový bod"
#: mailu/ui/templates/fetch/list.html:22 #: mailu/ui/templates/fetch/list.html:22
msgid "Keep emails" msgid "Keep emails"
msgstr "Zachovat emaily" msgstr "Ponechat e-maily"
#: mailu/ui/templates/fetch/list.html:23 #: mailu/ui/templates/fetch/list.html:23
msgid "Rescan emails"
msgstr "Přeskenovat e-maily"
#: mailu/ui/templates/fetch/list.html:24
msgid "Folders"
msgstr "Složky"
#: mailu/ui/templates/fetch/list.html:25
msgid "Last check" msgid "Last check"
msgstr "Poslední kontrola" msgstr "Poslední kontrola"
#: mailu/ui/templates/fetch/list.html:24 #: mailu/ui/templates/fetch/list.html:26
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Stav"
#: mailu/ui/templates/fetch/list.html:38
msgid "yes"
msgstr "ano"
#: mailu/ui/templates/fetch/list.html:38
msgid "no"
msgstr "ne"
#: mailu/ui/templates/manager/create.html:4 #: mailu/ui/templates/manager/create.html:4
msgid "Add a manager" msgid "Add a manager"
@@ -676,15 +755,19 @@ msgstr "Vytvořit ověřovací token"
msgid "New token" msgid "New token"
msgstr "Nový token" msgstr "Nový token"
#: mailu/ui/templates/token/list.html:20
msgid "ID"
msgstr "ID"
#: mailu/ui/templates/user/create.html:4 #: mailu/ui/templates/user/create.html:4
msgid "New user" msgid "New user"
msgstr "Nový uživatel" msgstr "Nový uživatel"
#: mailu/ui/templates/user/create.html:15 #: mailu/ui/templates/user/create.html:15
msgid "General" msgid "General"
msgstr "Všeobecné" msgstr "Obecné"
#: mailu/ui/templates/user/create.html:23 #: mailu/ui/templates/user/create.html:24
msgid "Features and quotas" msgid "Features and quotas"
msgstr "Funkce a kvóty" msgstr "Funkce a kvóty"
@@ -724,10 +807,13 @@ msgstr "Automatické přeposlání"
msgid "pick a domain for the new account" msgid "pick a domain for the new account"
msgstr "vybrat doménu pro nový účet" msgstr "vybrat doménu pro nový účet"
#: mailu/ui/templates/user/signup_domain.html:14 #: mailu/ui/templates/user/signup_domain.html:15
msgid "Domain" msgid "Domain"
msgstr "Doména" msgstr "Doména"
#: mailu/ui/templates/user/signup_domain.html:15 #: mailu/ui/templates/user/signup_domain.html:16
msgid "Available slots" msgid "Available slots"
msgstr "Dostupných slotů" msgstr "Dostupné sloty"
#~ msgid "DKIM public key"
#~ msgstr "Veřejný klíč DKIM"

View File

@@ -3,33 +3,49 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Mailu\n" "Project-Id-Version: Mailu\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-05-22 18:47+0200\n" "POT-Creation-Date: 2024-06-20 12:30+0000\n"
"PO-Revision-Date: 2021-03-04 18:46+0000\n" "PO-Revision-Date: 2021-03-04 18:46+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n" "Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language: de\n" "Language: de\n"
"Language-Team: German " "Language-Team: German "
"<https://translate.tedomum.net/projects/mailu/admin/de/>\n" "<https://translate.tedomum.net/projects/mailu/admin/de/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n" "Generated-By: Babel 2.15.0\n"
#: mailu/sso/forms.py:8 mailu/ui/forms.py:79 #: mailu/sso/forms.py:8 mailu/ui/forms.py:91
msgid "E-mail" msgid "E-mail"
msgstr "E-Mail" msgstr "E-Mail"
#: mailu/sso/forms.py:9 mailu/ui/forms.py:80 mailu/ui/forms.py:93 #: mailu/sso/forms.py:9 mailu/ui/forms.py:92 mailu/ui/forms.py:108
#: mailu/ui/forms.py:112 mailu/ui/forms.py:166 #: mailu/ui/forms.py:128 mailu/ui/forms.py:135 mailu/ui/forms.py:197
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:57 #: mailu/ui/templates/client.html:31 mailu/ui/templates/client.html:56
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
#: mailu/sso/forms.py:10 mailu/sso/forms.py:11 mailu/sso/templates/login.html:4 #: mailu/sso/forms.py:11 mailu/sso/forms.py:12 mailu/sso/templates/login.html:4
#: mailu/ui/templates/sidebar.html:142 #: mailu/sso/templates/sidebar_sso.html:42 mailu/ui/templates/sidebar.html:144
msgid "Sign in" msgid "Sign in"
msgstr "Anmelden" msgstr "Anmelden"
#: mailu/sso/forms.py:15 mailu/ui/forms.py:134
msgid "Current password"
msgstr "Aktuelles Passwort"
#: mailu/sso/forms.py:16
msgid "New password"
msgstr "Neues Passwort"
#: mailu/sso/forms.py:17
msgid "New password (again)"
msgstr "Passwort wiederholen"
#: mailu/sso/forms.py:19
msgid "Change password"
msgstr "Passwort ändern"
#: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8 #: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8
msgid "Admin page for" msgid "Admin page for"
msgstr "Administration für" msgstr "Administration für"
@@ -42,255 +58,301 @@ msgstr "Seitenleiste ein-/ausklapen"
msgid "change language" msgid "change language"
msgstr "Sprachauswahl" msgstr "Sprachauswahl"
#: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:94 #: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:96
msgid "Go to" msgid "Go to"
msgstr "Wechseln zu" msgstr "Wechseln zu"
#: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4 #: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4
#: mailu/ui/templates/sidebar.html:50 mailu/ui/templates/sidebar.html:107 #: mailu/ui/templates/sidebar.html:52 mailu/ui/templates/sidebar.html:109
msgid "Client setup" msgid "Client setup"
msgstr "Client Einrichtung" msgstr "Client Einrichtung"
#: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:114 #: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:116
msgid "Website" msgid "Website"
msgstr "Webseite" msgstr "Webseite"
#: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:120 #: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:122
msgid "Help" msgid "Help"
msgstr "Hilfe" msgstr "Hilfe"
#: mailu/sso/templates/sidebar_sso.html:35 #: mailu/sso/templates/sidebar_sso.html:35
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:127 #: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:129
msgid "Register a domain" msgid "Register a domain"
msgstr "Regestrieren Sie eine Domain" msgstr "Regestrieren Sie eine Domain"
#: mailu/sso/templates/sidebar_sso.html:49 mailu/ui/forms.py:95 #: mailu/sso/templates/sidebar_sso.html:55 mailu/ui/forms.py:111
#: mailu/ui/templates/sidebar.html:149 mailu/ui/templates/user/signup.html:4 #: mailu/ui/templates/sidebar.html:151 mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4 #: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up" msgid "Sign up"
msgstr "Registrieren" msgstr "Registrieren"
#: mailu/ui/forms.py:33 mailu/ui/forms.py:36 #: mailu/sso/views/base.py:48
msgid "Too many attempts from your IP (rate-limit)"
msgstr "Zu viele Versuche von Ihrer IP (Rate-Limit)"
#: mailu/sso/views/base.py:51
msgid "Too many attempts for this user (rate-limit)"
msgstr "Zu viele Versuche für diesen Benutzer (Rate-Limit)"
#: mailu/sso/views/base.py:69
msgid "Wrong e-mail or password"
msgstr "Falsche E-Mail oder Passwort"
#: mailu/sso/views/base.py:85
msgid "The new password can't be the same as the old password"
msgstr "Das neue Passwort darf nicht mit dem alten Passwort übereinstimmen"
#: mailu/sso/views/base.py:88
msgid "The new passwords don't match"
msgstr "Die neuen Passwörter stimmen nicht überein"
#: mailu/sso/views/base.py:100
msgid "The current password is incorrect!"
msgstr "Das aktuelle Passwort ist falsch!"
#: mailu/ui/forms.py:34 mailu/ui/forms.py:37
msgid "Invalid email address." msgid "Invalid email address."
msgstr "Ungültige E-Mail-Adresse." msgstr "Ungültige E-Mail-Adresse."
#: mailu/ui/forms.py:45 #: mailu/ui/forms.py:47
msgid "Invalid list of folders."
msgstr "Ungültige Ordnerliste."
#: mailu/ui/forms.py:56
msgid "Confirm" msgid "Confirm"
msgstr "Bestätigen" msgstr "Bestätigen"
#: mailu/ui/forms.py:48 mailu/ui/forms.py:58 #: mailu/ui/forms.py:59 mailu/ui/forms.py:69
#: mailu/ui/templates/domain/details.html:26 #: mailu/ui/templates/domain/details.html:26
#: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18 #: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18
msgid "Domain name" msgid "Domain name"
msgstr "Domain-Name" msgstr "Domain-Name"
#: mailu/ui/forms.py:49 #: mailu/ui/forms.py:60
msgid "Maximum user count" msgid "Maximum user count"
msgstr "Maximale Anzahl Benutzer" msgstr "Maximale Anzahl Benutzer"
#: mailu/ui/forms.py:50 #: mailu/ui/forms.py:61
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "Maximale Anzahl Aliase" msgstr "Maximale Anzahl Aliase"
#: mailu/ui/forms.py:51 #: mailu/ui/forms.py:62
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Maximale Quota pro Benutzer" msgstr "Maximale Quota pro Benutzer"
#: mailu/ui/forms.py:52 #: mailu/ui/forms.py:63 mailu/ui/templates/domain/list.html:24
msgid "Enable sign-up" msgid "Enable sign-up"
msgstr "Neuanmeldung erlauben" msgstr "Neuanmeldung erlauben"
#: mailu/ui/forms.py:53 mailu/ui/forms.py:74 mailu/ui/forms.py:86 #: mailu/ui/forms.py:64 mailu/ui/forms.py:86 mailu/ui/forms.py:100
#: mailu/ui/forms.py:132 mailu/ui/forms.py:144 #: mailu/ui/forms.py:155 mailu/ui/forms.py:175
#: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:22 #: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:23
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:20 #: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
#: mailu/ui/templates/user/list.html:24 #: mailu/ui/templates/user/list.html:24
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: mailu/ui/forms.py:54 mailu/ui/forms.py:68 mailu/ui/forms.py:75 #: mailu/ui/forms.py:65 mailu/ui/forms.py:80 mailu/ui/forms.py:87
#: mailu/ui/forms.py:88 mailu/ui/forms.py:136 mailu/ui/forms.py:145 #: mailu/ui/forms.py:103 mailu/ui/forms.py:159 mailu/ui/forms.py:176
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
#: mailu/ui/forms.py:59 #: mailu/ui/forms.py:70
msgid "Initial admin" msgid "Initial admin"
msgstr "Initiale Admin-Adresse" msgstr "Initiale Admin-Adresse"
#: mailu/ui/forms.py:60 #: mailu/ui/forms.py:71
msgid "Admin password" msgid "Admin password"
msgstr "Administrator Passwort" msgstr "Administrator Passwort"
#: mailu/ui/forms.py:61 mailu/ui/forms.py:81 mailu/ui/forms.py:94 #: mailu/ui/forms.py:72 mailu/ui/forms.py:93 mailu/ui/forms.py:109
msgid "Confirm password" msgid "Confirm password"
msgstr "Passwort bestätigen" msgstr "Passwort bestätigen"
#: mailu/ui/forms.py:63 #: mailu/ui/forms.py:75
msgid "Create" msgid "Create"
msgstr "Erstellen" msgstr "Erstellen"
#: mailu/ui/forms.py:67 #: mailu/ui/forms.py:79
msgid "Alternative name" msgid "Alternative name"
msgstr "Alternativer Name" msgstr "Alternativer Name"
#: mailu/ui/forms.py:72 #: mailu/ui/forms.py:84
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "Relay-Domain-Name" msgstr "Relay-Domain-Name"
#: mailu/ui/forms.py:73 mailu/ui/templates/relay/list.html:19 #: mailu/ui/forms.py:85 mailu/ui/templates/relay/list.html:19
msgid "Remote host" msgid "Remote host"
msgstr "Entfernter Host" msgstr "Entfernter Host"
#: mailu/ui/forms.py:82 mailu/ui/templates/user/list.html:23 #: mailu/ui/forms.py:95 mailu/ui/templates/domain/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16 #: mailu/ui/templates/user/list.html:23
#: mailu/ui/templates/user/signup_domain.html:17
msgid "Quota" msgid "Quota"
msgstr "Kontingent" msgstr "Kontingent"
#: mailu/ui/forms.py:83 #: mailu/ui/forms.py:96
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Zugriff via IMAP erlauben" msgstr "Zugriff via IMAP erlauben"
#: mailu/ui/forms.py:84 #: mailu/ui/forms.py:97
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Zugriff via POP3 erlauben" msgstr "Zugriff via POP3 erlauben"
#: mailu/ui/forms.py:85 mailu/ui/forms.py:101 #: mailu/ui/forms.py:98
msgid "Allow the user to spoof the sender (send email as anyone)"
msgstr "Dem Benutzer ermöglichen, den Absender zu fälschen (E-Mail als jedermann senden)"
#: mailu/ui/forms.py:99 mailu/ui/forms.py:117
#: mailu/ui/templates/user/settings.html:15 #: mailu/ui/templates/user/settings.html:15
msgid "Displayed name" msgid "Displayed name"
msgstr "Angezeigter Name" msgstr "Angezeigter Name"
#: mailu/ui/forms.py:87 #: mailu/ui/forms.py:101
msgid "Enabled" msgid "Enabled"
msgstr "Aktiv" msgstr "Aktiv"
#: mailu/ui/forms.py:92 #: mailu/ui/forms.py:102
msgid "Force password change at next login"
msgstr "Kennwortänderung bei der nächsten Anmeldung erzwingen"
#: mailu/ui/forms.py:107
msgid "Email address" msgid "Email address"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"
#: mailu/ui/forms.py:102 #: mailu/ui/forms.py:118
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Spamfilter aktivieren" msgstr "Spamfilter aktivieren"
#: mailu/ui/forms.py:103 #: mailu/ui/forms.py:119
msgid "Enable marking spam mails as read" msgid "Enable marking spam mails as read"
msgstr "Spam automatisch als gelesen markieren" msgstr "Spam automatisch als gelesen markieren"
#: mailu/ui/forms.py:104 #: mailu/ui/forms.py:120
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "Spamfilter-Grenzwert" msgstr "Spamfilter-Grenzwert"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:121
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Weiterleitung aktivieren" msgstr "Weiterleitung aktivieren"
#: mailu/ui/forms.py:106 #: mailu/ui/forms.py:122
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Kopie der E-Mails behalten" msgstr "Kopie der E-Mails behalten"
#: mailu/ui/forms.py:107 mailu/ui/forms.py:143 #: mailu/ui/forms.py:123 mailu/ui/forms.py:174
#: mailu/ui/templates/alias/list.html:21 #: mailu/ui/templates/alias/list.html:21
msgid "Destination" msgid "Destination"
msgstr "Ziel" msgstr "Ziel"
#: mailu/ui/forms.py:108 #: mailu/ui/forms.py:124
msgid "Save settings" msgid "Save settings"
msgstr "Einstellungen speichern" msgstr "Einstellungen speichern"
#: mailu/ui/forms.py:113 #: mailu/ui/forms.py:129 mailu/ui/forms.py:136
msgid "Password check" msgid "Password check"
msgstr "Passwort wiederholen" msgstr "Passwort wiederholen"
#: mailu/ui/forms.py:114 mailu/ui/templates/sidebar.html:25 #: mailu/ui/forms.py:131 mailu/ui/forms.py:138
#: mailu/ui/templates/sidebar.html:25
msgid "Update password" msgid "Update password"
msgstr "Passwort aktualisieren" msgstr "Passwort aktualisieren"
#: mailu/ui/forms.py:118 #: mailu/ui/forms.py:141
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Automatische Antwort aktivieren" msgstr "Automatische Antwort aktivieren"
#: mailu/ui/forms.py:119 #: mailu/ui/forms.py:142
msgid "Reply subject" msgid "Reply subject"
msgstr "Betreff" msgstr "Betreff"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:143
msgid "Reply body" msgid "Reply body"
msgstr "Text" msgstr "Text"
#: mailu/ui/forms.py:122 #: mailu/ui/forms.py:145
msgid "Start of vacation" msgid "Start of vacation"
msgstr "Beginn der Abwesenheit" msgstr "Beginn der Abwesenheit"
#: mailu/ui/forms.py:123 #: mailu/ui/forms.py:146
msgid "End of vacation" msgid "End of vacation"
msgstr "Ende der Abwesenheit" msgstr "Ende der Abwesenheit"
#: mailu/ui/forms.py:124 #: mailu/ui/forms.py:147
msgid "Update" msgid "Update"
msgstr "Aktualisieren" msgstr "Aktualisieren"
#: mailu/ui/forms.py:129 #: mailu/ui/forms.py:152
msgid "Your token (write it down, as it will never be displayed again)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Token (bitte speichern, da er hier nach nicht mehr angezeigt wird)" msgstr "Token (bitte speichern, da er hier nach nicht mehr angezeigt wird)"
#: mailu/ui/forms.py:134 mailu/ui/templates/token/list.html:21 #: mailu/ui/forms.py:157 mailu/ui/templates/token/list.html:22
msgid "Authorized IP" msgid "Authorized IP"
msgstr "Authorisierte IP-Adresse" msgstr "Authorisierte IP-Adresse"
#: mailu/ui/forms.py:140 #: mailu/ui/forms.py:171
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:142 #: mailu/ui/forms.py:173
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "SQL LIKE Syntax nutzen (z.B. für Catch-All-Aliase)" msgstr "SQL LIKE Syntax nutzen (z.B. für Catch-All-Aliase)"
#: mailu/ui/forms.py:149 #: mailu/ui/forms.py:180
msgid "Admin email" msgid "Admin email"
msgstr "Administrator E-Mail" msgstr "Administrator E-Mail"
#: mailu/ui/forms.py:150 mailu/ui/forms.py:155 mailu/ui/forms.py:168 #: mailu/ui/forms.py:181 mailu/ui/forms.py:186 mailu/ui/forms.py:201
msgid "Submit" msgid "Submit"
msgstr "Absenden" msgstr "Absenden"
#: mailu/ui/forms.py:154 #: mailu/ui/forms.py:185
msgid "Manager email" msgid "Manager email"
msgstr "Manager E-Mail" msgstr "Manager E-Mail"
#: mailu/ui/forms.py:159 #: mailu/ui/forms.py:190
msgid "Protocol" msgid "Protocol"
msgstr "Protokoll" msgstr "Protokoll"
#: mailu/ui/forms.py:162 #: mailu/ui/forms.py:193
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Hostname oder IP" msgstr "Hostname oder IP"
#: mailu/ui/forms.py:163 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:194 mailu/ui/templates/client.html:19
#: mailu/ui/templates/client.html:45 #: mailu/ui/templates/client.html:44
msgid "TCP port" msgid "TCP port"
msgstr "TCP Port" msgstr "TCP Port"
#: mailu/ui/forms.py:164 #: mailu/ui/forms.py:195
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Verschlüsselung aktivieren (TLS)" msgstr "Verschlüsselung aktivieren (TLS)"
#: mailu/ui/forms.py:165 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:196 mailu/ui/templates/client.html:27
#: mailu/ui/templates/client.html:53 mailu/ui/templates/fetch/list.html:21 #: mailu/ui/templates/client.html:52 mailu/ui/templates/fetch/list.html:21
msgid "Username" msgid "Username"
msgstr "Benutzername" msgstr "Benutzername"
#: mailu/ui/forms.py:167 #: mailu/ui/forms.py:198
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "E-Mails auf dem Server belassen" msgstr "E-Mails auf dem Server belassen"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:199
msgid "Rescan emails locally"
msgstr "E-Mails lokal erneut scannen"
#: mailu/ui/forms.py:200
msgid "Folders to fetch on the server"
msgstr "Auf dem Server abzurufende Ordner"
#: mailu/ui/forms.py:205
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Betreff" msgstr "Betreff"
#: mailu/ui/forms.py:174 #: mailu/ui/forms.py:207
msgid "Announcement body" msgid "Announcement body"
msgstr "Text" msgstr "Text"
#: mailu/ui/forms.py:176 #: mailu/ui/forms.py:209
msgid "Send" msgid "Send"
msgstr "Absenden" msgstr "Absenden"
@@ -298,7 +360,7 @@ msgstr "Absenden"
msgid "Public announcement" msgid "Public announcement"
msgstr "Öffentliche Bekanntmachung" msgstr "Öffentliche Bekanntmachung"
#: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:80 #: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:82
#: mailu/ui/templates/user/settings.html:19 #: mailu/ui/templates/user/settings.html:19
msgid "Antispam" msgid "Antispam"
msgstr "Antispam" msgstr "Antispam"
@@ -307,6 +369,26 @@ msgstr "Antispam"
msgid "RSPAMD status page" msgid "RSPAMD status page"
msgstr "RSPAMD Statusseite" msgstr "RSPAMD Statusseite"
#: mailu/ui/templates/client.html:8
msgid "configure your email client"
msgstr "Informationen zur Einrichtung Ihres Email-Clients"
#: mailu/ui/templates/client.html:12
msgid "Incoming mail"
msgstr "E-Mail-Empfang"
#: mailu/ui/templates/client.html:15 mailu/ui/templates/client.html:40
msgid "Mail protocol"
msgstr "E-Mail-Protokoll"
#: mailu/ui/templates/client.html:23 mailu/ui/templates/client.html:48
msgid "Server name"
msgstr "Servername"
#: mailu/ui/templates/client.html:37
msgid "Outgoing mail"
msgstr "E-Mail-Versand"
#: mailu/ui/templates/client.html:62 #: mailu/ui/templates/client.html:62
msgid "If you use an Apple device," msgid "If you use an Apple device,"
msgstr "Falls es sich um ein Apple-Gerät handelt," msgstr "Falls es sich um ein Apple-Gerät handelt,"
@@ -315,26 +397,6 @@ msgstr "Falls es sich um ein Apple-Gerät handelt,"
msgid "click here to auto-configure it." msgid "click here to auto-configure it."
msgstr "kann dieses hier automatisch eingerichtet werden." msgstr "kann dieses hier automatisch eingerichtet werden."
#: mailu/ui/templates/client.html:8
msgid "configure your email client"
msgstr "Informationen zur Einrichtung Ihres Email-Clients"
#: mailu/ui/templates/client.html:13
msgid "Incoming mail"
msgstr "E-Mail-Empfang"
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:41
msgid "Mail protocol"
msgstr "E-Mail-Protokoll"
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:49
msgid "Server name"
msgstr "Servername"
#: mailu/ui/templates/client.html:38
msgid "Outgoing mail"
msgstr "E-Mail-Versand"
#: mailu/ui/templates/confirm.html:4 #: mailu/ui/templates/confirm.html:4
msgid "Confirm action" msgid "Confirm action"
msgstr "Aktion bestätigen" msgstr "Aktion bestätigen"
@@ -354,7 +416,7 @@ msgstr ""
"Während der Kommunikation mit dem Docker Server ist ein Fehler " "Während der Kommunikation mit dem Docker Server ist ein Fehler "
"aufgetreten." "aufgetreten."
#: mailu/ui/templates/macros.html:129 #: mailu/ui/templates/macros.html:128
msgid "copy to clipboard" msgid "copy to clipboard"
msgstr "In Zwischenablage kopieren" msgstr "In Zwischenablage kopieren"
@@ -362,48 +424,48 @@ msgstr "In Zwischenablage kopieren"
msgid "My account" msgid "My account"
msgstr "Mein Konto" msgstr "Mein Konto"
#: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:37 #: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:36
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:38 #: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:37
msgid "Auto-reply" msgid "Auto-reply"
msgstr "Auto-Antwort" msgstr "Auto-Antwort"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:37 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:38
#: mailu/ui/templates/user/list.html:39 #: mailu/ui/templates/user/list.html:39
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "Abgerufene Konten" msgstr "Abgerufene Konten"
#: mailu/ui/templates/sidebar.html:43 mailu/ui/templates/token/list.html:4 #: mailu/ui/templates/sidebar.html:45 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens" msgid "Authentication tokens"
msgstr "Authentifizierungs-Tokens" msgstr "Authentifizierungs-Tokens"
#: mailu/ui/templates/sidebar.html:56 #: mailu/ui/templates/sidebar.html:58
msgid "Administration" msgid "Administration"
msgstr "Administration" msgstr "Administration"
#: mailu/ui/templates/sidebar.html:62 #: mailu/ui/templates/sidebar.html:64
msgid "Announcement" msgid "Announcement"
msgstr "Bekanntmachung" msgstr "Bekanntmachung"
#: mailu/ui/templates/sidebar.html:68 #: mailu/ui/templates/sidebar.html:70
msgid "Administrators" msgid "Administrators"
msgstr "Administratoren" msgstr "Administratoren"
#: mailu/ui/templates/sidebar.html:74 #: mailu/ui/templates/sidebar.html:76
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Relay-Domains" msgstr "Relay-Domains"
#: mailu/ui/templates/sidebar.html:88 #: mailu/ui/templates/sidebar.html:90
msgid "Mail domains" msgid "Mail domains"
msgstr "E-Mail-Domains" msgstr "E-Mail-Domains"
#: mailu/ui/templates/sidebar.html:99 #: mailu/ui/templates/sidebar.html:101
msgid "Webmail" msgid "Webmail"
msgstr "Webmail" msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:135 #: mailu/ui/templates/sidebar.html:137
msgid "Sign out" msgid "Sign out"
msgstr "Abmelden" msgstr "Abmelden"
@@ -437,12 +499,18 @@ msgstr "Aktionen"
msgid "Email" msgid "Email"
msgstr "E-Mail" msgstr "E-Mail"
#: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:32 #: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:31
#: mailu/ui/templates/alternative/list.html:29 #: mailu/ui/templates/domain/list.html:35 mailu/ui/templates/fetch/list.html:35
#: mailu/ui/templates/domain/list.html:34 mailu/ui/templates/fetch/list.html:34
#: mailu/ui/templates/manager/list.html:27 #: mailu/ui/templates/manager/list.html:27
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:30 #: mailu/ui/templates/relay/list.html:29 mailu/ui/templates/user/list.html:33
#: mailu/ui/templates/user/list.html:34 msgid "Edit"
msgstr "Bearbeiten"
#: mailu/ui/templates/admin/list.html:26 mailu/ui/templates/alias/list.html:32
#: mailu/ui/templates/alternative/list.html:29
#: mailu/ui/templates/domain/list.html:36 mailu/ui/templates/fetch/list.html:36
#: mailu/ui/templates/manager/list.html:28
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:31
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
@@ -464,26 +532,20 @@ msgstr "Alias hinzufügen"
#: mailu/ui/templates/alias/list.html:23 #: mailu/ui/templates/alias/list.html:23
#: mailu/ui/templates/alternative/list.html:21 #: mailu/ui/templates/alternative/list.html:21
#: mailu/ui/templates/domain/list.html:23 mailu/ui/templates/fetch/list.html:25 #: mailu/ui/templates/domain/list.html:25 mailu/ui/templates/fetch/list.html:27
#: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:22 #: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:23
#: mailu/ui/templates/user/list.html:25 #: mailu/ui/templates/user/list.html:25
msgid "Created" msgid "Created"
msgstr "Erstellt" msgstr "Erstellt"
#: mailu/ui/templates/alias/list.html:24 #: mailu/ui/templates/alias/list.html:24
#: mailu/ui/templates/alternative/list.html:22 #: mailu/ui/templates/alternative/list.html:22
#: mailu/ui/templates/domain/list.html:24 mailu/ui/templates/fetch/list.html:26 #: mailu/ui/templates/domain/list.html:26 mailu/ui/templates/fetch/list.html:28
#: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:23 #: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:24
#: mailu/ui/templates/user/list.html:26 #: mailu/ui/templates/user/list.html:26
msgid "Last edit" msgid "Last edit"
msgstr "Zuletzt bearbeitet" msgstr "Zuletzt bearbeitet"
#: mailu/ui/templates/alias/list.html:31 mailu/ui/templates/domain/list.html:33
#: mailu/ui/templates/fetch/list.html:33 mailu/ui/templates/relay/list.html:29
#: mailu/ui/templates/user/list.html:33
msgid "Edit"
msgstr "Bearbeiten"
#: mailu/ui/templates/alternative/create.html:4 #: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain" msgid "Create alternative domain"
msgstr "Alternative Domain erstellen" msgstr "Alternative Domain erstellen"
@@ -517,6 +579,10 @@ msgstr "Schlüssel neu erzeugen"
msgid "Generate keys" msgid "Generate keys"
msgstr "Schlüssel erzeugen" msgstr "Schlüssel erzeugen"
#: mailu/ui/templates/domain/details.html:19
msgid "Download zonefile"
msgstr "Zonefile herunterladen"
#: mailu/ui/templates/domain/details.html:30 #: mailu/ui/templates/domain/details.html:30
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "DNS MX Eintrag" msgstr "DNS MX Eintrag"
@@ -526,25 +592,25 @@ msgid "DNS SPF entries"
msgstr "DNS SPF Einträge" msgstr "DNS SPF Einträge"
#: mailu/ui/templates/domain/details.html:40 #: mailu/ui/templates/domain/details.html:40
msgid "DKIM public key"
msgstr "DKIM öffentlicher Schlüssel"
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "DNS DKIM Eintrag" msgstr "DNS DKIM Eintrag"
#: mailu/ui/templates/domain/details.html:48 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "DNS DMARC Eintrag" msgstr "DNS DMARC Eintrag"
#: mailu/ui/templates/domain/details.html:58 #: mailu/ui/templates/domain/details.html:53
msgid "DNS TLSA entry" msgid "DNS TLSA entry"
msgstr "DNS TLSA Eintrag" msgstr "DNS TLSA Eintrag"
#: mailu/ui/templates/domain/details.html:63 #: mailu/ui/templates/domain/details.html:58
msgid "DNS client auto-configuration entries" msgid "DNS client auto-configuration entries"
msgstr "DNS Einträge für die automatische Client-Konfiguration" msgstr "DNS Einträge für die automatische Client-Konfiguration"
#: mailu/ui/templates/domain/details.html:71
msgid "Alternative Domain name"
msgstr "Alternativer Domain Name"
#: mailu/ui/templates/domain/edit.html:4 #: mailu/ui/templates/domain/edit.html:4
msgid "Edit domain" msgid "Edit domain"
msgstr "Domain bearbeiten" msgstr "Domain bearbeiten"
@@ -565,26 +631,36 @@ msgstr "Anzahl Mailboxen"
msgid "Alias count" msgid "Alias count"
msgstr "Anzahl Aliase" msgstr "Anzahl Aliase"
#: mailu/ui/templates/domain/list.html:31 #: mailu/ui/templates/domain/list.html:33
msgid "Details" msgid "Details"
msgstr "Details" msgstr "Details"
#: mailu/ui/templates/domain/list.html:38 #: mailu/ui/templates/domain/list.html:40
msgid "Users" msgid "Users"
msgstr "Benutzer" msgstr "Benutzer"
#: mailu/ui/templates/domain/list.html:39 #: mailu/ui/templates/domain/list.html:41
msgid "Aliases" msgid "Aliases"
msgstr "Aliase" msgstr "Aliase"
#: mailu/ui/templates/domain/list.html:40 #: mailu/ui/templates/domain/list.html:42
msgid "Managers" msgid "Managers"
msgstr "Manager" msgstr "Manager"
#: mailu/ui/templates/domain/list.html:42 #: mailu/ui/templates/domain/list.html:44
msgid "Alternatives" msgid "Alternatives"
msgstr "Alternativen" msgstr "Alternativen"
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "yes"
msgstr "ja"
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "no"
msgstr "nein"
#: mailu/ui/templates/domain/signup.html:13 #: mailu/ui/templates/domain/signup.html:13
msgid "" msgid ""
"In order to register a new domain, you must first setup the\n" "In order to register a new domain, you must first setup the\n"
@@ -631,21 +707,21 @@ msgid "Keep emails"
msgstr "E-Mails behalten" msgstr "E-Mails behalten"
#: mailu/ui/templates/fetch/list.html:23 #: mailu/ui/templates/fetch/list.html:23
msgid "Rescan emails"
msgstr "E-Mails erneut scannen"
#: mailu/ui/templates/fetch/list.html:24
msgid "Folders"
msgstr "Ordner"
#: mailu/ui/templates/fetch/list.html:25
msgid "Last check" msgid "Last check"
msgstr "Letzte Prüfung" msgstr "Letzte Prüfung"
#: mailu/ui/templates/fetch/list.html:24 #: mailu/ui/templates/fetch/list.html:26
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
#: mailu/ui/templates/fetch/list.html:38
msgid "yes"
msgstr "ja"
#: mailu/ui/templates/fetch/list.html:38
msgid "no"
msgstr "nein"
#: mailu/ui/templates/manager/create.html:4 #: mailu/ui/templates/manager/create.html:4
msgid "Add a manager" msgid "Add a manager"
msgstr "Einen Manager hinzufügen" msgstr "Einen Manager hinzufügen"
@@ -682,6 +758,10 @@ msgstr "Authentifizierungs-Token erstellen"
msgid "New token" msgid "New token"
msgstr "Neuer Token" msgstr "Neuer Token"
#: mailu/ui/templates/token/list.html:20
msgid "ID"
msgstr "ID"
#: mailu/ui/templates/user/create.html:4 #: mailu/ui/templates/user/create.html:4
msgid "New user" msgid "New user"
msgstr "Neuer Benutzer" msgstr "Neuer Benutzer"
@@ -690,7 +770,7 @@ msgstr "Neuer Benutzer"
msgid "General" msgid "General"
msgstr "Allgemein" msgstr "Allgemein"
#: mailu/ui/templates/user/create.html:23 #: mailu/ui/templates/user/create.html:24
msgid "Features and quotas" msgid "Features and quotas"
msgstr "Funktionen und Quotas" msgstr "Funktionen und Quotas"
@@ -730,47 +810,11 @@ msgstr "Auto-Weiterleitung"
msgid "pick a domain for the new account" msgid "pick a domain for the new account"
msgstr "Wählen Sie eine Domain für das neue Benutzerkonto" msgstr "Wählen Sie eine Domain für das neue Benutzerkonto"
#: mailu/ui/templates/user/signup_domain.html:14 #: mailu/ui/templates/user/signup_domain.html:15
msgid "Domain" msgid "Domain"
msgstr "Domain" msgstr "Domain"
#: mailu/ui/templates/user/signup_domain.html:15 #: mailu/ui/templates/user/signup_domain.html:16
msgid "Available slots" msgid "Available slots"
msgstr "Verfügbare Plätze" msgstr "Verfügbare Plätze"
#~ msgid "Spam filter threshold"
#~ msgstr "Schwellenwert für Spamfilter"
#~ msgid "Your account"
#~ msgstr "Konto"
#~ msgid "to access the administration tools"
#~ msgstr "für administrativen Zugriff"
#~ msgid "Services status"
#~ msgstr "Dienst-Status"
#~ msgid "Service"
#~ msgstr "Dienst"
#~ msgid "PID"
#~ msgstr "PID"
#~ msgid "Image"
#~ msgstr "Image"
#~ msgid "Started"
#~ msgstr "Gestartet"
#~ msgid "Last update"
#~ msgstr "Letztes Update"
#~ msgid "from"
#~ msgstr "von"
#~ msgid "Forward emails"
#~ msgstr "E-Mails weiterleiten"
#~ msgid "General settings"
#~ msgstr "Allgemeine Einstellungen"

View File

@@ -7,33 +7,49 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-05-22 18:47+0200\n" "POT-Creation-Date: 2024-06-20 12:30+0000\n"
"PO-Revision-Date: 2021-03-04 18:46+0000\n" "PO-Revision-Date: 2021-03-04 18:46+0000\n"
"Last-Translator: Jaume Barber <jaumebarber@gmail.com>\n" "Last-Translator: Jaume Barber <jaumebarber@gmail.com>\n"
"Language: en\n" "Language: en\n"
"Language-Team: English " "Language-Team: English "
"<https://translate.tedomum.net/projects/mailu/admin/en/>\n" "<https://translate.tedomum.net/projects/mailu/admin/en/>\n"
"Plural-Forms: nplurals=2; plural=n != 1\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n" "Generated-By: Babel 2.15.0\n"
#: mailu/sso/forms.py:8 mailu/ui/forms.py:79 #: mailu/sso/forms.py:8 mailu/ui/forms.py:91
msgid "E-mail" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: mailu/sso/forms.py:9 mailu/ui/forms.py:80 mailu/ui/forms.py:93 #: mailu/sso/forms.py:9 mailu/ui/forms.py:92 mailu/ui/forms.py:108
#: mailu/ui/forms.py:112 mailu/ui/forms.py:166 #: mailu/ui/forms.py:128 mailu/ui/forms.py:135 mailu/ui/forms.py:197
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:57 #: mailu/ui/templates/client.html:31 mailu/ui/templates/client.html:56
msgid "Password" msgid "Password"
msgstr "Password" msgstr "Password"
#: mailu/sso/forms.py:10 mailu/sso/forms.py:11 mailu/sso/templates/login.html:4 #: mailu/sso/forms.py:11 mailu/sso/forms.py:12 mailu/sso/templates/login.html:4
#: mailu/ui/templates/sidebar.html:142 #: mailu/sso/templates/sidebar_sso.html:42 mailu/ui/templates/sidebar.html:144
msgid "Sign in" msgid "Sign in"
msgstr "" msgstr ""
#: mailu/sso/forms.py:15 mailu/ui/forms.py:134
msgid "Current password"
msgstr ""
#: mailu/sso/forms.py:16
msgid "New password"
msgstr ""
#: mailu/sso/forms.py:17
msgid "New password (again)"
msgstr ""
#: mailu/sso/forms.py:19
msgid "Change password"
msgstr ""
#: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8 #: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8
msgid "Admin page for" msgid "Admin page for"
msgstr "" msgstr ""
@@ -46,255 +62,301 @@ msgstr ""
msgid "change language" msgid "change language"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:94 #: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:96
msgid "Go to" msgid "Go to"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4 #: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4
#: mailu/ui/templates/sidebar.html:50 mailu/ui/templates/sidebar.html:107 #: mailu/ui/templates/sidebar.html:52 mailu/ui/templates/sidebar.html:109
msgid "Client setup" msgid "Client setup"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:114 #: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:116
msgid "Website" msgid "Website"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:120 #: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:122
msgid "Help" msgid "Help"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:35 #: mailu/sso/templates/sidebar_sso.html:35
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:127 #: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:129
msgid "Register a domain" msgid "Register a domain"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:49 mailu/ui/forms.py:95 #: mailu/sso/templates/sidebar_sso.html:55 mailu/ui/forms.py:111
#: mailu/ui/templates/sidebar.html:149 mailu/ui/templates/user/signup.html:4 #: mailu/ui/templates/sidebar.html:151 mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4 #: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up" msgid "Sign up"
msgstr "Sign up" msgstr "Sign up"
#: mailu/ui/forms.py:33 mailu/ui/forms.py:36 #: mailu/sso/views/base.py:48
msgid "Too many attempts from your IP (rate-limit)"
msgstr ""
#: mailu/sso/views/base.py:51
msgid "Too many attempts for this user (rate-limit)"
msgstr ""
#: mailu/sso/views/base.py:69
msgid "Wrong e-mail or password"
msgstr ""
#: mailu/sso/views/base.py:85
msgid "The new password can't be the same as the old password"
msgstr ""
#: mailu/sso/views/base.py:88
msgid "The new passwords don't match"
msgstr ""
#: mailu/sso/views/base.py:100
msgid "The current password is incorrect!"
msgstr ""
#: mailu/ui/forms.py:34 mailu/ui/forms.py:37
msgid "Invalid email address." msgid "Invalid email address."
msgstr "" msgstr ""
#: mailu/ui/forms.py:45 #: mailu/ui/forms.py:47
msgid "Invalid list of folders."
msgstr ""
#: mailu/ui/forms.py:56
msgid "Confirm" msgid "Confirm"
msgstr "Confirm" msgstr "Confirm"
#: mailu/ui/forms.py:48 mailu/ui/forms.py:58 #: mailu/ui/forms.py:59 mailu/ui/forms.py:69
#: mailu/ui/templates/domain/details.html:26 #: mailu/ui/templates/domain/details.html:26
#: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18 #: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18
msgid "Domain name" msgid "Domain name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:49 #: mailu/ui/forms.py:60
msgid "Maximum user count" msgid "Maximum user count"
msgstr "Maximum user count" msgstr "Maximum user count"
#: mailu/ui/forms.py:50 #: mailu/ui/forms.py:61
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "" msgstr ""
#: mailu/ui/forms.py:51 #: mailu/ui/forms.py:62
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Maximum user quota" msgstr "Maximum user quota"
#: mailu/ui/forms.py:52 #: mailu/ui/forms.py:63 mailu/ui/templates/domain/list.html:24
msgid "Enable sign-up" msgid "Enable sign-up"
msgstr "Enable sign-up" msgstr "Enable sign-up"
#: mailu/ui/forms.py:53 mailu/ui/forms.py:74 mailu/ui/forms.py:86 #: mailu/ui/forms.py:64 mailu/ui/forms.py:86 mailu/ui/forms.py:100
#: mailu/ui/forms.py:132 mailu/ui/forms.py:144 #: mailu/ui/forms.py:155 mailu/ui/forms.py:175
#: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:22 #: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:23
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:20 #: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
#: mailu/ui/templates/user/list.html:24 #: mailu/ui/templates/user/list.html:24
msgid "Comment" msgid "Comment"
msgstr "Comment" msgstr "Comment"
#: mailu/ui/forms.py:54 mailu/ui/forms.py:68 mailu/ui/forms.py:75 #: mailu/ui/forms.py:65 mailu/ui/forms.py:80 mailu/ui/forms.py:87
#: mailu/ui/forms.py:88 mailu/ui/forms.py:136 mailu/ui/forms.py:145 #: mailu/ui/forms.py:103 mailu/ui/forms.py:159 mailu/ui/forms.py:176
msgid "Save" msgid "Save"
msgstr "Save" msgstr "Save"
#: mailu/ui/forms.py:59 #: mailu/ui/forms.py:70
msgid "Initial admin" msgid "Initial admin"
msgstr "Initial admin" msgstr "Initial admin"
#: mailu/ui/forms.py:60 #: mailu/ui/forms.py:71
msgid "Admin password" msgid "Admin password"
msgstr "Admin password" msgstr "Admin password"
#: mailu/ui/forms.py:61 mailu/ui/forms.py:81 mailu/ui/forms.py:94 #: mailu/ui/forms.py:72 mailu/ui/forms.py:93 mailu/ui/forms.py:109
msgid "Confirm password" msgid "Confirm password"
msgstr "Confirm password" msgstr "Confirm password"
#: mailu/ui/forms.py:63 #: mailu/ui/forms.py:75
msgid "Create" msgid "Create"
msgstr "Create" msgstr "Create"
#: mailu/ui/forms.py:67 #: mailu/ui/forms.py:79
msgid "Alternative name" msgid "Alternative name"
msgstr "Alternative name" msgstr "Alternative name"
#: mailu/ui/forms.py:72 #: mailu/ui/forms.py:84
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:73 mailu/ui/templates/relay/list.html:19 #: mailu/ui/forms.py:85 mailu/ui/templates/relay/list.html:19
msgid "Remote host" msgid "Remote host"
msgstr "" msgstr ""
#: mailu/ui/forms.py:82 mailu/ui/templates/user/list.html:23 #: mailu/ui/forms.py:95 mailu/ui/templates/domain/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16 #: mailu/ui/templates/user/list.html:23
#: mailu/ui/templates/user/signup_domain.html:17
msgid "Quota" msgid "Quota"
msgstr "Quota" msgstr "Quota"
#: mailu/ui/forms.py:83 #: mailu/ui/forms.py:96
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Allow IMAP access" msgstr "Allow IMAP access"
#: mailu/ui/forms.py:84 #: mailu/ui/forms.py:97
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Allow POP3 access" msgstr "Allow POP3 access"
#: mailu/ui/forms.py:85 mailu/ui/forms.py:101 #: mailu/ui/forms.py:98
msgid "Allow the user to spoof the sender (send email as anyone)"
msgstr ""
#: mailu/ui/forms.py:99 mailu/ui/forms.py:117
#: mailu/ui/templates/user/settings.html:15 #: mailu/ui/templates/user/settings.html:15
msgid "Displayed name" msgid "Displayed name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:87 #: mailu/ui/forms.py:101
msgid "Enabled" msgid "Enabled"
msgstr "Enabled" msgstr "Enabled"
#: mailu/ui/forms.py:92 #: mailu/ui/forms.py:102
msgid "Force password change at next login"
msgstr ""
#: mailu/ui/forms.py:107
msgid "Email address" msgid "Email address"
msgstr "" msgstr ""
#: mailu/ui/forms.py:102 #: mailu/ui/forms.py:118
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Enable spam filter" msgstr "Enable spam filter"
#: mailu/ui/forms.py:103 #: mailu/ui/forms.py:119
msgid "Enable marking spam mails as read" msgid "Enable marking spam mails as read"
msgstr "" msgstr ""
#: mailu/ui/forms.py:104 #: mailu/ui/forms.py:120
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "Spam filter tolerance" msgstr "Spam filter tolerance"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:121
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Enable forwarding" msgstr "Enable forwarding"
#: mailu/ui/forms.py:106 #: mailu/ui/forms.py:122
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "" msgstr ""
#: mailu/ui/forms.py:107 mailu/ui/forms.py:143 #: mailu/ui/forms.py:123 mailu/ui/forms.py:174
#: mailu/ui/templates/alias/list.html:21 #: mailu/ui/templates/alias/list.html:21
msgid "Destination" msgid "Destination"
msgstr "" msgstr ""
#: mailu/ui/forms.py:108 #: mailu/ui/forms.py:124
msgid "Save settings" msgid "Save settings"
msgstr "Save settings" msgstr "Save settings"
#: mailu/ui/forms.py:113 #: mailu/ui/forms.py:129 mailu/ui/forms.py:136
msgid "Password check" msgid "Password check"
msgstr "" msgstr ""
#: mailu/ui/forms.py:114 mailu/ui/templates/sidebar.html:25 #: mailu/ui/forms.py:131 mailu/ui/forms.py:138
#: mailu/ui/templates/sidebar.html:25
msgid "Update password" msgid "Update password"
msgstr "" msgstr ""
#: mailu/ui/forms.py:118 #: mailu/ui/forms.py:141
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "" msgstr ""
#: mailu/ui/forms.py:119 #: mailu/ui/forms.py:142
msgid "Reply subject" msgid "Reply subject"
msgstr "" msgstr ""
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:143
msgid "Reply body" msgid "Reply body"
msgstr "" msgstr ""
#: mailu/ui/forms.py:122 #: mailu/ui/forms.py:145
msgid "Start of vacation" msgid "Start of vacation"
msgstr "" msgstr ""
#: mailu/ui/forms.py:123 #: mailu/ui/forms.py:146
msgid "End of vacation" msgid "End of vacation"
msgstr "End of vacation" msgstr "End of vacation"
#: mailu/ui/forms.py:124 #: mailu/ui/forms.py:147
msgid "Update" msgid "Update"
msgstr "Update" msgstr "Update"
#: mailu/ui/forms.py:129 #: mailu/ui/forms.py:152
msgid "Your token (write it down, as it will never be displayed again)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:134 mailu/ui/templates/token/list.html:21 #: mailu/ui/forms.py:157 mailu/ui/templates/token/list.html:22
msgid "Authorized IP" msgid "Authorized IP"
msgstr "Authorized IP" msgstr "Authorized IP"
#: mailu/ui/forms.py:140 #: mailu/ui/forms.py:171
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:142 #: mailu/ui/forms.py:173
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:149 #: mailu/ui/forms.py:180
msgid "Admin email" msgid "Admin email"
msgstr "" msgstr ""
#: mailu/ui/forms.py:150 mailu/ui/forms.py:155 mailu/ui/forms.py:168 #: mailu/ui/forms.py:181 mailu/ui/forms.py:186 mailu/ui/forms.py:201
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: mailu/ui/forms.py:154 #: mailu/ui/forms.py:185
msgid "Manager email" msgid "Manager email"
msgstr "" msgstr ""
#: mailu/ui/forms.py:159 #: mailu/ui/forms.py:190
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: mailu/ui/forms.py:162 #: mailu/ui/forms.py:193
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "" msgstr ""
#: mailu/ui/forms.py:163 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:194 mailu/ui/templates/client.html:19
#: mailu/ui/templates/client.html:45 #: mailu/ui/templates/client.html:44
msgid "TCP port" msgid "TCP port"
msgstr "TCP port" msgstr "TCP port"
#: mailu/ui/forms.py:164 #: mailu/ui/forms.py:195
msgid "Enable TLS" msgid "Enable TLS"
msgstr "" msgstr ""
#: mailu/ui/forms.py:165 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:196 mailu/ui/templates/client.html:27
#: mailu/ui/templates/client.html:53 mailu/ui/templates/fetch/list.html:21 #: mailu/ui/templates/client.html:52 mailu/ui/templates/fetch/list.html:21
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: mailu/ui/forms.py:167 #: mailu/ui/forms.py:198
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "" msgstr ""
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:199
msgid "Rescan emails locally"
msgstr ""
#: mailu/ui/forms.py:200
msgid "Folders to fetch on the server"
msgstr ""
#: mailu/ui/forms.py:205
msgid "Announcement subject" msgid "Announcement subject"
msgstr "" msgstr ""
#: mailu/ui/forms.py:174 #: mailu/ui/forms.py:207
msgid "Announcement body" msgid "Announcement body"
msgstr "" msgstr ""
#: mailu/ui/forms.py:176 #: mailu/ui/forms.py:209
msgid "Send" msgid "Send"
msgstr "" msgstr ""
@@ -302,7 +364,7 @@ msgstr ""
msgid "Public announcement" msgid "Public announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:80 #: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:82
#: mailu/ui/templates/user/settings.html:19 #: mailu/ui/templates/user/settings.html:19
msgid "Antispam" msgid "Antispam"
msgstr "Antispam" msgstr "Antispam"
@@ -315,22 +377,30 @@ msgstr ""
msgid "configure your email client" msgid "configure your email client"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:13 #: mailu/ui/templates/client.html:12
msgid "Incoming mail" msgid "Incoming mail"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:41 #: mailu/ui/templates/client.html:15 mailu/ui/templates/client.html:40
msgid "Mail protocol" msgid "Mail protocol"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:49 #: mailu/ui/templates/client.html:23 mailu/ui/templates/client.html:48
msgid "Server name" msgid "Server name"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:38 #: mailu/ui/templates/client.html:37
msgid "Outgoing mail" msgid "Outgoing mail"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:62
msgid "If you use an Apple device,"
msgstr ""
#: mailu/ui/templates/client.html:63
msgid "click here to auto-configure it."
msgstr ""
#: mailu/ui/templates/confirm.html:4 #: mailu/ui/templates/confirm.html:4
msgid "Confirm action" msgid "Confirm action"
msgstr "" msgstr ""
@@ -348,7 +418,7 @@ msgstr "Docker error"
msgid "An error occurred while talking to the Docker server." msgid "An error occurred while talking to the Docker server."
msgstr "" msgstr ""
#: mailu/ui/templates/macros.html:129 #: mailu/ui/templates/macros.html:128
msgid "copy to clipboard" msgid "copy to clipboard"
msgstr "" msgstr ""
@@ -356,48 +426,48 @@ msgstr ""
msgid "My account" msgid "My account"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:37 #: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:36
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:38 #: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:37
msgid "Auto-reply" msgid "Auto-reply"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:37 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:38
#: mailu/ui/templates/user/list.html:39 #: mailu/ui/templates/user/list.html:39
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:43 mailu/ui/templates/token/list.html:4 #: mailu/ui/templates/sidebar.html:45 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens" msgid "Authentication tokens"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:56 #: mailu/ui/templates/sidebar.html:58
msgid "Administration" msgid "Administration"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:62 #: mailu/ui/templates/sidebar.html:64
msgid "Announcement" msgid "Announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:68 #: mailu/ui/templates/sidebar.html:70
msgid "Administrators" msgid "Administrators"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:74 #: mailu/ui/templates/sidebar.html:76
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Relayed domains" msgstr "Relayed domains"
#: mailu/ui/templates/sidebar.html:88 #: mailu/ui/templates/sidebar.html:90
msgid "Mail domains" msgid "Mail domains"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:99 #: mailu/ui/templates/sidebar.html:101
msgid "Webmail" msgid "Webmail"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:135 #: mailu/ui/templates/sidebar.html:137
msgid "Sign out" msgid "Sign out"
msgstr "" msgstr ""
@@ -431,12 +501,18 @@ msgstr ""
msgid "Email" msgid "Email"
msgstr "" msgstr ""
#: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:32 #: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:31
#: mailu/ui/templates/alternative/list.html:29 #: mailu/ui/templates/domain/list.html:35 mailu/ui/templates/fetch/list.html:35
#: mailu/ui/templates/domain/list.html:34 mailu/ui/templates/fetch/list.html:34
#: mailu/ui/templates/manager/list.html:27 #: mailu/ui/templates/manager/list.html:27
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:30 #: mailu/ui/templates/relay/list.html:29 mailu/ui/templates/user/list.html:33
#: mailu/ui/templates/user/list.html:34 msgid "Edit"
msgstr ""
#: mailu/ui/templates/admin/list.html:26 mailu/ui/templates/alias/list.html:32
#: mailu/ui/templates/alternative/list.html:29
#: mailu/ui/templates/domain/list.html:36 mailu/ui/templates/fetch/list.html:36
#: mailu/ui/templates/manager/list.html:28
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:31
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -458,26 +534,20 @@ msgstr ""
#: mailu/ui/templates/alias/list.html:23 #: mailu/ui/templates/alias/list.html:23
#: mailu/ui/templates/alternative/list.html:21 #: mailu/ui/templates/alternative/list.html:21
#: mailu/ui/templates/domain/list.html:23 mailu/ui/templates/fetch/list.html:25 #: mailu/ui/templates/domain/list.html:25 mailu/ui/templates/fetch/list.html:27
#: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:22 #: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:23
#: mailu/ui/templates/user/list.html:25 #: mailu/ui/templates/user/list.html:25
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: mailu/ui/templates/alias/list.html:24 #: mailu/ui/templates/alias/list.html:24
#: mailu/ui/templates/alternative/list.html:22 #: mailu/ui/templates/alternative/list.html:22
#: mailu/ui/templates/domain/list.html:24 mailu/ui/templates/fetch/list.html:26 #: mailu/ui/templates/domain/list.html:26 mailu/ui/templates/fetch/list.html:28
#: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:23 #: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:24
#: mailu/ui/templates/user/list.html:26 #: mailu/ui/templates/user/list.html:26
msgid "Last edit" msgid "Last edit"
msgstr "" msgstr ""
#: mailu/ui/templates/alias/list.html:31 mailu/ui/templates/domain/list.html:33
#: mailu/ui/templates/fetch/list.html:33 mailu/ui/templates/relay/list.html:29
#: mailu/ui/templates/user/list.html:33
msgid "Edit"
msgstr ""
#: mailu/ui/templates/alternative/create.html:4 #: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain" msgid "Create alternative domain"
msgstr "" msgstr ""
@@ -524,22 +594,18 @@ msgid "DNS SPF entries"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:40 #: mailu/ui/templates/domain/details.html:40
msgid "DKIM public key"
msgstr ""
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:48 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:58 #: mailu/ui/templates/domain/details.html:53
msgid "DNS TLSA entry" msgid "DNS TLSA entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:63 #: mailu/ui/templates/domain/details.html:58
msgid "DNS client auto-configuration entries" msgid "DNS client auto-configuration entries"
msgstr "" msgstr ""
@@ -563,26 +629,36 @@ msgstr ""
msgid "Alias count" msgid "Alias count"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:31 #: mailu/ui/templates/domain/list.html:33
msgid "Details" msgid "Details"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:38 #: mailu/ui/templates/domain/list.html:40
msgid "Users" msgid "Users"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:39 #: mailu/ui/templates/domain/list.html:41
msgid "Aliases" msgid "Aliases"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:40 #: mailu/ui/templates/domain/list.html:42
msgid "Managers" msgid "Managers"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:42 #: mailu/ui/templates/domain/list.html:44
msgid "Alternatives" msgid "Alternatives"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "yes"
msgstr ""
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "no"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13 #: mailu/ui/templates/domain/signup.html:13
msgid "" msgid ""
"In order to register a new domain, you must first setup the\n" "In order to register a new domain, you must first setup the\n"
@@ -621,21 +697,21 @@ msgid "Keep emails"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:23 #: mailu/ui/templates/fetch/list.html:23
msgid "Last check" msgid "Rescan emails"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:24 #: mailu/ui/templates/fetch/list.html:24
msgid "Folders"
msgstr ""
#: mailu/ui/templates/fetch/list.html:25
msgid "Last check"
msgstr ""
#: mailu/ui/templates/fetch/list.html:26
msgid "Status" msgid "Status"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:38
msgid "yes"
msgstr ""
#: mailu/ui/templates/fetch/list.html:38
msgid "no"
msgstr ""
#: mailu/ui/templates/manager/create.html:4 #: mailu/ui/templates/manager/create.html:4
msgid "Add a manager" msgid "Add a manager"
msgstr "" msgstr ""
@@ -672,6 +748,10 @@ msgstr ""
msgid "New token" msgid "New token"
msgstr "" msgstr ""
#: mailu/ui/templates/token/list.html:20
msgid "ID"
msgstr ""
#: mailu/ui/templates/user/create.html:4 #: mailu/ui/templates/user/create.html:4
msgid "New user" msgid "New user"
msgstr "" msgstr ""
@@ -680,7 +760,7 @@ msgstr ""
msgid "General" msgid "General"
msgstr "" msgstr ""
#: mailu/ui/templates/user/create.html:23 #: mailu/ui/templates/user/create.html:24
msgid "Features and quotas" msgid "Features and quotas"
msgstr "" msgstr ""
@@ -720,29 +800,11 @@ msgstr ""
msgid "pick a domain for the new account" msgid "pick a domain for the new account"
msgstr "" msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14 #: mailu/ui/templates/user/signup_domain.html:15
msgid "Domain" msgid "Domain"
msgstr "Domain" msgstr "Domain"
#: mailu/ui/templates/user/signup_domain.html:15 #: mailu/ui/templates/user/signup_domain.html:16
msgid "Available slots" msgid "Available slots"
msgstr "" msgstr ""
#~ msgid "Your account"
#~ msgstr ""
#~ msgid "Spam filter threshold"
#~ msgstr ""
#~ msgid "from"
#~ msgstr ""
#~ msgid "General settings"
#~ msgstr ""
#~ msgid "to access the administration tools"
#~ msgstr ""
#~ msgid "Forward emails"
#~ msgstr ""

View File

@@ -1,14 +1,20 @@
from wtforms import validators, fields, widgets from wtforms import validators, fields, widgets
from wtforms.validators import ValidationError
from wtforms_components import fields as fields_ from wtforms_components import fields as fields_
from flask_babel import lazy_gettext as _ from flask_babel import lazy_gettext as _
import flask_login import flask_login
import flask_wtf import flask_wtf
import re import re
import string
import ipaddress import ipaddress
LOCALPART_REGEX = r'^[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+)*$' LOCALPART_REGEX = r'^[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+)*$'
def checkStrippable(form, field):
if field.data != field.data.strip(string.whitespace):
raise ValidationError(_('Passwords should not start or end with whitespaces'))
class DestinationField(fields.SelectMultipleField): class DestinationField(fields.SelectMultipleField):
""" Allow for multiple emails selection from current user choices and """ Allow for multiple emails selection from current user choices and
additional email addresses. additional email addresses.
@@ -68,7 +74,7 @@ class DomainForm(flask_wtf.FlaskForm):
class DomainSignupForm(flask_wtf.FlaskForm): class DomainSignupForm(flask_wtf.FlaskForm):
name = fields.StringField(_('Domain name'), [validators.DataRequired()]) name = fields.StringField(_('Domain name'), [validators.DataRequired()])
localpart = fields.StringField(_('Initial admin'), [validators.DataRequired()]) localpart = fields.StringField(_('Initial admin'), [validators.DataRequired()])
pw = fields.PasswordField(_('Admin password'), [validators.DataRequired()]) pw = fields.PasswordField(_('Admin password'), [validators.DataRequired(), checkStrippable])
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')]) pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
pwned = fields.HiddenField(label='', default=-1) pwned = fields.HiddenField(label='', default=-1)
captcha = flask_wtf.RecaptchaField() captcha = flask_wtf.RecaptchaField()
@@ -90,7 +96,7 @@ class RelayForm(flask_wtf.FlaskForm):
class UserForm(flask_wtf.FlaskForm): class UserForm(flask_wtf.FlaskForm):
localpart = fields.StringField(_('E-mail'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)]) localpart = fields.StringField(_('E-mail'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)])
pw = fields.PasswordField(_('Password')) pw = fields.PasswordField(_('Password'))
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')]) pw2 = fields.PasswordField(_('Confirm password'), [checkStrippable, validators.EqualTo('pw')])
pwned = fields.HiddenField(label='', default=-1) pwned = fields.HiddenField(label='', default=-1)
quota_bytes = fields_.IntegerSliderField(_('Quota'), default=10**9) quota_bytes = fields_.IntegerSliderField(_('Quota'), default=10**9)
enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True) enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True)
@@ -105,7 +111,7 @@ class UserForm(flask_wtf.FlaskForm):
class UserSignupForm(flask_wtf.FlaskForm): class UserSignupForm(flask_wtf.FlaskForm):
localpart = fields.StringField(_('Email address'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)]) localpart = fields.StringField(_('Email address'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)])
pw = fields.PasswordField(_('Password'), [validators.DataRequired()]) pw = fields.PasswordField(_('Password'), [validators.DataRequired(), checkStrippable])
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')]) pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
pwned = fields.HiddenField(label='', default=-1) pwned = fields.HiddenField(label='', default=-1)
submit = fields.SubmitField(_('Sign up')) submit = fields.SubmitField(_('Sign up'))
@@ -132,7 +138,7 @@ class UserPasswordForm(flask_wtf.FlaskForm):
class UserPasswordChangeForm(flask_wtf.FlaskForm): class UserPasswordChangeForm(flask_wtf.FlaskForm):
current_pw = fields.PasswordField(_('Current password'), [validators.DataRequired()]) current_pw = fields.PasswordField(_('Current password'), [validators.DataRequired()])
pw = fields.PasswordField(_('Password'), [validators.DataRequired()]) pw = fields.PasswordField(_('Password'), [validators.DataRequired(), checkStrippable])
pw2 = fields.PasswordField(_('Password check'), [validators.DataRequired()]) pw2 = fields.PasswordField(_('Password check'), [validators.DataRequired()])
pwned = fields.HiddenField(label='', default=-1) pwned = fields.HiddenField(label='', default=-1)
submit = fields.SubmitField(_('Update password')) submit = fields.SubmitField(_('Update password'))

View File

@@ -63,4 +63,36 @@
</pre></td> </pre></td>
</tr> </tr>
{%- endcall %} {%- endcall %}
{%- for alternative in domain.alternatives %}
{%- call macros.table(datatable=False) %}
<tr>
<th>{% trans %}Alternative Domain name{% endtrans %}</th>
<td>{{ alternative.name }}</td>
</tr>
<tr>
<th>{% trans %}DNS MX entry{% endtrans %} <i class="fa {{ 'fa-check-circle text-success' if alternative.check_mx() else 'fa-exclamation-circle text-danger' }}"></i></th>
<td>{{ macros.clip("dns_mx") }}<pre id="dns_mx" class="pre-config border bg-light">{{ alternative.dns_mx }}</pre></td>
</tr>
<tr>
<th>{% trans %}DNS SPF entries{% endtrans %}</th>
<td>{{ macros.clip("dns_spf") }}<pre id="dns_spf" class="pre-config border bg-light">{{ alternative.dns_spf }}</pre>
</td>
</tr>
{%- if alternative.domain.dkim_publickey %}
<tr>
<th>{% trans %}DNS DKIM entry{% endtrans %}</th>
<td>{{ macros.clip("dns_dkim") }}<pre id="dns_dkim" class="pre-config border bg-light">{{ alternative.dns_dkim }}</pre></td>
</tr>
<tr>
<th>{% trans %}DNS DMARC entry{% endtrans %}</th>
<td>
{{ macros.clip("dns_dmarc") }}<pre id="dns_dmarc" class="pre-config border bg-light">{{ alternative.dns_dmarc }}</pre>
{{ macros.clip("dns_dmarc_report") }}<pre id="dns_dmarc_report" class="pre-config border bg-light">{{ alternative.dns_dmarc_report }}</pre>
</td>
</tr>
{%- endif %}
{%- endcall %}
{%- endfor %}
{%- endblock %} {%- endblock %}

View File

@@ -1,37 +1,53 @@
# Translations template for PROJECT. # Translations template for PROJECT.
# Copyright (C) 2022 ORGANIZATION # Copyright (C) 2024 ORGANIZATION
# This file is distributed under the same license as the PROJECT project. # This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2022. # FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2022-05-22 18:47+0200\n" "POT-Creation-Date: 2024-06-20 12:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n" "Generated-By: Babel 2.15.0\n"
#: mailu/sso/forms.py:8 mailu/ui/forms.py:79 #: mailu/sso/forms.py:8 mailu/ui/forms.py:91
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: mailu/sso/forms.py:9 mailu/ui/forms.py:80 mailu/ui/forms.py:93 #: mailu/sso/forms.py:9 mailu/ui/forms.py:92 mailu/ui/forms.py:108
#: mailu/ui/forms.py:112 mailu/ui/forms.py:166 #: mailu/ui/forms.py:128 mailu/ui/forms.py:135 mailu/ui/forms.py:197
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:57 #: mailu/ui/templates/client.html:31 mailu/ui/templates/client.html:56
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: mailu/sso/forms.py:10 mailu/sso/forms.py:11 mailu/sso/templates/login.html:4 #: mailu/sso/forms.py:11 mailu/sso/forms.py:12 mailu/sso/templates/login.html:4
#: mailu/ui/templates/sidebar.html:142 #: mailu/sso/templates/sidebar_sso.html:42 mailu/ui/templates/sidebar.html:144
msgid "Sign in" msgid "Sign in"
msgstr "" msgstr ""
#: mailu/sso/forms.py:15 mailu/ui/forms.py:134
msgid "Current password"
msgstr ""
#: mailu/sso/forms.py:16
msgid "New password"
msgstr ""
#: mailu/sso/forms.py:17
msgid "New password (again)"
msgstr ""
#: mailu/sso/forms.py:19
msgid "Change password"
msgstr ""
#: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8 #: mailu/sso/templates/base_sso.html:8 mailu/ui/templates/base.html:8
msgid "Admin page for" msgid "Admin page for"
msgstr "" msgstr ""
@@ -44,255 +60,301 @@ msgstr ""
msgid "change language" msgid "change language"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:94 #: mailu/sso/templates/sidebar_sso.html:4 mailu/ui/templates/sidebar.html:96
msgid "Go to" msgid "Go to"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4 #: mailu/sso/templates/sidebar_sso.html:9 mailu/ui/templates/client.html:4
#: mailu/ui/templates/sidebar.html:50 mailu/ui/templates/sidebar.html:107 #: mailu/ui/templates/sidebar.html:52 mailu/ui/templates/sidebar.html:109
msgid "Client setup" msgid "Client setup"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:114 #: mailu/sso/templates/sidebar_sso.html:16 mailu/ui/templates/sidebar.html:116
msgid "Website" msgid "Website"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:120 #: mailu/sso/templates/sidebar_sso.html:22 mailu/ui/templates/sidebar.html:122
msgid "Help" msgid "Help"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:35 #: mailu/sso/templates/sidebar_sso.html:35
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:127 #: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:129
msgid "Register a domain" msgid "Register a domain"
msgstr "" msgstr ""
#: mailu/sso/templates/sidebar_sso.html:49 mailu/ui/forms.py:95 #: mailu/sso/templates/sidebar_sso.html:55 mailu/ui/forms.py:111
#: mailu/ui/templates/sidebar.html:149 mailu/ui/templates/user/signup.html:4 #: mailu/ui/templates/sidebar.html:151 mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4 #: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up" msgid "Sign up"
msgstr "" msgstr ""
#: mailu/ui/forms.py:33 mailu/ui/forms.py:36 #: mailu/sso/views/base.py:48
msgid "Too many attempts from your IP (rate-limit)"
msgstr ""
#: mailu/sso/views/base.py:51
msgid "Too many attempts for this user (rate-limit)"
msgstr ""
#: mailu/sso/views/base.py:69
msgid "Wrong e-mail or password"
msgstr ""
#: mailu/sso/views/base.py:85
msgid "The new password can't be the same as the old password"
msgstr ""
#: mailu/sso/views/base.py:88
msgid "The new passwords don't match"
msgstr ""
#: mailu/sso/views/base.py:100
msgid "The current password is incorrect!"
msgstr ""
#: mailu/ui/forms.py:34 mailu/ui/forms.py:37
msgid "Invalid email address." msgid "Invalid email address."
msgstr "" msgstr ""
#: mailu/ui/forms.py:45 #: mailu/ui/forms.py:47
msgid "Invalid list of folders."
msgstr ""
#: mailu/ui/forms.py:56
msgid "Confirm" msgid "Confirm"
msgstr "" msgstr ""
#: mailu/ui/forms.py:48 mailu/ui/forms.py:58 #: mailu/ui/forms.py:59 mailu/ui/forms.py:69
#: mailu/ui/templates/domain/details.html:26 #: mailu/ui/templates/domain/details.html:26
#: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18 #: mailu/ui/templates/domain/list.html:19 mailu/ui/templates/relay/list.html:18
msgid "Domain name" msgid "Domain name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:49 #: mailu/ui/forms.py:60
msgid "Maximum user count" msgid "Maximum user count"
msgstr "" msgstr ""
#: mailu/ui/forms.py:50 #: mailu/ui/forms.py:61
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "" msgstr ""
#: mailu/ui/forms.py:51 #: mailu/ui/forms.py:62
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:52 #: mailu/ui/forms.py:63 mailu/ui/templates/domain/list.html:24
msgid "Enable sign-up" msgid "Enable sign-up"
msgstr "" msgstr ""
#: mailu/ui/forms.py:53 mailu/ui/forms.py:74 mailu/ui/forms.py:86 #: mailu/ui/forms.py:64 mailu/ui/forms.py:86 mailu/ui/forms.py:100
#: mailu/ui/forms.py:132 mailu/ui/forms.py:144 #: mailu/ui/forms.py:155 mailu/ui/forms.py:175
#: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:22 #: mailu/ui/templates/alias/list.html:22 mailu/ui/templates/domain/list.html:23
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:20 #: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
#: mailu/ui/templates/user/list.html:24 #: mailu/ui/templates/user/list.html:24
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: mailu/ui/forms.py:54 mailu/ui/forms.py:68 mailu/ui/forms.py:75 #: mailu/ui/forms.py:65 mailu/ui/forms.py:80 mailu/ui/forms.py:87
#: mailu/ui/forms.py:88 mailu/ui/forms.py:136 mailu/ui/forms.py:145 #: mailu/ui/forms.py:103 mailu/ui/forms.py:159 mailu/ui/forms.py:176
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: mailu/ui/forms.py:59 #: mailu/ui/forms.py:70
msgid "Initial admin" msgid "Initial admin"
msgstr "" msgstr ""
#: mailu/ui/forms.py:60 #: mailu/ui/forms.py:71
msgid "Admin password" msgid "Admin password"
msgstr "" msgstr ""
#: mailu/ui/forms.py:61 mailu/ui/forms.py:81 mailu/ui/forms.py:94 #: mailu/ui/forms.py:72 mailu/ui/forms.py:93 mailu/ui/forms.py:109
msgid "Confirm password" msgid "Confirm password"
msgstr "" msgstr ""
#: mailu/ui/forms.py:63 #: mailu/ui/forms.py:75
msgid "Create" msgid "Create"
msgstr "" msgstr ""
#: mailu/ui/forms.py:67 #: mailu/ui/forms.py:79
msgid "Alternative name" msgid "Alternative name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:72 #: mailu/ui/forms.py:84
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:73 mailu/ui/templates/relay/list.html:19 #: mailu/ui/forms.py:85 mailu/ui/templates/relay/list.html:19
msgid "Remote host" msgid "Remote host"
msgstr "" msgstr ""
#: mailu/ui/forms.py:82 mailu/ui/templates/user/list.html:23 #: mailu/ui/forms.py:95 mailu/ui/templates/domain/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16 #: mailu/ui/templates/user/list.html:23
#: mailu/ui/templates/user/signup_domain.html:17
msgid "Quota" msgid "Quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:83 #: mailu/ui/forms.py:96
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "" msgstr ""
#: mailu/ui/forms.py:84 #: mailu/ui/forms.py:97
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "" msgstr ""
#: mailu/ui/forms.py:85 mailu/ui/forms.py:101 #: mailu/ui/forms.py:98
msgid "Allow the user to spoof the sender (send email as anyone)"
msgstr ""
#: mailu/ui/forms.py:99 mailu/ui/forms.py:117
#: mailu/ui/templates/user/settings.html:15 #: mailu/ui/templates/user/settings.html:15
msgid "Displayed name" msgid "Displayed name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:87 #: mailu/ui/forms.py:101
msgid "Enabled" msgid "Enabled"
msgstr "" msgstr ""
#: mailu/ui/forms.py:92 #: mailu/ui/forms.py:102
msgid "Force password change at next login"
msgstr ""
#: mailu/ui/forms.py:107
msgid "Email address" msgid "Email address"
msgstr "" msgstr ""
#: mailu/ui/forms.py:102 #: mailu/ui/forms.py:118
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "" msgstr ""
#: mailu/ui/forms.py:103 #: mailu/ui/forms.py:119
msgid "Enable marking spam mails as read" msgid "Enable marking spam mails as read"
msgstr "" msgstr ""
#: mailu/ui/forms.py:104 #: mailu/ui/forms.py:120
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "" msgstr ""
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:121
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "" msgstr ""
#: mailu/ui/forms.py:106 #: mailu/ui/forms.py:122
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "" msgstr ""
#: mailu/ui/forms.py:107 mailu/ui/forms.py:143 #: mailu/ui/forms.py:123 mailu/ui/forms.py:174
#: mailu/ui/templates/alias/list.html:21 #: mailu/ui/templates/alias/list.html:21
msgid "Destination" msgid "Destination"
msgstr "" msgstr ""
#: mailu/ui/forms.py:108 #: mailu/ui/forms.py:124
msgid "Save settings" msgid "Save settings"
msgstr "" msgstr ""
#: mailu/ui/forms.py:113 #: mailu/ui/forms.py:129 mailu/ui/forms.py:136
msgid "Password check" msgid "Password check"
msgstr "" msgstr ""
#: mailu/ui/forms.py:114 mailu/ui/templates/sidebar.html:25 #: mailu/ui/forms.py:131 mailu/ui/forms.py:138
#: mailu/ui/templates/sidebar.html:25
msgid "Update password" msgid "Update password"
msgstr "" msgstr ""
#: mailu/ui/forms.py:118 #: mailu/ui/forms.py:141
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "" msgstr ""
#: mailu/ui/forms.py:119 #: mailu/ui/forms.py:142
msgid "Reply subject" msgid "Reply subject"
msgstr "" msgstr ""
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:143
msgid "Reply body" msgid "Reply body"
msgstr "" msgstr ""
#: mailu/ui/forms.py:122 #: mailu/ui/forms.py:145
msgid "Start of vacation" msgid "Start of vacation"
msgstr "" msgstr ""
#: mailu/ui/forms.py:123 #: mailu/ui/forms.py:146
msgid "End of vacation" msgid "End of vacation"
msgstr "" msgstr ""
#: mailu/ui/forms.py:124 #: mailu/ui/forms.py:147
msgid "Update" msgid "Update"
msgstr "" msgstr ""
#: mailu/ui/forms.py:129 #: mailu/ui/forms.py:152
msgid "Your token (write it down, as it will never be displayed again)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:134 mailu/ui/templates/token/list.html:21 #: mailu/ui/forms.py:157 mailu/ui/templates/token/list.html:22
msgid "Authorized IP" msgid "Authorized IP"
msgstr "" msgstr ""
#: mailu/ui/forms.py:140 #: mailu/ui/forms.py:171
msgid "Alias" msgid "Alias"
msgstr "" msgstr ""
#: mailu/ui/forms.py:142 #: mailu/ui/forms.py:173
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:149 #: mailu/ui/forms.py:180
msgid "Admin email" msgid "Admin email"
msgstr "" msgstr ""
#: mailu/ui/forms.py:150 mailu/ui/forms.py:155 mailu/ui/forms.py:168 #: mailu/ui/forms.py:181 mailu/ui/forms.py:186 mailu/ui/forms.py:201
msgid "Submit" msgid "Submit"
msgstr "" msgstr ""
#: mailu/ui/forms.py:154 #: mailu/ui/forms.py:185
msgid "Manager email" msgid "Manager email"
msgstr "" msgstr ""
#: mailu/ui/forms.py:159 #: mailu/ui/forms.py:190
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: mailu/ui/forms.py:162 #: mailu/ui/forms.py:193
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "" msgstr ""
#: mailu/ui/forms.py:163 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:194 mailu/ui/templates/client.html:19
#: mailu/ui/templates/client.html:45 #: mailu/ui/templates/client.html:44
msgid "TCP port" msgid "TCP port"
msgstr "" msgstr ""
#: mailu/ui/forms.py:164 #: mailu/ui/forms.py:195
msgid "Enable TLS" msgid "Enable TLS"
msgstr "" msgstr ""
#: mailu/ui/forms.py:165 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:196 mailu/ui/templates/client.html:27
#: mailu/ui/templates/client.html:53 mailu/ui/templates/fetch/list.html:21 #: mailu/ui/templates/client.html:52 mailu/ui/templates/fetch/list.html:21
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: mailu/ui/forms.py:167 #: mailu/ui/forms.py:198
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "" msgstr ""
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:199
msgid "Rescan emails locally"
msgstr ""
#: mailu/ui/forms.py:200
msgid "Folders to fetch on the server"
msgstr ""
#: mailu/ui/forms.py:205
msgid "Announcement subject" msgid "Announcement subject"
msgstr "" msgstr ""
#: mailu/ui/forms.py:174 #: mailu/ui/forms.py:207
msgid "Announcement body" msgid "Announcement body"
msgstr "" msgstr ""
#: mailu/ui/forms.py:176 #: mailu/ui/forms.py:209
msgid "Send" msgid "Send"
msgstr "" msgstr ""
@@ -300,7 +362,7 @@ msgstr ""
msgid "Public announcement" msgid "Public announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:80 #: mailu/ui/templates/antispam.html:4 mailu/ui/templates/sidebar.html:82
#: mailu/ui/templates/user/settings.html:19 #: mailu/ui/templates/user/settings.html:19
msgid "Antispam" msgid "Antispam"
msgstr "" msgstr ""
@@ -313,22 +375,30 @@ msgstr ""
msgid "configure your email client" msgid "configure your email client"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:13 #: mailu/ui/templates/client.html:12
msgid "Incoming mail" msgid "Incoming mail"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:41 #: mailu/ui/templates/client.html:15 mailu/ui/templates/client.html:40
msgid "Mail protocol" msgid "Mail protocol"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:49 #: mailu/ui/templates/client.html:23 mailu/ui/templates/client.html:48
msgid "Server name" msgid "Server name"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:38 #: mailu/ui/templates/client.html:37
msgid "Outgoing mail" msgid "Outgoing mail"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:62
msgid "If you use an Apple device,"
msgstr ""
#: mailu/ui/templates/client.html:63
msgid "click here to auto-configure it."
msgstr ""
#: mailu/ui/templates/confirm.html:4 #: mailu/ui/templates/confirm.html:4
msgid "Confirm action" msgid "Confirm action"
msgstr "" msgstr ""
@@ -346,7 +416,7 @@ msgstr ""
msgid "An error occurred while talking to the Docker server." msgid "An error occurred while talking to the Docker server."
msgstr "" msgstr ""
#: mailu/ui/templates/macros.html:129 #: mailu/ui/templates/macros.html:128
msgid "copy to clipboard" msgid "copy to clipboard"
msgstr "" msgstr ""
@@ -354,48 +424,48 @@ msgstr ""
msgid "My account" msgid "My account"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:37 #: mailu/ui/templates/sidebar.html:19 mailu/ui/templates/user/list.html:36
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:38 #: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/user/list.html:37
msgid "Auto-reply" msgid "Auto-reply"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:37 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:38
#: mailu/ui/templates/user/list.html:39 #: mailu/ui/templates/user/list.html:39
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:43 mailu/ui/templates/token/list.html:4 #: mailu/ui/templates/sidebar.html:45 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens" msgid "Authentication tokens"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:56 #: mailu/ui/templates/sidebar.html:58
msgid "Administration" msgid "Administration"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:62 #: mailu/ui/templates/sidebar.html:64
msgid "Announcement" msgid "Announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:68 #: mailu/ui/templates/sidebar.html:70
msgid "Administrators" msgid "Administrators"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:74 #: mailu/ui/templates/sidebar.html:76
msgid "Relayed domains" msgid "Relayed domains"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:88 #: mailu/ui/templates/sidebar.html:90
msgid "Mail domains" msgid "Mail domains"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:99 #: mailu/ui/templates/sidebar.html:101
msgid "Webmail" msgid "Webmail"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:135 #: mailu/ui/templates/sidebar.html:137
msgid "Sign out" msgid "Sign out"
msgstr "" msgstr ""
@@ -429,12 +499,18 @@ msgstr ""
msgid "Email" msgid "Email"
msgstr "" msgstr ""
#: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:32 #: mailu/ui/templates/admin/list.html:25 mailu/ui/templates/alias/list.html:31
#: mailu/ui/templates/alternative/list.html:29 #: mailu/ui/templates/domain/list.html:35 mailu/ui/templates/fetch/list.html:35
#: mailu/ui/templates/domain/list.html:34 mailu/ui/templates/fetch/list.html:34
#: mailu/ui/templates/manager/list.html:27 #: mailu/ui/templates/manager/list.html:27
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:30 #: mailu/ui/templates/relay/list.html:29 mailu/ui/templates/user/list.html:33
#: mailu/ui/templates/user/list.html:34 msgid "Edit"
msgstr ""
#: mailu/ui/templates/admin/list.html:26 mailu/ui/templates/alias/list.html:32
#: mailu/ui/templates/alternative/list.html:29
#: mailu/ui/templates/domain/list.html:36 mailu/ui/templates/fetch/list.html:36
#: mailu/ui/templates/manager/list.html:28
#: mailu/ui/templates/relay/list.html:30 mailu/ui/templates/token/list.html:31
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
@@ -456,26 +532,20 @@ msgstr ""
#: mailu/ui/templates/alias/list.html:23 #: mailu/ui/templates/alias/list.html:23
#: mailu/ui/templates/alternative/list.html:21 #: mailu/ui/templates/alternative/list.html:21
#: mailu/ui/templates/domain/list.html:23 mailu/ui/templates/fetch/list.html:25 #: mailu/ui/templates/domain/list.html:25 mailu/ui/templates/fetch/list.html:27
#: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:22 #: mailu/ui/templates/relay/list.html:21 mailu/ui/templates/token/list.html:23
#: mailu/ui/templates/user/list.html:25 #: mailu/ui/templates/user/list.html:25
msgid "Created" msgid "Created"
msgstr "" msgstr ""
#: mailu/ui/templates/alias/list.html:24 #: mailu/ui/templates/alias/list.html:24
#: mailu/ui/templates/alternative/list.html:22 #: mailu/ui/templates/alternative/list.html:22
#: mailu/ui/templates/domain/list.html:24 mailu/ui/templates/fetch/list.html:26 #: mailu/ui/templates/domain/list.html:26 mailu/ui/templates/fetch/list.html:28
#: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:23 #: mailu/ui/templates/relay/list.html:22 mailu/ui/templates/token/list.html:24
#: mailu/ui/templates/user/list.html:26 #: mailu/ui/templates/user/list.html:26
msgid "Last edit" msgid "Last edit"
msgstr "" msgstr ""
#: mailu/ui/templates/alias/list.html:31 mailu/ui/templates/domain/list.html:33
#: mailu/ui/templates/fetch/list.html:33 mailu/ui/templates/relay/list.html:29
#: mailu/ui/templates/user/list.html:33
msgid "Edit"
msgstr ""
#: mailu/ui/templates/alternative/create.html:4 #: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain" msgid "Create alternative domain"
msgstr "" msgstr ""
@@ -509,6 +579,10 @@ msgstr ""
msgid "Generate keys" msgid "Generate keys"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:19
msgid "Download zonefile"
msgstr ""
#: mailu/ui/templates/domain/details.html:30 #: mailu/ui/templates/domain/details.html:30
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "" msgstr ""
@@ -518,22 +592,18 @@ msgid "DNS SPF entries"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:40 #: mailu/ui/templates/domain/details.html:40
msgid "DKIM public key"
msgstr ""
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:48 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:58 #: mailu/ui/templates/domain/details.html:53
msgid "DNS TLSA entry" msgid "DNS TLSA entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:63 #: mailu/ui/templates/domain/details.html:58
msgid "DNS client auto-configuration entries" msgid "DNS client auto-configuration entries"
msgstr "" msgstr ""
@@ -557,26 +627,36 @@ msgstr ""
msgid "Alias count" msgid "Alias count"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:31 #: mailu/ui/templates/domain/list.html:33
msgid "Details" msgid "Details"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:38 #: mailu/ui/templates/domain/list.html:40
msgid "Users" msgid "Users"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:39 #: mailu/ui/templates/domain/list.html:41
msgid "Aliases" msgid "Aliases"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:40 #: mailu/ui/templates/domain/list.html:42
msgid "Managers" msgid "Managers"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:42 #: mailu/ui/templates/domain/list.html:44
msgid "Alternatives" msgid "Alternatives"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "yes"
msgstr ""
#: mailu/ui/templates/domain/list.html:52 mailu/ui/templates/fetch/list.html:40
#: mailu/ui/templates/fetch/list.html:41
msgid "no"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13 #: mailu/ui/templates/domain/signup.html:13
msgid "" msgid ""
"In order to register a new domain, you must first setup the\n" "In order to register a new domain, you must first setup the\n"
@@ -615,21 +695,21 @@ msgid "Keep emails"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:23 #: mailu/ui/templates/fetch/list.html:23
msgid "Last check" msgid "Rescan emails"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:24 #: mailu/ui/templates/fetch/list.html:24
msgid "Folders"
msgstr ""
#: mailu/ui/templates/fetch/list.html:25
msgid "Last check"
msgstr ""
#: mailu/ui/templates/fetch/list.html:26
msgid "Status" msgid "Status"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:38
msgid "yes"
msgstr ""
#: mailu/ui/templates/fetch/list.html:38
msgid "no"
msgstr ""
#: mailu/ui/templates/manager/create.html:4 #: mailu/ui/templates/manager/create.html:4
msgid "Add a manager" msgid "Add a manager"
msgstr "" msgstr ""
@@ -666,6 +746,10 @@ msgstr ""
msgid "New token" msgid "New token"
msgstr "" msgstr ""
#: mailu/ui/templates/token/list.html:20
msgid "ID"
msgstr ""
#: mailu/ui/templates/user/create.html:4 #: mailu/ui/templates/user/create.html:4
msgid "New user" msgid "New user"
msgstr "" msgstr ""
@@ -674,7 +758,7 @@ msgstr ""
msgid "General" msgid "General"
msgstr "" msgstr ""
#: mailu/ui/templates/user/create.html:23 #: mailu/ui/templates/user/create.html:24
msgid "Features and quotas" msgid "Features and quotas"
msgstr "" msgstr ""
@@ -714,11 +798,11 @@ msgstr ""
msgid "pick a domain for the new account" msgid "pick a domain for the new account"
msgstr "" msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14 #: mailu/ui/templates/user/signup_domain.html:15
msgid "Domain" msgid "Domain"
msgstr "" msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15 #: mailu/ui/templates/user/signup_domain.html:16
msgid "Available slots" msgid "Available slots"
msgstr "" msgstr ""

View File

@@ -3,7 +3,7 @@
# base system image (intermediate) # base system image (intermediate)
# Note when updating the alpine tag, first manually run the workflow .github/workflows/mirror.yml. # Note when updating the alpine tag, first manually run the workflow .github/workflows/mirror.yml.
# Just run the workflow with the tag that must be synchronised. # Just run the workflow with the tag that must be synchronised.
ARG DISTRO=ghcr.io/mailu/alpine:3.20.3 ARG DISTRO=ghcr.io/mailu/alpine:3.21.0
FROM $DISTRO as system FROM $DISTRO as system
ENV TZ=Etc/UTC LANG=C.UTF-8 ENV TZ=Etc/UTC LANG=C.UTF-8
@@ -15,7 +15,7 @@ RUN set -euxo pipefail \
; addgroup -Sg ${MAILU_GID} mailu \ ; addgroup -Sg ${MAILU_GID} mailu \
; adduser -Sg ${MAILU_UID} -G mailu -h /app -g "mailu app" -s /bin/bash mailu \ ; adduser -Sg ${MAILU_UID} -G mailu -h /app -g "mailu app" -s /bin/bash mailu \
; apk add --no-cache bash ca-certificates curl python3 tzdata \ ; apk add --no-cache bash ca-certificates curl python3 tzdata \
; ! [[ "$(uname -m)" == x86_64 ]] \ ; ! [[ "$(apk --print-arch)" == x86_64 ]] \
|| apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing hardened-malloc || apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing hardened-malloc
WORKDIR /app WORKDIR /app
@@ -27,7 +27,7 @@ CMD /bin/bash
FROM system as build FROM system as build
ARG MAILU_DEPS=prod ARG MAILU_DEPS=prod
ARG SNUFFLEUPAGUS_VERSION=0.10.0 ARG SNUFFLEUPAGUS_VERSION=0.11.0
ENV VIRTUAL_ENV=/app/venv ENV VIRTUAL_ENV=/app/venv
@@ -52,10 +52,10 @@ ENV \
SNUFFLEUPAGUS_URL="https://github.com/jvoisin/snuffleupagus/archive/refs/tags/v${SNUFFLEUPAGUS_VERSION}.tar.gz" SNUFFLEUPAGUS_URL="https://github.com/jvoisin/snuffleupagus/archive/refs/tags/v${SNUFFLEUPAGUS_VERSION}.tar.gz"
RUN set -euxo pipefail \ RUN set -euxo pipefail \
; machine="$(uname -m)" \ ; machine="$(apk --print-arch)" \
; deps="build-base gcc libffi-dev python3-dev" \ ; deps="build-base gcc libffi-dev python3-dev mariadb-dev" \
; [[ "${machine}" != x86_64 ]] && \ ; [[ "${machine}" != x86_64 ]] && \
deps="${deps} cargo git libretls-dev mariadb-connector-c-dev postgresql-dev" \ deps="${deps} rust cargo git libretls-dev mariadb-connector-c-dev postgresql-dev" \
; apk add --virtual .build-deps ${deps} \ ; apk add --virtual .build-deps ${deps} \
; [[ "${machine}" == armv7* ]] && \ ; [[ "${machine}" == armv7* ]] && \
mkdir -p /root/.cargo/registry/index && \ mkdir -p /root/.cargo/registry/index && \

View File

@@ -57,6 +57,11 @@ class LogFilter(object):
self.stream.flush() self.stream.flush()
def _is_compatible_with_hardened_malloc(): def _is_compatible_with_hardened_malloc():
with open('/proc/version', 'r') as f:
major, minor = f.readline().split()[2].split('.')[:2]
if int(major) < 6 or int(major) == 6 and int(minor) < 1:
return False
with open('/proc/cpuinfo', 'r') as f: with open('/proc/cpuinfo', 'r') as f:
lines = f.readlines() lines = f.readlines()
for line in lines: for line in lines:
@@ -81,9 +86,13 @@ def set_env(required_secrets=[], log_filters=[]):
log.basicConfig(stream=sys.stderr, level=os.environ.get("LOG_LEVEL", 'WARNING')) log.basicConfig(stream=sys.stderr, level=os.environ.get("LOG_LEVEL", 'WARNING'))
signal.signal(signal.SIGTERM, sigterm_handler) signal.signal(signal.SIGTERM, sigterm_handler)
if not 'LD_PRELOAD' in os.environ and _is_compatible_with_hardened_malloc(): if _is_compatible_with_hardened_malloc():
log.warning('Your CPU has Advanced Vector Extensions available, we recommend you enable hardened-malloc earlier in the boot process by adding LD_PRELOAD=/usr/lib/libhardened_malloc.so to your mailu.env') if not 'LD_PRELOAD' in os.environ and _is_compatible_with_hardened_malloc():
os.environ['LD_PRELOAD'] = '/usr/lib/libhardened_malloc.so' log.warning('Your CPU has Advanced Vector Extensions available, we recommend you enable hardened-malloc earlier in the boot process by adding LD_PRELOAD=/usr/lib/libhardened_malloc.so to your mailu.env')
os.environ['LD_PRELOAD'] = '/usr/lib/libhardened_malloc.so'
with open('/proc/sys/vm/max_map_count', 'r') as f:
if int(f.readline()) < 1048576:
log.warning('Please consider increasing vm.max_map_count to 1048576 as per https://github.com/GrapheneOS/hardened_malloc?tab=readme-ov-file#traditional-linux-based-operating-systems')
""" This will set all the environment variables and retains only the secrets we need """ """ This will set all the environment variables and retains only the secrets we need """
if 'SECRET_KEY_FILE' in os.environ: if 'SECRET_KEY_FILE' in os.environ:

View File

@@ -22,6 +22,7 @@ gunicorn
idna idna
itsdangerous itsdangerous
limits limits
mariadb
marshmallow marshmallow
marshmallow-sqlalchemy marshmallow-sqlalchemy
mysql-connector-python mysql-connector-python
@@ -45,6 +46,7 @@ watchdog
# core/postfix # core/postfix
postfix-mta-sts-resolver postfix-mta-sts-resolver
uvloop
# core/oletools # core/oletools
python-magic python-magic

View File

@@ -42,6 +42,7 @@ jsonschema==4.22.0
jsonschema-specifications==2023.12.1 jsonschema-specifications==2023.12.1
limits==3.11.0 limits==3.11.0
Mako==1.3.3 Mako==1.3.3
mariadb==1.1.11
MarkupSafe==2.1.5 MarkupSafe==2.1.5
marshmallow==3.21.2 marshmallow==3.21.2
marshmallow-sqlalchemy==1.0.0 marshmallow-sqlalchemy==1.0.0
@@ -79,6 +80,7 @@ tabulate==0.9.0
tenacity==8.2.3 tenacity==8.2.3
typing_extensions==4.11.0 typing_extensions==4.11.0
urllib3==2.2.2 urllib3==2.2.2
uvloop==0.21.0
validators==0.28.1 validators==0.28.1
visitor==0.1.3 visitor==0.1.3
vobject==0.9.7 vobject==0.9.7

View File

@@ -17,8 +17,7 @@ ARG VERSION
LABEL version=$VERSION LABEL version=$VERSION
RUN set -euxo pipefail \ RUN set -euxo pipefail \
; apk add --no-cache certbot nginx nginx-mod-http-brotli nginx-mod-mail openssl \ ; apk add --no-cache certbot nginx nginx-mod-http-brotli nginx-mod-mail openssl dovecot-lua dovecot-pigeonhole-plugin 'dovecot-lmtpd<2.4' dovecot-pop3d dovecot-submissiond
; apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main dovecot-lua dovecot-pigeonhole-plugin 'dovecot-lmtpd<2.4' dovecot-pop3d dovecot-submissiond
COPY conf/ /conf/ COPY conf/ /conf/
COPY --from=static /static/ /static/ COPY --from=static /static/ /static/

View File

@@ -221,7 +221,7 @@ The minimum length is 3 characters.
This token must be passed as request header to the API as authentication token. This token must be passed as request header to the API as authentication token.
This is a mandatory setting for using the RESTful API. This is a mandatory setting for using the RESTful API.
The ``CREDENTIAL_ROUNDS`` (default: 12) setting is the number of rounds used by the The ``CREDENTIAL_ROUNDS`` (default: 13) setting is the number of rounds used by the
password hashing scheme. The number of rounds can be reduced in case faster password hashing scheme. The number of rounds can be reduced in case faster
authentication is needed or increased when additional protection is desired. authentication is needed or increased when additional protection is desired.
Keep in mind that this is a mitigation against offline attacks on password hashes, Keep in mind that this is a mitigation against offline attacks on password hashes,

View File

@@ -986,3 +986,32 @@ Below are the steps for writing the postfix (mail) logs to a log file on the fil
if [ -d /run/systemd/system ]; then if [ -d /run/systemd/system ]; then
systemctl kill -s HUP rsyslog.service systemctl kill -s HUP rsyslog.service
fi fi
Admin container fails to connect to external MariaDB database
`````````````````````````````````````````````````````````````
If the admin container is `unable to connect to an external MariaDB database due to incompatible collation`_, you may need to change the ``SQLALCHEMY_DATABASE_URI`` setting to ensure the right connector is used.
Alternatively, you may set ``DB_APPENDIX`` accordingly. For example: ``?collation=utf8mb4_unicode_ci`` is appended as is just after the database name in case DB_TYPE and related values are set.
MariaDB has no support for utf8mb4_0900_ai_ci which is the new default since MySQL version 8.0.
.. _`unable to connect to an external MariaDB database due to incompatible collation`: https://github.com/Mailu/Mailu/issues/3449
Why is Rspamd giving me an "Illegal instruction" error ?
`````````````````````````````````````````````````````````
On Linux amd64 (x84_64), if the antispam container is crashing and gives you an ``Illegal instruction`` error, you may have a CPU that lacks support of the ``SSE4.2`` instruction set.
The more modern and FOSS ``vectorscan`` library used by rspamd superseeded the now closed source Intel ``hyperscan`` library in Alpine Linux, and since August 2024 it requires the ``SSE4.2`` instruction set to work properly.
Pre-2013 Intel Atom CPUs (Like N2800 or D425), Intel pre-Nehalem architectures and AMD pre-Bulldozer architectures do not support ``SSE4.2``.
To check if your CPU supports ``SSE4.2`` you can use this one liner command:
``if grep -q sse4_2 /proc/cpuinfo; then echo "CPU is SSE4.2 Capable"; else echo "CPU is NOT SSE4.2 capable"; fi``
A workaround to this issue is to use a x86_32 (or i686) version of rspamd, because the ``vectorscan`` library is only used on 64-bit capable systems.
Note that this may stop working in the future, as 32-bit software support is being progressively dropped.
*Issue reference:* `3713`_.
.. _`3713`: https://github.com/Mailu/Mailu/issues/3713

View File

@@ -7,10 +7,31 @@ other Web services are available on other FQDNs served from the same IP address.
In such a configuration, one would usually run a front-end reverse proxy to serve all In such a configuration, one would usually run a front-end reverse proxy to serve all
Web contents based on criteria like the requested hostname (virtual hosts). Web contents based on criteria like the requested hostname (virtual hosts).
The Mailu team recommends to use Traefik as reverse proxy. This program is solely designed
to act as reverse proxy. It is easy to configure and offers a streamlined experienced when
used with other docker containers on the same host.
When using a reverse proxy, Mailu should still be used for requesting certificates.
This prevents duplicate certificates.
Other reasons are:
- Mailu controls the ciphers and keys used for certificates (Mailu has both RSA and ECDSA certs)
- Mailu cerbot client is configured to prevent hitting ratelimits of the CA
- Due to usage of proxy protocol it is less likely that Mailu becomes an open relay due to misconfiguration of special headers.
- No special scripting is required to copy over certs from the proxy to Mailu
When using Mailu with Traefik as reverse proxy. Traefik is configured to use proxy protocol for all ports, but port 80.
Port 80 is configured to let through the letsencrypt HTTP challenges for Mailu.
This means that if Traefik must request certificates for other services than Mailu, Traefik should use the TLS (TLS-ALPN-01)
challenge method. The HTTP challenge (HTTP-01) cannot be used since this is already used by Mailu.
.. _traefik_proxy: .. _traefik_proxy:
Traefik as reverse proxy Traefik as reverse proxy (same host)
------------------------ ------------------------------------
This example is for when Traefik (reverse proxy) runs on the same host as Mailu.
It makes use of the docker configuration method for Traefik.
In your docker-compose.yml, remove the `ports` section of the `front` container In your docker-compose.yml, remove the `ports` section of the `front` container
and add a section like follows: and add a section like follows:
@@ -102,7 +123,7 @@ and then add the following to the front section:
in mailu.env: in mailu.env:
.. code-block:: docker .. code-block:: bash
REAL_IP_FROM=192.168.203.0/24 REAL_IP_FROM=192.168.203.0/24
PROXY_PROTOCOL=25,443,465,993,995,4190 PROXY_PROTOCOL=25,443,465,993,995,4190
@@ -111,3 +132,164 @@ in mailu.env:
WEBROOT_REDIRECT=/sso/login WEBROOT_REDIRECT=/sso/login
Using the above configuration, Traefik will proxy all the traffic related to Mailu's FQDNs without requiring duplicate certificates. Using the above configuration, Traefik will proxy all the traffic related to Mailu's FQDNs without requiring duplicate certificates.
Traefik as reverse proxy (different host)
-----------------------------------------
This example is for when Traefik (reverse proxy) runs on a different server than the Mailu server.
This example makes use of the File configuration method (File Provider) of Traefik.
It makes use of a single static configuration file and one or more dynamic configuration files.
This example uses V3 of Traefik. V2 and V3 of Traefik have some differences in the configuration method.
The contents for the static configuration file. The static configuration file must be provided as argument to Traefik.
.. code-block:: yaml
#STATIC CONFIGURATION FILE
#Below value for 'directory' is the location where the dynamic configuration files reside:
#When a change is made in this folder, Traefik automatically loads or reloads it.
providers:
file:
directory: "/etc/traefik/conf"
entryPoints:
web:
address: :80
websecure:
address: :443
mailu-smtp:
address: :25
mailu-imaps:
address: :993
mailu-pop3s:
address: :995
mailu-submissions:
address: :465
mailu-sieve:
address: :4190
#Optional, enables access logging at:
accessLog:
filePath: "/var/log/traefik_access.log"
#Optional, enables normal logging at:
log:
level: INFO
filePath: "/var/log/traefik.log"
This is the contents for the dynamic configuration. You can use any filename you want.
The extension must end with .yml and the file must be placed in the configured directory for
dynamic configuration files.
.. code-block:: yaml
http:
routers:
mailu-web:
entryPoints:
- web
rule: "Host(`mail.example.com) || PathPrefix(`/.well-known/acme-challenge/`))"
service: "mailu-web"
services:
mailu-web:
loadBalancer:
servers:
- url: "http://mailu-server"
tcp:
routers:
mailu-websecure:
entryPoints:
- websecure
# Add other FQDN's here
rule: "HostSNI(`mail.example.com`) || HostSNI(`autoconfig.example.com`) || HostSNI(`mta-sts.example.com`)"
service: "mailu-websecure"
tls:
passthrough: true
mailu-submissions:
entryPoints:
- mailu-submissions
rule: "HostSNI(`*`)"
service: "mailu-submissions"
mailu-imaps:
entryPoints:
- mailu-imaps
rule: "HostSNI(`*`)"
service: "mailu-imaps"
tls:
passthrough: true
mailu-pop3s:
entryPoints:
- mailu-pop3s
rule: "HostSNI(`*`)"
service: "mailu-pop3s"
tls:
passthrough: true
mailu-submissions:
entryPoints:
- mailu-submissions
rule: "HostSNI(`*`)"
service: "mailu-submissions"
tls:
passthrough: true
mailu-sieve:
entryPoints:
- mailu-sieve
rule: "HostSNI(`*`)"
service: "mailu-sieve"
services:
mailu-websecure:
loadBalancer:
proxyProtocol:
version: 2
servers:
- address: "mailu-server:443"
mailu-smtp:
loadBalancer:
proxyProtocol:
version: 2
servers:
- address: "mailu-server:25"
mailu-submissions:
loadBalancer:
proxyProtocol:
version: 2
servers:
- address: "mailu-server:465"
mailu-imaps:
loadBalancer:
proxyProtocol:
version: 2
servers:
- address: "mailu-server:993"
mailu-pop3s:
loadBalancer:
proxyProtocol:
version: 2
servers:
- address: "mailu-server:995"
mailu-sieve:
loadBalancer:
proxyProtocol:
version: 2
servers:
- address: "mailu-server:4190"
In the mailu.env file add the following:
.. code-block:: bash
#Add the IP address of the Traefik server as value for REAL_IP_FROM
REAL_IP_FROM=192.168.2.300/32
PROXY_PROTOCOL=25,443,465,993,995,4190
TLS_FLAVOR=letsencrypt
WEBROOT_REDIRECT=/sso/login
Using the above configuration, Traefik will proxy all the traffic related to Mailu's FQDNs without requiring duplicate certificates.

View File

@@ -22,6 +22,9 @@ linux/arm64v8 or linux/armv7 hardware, so it
should run on pretty much any cloud server as long as enough power is should run on pretty much any cloud server as long as enough power is
provided. provided.
On x86_64, check that your processor supports the ``SSE4.2`` instruction set.
For example, pre-2013 Intel Atom CPUs lacks ``SSE4.2`` support. See :ref:`faq`.
You should also have at least a DNS hostname and a DNS name for receiving You should also have at least a DNS hostname and a DNS name for receiving
emails. Some instructions are provided on the matter in the article emails. Some instructions are provided on the matter in the article
:ref:`dns_setup`. :ref:`dns_setup`.

View File

@@ -217,7 +217,7 @@ services:
# Optional services # Optional services
{% if antivirus_enabled %} {% if antivirus_enabled %}
antivirus: antivirus:
image: clamav/clamav-debian:1.2.3-45 image: clamav/clamav-debian:1.4
restart: always restart: always
logging: logging:
driver: journald driver: journald
@@ -226,13 +226,7 @@ services:
networks: networks:
- clamav - clamav
volumes: volumes:
- "{{ root }}/filter/clamav:/var/lib/clamav" - "{{ root }}/clamav:/var/lib/clamav"
healthcheck:
test: ["CMD-SHELL", "kill -0 `cat /tmp/clamd.pid` && kill -0 `cat /tmp/freshclam.pid`"]
interval: 10s
timeout: 5s
retries: 3
start_period: 10s
{% endif %} {% endif %}
{% if webdav_enabled %} {% if webdav_enabled %}

View File

@@ -10,8 +10,8 @@ IP addresses in order to expose its public services. You must at least set up
an IPv4 or an IPv6 address if you wish to access Mailu.</p> an IPv4 or an IPv6 address if you wish to access Mailu.</p>
<p><span class="label label-warning">Warning</span> You must use specific addresses, please <p><span class="label label-warning">Warning</span> You must use specific addresses, please
avoid generic all-interfaces addresses like <code>0.0.0.0</code> or <code>::</code>. avoid generic all-interfaces addresses like <code>0.0.0.0</code> or <code>::</code>. If you still want to use generic addresses you <b>MUST</b> disable <code>userland-proxy</code>; failing to do so will turn your Mailu installation into an open-relay.
<a href="https://mailu.io/{{ version }}/compose/setup.html#bind-address">How to find these addresses.</a></p> <a href="https://mailu.io/{{ version }}/compose/setup.html#bind-address">How to find these addresses.</a> <a href="https://mailu.io/{{ version }}/faq.html#how-to-make-ipv6-work">How to disable userland-proxy.</a></p>
<div class="form-group"> <div class="form-group">
<label>IPv4 listen address</label> <label>IPv4 listen address</label>

View File

@@ -1,9 +1,10 @@
set -e
echo "Users tests ..." echo "Users tests ..."
# Should fail, admin is already auto-created # Should fail, admin is already auto-created
docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu admin admin mailu.io 'FooBar' && exit 1 docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu admin admin mailu.io 'FooBar' && exit 1
echo "The above error was intended!" echo "The above error was intended!"
# Should not fail, but does nothing; ifmissing mode # Should not fail, but does nothing; ifmissing mode
docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu admin admin mailu.io 'FooBar' --mode=ifmissing || exit 1 docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu admin admin mailu.io 'FooBar' --mode=ifmissing
# Should not fail and update the password; update mode # Should not fail and update the password; update mode
docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu admin admin mailu.io 'password' --mode=update || exit 1 docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu admin admin mailu.io 'password' --mode=update || exit 1
docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu user user mailu.io 'password' || exit 1 docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu user user mailu.io 'password' || exit 1

View File

@@ -1 +1,2 @@
python3 tests/email_test.py message-core set -e
python3 tests/email_test.py message-core

View File

@@ -1,3 +1,4 @@
set -e
cat << EOF | docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu config-update -v 1 cat << EOF | docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu config-update -v 1
users: users:
- localpart: forwardinguser - localpart: forwardinguser

View File

@@ -1,3 +1,5 @@
set -e
cat << EOF | docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu config-update -v 1 cat << EOF | docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu config-update -v 1
aliases: aliases:
- localpart: alltheusers - localpart: alltheusers

View File

@@ -1,3 +1,4 @@
set -e
cat << EOF | docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu config-update -v 1 cat << EOF | docker compose -f tests/compose/core/docker-compose.yml exec -T admin flask mailu config-update -v 1
users: users:
- localpart: replyuser - localpart: replyuser

View File

@@ -99,7 +99,7 @@ services:
networks: networks:
- clamav - clamav
volumes: volumes:
- "/mailu/filter/clamav:/var/lib/clamav" - "/mailu/clamav:/var/lib/clamav"
healthcheck: healthcheck:
test: ["CMD-SHELL", "kill -0 `cat /tmp/clamd.pid` && kill -0 `cat /tmp/freshclam.pid`"] test: ["CMD-SHELL", "kill -0 `cat /tmp/clamd.pid` && kill -0 `cat /tmp/freshclam.pid`"]
interval: 10s interval: 10s

View File

@@ -0,0 +1 @@
Bump CREDENTIAL_ROUNDS to 13. If your system is too slow you may want to revert back to 12.

View File

@@ -0,0 +1 @@
Add DKIM support for alternative domains: alternative domains use the same DKIM key as the main domain.

View File

@@ -0,0 +1 @@
Fix a bug preventing user "forward_destination" to be updated with a PATCH request

View File

@@ -0,0 +1 @@
Warn if passwords set from the UI contain leading or trailing whitespaces (see #3425)

View File

@@ -0,0 +1 @@
The reverse proxy documentation page is updated with the scenario where Traefik (the reverse proxy) resides on a different server.

View File

@@ -0,0 +1 @@
Add the mariadb connector, as per #3449

View File

@@ -0,0 +1 @@
Ensure the tests actually work

View File

@@ -0,0 +1 @@
Upgrade to snuffleupagus 0.11, filter php:// wrapper types

View File

@@ -0,0 +1 @@
Modern docker versions enable the userland-proxy by default, clarify in setup that unless the bindto address is specific that will create problems.

View File

@@ -0,0 +1 @@
autoconfig shouldn't set useGlobalPreferredServer

View File

@@ -0,0 +1 @@
Add optional DB_APPENDIX configuration parameter which is appended as is to the postgresql or mysql URI

View File

@@ -0,0 +1,7 @@
Place ClamAV files under `mailu/clamav` instead of `mailu/filter/clamav` such that they can be modified by ClamAV
itself.
Users will want to change their `docker-compose.yml` accordingly and remove `mailu/filter/clamav` after upgrade.
Also ClamAV image tag increased to `1.4` instead of specific (older) release, users will need to update it manually as
well and keep it updated over time.

View File

@@ -0,0 +1 @@
Update roundcube to 1.6.10

View File

@@ -0,0 +1 @@
domain name of an IDN domain in the DKIM signature needs to follow RFC6376; puny encoding the domain name when rspamd accesses the vault;

View File

@@ -0,0 +1 @@
Remove the healthcheck section of clamav: use upstream's

View File

@@ -28,8 +28,8 @@ RUN set -euxo pipefail \
; mkdir -p /run/nginx /conf ; mkdir -p /run/nginx /conf
# roundcube # roundcube
ENV ROUNDCUBE_URL=https://github.com/roundcube/roundcubemail/releases/download/1.6.9/roundcubemail-1.6.9-complete.tar.gz ENV ROUNDCUBE_URL https://github.com/roundcube/roundcubemail/releases/download/1.6.10/roundcubemail-1.6.10-complete.tar.gz
ENV CARDDAV_URL=https://github.com/mstilkerich/rcmcarddav/releases/download/v5.1.0/carddav-v5.1.0.tar.gz ENV CARDDAV_URL https://github.com/mstilkerich/rcmcarddav/releases/download/v5.1.0/carddav-v5.1.0.tar.gz
RUN set -euxo pipefail \ RUN set -euxo pipefail \
; cd /var/www \ ; cd /var/www \

View File

@@ -26,6 +26,8 @@ sp.readonly_exec.enable();
# PHP has a lot of wrappers, most of them aren't usually useful, you should # PHP has a lot of wrappers, most of them aren't usually useful, you should
# only enable the ones you're using. # only enable the ones you're using.
sp.wrappers_whitelist.list("file,php,phar,mailsosubstreams,mailsoliteral,mailsotempfile,mailsobinary"); sp.wrappers_whitelist.list("file,php,phar,mailsosubstreams,mailsoliteral,mailsotempfile,mailsobinary");
# The "php" wrapper can be further filtered: we probably don't want 'filter' nor 'fd'
sp.wrappers_whitelist.php_list("stdout,stdin,stderr,input,output,memory,temp");
# Prevent sloppy comparisons. # Prevent sloppy comparisons.
sp.sloppy_comparison.enable(); sp.sloppy_comparison.enable();