77 Commits
master ... 1.5

Author SHA1 Message Date
70251ea215 Downgrade postfix back to 1.4 configuration 2021-04-26 21:52:18 +02:00
87ac211e03 Fixes 2021-04-26 20:23:45 +02:00
eb8380fa5b Fix python3 compatibility 2021-04-26 18:31:20 +02:00
a6491fd87f Fix build.sh 2021-04-26 18:25:46 +02:00
4ab9ba97ca Update to alpine 3.13 2021-04-26 18:24:31 +02:00
e2aa247c2d Fix rspamd 2021-04-26 18:20:48 +02:00
Tim Möhlmann
f75b2fb631 Disable healthcheck, like on master 2018-12-17 00:30:26 +02:00
Tim Möhlmann
0739224fc4 Add dockerfile and enable Docs build 2018-12-17 00:19:44 +02:00
Tim Möhlmann
fc83a7d829 Merge pull request #749 from usrpro/1.5-autobuild
1.5 autobuild
2018-12-16 23:43:56 +02:00
mergify-bot
2b1ed25148 Merge branch '1.5' into '1.5-autobuild' 2018-12-16 22:36:47 +01:00
kaiyou
a4551870aa Backport documentation build from master 2018-12-16 22:31:28 +01:00
Tim Möhlmann
6869b3096b Use MAILU_VERSION from Travis for Docs build 2018-12-15 21:46:30 +02:00
Tim Möhlmann
1c39af464d Move radicale to edge in able to build 2018-12-15 21:00:58 +02:00
Tim Möhlmann
f02a183694 Enable Travis autobuilds for 1.5
This is a simplified backport from master, whitout any testing.
2018-12-15 20:52:57 +02:00
Tim Möhlmann
cd80fda12e Merge pull request #735 from HorayNarea/fix-dhparam
fix dhparam.pem shadowing in 1.5
2018-12-08 11:58:15 +02:00
kaiyou
8c7138d69b Move dhparam to /conf 2018-12-08 09:02:26 +01:00
kaiyou
28f8e69ebb Merge pull request #709 from rbarazzutti/1.5-htaccess-php7
1.5 htaccess php7
2018-12-06 10:01:57 +01:00
kaiyou
09934c460c Merge pull request #706 from usrpro/backport-incl-dhparam
Use a predefined dhparam.pem (Backport)
2018-12-06 10:00:40 +01:00
Raphaël P. Barazzutti
18f4f0bed8 adapt the .htaccess file for PHP7 as required 2018-11-18 10:27:08 +01:00
Greg Fitzgerald
e2ce62cbd0 Use a predefined dhparam.pem, This fixes issue #322 2018-11-09 13:34:28 +02:00
kaiyou
a36fc369f9 Merge pull request #658 from bluedynamics/backport/309-Announces-fail
Only check login mismatch for authenticated users, fixes #309
2018-10-16 19:49:25 +02:00
Pierre Jaury
c91953b5df Only check login mismatch for authenticated users, fixes #309 2018-10-15 16:05:55 +02:00
kaiyou
790e32cfb8 Merge pull request #572 from ofthesun9/1.5-alpine_3.8
alpine 3.8 for nginx front container
2018-10-07 11:56:23 +02:00
kaiyou
bbcf3edb10 Merge branch '1.5' into 1.5-alpine_3.8 2018-10-07 11:56:13 +02:00
kaiyou
e4b63cb043 Merge pull request #617 from HorayNarea/patch-3
backport fix for #474 to 1.5
2018-10-06 19:08:50 +02:00
kaiyou
a7a27625cc Merge pull request #621 from usrpro/fix-1.5-no-travis
1.5: Travis to always succeed
2018-10-06 17:14:47 +02:00
Tim Möhlmann
57188345f0 Travis to always succeed 2018-10-01 00:44:37 +03:00
Thomas Sänger
4dd66e4964 backport fix for #474 to 1.5 2018-09-29 15:59:36 +02:00
kaiyou
cfff8953e5 Merge pull request #556 from usrpro/patch-1
Libpng12-dev is now called libpng-dev
2018-09-16 19:56:09 +02:00
kaiyou
9bf6f84c05 Merge pull request #557 from usrpro/1.5
Pin Alpine 3.7
2018-09-16 19:55:16 +02:00
kaiyou
cd0bc5562a Merge pull request #587 from nasa9084/patch-1
fix typo
2018-09-16 19:47:53 +02:00
nasa9084
eb4e65be64 fix typo 2018-09-14 15:59:19 +09:00
Hypriot Pirate
5d26c9a097 fix for #522 2018-08-18 13:08:36 +00:00
Tim Möhlmann
f0e56bb80e Libpng12-dev is now called libpng-dev
Like PR #514, this prevents re-building the image in the 1.5 branch.
2018-08-07 19:13:17 +03:00
Tim Möhlmann
465ccda95f Pin Alpine 3.7 to preserve the Postfix version 2018-08-07 18:38:22 +03:00
kaiyou
e14fcd1b8a Merge pull request #549 from muhlemmer/1.5
Use alpine:3.7 tag to prevent postix upgrade
2018-08-03 08:19:53 +02:00
kaiyou
4d62861b78 Pin alpine 3.7 2018-08-03 07:25:36 +02:00
kaiyou
550470d604 Pin alpine 3.7 in order to preserve Postfix version 2018-08-03 07:24:20 +02:00
Tim Möhlmann
43b64229d1 Use alpine:3.7 tag to prevent postix upgrade 2018-08-03 00:31:28 +03:00
kaiyou
ad6bc4060d Merge pull request #536 from WBasson/patch-1
Update index.rst
2018-08-01 21:08:20 +02:00
WBasson
53da190863 Update index.rst
administration was mis-spelled
2018-07-26 11:00:10 +02:00
ofthesun9
6674af8881 Switching to alpine:3.8 2018-07-21 15:19:43 +00:00
kaiyou
c24cabc305 Merge pull request #488 from ofthesun9/1.5
Fix rspamd behavior, currently failing due to worker-fuzzy for 1.5
2018-06-03 17:06:53 +02:00
ofthesun9
ce4db065c6 Fix rspamd behavior, currently failing due to worker-fuzzy for 1.5 2018-06-03 11:35:53 +00:00
kaiyou
3e6f0d7842 Merge pull request #486 from ofthesun9/1.5
Do not remove openssl when purging build deps, fixes #481
2018-06-03 11:48:57 +02:00
Pierre Jaury
11f145da8c Do not remove openssl when purging build deps, fixes #481 2018-06-03 09:51:49 +02:00
Pierre Jaury
6a3236200d Fix the path of the nginx pid in startup scripts, fixes #483
(cherry picked from commit 6828231c28)
2018-06-02 10:23:58 +02:00
kaiyou
e17c587b78 Remove a reference to 1.5.1 2018-04-21 12:29:55 +02:00
kaiyou
9caab592ed Switch to edge for clamav 2018-03-21 21:25:22 +01:00
AdrienM
6afde67525 Add explicit ssl_protocols in conf 2018-03-21 08:20:24 +01:00
kaiyou
564f5ad070 Merge pull request #397 from pbinks/patch-2
Update setup.rst
2018-03-05 21:21:35 +01:00
kaiyou
fb74adf1dc Remove the reference to stable in the setup docs, fixes #393
(cherry picked from commit a0d7b987ca)
2018-03-05 21:19:29 +01:00
kaiyou
91bb76ecd3 Merge pull request #402 from pbinks/patch-7
Update cli.rst
2018-03-05 20:46:47 +01:00
kaiyou
f7dfee4c60 Merge pull request #401 from pbinks/patch-6
Update maintain.rst
2018-03-05 20:46:28 +01:00
kaiyou
dbe0cfe129 Merge pull request #400 from pbinks/patch-5
Update reverse.rst
2018-03-05 20:45:45 +01:00
kaiyou
fdeb302eff Merge pull request #399 from pbinks/patch-4
Update dns.rst
2018-03-05 20:45:28 +01:00
kaiyou
8eeb9b22b4 Merge pull request #398 from pbinks/patch-3
Update index.rst
2018-03-05 20:45:12 +01:00
kaiyou
b362940388 Merge pull request #396 from pbinks/patch-1
Update requirements.rst
2018-03-05 20:41:58 +01:00
Paul Binks
ce01389669 Update cli.rst 2018-03-01 16:49:30 +00:00
Paul Binks
37ba915e7b Update maintain.rst 2018-03-01 16:46:21 +00:00
Paul Binks
6c47dfb997 Update reverse.rst 2018-03-01 16:41:17 +00:00
Paul Binks
4b6e48d826 Update dns.rst 2018-03-01 16:36:43 +00:00
Paul Binks
2f7dbe92bf Update index.rst 2018-03-01 16:33:13 +00:00
Paul Binks
0ff9d3c953 Update setup.rst 2018-03-01 16:30:13 +00:00
Paul Binks
cce0de24e9 Update requirements.rst 2018-03-01 16:20:43 +00:00
kaiyou
2b144bc574 Specify the client max body size in the front, related to #371
(cherry picked from commit 6c56c8e298)
2018-02-19 14:18:35 +01:00
kaiyou
449af8eb0b Make sure stale pid files are dealt with, fix #341
(cherry picked from commit 4761646616)
2018-02-08 21:09:32 +01:00
Rafael Cossovan
e03097b505 Update configuration.rst
Fix env variable.

(cherry picked from commit 23f392efb2)
2018-02-01 00:41:46 +01:00
kaiyou
c157088385 Set the temp directory for Roundcube, related to #365
(cherry picked from commit 34d88144b2)
2017-12-19 22:19:38 +01:00
kaiyou
4ce3a04287 Use relative redirect for / to the webmail
(cherry picked from commit acb5d7da38)
2017-12-05 20:08:36 +01:00
kaiyou
8854d76bcc Use a map for passing x-forwarded-proto along
(cherry picked from commit 2dfc91ac4d)
2017-12-05 20:08:29 +01:00
kaiyou
13ffb85912 Remove a remaining rebug print() statement
(cherry picked from commit 42314d3d75)
2017-12-05 20:08:19 +01:00
kaiyou
f5b78ffff0 Properly use x-forwarded-proto with redirects in the webui, related to #347
(cherry picked from commit a4f46ced49)
2017-12-05 20:08:11 +01:00
kaiyou
46dc9b0b16 Fix the Webdav behavior with Radicale, related to #334 2017-11-30 22:03:22 +01:00
kaiyou
820f6dee82 Merge branch '1.5' into 1.5.1 2017-11-26 22:10:36 +01:00
kaiyou
92c21613ff Set the title of web pages in the docs
(cherry picked from commit 03d3351496)
2017-11-21 22:44:11 +01:00
kaiyou
017a2611cc Release version 1.5.1 2017-11-21 22:05:23 +01:00
237 changed files with 2501 additions and 13933 deletions

30
.gitsplit.yml Normal file
View File

@@ -0,0 +1,30 @@
splits:
- prefix: "admin"
target: "https://${GH_TOKEN}@github.com/Mailu/Admin.git"
- prefix: "clamav"
target: "https://${GH_TOKEN}@github.com/Mailu/ClamAV.git"
- prefix: "dovecot"
target: "https://${GH_TOKEN}@github.com/Mailu/Dovecot.git"
- prefix: "fetchmail"
target: "https://${GH_TOKEN}@github.com/Mailu/Fetchmail.git"
- prefix: "nginx-no-https"
target: "https://${GH_TOKEN}@github.com/Mailu/NGINX-no-HTTPS.git"
- prefix: "nginx"
target: "https://${GH_TOKEN}@github.com/Mailu/NGINX.git"
- prefix: "postfix"
target: "https://${GH_TOKEN}@github.com/Mailu/Postfix.git"
- prefix: "radicale"
target: "https://${GH_TOKEN}@github.com/Mailu/Radicale.git"
- prefix: "rainloop"
target: "https://${GH_TOKEN}@github.com/Mailu/RainLoop.git"
- prefix: "rmilter"
target: "https://${GH_TOKEN}@github.com/Mailu/Rmilter.git"
- prefix: "roundcube"
target: "https://${GH_TOKEN}@github.com/Mailu/Roundcube.git"
- prefix: "rspamd"
target: "https://${GH_TOKEN}@github.com/Mailu/Rspamd.git"
origins:
- ^master$
- ^stable$
- ^v\d+\.\d+\.\d+$

View File

@@ -1,25 +0,0 @@
pull_request_rules:
- name: Successful travis and 2 approved reviews
conditions:
- status-success=continuous-integration/travis-ci/pr
- label!=["status"/wip","status/blocked"]
- "#approved-reviews-by>=2"
actions:
merge:
method: merge
strict: true
dismiss_reviews:
approved: true
- name: Trusted author, successful travis and 1 approved review
conditions:
- author~=(kaiyou|muhlemmer|mildred|HorayNarea|adi90x|hoellen|ofthesun9)
- status-success=continuous-integration/travis-ci/pr
- label!=["status"/wip","status/blocked","review/need2"]
- "#approved-reviews-by>=1"
actions:
merge:
method: merge
strict: true
dismiss_reviews:
approved: true

View File

@@ -11,23 +11,15 @@ language: python
python:
- "3.6"
install:
- pip install -r tests/requirements.txt
- sudo curl -L https://github.com/docker/compose/releases/download/1.23.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
- sudo chmod +x /usr/local/bin/docker-compose
before_script:
- docker-compose -v
- docker-compose -f tests/build.yml build
- sudo -- sh -c 'mkdir -p /mailu && cp -r tests/certs /mailu && chmod 600 /mailu/certs/*'
script:
# test.py, test name and timeout between start and tests.
- python tests/compose/test.py core 1
- python tests/compose/test.py fetchmail 1
- travis_wait python tests/compose/test.py filters 10
- python tests/compose/test.py rainloop 1
- python tests/compose/test.py roundcube 1
- python tests/compose/test.py webdav 1
- /bin/true
deploy:
provider: script

View File

@@ -1,5 +1,4 @@
<p align="leftr"><img src="docs/assets/logomark.png" alt="Mailu" height="200px"></p>
![Logo](docs/assets/logo.png)
Mailu is a simple yet full-featured mail server as a set of Docker images.
It is free software (both as in free beer and as in free speech), open to
@@ -19,7 +18,7 @@ Main features include:
- **Standard email server**, IMAP and IMAP+, SMTP and Submission
- **Advanced email features**, aliases, domain aliases, custom routing
- **Web access**, multiple Webmails and administration interface
- **Web access**, multiple Webmails and adminitration interface
- **User features**, aliases, auto-reply, auto-forward, fetched accounts
- **Admin features**, global admins, announcements, per-domain delegation, quotas
- **Security**, enforced TLS, Letsencrypt!, outgoing DKIM, anti-virus scanner

26
build.sh Executable file
View File

@@ -0,0 +1,26 @@
#!/bin/bash -e
TAG="1.5-$(date +%Y%m%d)"
build() {
image=$1
echo "[INFO] Building ${image}"
docker build -t ${image} .
docker push ${image}
}
if [ -z "$1" ]; then
find . -name Dockerfile | while read i; do
dir=$(dirname $i)
pushd ${dir} >/dev/null
image="genunix/mailu-$(basename $dir):${TAG}"
build ${image}
popd >/dev/null
done
else
dir=$(basename $1)
image="genunix/mailu-$(basename $dir):${TAG}"
pushd "$1" >/dev/null
build "$image"
popd >/dev/null
fi

View File

@@ -1,28 +1,19 @@
FROM alpine:3.8
# python3 shared with most images
RUN apk add --no-cache \
python3 py3-pip \
&& pip3 install --upgrade pip
# Image specific layers under this line
FROM python:3-alpine3.13
RUN mkdir -p /app
WORKDIR /app
COPY requirements-prod.txt requirements.txt
RUN apk add --no-cache openssl curl \
RUN apk add --no-cache openssl \
&& apk add --no-cache --virtual build-dep openssl-dev libffi-dev python3-dev build-base \
&& pip3 install -r requirements.txt \
&& apk del --no-cache build-dep
&& pip install -r requirements.txt \
&& apk del build-dep
COPY mailu ./mailu
COPY migrations ./migrations
COPY start.py /start.py
COPY manage.py .
COPY start.sh /start.sh
RUN pybabel compile -d mailu/translations
EXPOSE 80/tcp
VOLUME ["/data","/dkim"]
ENV FLASK_APP mailu
CMD /start.py
HEALTHCHECK CMD curl -f -L http://localhost/ui/login?next=ui.index || exit 1
CMD ["/start.sh"]

View File

@@ -1,56 +1,120 @@
import flask
import flask_sqlalchemy
import flask_bootstrap
import flask_login
import flask_script
import flask_migrate
import flask_babel
import flask_limiter
from mailu import utils, debug, models, manage, configuration
import os
import docker
import socket
import uuid
from werkzeug.contrib import fixers
def create_app_from_config(config):
""" Create a new application based on the given configuration
"""
app = flask.Flask(__name__)
app.cli.add_command(manage.mailu)
# Create application
app = flask.Flask(__name__)
# Bootstrap is used for basic JS and CSS loading
# TODO: remove this and use statically generated assets instead
app.bootstrap = flask_bootstrap.Bootstrap(app)
default_config = {
# Specific to the admin UI
'SQLALCHEMY_DATABASE_URI': 'sqlite:////data/main.db',
'SQLALCHEMY_TRACK_MODIFICATIONS': False,
'DOCKER_SOCKET': 'unix:///var/run/docker.sock',
'BABEL_DEFAULT_LOCALE': 'en',
'BABEL_DEFAULT_TIMEZONE': 'UTC',
'BOOTSTRAP_SERVE_LOCAL': True,
'RATELIMIT_STORAGE_URL': 'redis://redis',
'DEBUG': False,
# Statistics management
'INSTANCE_ID_PATH': '/data/instance',
'STATS_ENDPOINT': '0.{}.stats.mailu.io',
# Common configuration variables
'SECRET_KEY': 'changeMe',
'DOMAIN': 'mailu.io',
'HOSTNAMES': 'mail.mailu.io,alternative.mailu.io,yetanother.mailu.io',
'POSTMASTER': 'postmaster',
'TLS_FLAVOR': 'cert',
'AUTH_RATELIMIT': '10/minute;1000/hour',
'DISABLE_STATISTICS': 'False',
# Mail settings
'DMARC_RUA': None,
'DMARC_RUF': None,
'WELCOME': 'False',
'WELCOME_SUBJECT': 'Dummy welcome topic',
'WELCOME_BODY': 'Dummy welcome body',
'DKIM_SELECTOR': 'dkim',
'DKIM_PATH': '/dkim/{domain}.{selector}.key',
# Web settings
'SITENAME': 'Mailu',
'WEBSITE': 'https://mailu.io',
'WEB_ADMIN': '/admin',
'WEB_WEBMAIL': '/webmail',
# Advanced settings
'PASSWORD_SCHEME': 'SHA512-CRYPT',
}
# Initialize application extensions
config.init_app(app)
models.db.init_app(app)
utils.limiter.init_app(app)
utils.babel.init_app(app)
utils.login.init_app(app)
utils.login.user_loader(models.User.get)
utils.proxy.init_app(app)
utils.migrate.init_app(app, models.db)
# Load configuration from the environment if available
for key, value in default_config.items():
app.config[key] = os.environ.get(key, value)
# Initialize debugging tools
if app.config.get("DEBUG"):
debug.toolbar.init_app(app)
# TODO: add a specific configuration variable for profiling
# debug.profiler.init_app(app)
# Base application
flask_bootstrap.Bootstrap(app)
db = flask_sqlalchemy.SQLAlchemy(app)
migrate = flask_migrate.Migrate(app, db)
limiter = flask_limiter.Limiter(app, key_func=lambda: current_user.username)
# Inject the default variables in the Jinja parser
# TODO: move this to blueprints when needed
@app.context_processor
def inject_defaults():
signup_domains = models.Domain.query.filter_by(signup_enabled=True).all()
return dict(
signup_domains=signup_domains,
config=app.config
)
# Debugging toolbar
if app.config.get("DEBUG"):
import flask_debugtoolbar
toolbar = flask_debugtoolbar.DebugToolbarExtension(app)
# Import views
from mailu import ui, internal
app.register_blueprint(ui.ui, url_prefix='/ui')
app.register_blueprint(internal.internal, url_prefix='/internal')
# Manager commnad
manager = flask_script.Manager(app)
manager.add_command('db', flask_migrate.MigrateCommand)
return app
# Babel configuration
babel = flask_babel.Babel(app)
translations = list(map(str, babel.list_translations()))
@babel.localeselector
def get_locale():
return flask.request.accept_languages.best_match(translations)
def create_app():
""" Create a new application based on the config module
"""
config = configuration.ConfigManager()
return create_app_from_config(config)
# Login configuration
login_manager = flask_login.LoginManager()
login_manager.init_app(app)
login_manager.login_view = "ui.login"
@login_manager.unauthorized_handler
def handle_needs_login():
return flask.redirect(
flask.url_for('ui.login', next=flask.request.endpoint)
)
@app.context_processor
def inject_defaults():
return dict(
current_user=flask_login.current_user,
config=app.config
)
# Import views
from mailu import ui, internal
app.register_blueprint(ui.ui, url_prefix='/ui')
app.register_blueprint(internal.internal, url_prefix='/internal')
# Create the prefix middleware
class PrefixMiddleware(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
prefix = environ.get('HTTP_X_FORWARDED_PREFIX', '')
if prefix:
environ['SCRIPT_NAME'] = prefix
return self.app(environ, start_response)
app.wsgi_app = PrefixMiddleware(fixers.ProxyFix(app.wsgi_app))

View File

@@ -1,91 +0,0 @@
import os
DEFAULT_CONFIG = {
# Specific to the admin UI
'SQLALCHEMY_DATABASE_URI': 'sqlite:////data/main.db',
'SQLALCHEMY_TRACK_MODIFICATIONS': False,
'DOCKER_SOCKET': 'unix:///var/run/docker.sock',
'BABEL_DEFAULT_LOCALE': 'en',
'BABEL_DEFAULT_TIMEZONE': 'UTC',
'BOOTSTRAP_SERVE_LOCAL': True,
'RATELIMIT_STORAGE_URL': 'redis://redis/2',
'QUOTA_STORAGE_URL': 'redis://redis/1',
'DEBUG': False,
'DOMAIN_REGISTRATION': False,
'TEMPLATES_AUTO_RELOAD': True,
# Statistics management
'INSTANCE_ID_PATH': '/data/instance',
'STATS_ENDPOINT': '0.{}.stats.mailu.io',
# Common configuration variables
'SECRET_KEY': 'changeMe',
'DOMAIN': 'mailu.io',
'HOSTNAMES': 'mail.mailu.io,alternative.mailu.io,yetanother.mailu.io',
'POSTMASTER': 'postmaster',
'TLS_FLAVOR': 'cert',
'AUTH_RATELIMIT': '10/minute;1000/hour',
'DISABLE_STATISTICS': 'False',
# Mail settings
'DMARC_RUA': None,
'DMARC_RUF': None,
'WELCOME': 'False',
'WELCOME_SUBJECT': 'Dummy welcome topic',
'WELCOME_BODY': 'Dummy welcome body',
'DKIM_SELECTOR': 'dkim',
'DKIM_PATH': '/dkim/{domain}.{selector}.key',
'DEFAULT_QUOTA': 1000000000,
# Web settings
'SITENAME': 'Mailu',
'WEBSITE': 'https://mailu.io',
'WEB_ADMIN': '/admin',
'WEB_WEBMAIL': '/webmail',
'RECAPTCHA_PUBLIC_KEY': '',
'RECAPTCHA_PRIVATE_KEY': '',
# Advanced settings
'PASSWORD_SCHEME': 'BLF-CRYPT',
# Host settings
'HOST_IMAP': 'imap',
'HOST_POP3': 'imap',
'HOST_SMTP': 'smtp',
'HOST_WEBMAIL': 'webmail',
'HOST_FRONT': 'front',
'HOST_AUTHSMTP': os.environ.get('HOST_SMTP', 'smtp'),
'SUBNET': '192.168.203.0/24',
'POD_ADDRESS_RANGE': None
}
class ConfigManager(dict):
""" Naive configuration manager that uses environment only
"""
def __init__(self):
self.config = dict()
def init_app(self, app):
self.config.update(app.config)
self.config.update({
key: os.environ.get(key, value)
for key, value in DEFAULT_CONFIG.items()
})
app.config = self
def setdefault(self, key, value):
if key not in self.config:
self.config[key] = value
return self.config[key]
def get(self, *args):
return self.config.get(*args)
def keys(self):
return self.config.keys()
def __getitem__(self, key):
return self.config.get(key)
def __setitem__(self, key, value):
self.config[key] = value
def __contains__(self, key):
return key in self.config

View File

@@ -1,17 +0,0 @@
import flask_debugtoolbar
from werkzeug.contrib import profiler as werkzeug_profiler
# Debugging toolbar
toolbar = flask_debugtoolbar.DebugToolbarExtension()
# Profiler
class Profiler(object):
def init_app(self, app):
app.wsgi_app = werkzeug_profiler.ProfilerMiddleware(
app.wsgi_app, restrictions=[30]
)
profiler = Profiler()

View File

@@ -0,0 +1,26 @@
from mailu import app
import docker
import signal
# Connect to the Docker socket
cli = docker.Client(base_url=app.config['DOCKER_SOCKET'])
def get(*names):
result = {}
all_containers = cli.containers(all=True)
for brief in all_containers:
if brief['Image'].startswith('mailu/'):
container = cli.inspect_container(brief['Id'])
container['Image'] = cli.inspect_image(container['Image'])
name = container['Config']['Labels']['com.docker.compose.service']
if not names or name in names:
result[name] = container
return result
def reload(*names):
for name, container in get(*names).items():
cli.kill(container["Id"], signal.SIGHUP.value)

View File

@@ -1,25 +1,13 @@
from flask_limiter import RateLimitExceeded
from mailu import utils
from mailu import limiter
import socket
import flask
internal = flask.Blueprint('internal', __name__, template_folder='templates')
internal = flask.Blueprint('internal', __name__)
@internal.app_errorhandler(RateLimitExceeded)
def rate_limit_handler(e):
response = flask.Response()
response.headers['Auth-Status'] = 'Authentication rate limit from one source exceeded'
response.headers['Auth-Error-Code'] = '451 4.3.2'
if int(flask.request.headers['Auth-Login-Attempt']) < 10:
response.headers['Auth-Wait'] = '3'
return response
@utils.limiter.request_filter
@limiter.request_filter
def whitelist_webmail():
try:
return flask.request.headers["Client-Ip"] ==\
@@ -28,4 +16,4 @@ def whitelist_webmail():
return False
from mailu.internal.views import *
from mailu.internal import views

View File

@@ -1,7 +1,5 @@
from mailu import models
from flask import current_app as app
from mailu import db, models
import re
import socket
import urllib
@@ -52,7 +50,7 @@ def handle_authentication(headers):
status = False
elif protocol == "pop3" and not user.enable_pop:
status = False
if status and user.enabled:
if status:
return {
"Auth-Status": "OK",
"Auth-Server": server,
@@ -75,19 +73,14 @@ def get_status(protocol, status):
status, codes = STATUSES[status]
return status, codes[protocol]
def extract_host_port(host_and_port, default_port):
host, _, port = re.match('^(.*)(:([0-9]*))?$', host_and_port).groups()
return host, int(port) if port else default_port
def get_server(protocol, authenticated=False):
if protocol == "imap":
hostname, port = extract_host_port(app.config['HOST_IMAP'], 143)
hostname, port = "imap", 143
elif protocol == "pop3":
hostname, port = extract_host_port(app.config['HOST_POP3'], 110)
hostname, port = "imap", 110
elif protocol == "smtp":
if authenticated:
hostname, port = extract_host_port(app.config['HOST_AUTHSMTP'], 10025)
else:
hostname, port = extract_host_port(app.config['HOST_SMTP'], 25)
hostname = "smtp"
port = 10025 if authenticated else 25
address = socket.gethostbyname(hostname)
return address, port

View File

@@ -1,37 +0,0 @@
require "variables";
require "vacation";
require "fileinto";
require "envelope";
require "mailbox";
require "imap4flags";
require "regex";
require "relational";
require "date";
require "comparator-i;ascii-numeric";
require "spamtestplus";
require "editheader";
require "index";
if header :index 2 :matches "Received" "from * by * for <*>; *"
{
deleteheader "Delivered-To";
addheader "Delivered-To" "<${3}>";
}
{% if user.spam_enabled %}
if spamtest :percent :value "gt" :comparator "i;ascii-numeric" "{{ user.spam_threshold }}"
{
setflag "\\seen";
fileinto :create "Junk";
stop;
}
{% endif %}
if exists "X-Virus" {
discard;
stop;
}
{% if user.reply_active %}
vacation :days 1 :subject "{{ user.reply_subject }}" "{{ user.reply_body }}";
{% endif %}

View File

@@ -1,15 +1,15 @@
from mailu import models, utils
from mailu import db, models, app, limiter
from mailu.internal import internal, nginx
from flask import current_app as app
import flask
import flask_login
import base64
import urllib
@internal.route("/auth/email")
@utils.limiter.limit(
lambda: app.config["AUTH_RATELIMIT"],
@limiter.limit(
app.config["AUTH_RATELIMIT"],
lambda: flask.request.headers["Client-Ip"]
)
def nginx_authentication():
@@ -27,8 +27,7 @@ def admin_authentication():
""" Fails if the user is not an authenticated admin.
"""
if (not flask_login.current_user.is_anonymous
and flask_login.current_user.global_admin
and flask_login.current_user.enabled):
and flask_login.current_user.global_admin):
return ""
return flask.abort(403)
@@ -42,7 +41,7 @@ def basic_authentication():
encoded = authorization.replace("Basic ", "")
user_email, password = base64.b64decode(encoded).split(b":")
user = models.User.query.get(user_email.decode("utf8"))
if user and user.enabled and user.check_password(password.decode("utf8")):
if user and user.check_password(password.decode("utf8")):
response = flask.Response()
response.headers["X-User"] = user.email
return response

View File

@@ -1,3 +0,0 @@
__all__ = [
'auth', 'postfix', 'dovecot', 'fetch'
]

View File

@@ -1,48 +0,0 @@
from mailu import models
from mailu.internal import internal
from flask import current_app as app
import flask
import socket
import os
@internal.route("/dovecot/passdb/<user_email>")
def dovecot_passdb_dict(user_email):
user = models.User.query.get(user_email) or flask.abort(404)
allow_nets = []
allow_nets.append(app.config["SUBNET"])
if app.config["POD_ADDRESS_RANGE"]:
allow_nets.append(app.config["POD_ADDRESS_RANGE"])
return flask.jsonify({
"password": None,
"nopassword": "Y",
"allow_nets": ",".join(allow_nets)
})
@internal.route("/dovecot/userdb/<user_email>")
def dovecot_userdb_dict(user_email):
user = models.User.query.get(user_email) or flask.abort(404)
return flask.jsonify({
"quota_rule": "*:bytes={}".format(user.quota_bytes)
})
@internal.route("/dovecot/quota/<ns>/<user_email>", methods=["POST"])
def dovecot_quota(ns, user_email):
user = models.User.query.get(user_email) or flask.abort(404)
if ns == "storage":
user.quota_bytes_used = flask.request.get_json()
models.db.session.commit()
return flask.jsonify(None)
@internal.route("/dovecot/sieve/name/<script>/<user_email>")
def dovecot_sieve_name(script, user_email):
return flask.jsonify(script)
@internal.route("/dovecot/sieve/data/default/<user_email>")
def dovecot_sieve_data(user_email):
user = models.User.query.get(user_email) or flask.abort(404)
return flask.jsonify(flask.render_template("default.sieve", user=user))

View File

@@ -1,32 +0,0 @@
from mailu import models
from mailu.internal import internal
import flask
import datetime
@internal.route("/fetch")
def fetch_list():
return flask.jsonify([
{
"id": fetch.id,
"tls": fetch.tls,
"keep": fetch.keep,
"user_email": fetch.user_email,
"protocol": fetch.protocol,
"host": fetch.host,
"port": fetch.port,
"username": fetch.username,
"password": fetch.password
} for fetch in models.Fetch.query.all()
])
@internal.route("/fetch/<fetch_id>", methods=["POST"])
def fetch_done(fetch_id):
fetch = models.Fetch.query.get(fetch_id) or flask.abort(404)
fetch.last_check = datetime.datetime.now()
fetch.error_message = str(flask.request.get_json())
models.db.session.add(fetch)
models.db.session.commit()
return ""

View File

@@ -1,53 +0,0 @@
from mailu import models
from mailu.internal import internal
import flask
@internal.route("/postfix/domain/<domain_name>")
def postfix_mailbox_domain(domain_name):
domain = models.Domain.query.get(domain_name) or \
models.Alternative.query.get(domain_name) or \
flask.abort(404)
return flask.jsonify(domain.name)
@internal.route("/postfix/mailbox/<email>")
def postfix_mailbox_map(email):
user = models.User.query.get(email) or flask.abort(404)
return flask.jsonify(user.email)
@internal.route("/postfix/alias/<alias>")
def postfix_alias_map(alias):
localpart, domain_name = models.Email.resolve_domain(alias)
if localpart is None:
return flask.jsonify(domain_name)
destination = models.Email.resolve_destination(localpart, domain_name)
return flask.jsonify(",".join(destination)) if destination else flask.abort(404)
@internal.route("/postfix/transport/<email>")
def postfix_transport(email):
if email == '*':
return flask.abort(404)
localpart, domain_name = models.Email.resolve_domain(email)
relay = models.Relay.query.get(domain_name) or flask.abort(404)
return flask.jsonify("smtp:[{}]".format(relay.smtp))
@internal.route("/postfix/sender/login/<sender>")
def postfix_sender_login(sender):
localpart, domain_name = models.Email.resolve_domain(sender)
if localpart is None:
return flask.abort(404)
destination = models.Email.resolve_destination(localpart, domain_name, True)
return flask.jsonify(",".join(destination)) if destination else flask.abort(404)
@internal.route("/postfix/sender/access/<sender>")
def postfix_sender_access(sender):
""" Simply reject any sender that pretends to be from a local domain
"""
localpart, domain_name = models.Email.resolve_domain(sender)
return flask.jsonify("REJECT") if models.Domain.query.get(domain_name) else flask.abort(404)

View File

@@ -1,60 +1,23 @@
from mailu import dkim
from mailu import app, db, dkim, login_manager
from sqlalchemy.ext import declarative
from passlib import context, hash
from datetime import datetime, date
from email.mime import text
from flask import current_app as app
import flask_sqlalchemy
import sqlalchemy
import re
import time
import os
import glob
import smtplib
import idna
import dns
db = flask_sqlalchemy.SQLAlchemy()
class IdnaDomain(db.TypeDecorator):
""" Stores a Unicode string in it's IDNA representation (ASCII only)
"""
impl = db.String(80)
def process_bind_param(self, value, dialect):
return idna.encode(value).decode("ascii")
def process_result_value(self, value, dialect):
return idna.decode(value)
class IdnaEmail(db.TypeDecorator):
""" Stores a Unicode string in it's IDNA representation (ASCII only)
"""
impl = db.String(255, collation="NOCASE")
def process_bind_param(self, value, dialect):
try:
localpart, domain_name = value.split('@')
return "{0}@{1}".format(
localpart,
idna.encode(domain_name).decode('ascii'),
)
except ValueError:
pass
def process_result_value(self, value, dialect):
localpart, domain_name = value.split('@')
return "{0}@{1}".format(
localpart,
idna.decode(domain_name),
)
# Many-to-many association table for domain managers
managers = db.Table('manager',
db.Column('domain_name', db.String(80), db.ForeignKey('domain.name')),
db.Column('user_email', db.String(255), db.ForeignKey('user.email'))
)
class CommaSeparatedList(db.TypeDecorator):
@@ -72,35 +35,7 @@ class CommaSeparatedList(db.TypeDecorator):
return ",".join(value)
def process_result_value(self, value, dialect):
return filter(bool, value.split(",")) if value else []
class JSONEncoded(db.TypeDecorator):
"""Represents an immutable structure as a json-encoded string.
"""
impl = db.String
def process_bind_param(self, value, dialect):
return json.dumps(value) if value else None
def process_result_value(self, value, dialect):
return json.loads(value) if value else None
class Config(db.Model):
""" In-database configuration values
"""
name = db.Column(db.String(255), primary_key=True, nullable=False)
value = db.Column(JSONEncoded)
# Many-to-many association table for domain managers
managers = db.Table('manager',
db.Column('domain_name', IdnaDomain, db.ForeignKey('domain.name')),
db.Column('user_email', IdnaEmail, db.ForeignKey('user.email'))
)
return filter(bool, value.split(","))
class Base(db.Model):
@@ -119,13 +54,12 @@ class Domain(Base):
"""
__tablename__ = "domain"
name = db.Column(IdnaDomain, primary_key=True, nullable=False)
name = db.Column(db.String(80), primary_key=True, nullable=False)
managers = db.relationship('User', secondary=managers,
backref=db.backref('manager_of'), lazy='dynamic')
max_users = db.Column(db.Integer, nullable=False, default=0)
max_aliases = db.Column(db.Integer, nullable=False, default=0)
max_quota_bytes = db.Column(db.Integer(), nullable=False, default=0)
signup_enabled = db.Column(db.Boolean(), nullable=False, default=False)
@property
def dkim_key(self):
@@ -158,16 +92,6 @@ class Domain(Base):
else:
return False
def check_mx(self):
try:
hostnames = app.config['HOSTNAMES'].split(',')
return any(
str(rset).split()[-1][:-1] in hostnames
for rset in dns.resolver.query(self.name, 'MX')
)
except Exception as e:
return False
def __str__(self):
return self.name
@@ -185,8 +109,8 @@ class Alternative(Base):
__tablename__ = "alternative"
name = db.Column(IdnaDomain, primary_key=True, nullable=False)
domain_name = db.Column(IdnaDomain, db.ForeignKey(Domain.name))
name = db.Column(db.String(80), primary_key=True, nullable=False)
domain_name = db.Column(db.String(80), db.ForeignKey(Domain.name))
domain = db.relationship(Domain,
backref=db.backref('alternatives', cascade='all, delete-orphan'))
@@ -216,62 +140,33 @@ class Email(object):
@declarative.declared_attr
def domain_name(cls):
return db.Column(IdnaDomain, db.ForeignKey(Domain.name),
nullable=False, default=IdnaDomain)
return db.Column(db.String(80), db.ForeignKey(Domain.name),
nullable=False)
# This field is redundant with both localpart and domain name.
# It is however very useful for quick lookups without joining tables,
# especially when the mail server is reading the database.
# especially when the mail server il reading the database.
@declarative.declared_attr
def email(cls):
updater = lambda context: "{0}@{1}".format(
context.current_parameters["localpart"],
context.current_parameters["domain_name"],
)
return db.Column(IdnaEmail,
return db.Column(db.String(255, collation="NOCASE"),
primary_key=True, nullable=False,
default=updater)
def sendmail(self, subject, body):
""" Send an email to the address.
"""
from_address = "{0}@{1}".format(
app.config['POSTMASTER'],
idna.encode(app.config['DOMAIN']).decode('ascii'),
)
with smtplib.SMTP(app.config['HOST_AUTHSMTP'], port=10025) as smtp:
to_address = "{0}@{1}".format(
self.localpart,
idna.encode(self.domain_name).decode('ascii'),
)
from_address = '{}@{}'.format(
app.config['POSTMASTER'], app.config['DOMAIN'])
with smtplib.SMTP('smtp', port=10025) as smtp:
msg = text.MIMEText(body)
msg['Subject'] = subject
msg['From'] = from_address
msg['To'] = to_address
smtp.sendmail(from_address, [to_address], msg.as_string())
@classmethod
def resolve_domain(cls, email):
localpart, domain_name = email.split('@', 1) if '@' in email else (None, email)
alternative = Alternative.query.get(domain_name)
if alternative:
domain_name = alternative.domain_name
return (localpart, domain_name)
@classmethod
def resolve_destination(cls, localpart, domain_name, ignore_forward_keep=False):
alias = Alias.resolve(localpart, domain_name)
if alias:
return alias.destination
user = User.query.get('{}@{}'.format(localpart, domain_name))
if user:
if user.forward_enabled:
destination = user.forward_destination
if user.forward_keep or ignore_forward_keep:
destination.append(user.email)
else:
destination = [user.email]
return destination
msg['To'] = self.email
smtp.sendmail(from_address, [self.email], msg.as_string())
def __str__(self):
return self.email
@@ -286,9 +181,7 @@ class User(Base, Email):
backref=db.backref('users', cascade='all, delete-orphan'))
password = db.Column(db.String(255), nullable=False)
quota_bytes = db.Column(db.Integer(), nullable=False, default=10**9)
quota_bytes_used = db.Column(db.Integer(), nullable=False, default=0)
global_admin = db.Column(db.Boolean(), nullable=False, default=False)
enabled = db.Column(db.Boolean(), nullable=False, default=True)
# Features
enable_imap = db.Column(db.Boolean(), nullable=False, default=True)
@@ -296,13 +189,11 @@ class User(Base, Email):
# Filters
forward_enabled = db.Column(db.Boolean(), nullable=False, default=False)
forward_destination = db.Column(CommaSeparatedList(), nullable=True, default=[])
forward_destination = db.Column(db.String(255), nullable=True, default=None)
forward_keep = db.Column(db.Boolean(), nullable=False, default=True)
reply_enabled = db.Column(db.Boolean(), nullable=False, default=False)
reply_subject = db.Column(db.String(255), nullable=True, default=None)
reply_body = db.Column(db.Text(), nullable=True, default=None)
reply_startdate = db.Column(db.Date, nullable=False,
default=date(1900, 1, 1))
reply_enddate = db.Column(db.Date, nullable=False,
default=date(2999, 12, 31))
@@ -319,59 +210,28 @@ class User(Base, Email):
def get_id(self):
return self.email
@property
def destination(self):
if self.forward_enabled:
result = self.forward_destination
if self.forward_keep:
result += ',' + self.email
return result
else:
return self.email
@property
def reply_active(self):
now = date.today()
return (
self.reply_enabled and
self.reply_startdate < now and
self.reply_enddate > now
)
scheme_dict = {'PBKDF2': "pbkdf2_sha512",
'BLF-CRYPT': "bcrypt",
'SHA512-CRYPT': "sha512_crypt",
scheme_dict = {'SHA512-CRYPT': "sha512_crypt",
'SHA256-CRYPT': "sha256_crypt",
'MD5-CRYPT': "md5_crypt",
'CRYPT': "des_crypt"}
def get_password_context(self):
return context.CryptContext(
schemes=self.scheme_dict.values(),
default=self.scheme_dict[app.config['PASSWORD_SCHEME']],
)
pw_context = context.CryptContext(
schemes = scheme_dict.values(),
default=scheme_dict[app.config['PASSWORD_SCHEME']],
)
def check_password(self, password):
context = self.get_password_context()
reference = re.match('({[^}]+})?(.*)', self.password).group(2)
result = context.verify(password, reference)
if result and context.identify(reference) != context.default_scheme():
self.set_password(password)
db.session.add(self)
db.session.commit()
return result
return User.pw_context.verify(password, reference)
def set_password(self, password, hash_scheme=None, raw=False):
def set_password(self, password, hash_scheme=app.config['PASSWORD_SCHEME'], raw=False):
"""Set password for user with specified encryption scheme
@password: plain text password to encrypt (if raw == True the hash itself)
"""
if hash_scheme is None:
hash_scheme = app.config['PASSWORD_SCHEME']
# for the list of hash schemes see https://wiki2.dovecot.org/Authentication/PasswordSchemes
if raw:
self.password = '{'+hash_scheme+'}' + password
else:
self.password = '{'+hash_scheme+'}' + self.get_password_context().encrypt(password, self.scheme_dict[hash_scheme])
self.password = '{'+hash_scheme+'}' + User.pw_context.encrypt(password, self.scheme_dict[hash_scheme])
def get_managed_domains(self):
if self.global_admin:
@@ -392,14 +252,12 @@ class User(Base, Email):
self.sendmail(app.config["WELCOME_SUBJECT"],
app.config["WELCOME_BODY"])
@classmethod
def get(cls, email):
return cls.query.get(email)
@classmethod
def login(cls, email, password):
user = cls.query.get(email)
return user if (user and user.enabled and user.check_password(password)) else None
return user if (user and user.check_password(password)) else None
login_manager.user_loader(User.query.get)
class Alias(Base, Email):
@@ -412,22 +270,6 @@ class Alias(Base, Email):
wildcard = db.Column(db.Boolean(), nullable=False, default=False)
destination = db.Column(CommaSeparatedList, nullable=False, default=[])
@classmethod
def resolve(cls, localpart, domain_name):
return cls.query.filter(
sqlalchemy.and_(cls.domain_name == domain_name,
sqlalchemy.or_(
sqlalchemy.and_(
cls.wildcard == False,
cls.localpart == localpart
), sqlalchemy.and_(
cls.wildcard == True,
sqlalchemy.bindparam("l", localpart).like(cls.localpart)
)
)
)
).order_by(cls.wildcard, sqlalchemy.func.char_length(cls.localpart).desc()).first()
class Token(Base):
""" A token is an application password for a given user.

View File

@@ -15,23 +15,21 @@ msgstr "Ungültige E-Mail-Adresse."
msgid "Confirm"
msgstr "Bestätigen"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "E-Mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "Passwort"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "Anmelden"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Domain-Name"
@@ -44,45 +42,44 @@ msgstr "Maximale Anzahl Benutzer"
msgid "Maximum alias count"
msgstr "Maximale Anzahl Aliase"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Kommentar"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "Erstellen"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "Passwort bestätigen"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr "Quota"
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "Zugriff via IMAP erlauben"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "Zugriff via POP3 erlauben"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "Speichern"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "Angezeigter Name"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "Spamfilter aktivieren"
@@ -90,82 +87,80 @@ msgstr "Spamfilter aktivieren"
msgid "Spam filter threshold"
msgstr "Schwellenwert für Spamfilter"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "Einstellungen speichern"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr "Passwort wiederholen"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Passwort aktualisieren"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "Weiterleitung aktivieren"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Ziel"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "Aktualisieren"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "Automatische Antwort aktivieren"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "Betreff"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "Text"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "SQL LIKE Syntax nutzen (z.B. für Catch-All-Aliase)"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "Administrator E-Mail"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "Absenden"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr "Manager E-Mail"
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "Protokoll"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "Hostname oder IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "Port"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "Verschlüsselung aktivieren"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Benutzername"
@@ -193,6 +188,34 @@ msgstr "Konto"
msgid "to access the administration tools"
msgstr "für administrativen Zugriff"
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr "Dienst-Status"
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr "Dienst"
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "Status"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr "PID"
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr "Image"
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr "Gestartet"
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "Letztes Update"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Mein Konto"
@@ -201,28 +224,28 @@ msgstr "Mein Konto"
msgid "Settings"
msgstr "Einstellungen"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "Auto-Weiterleitung"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "Auto-Antwort"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr "Abgerufene Konten"
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "Abmelden"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "Administration"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "Administratoren"
@@ -230,7 +253,7 @@ msgstr "Administratoren"
msgid "Mail domains"
msgstr "E-Mail-Domains"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "Hilfe"
@@ -318,27 +341,27 @@ msgstr "Neue Domain"
msgid "Domain details"
msgstr "Domain-Details"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "Schlüssel neu erzeugen"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr "DNS MX Eintrag"
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr "DNS SPF Einträge"
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr "DKIM öffentlicher Schlüssel"
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr "DNS DKIM Eintrag"
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr "DNS DMARC Eintrag"
@@ -410,15 +433,15 @@ msgstr "Manager"
msgid "Add manager"
msgstr "Manager hinzufügen"
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr "Betreff"
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "Text"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "Absenden"
@@ -430,7 +453,7 @@ msgstr "Öffentliche Bekanntmachung"
msgid "from"
msgstr "von"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "Bekanntmachung"
@@ -474,11 +497,11 @@ msgstr "Automatische Antwort"
msgid "Maximum user quota"
msgstr "Maximale Quota pro Benutzer"
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "Kopie der E-Mails behalten"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "E-Mails auf dem Server belassen"
@@ -494,19 +517,19 @@ msgstr "ja"
msgid "no"
msgstr "nein"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr "Alternativer Name"
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr "Relay-Domain-Name"
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "Entfernter Host"
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr "Relay-Domains"
@@ -546,15 +569,15 @@ msgstr "Relay-Domains"
msgid "New relayed domain"
msgstr "Neue Relay-Domain"
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
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)"
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr "Authorisierte IP-Adresse"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr "Authentifizierungs-Tokens"
@@ -566,7 +589,7 @@ msgstr "Wechseln zu"
msgid "Webmail"
msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr "Website"
@@ -582,7 +605,7 @@ msgstr "Neuer Token"
msgid "General"
msgstr "Allgemein"
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr "Funktionen und Quotas"
@@ -590,85 +613,11 @@ msgstr "Funktionen und Quotas"
msgid "General settings"
msgstr "Allgemeine Einstellungen"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr "Antispam"
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr "Spamfilter-Grenzwert"
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2018-04-22 12:10+0200\n"
"POT-Creation-Date: 2017-11-05 17:17+0100\n"
"PO-Revision-Date: 2016-10-02 15:02+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
@@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.5.3\n"
"Generated-By: Babel 2.5.1\n"
#: mailu/ui/forms.py:32
msgid "Invalid email address."
@@ -26,23 +26,21 @@ msgstr ""
msgid "Confirm"
msgstr ""
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr ""
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr ""
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr ""
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr ""
@@ -59,198 +57,165 @@ msgstr ""
msgid "Maximum user quota"
msgstr ""
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr ""
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
msgid "Confirm password"
msgstr ""
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr ""
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr ""
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr ""
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr ""
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr ""
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr ""
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr ""
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr ""
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr ""
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr ""
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr ""
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr ""
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr ""
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr ""
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr ""
#: mailu/ui/forms.py:105
msgid "Save settings"
msgstr ""
#: mailu/ui/forms.py:110
msgid "Password check"
msgstr ""
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr ""
#: mailu/ui/forms.py:115
msgid "Enable automatic reply"
msgstr ""
#: mailu/ui/forms.py:116
msgid "Reply subject"
msgstr ""
#: mailu/ui/forms.py:117
msgid "Reply body"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr ""
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr ""
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr ""
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr ""
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr ""
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr ""
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr ""
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr ""
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr ""
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr ""
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr ""
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr ""
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr ""
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr ""
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr ""
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr ""
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr ""
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr ""
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr ""
@@ -258,16 +223,8 @@ msgstr ""
msgid "Public announcement"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
#: mailu/ui/templates/announcement.html:8
msgid "from"
msgstr ""
#: mailu/ui/templates/confirm.html:4
@@ -291,6 +248,34 @@ msgstr ""
msgid "to access the administration tools"
msgstr ""
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr ""
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr ""
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr ""
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr ""
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr ""
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr ""
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr ""
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr ""
@@ -300,38 +285,38 @@ msgid "Settings"
msgstr ""
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr ""
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr ""
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr ""
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr ""
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr ""
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr ""
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
msgid "Antispam"
msgstr ""
#: mailu/ui/templates/sidebar.html:66
msgid "Mail domains"
msgstr ""
@@ -344,19 +329,15 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr ""
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr ""
@@ -460,31 +441,27 @@ msgstr ""
msgid "Domain details"
msgstr ""
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr ""
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr ""
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr ""
@@ -528,23 +505,6 @@ msgstr ""
msgid "Alternatives"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid ""
"In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid ""
"If you do not know how to setup an <code>MX</code> record for your DNS "
"zone,\n"
" please contact your DNS provider or administrator. Also, please wait "
"a\n"
" couple minutes after the <code>MX</code> is set so the local server "
"cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/fetch/create.html:4
msgid "Add a fetched account"
msgstr ""
@@ -621,7 +581,7 @@ msgstr ""
msgid "General"
msgstr ""
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr ""
@@ -657,20 +617,12 @@ msgstr ""
msgid "Automatic reply"
msgstr ""
#: mailu/ui/templates/user/settings.html:22
msgid "Auto-forward"
#: mailu/ui/templates/user/settings.html:14
msgid "General settings"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr ""
#~ msgid "Your account"
@@ -679,9 +631,3 @@ msgstr ""
#~ msgid "Spam filter threshold"
#~ msgstr ""
#~ msgid "from"
#~ msgstr ""
#~ msgid "General settings"
#~ msgstr ""

View File

@@ -1,674 +0,0 @@
msgid ""
msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: POEditor.com\n"
"Project-Id-Version: Mailu\n"
"Language: es\n"
#: mailu/ui/forms.py:32
msgid "Invalid email address."
msgstr "Dirección de correo inválida."
#: mailu/ui/forms.py:36
msgid "Confirm"
msgstr "Confirmar"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
msgid "E-mail"
msgstr "Dirección de Correo"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password"
msgstr "Contraseña"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
msgid "Sign in"
msgstr "Entrar"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Nmbre de dominio"
#: mailu/ui/forms.py:47
msgid "Maximum user count"
msgstr "Máximo número de usuarios"
#: mailu/ui/forms.py:48
msgid "Maximum alias count"
msgstr "Máximo número de aliases"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Comentario"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
msgid "Create"
msgstr "Crear"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota"
msgstr "Cuota"
#: mailu/ui/forms.py:81
msgid "Allow IMAP access"
msgstr "Permitir acceso IMAP"
#: mailu/ui/forms.py:82
msgid "Allow POP3 access"
msgstr "Permitir acceso POP3"
#: mailu/ui/forms.py:85
msgid "Save"
msgstr "Guardar"
#: mailu/ui/forms.py:97
msgid "Displayed name"
msgstr "Nombre a mostrar"
#: mailu/ui/forms.py:98
msgid "Enable spam filter"
msgstr "Habilitar filtro de spam"
#: mailu/ui/forms.py:80
msgid "Spam filter threshold"
msgstr "Límite del filtro de spam"
#: mailu/ui/forms.py:105
msgid "Save settings"
msgstr "Guardar configuración"
#: mailu/ui/forms.py:110
msgid "Password check"
msgstr "Revisar contraseña"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Actualizar contraseña"
#: mailu/ui/forms.py:100
msgid "Enable forwarding"
msgstr "Habilitar reenvío"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Destino"
#: mailu/ui/forms.py:120
msgid "Update"
msgstr "Actualizar"
#: mailu/ui/forms.py:115
msgid "Enable automatic reply"
msgstr "Habilitar respuesta automática"
#: mailu/ui/forms.py:116
msgid "Reply subject"
msgstr ""
#: mailu/ui/forms.py:117
msgid "Reply body"
msgstr ""
#: mailu/ui/forms.py:136
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Usar sintaxis SQL (p.ej. para abarcar todos los alias)"
#: mailu/ui/forms.py:145
msgid "Admin email"
msgstr ""
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
msgid "Submit"
msgstr ""
#: mailu/ui/forms.py:150
msgid "Manager email"
msgstr ""
#: mailu/ui/forms.py:155
msgid "Protocol"
msgstr "Protocolo"
#: mailu/ui/forms.py:158
msgid "Hostname or IP"
msgstr ""
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
msgid "TCP port"
msgstr "Puerto TCP"
#: mailu/ui/forms.py:160
msgid "Enable TLS"
msgstr "Habilitar TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Nombre de usuario"
#: mailu/ui/templates/confirm.html:4
msgid "Confirm action"
msgstr "Confirmar acción"
#: mailu/ui/templates/confirm.html:13
msgid "You are about to %(action)s. Please confirm your action."
msgstr ""
#: mailu/ui/templates/docker-error.html:4
msgid "Docker error"
msgstr "Error de Docker"
#: mailu/ui/templates/docker-error.html:12
msgid "An error occurred while talking to the Docker server."
msgstr "Ocurrió un error en la comunicación con el servidor Docker."
#: mailu/admin/templates/login.html:6
msgid "Your account"
msgstr ""
#: mailu/ui/templates/login.html:8
msgid "to access the administration tools"
msgstr "para acceder a las herramientas de administración"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Mi cuenta"
#: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
msgid "Settings"
msgstr "Configuración"
#: mailu/ui/templates/user/settings.html:22
msgid "Auto-forward"
msgstr "Auto-reenvío"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-reply"
msgstr "Auto-respuesta"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
msgid "Fetched accounts"
msgstr ""
#: mailu/ui/templates/sidebar.html:105
msgid "Sign out"
msgstr "Salir"
#: mailu/ui/templates/sidebar.html:35
msgid "Administration"
msgstr "Administración"
#: mailu/ui/templates/sidebar.html:49
msgid "Administrators"
msgstr "Administradores"
#: mailu/ui/templates/sidebar.html:66
msgid "Mail domains"
msgstr "Dominios de correo"
#: mailu/ui/templates/sidebar.html:92
msgid "Help"
msgstr "Ayuda"
#: mailu/ui/templates/working.html:4
msgid "We are still working on this feature!"
msgstr "Aún trabajamos en esta característica!"
#: mailu/ui/templates/admin/create.html:4
msgid "Add a global administrator"
msgstr "Añadir administrador global"
#: mailu/ui/templates/admin/list.html:4
msgid "Global administrators"
msgstr "Administradores globales"
#: mailu/ui/templates/admin/list.html:9
msgid "Add administrator"
msgstr "Añadr administrador"
#: mailu/ui/templates/admin/list.html:16 mailu/ui/templates/alias/list.html:18
#: mailu/ui/templates/alternative/list.html:18
#: mailu/ui/templates/domain/list.html:16 mailu/ui/templates/fetch/list.html:18
#: mailu/ui/templates/manager/list.html:18
#: mailu/ui/templates/relay/list.html:16 mailu/ui/templates/token/list.html:18
#: mailu/ui/templates/user/list.html:18
msgid "Actions"
msgstr "Acciones"
#: mailu/ui/templates/admin/list.html:17 mailu/ui/templates/alias/list.html:19
#: mailu/ui/templates/manager/list.html:19 mailu/ui/templates/user/list.html:20
msgid "Email"
msgstr "Correo"
#: mailu/ui/templates/admin/list.html:22 mailu/ui/templates/alias/list.html:29
#: mailu/ui/templates/alternative/list.html:25
#: mailu/ui/templates/domain/list.html:31 mailu/ui/templates/fetch/list.html:31
#: mailu/ui/templates/manager/list.html:24
#: mailu/ui/templates/relay/list.html:27 mailu/ui/templates/token/list.html:26
#: mailu/ui/templates/user/list.html:31
msgid "Delete"
msgstr "Eliminar"
#: mailu/ui/templates/alias/create.html:4
msgid "Create alias"
msgstr "Crear alias"
#: mailu/ui/templates/alias/edit.html:4
msgid "Edit alias"
msgstr "Editar alias"
#: mailu/ui/templates/alias/list.html:4
msgid "Alias list"
msgstr "Lista de alias"
#: mailu/ui/templates/alias/list.html:12
msgid "Add alias"
msgstr "Añadir alias"
#: mailu/ui/templates/alias/list.html:22
#: mailu/ui/templates/alternative/list.html:20
#: mailu/ui/templates/domain/list.html:22 mailu/ui/templates/fetch/list.html:24
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
#: mailu/ui/templates/user/list.html:24
msgid "Created"
msgstr "Creado"
#: mailu/ui/templates/alias/list.html:23 mailu/ui/templates/domain/list.html:23
#: mailu/ui/templates/fetch/list.html:25 mailu/ui/templates/relay/list.html:21
#: mailu/ui/templates/user/list.html:25
msgid "Last edit"
msgstr "Última edición"
#: mailu/ui/templates/alias/list.html:28 mailu/ui/templates/domain/list.html:30
#: mailu/ui/templates/fetch/list.html:30 mailu/ui/templates/relay/list.html:26
#: mailu/ui/templates/user/list.html:30
msgid "Edit"
msgstr "Editar"
#: mailu/ui/templates/domain/create.html:4
#: mailu/ui/templates/domain/list.html:9
msgid "New domain"
msgstr "Nuevo dominio"
#: mailu/ui/templates/domain/details.html:4
msgid "Domain details"
msgstr "Detalle del domino"
#: mailu/ui/templates/domain/details.html:15
msgid "Regenerate keys"
msgstr "Regenerar llaves"
#: mailu/ui/templates/domain/details.html:31
msgid "DNS MX entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:35
msgid "DNS SPF entries"
msgstr ""
#: mailu/ui/templates/domain/details.html:42
msgid "DKIM public key"
msgstr ""
#: mailu/ui/templates/domain/details.html:46
msgid "DNS DKIM entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:50
msgid "DNS DMARC entry"
msgstr ""
#: mailu/ui/templates/domain/edit.html:4
msgid "Edit domain"
msgstr "Editar domino"
#: mailu/ui/templates/domain/list.html:4
msgid "Domain list"
msgstr "Lista de dominios"
#: mailu/ui/templates/domain/list.html:17
msgid "Manage"
msgstr ""
#: mailu/ui/templates/domain/list.html:19
msgid "Mailbox count"
msgstr ""
#: mailu/ui/templates/domain/list.html:20
msgid "Alias count"
msgstr ""
#: mailu/ui/templates/domain/list.html:28
msgid "Details"
msgstr "Detalles"
#: mailu/ui/templates/domain/list.html:35
msgid "Users"
msgstr "Usuarios"
#: mailu/ui/templates/domain/list.html:36
msgid "Aliases"
msgstr "Alias"
#: mailu/ui/templates/domain/list.html:37
msgid "Managers"
msgstr ""
#: mailu/ui/templates/fetch/create.html:4
msgid "Add a fetched account"
msgstr ""
#: mailu/ui/templates/fetch/edit.html:4
msgid "Update a fetched account"
msgstr ""
#: mailu/ui/templates/fetch/list.html:12
msgid "Add an account"
msgstr "Añadir una cuenta"
#: mailu/ui/templates/fetch/list.html:19
msgid "Endpoint"
msgstr ""
#: mailu/ui/templates/fetch/list.html:22
msgid "Last check"
msgstr "Último checkeo"
#: mailu/ui/templates/manager/create.html:4
msgid "Add a manager"
msgstr ""
#: mailu/ui/templates/manager/list.html:4
msgid "Manager list"
msgstr ""
#: mailu/ui/templates/manager/list.html:12
msgid "Add manager"
msgstr ""
#: mailu/ui/forms.py:168
msgid "Announcement subject"
msgstr ""
#: mailu/ui/forms.py:170
msgid "Announcement body"
msgstr ""
#: mailu/ui/forms.py:172
msgid "Send"
msgstr "Enviar"
#: mailu/ui/templates/announcement.html:4
msgid "Public announcement"
msgstr "Anuncio público"
#: mailu/ui/templates/announcement.html:8
msgid "from"
msgstr ""
#: mailu/ui/templates/sidebar.html:44
msgid "Announcement"
msgstr "Anuncio"
#: mailu/ui/templates/user/create.html:4
msgid "New user"
msgstr "Nuevo usuario"
#: mailu/ui/templates/user/edit.html:4
msgid "Edit user"
msgstr "Editar usuario"
#: mailu/ui/templates/user/forward.html:4
msgid "Forward emails"
msgstr ""
#: mailu/ui/templates/user/list.html:4
msgid "User list"
msgstr "Lista de usuarios"
#: mailu/ui/templates/user/list.html:12
msgid "Add user"
msgstr "Añadir usuario"
#: mailu/ui/templates/user/list.html:19 mailu/ui/templates/user/settings.html:4
msgid "User settings"
msgstr "Configuración de usuario"
#: mailu/ui/templates/user/list.html:21
msgid "Features"
msgstr "Características"
#: mailu/ui/templates/user/password.html:4
msgid "Password update"
msgstr "Actualizar contraseña"
#: mailu/ui/templates/user/reply.html:4
msgid "Automatic reply"
msgstr "Respuesta automática"
#: mailu/ui/forms.py:49
msgid "Maximum user quota"
msgstr ""
#: mailu/ui/forms.py:101
msgid "Keep a copy of the emails"
msgstr "Mantener una copia de los correos"
#: mailu/ui/forms.py:163
msgid "Keep emails on the server"
msgstr "Mantener los correos en el servidor"
#: mailu/ui/templates/fetch/list.html:21
msgid "Keep emails"
msgstr "Mantener los correos"
#: mailu/ui/templates/fetch/list.html:35
msgid "yes"
msgstr "si"
#: mailu/ui/templates/fetch/list.html:35
msgid "no"
msgstr "no"
#: mailu/ui/forms.py:65
msgid "Alternative name"
msgstr ""
#: mailu/ui/forms.py:70
msgid "Relayed domain name"
msgstr ""
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr ""
#: mailu/ui/templates/sidebar.html:54
msgid "Relayed domains"
msgstr ""
#: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain"
msgstr ""
#: mailu/ui/templates/alternative/list.html:4
msgid "Alternative domain list"
msgstr ""
#: mailu/ui/templates/alternative/list.html:12
msgid "Add alternative"
msgstr ""
#: mailu/ui/templates/alternative/list.html:19
msgid "Name"
msgstr "Nombre"
#: mailu/ui/templates/domain/list.html:39
msgid "Alternatives"
msgstr ""
#: mailu/ui/templates/relay/create.html:4
msgid "New relay domain"
msgstr ""
#: mailu/ui/templates/relay/edit.html:4
msgid "Edit relayd domain"
msgstr ""
#: mailu/ui/templates/relay/list.html:4
msgid "Relayed domain list"
msgstr ""
#: mailu/ui/templates/relay/list.html:9
msgid "New relayed domain"
msgstr ""
#: mailu/ui/forms.py:125
msgid "Your token (write it down, as it will never be displayed again)"
msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr ""
#: mailu/ui/templates/sidebar.html:72
msgid "Go to"
msgstr ""
#: mailu/ui/templates/sidebar.html:76
msgid "Webmail"
msgstr ""
#: mailu/ui/templates/sidebar.html:87
msgid "Website"
msgstr ""
#: mailu/ui/templates/token/create.html:4
msgid "Create an authentication token"
msgstr ""
#: mailu/ui/templates/token/list.html:12
msgid "New token"
msgstr ""
#: mailu/ui/templates/user/create.html:15
msgid "General"
msgstr ""
#: mailu/ui/templates/user/create.html:22
msgid "Features and quotas"
msgstr ""
#: mailu/ui/templates/user/settings.html:14
msgid "General settings"
msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
msgid "Antispam"
msgstr ""
#: mailu/ui/forms.py:99
msgid "Spam filter tolerance"
msgstr ""
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -15,23 +15,21 @@ msgstr "Adresse e-mail invalide"
msgid "Confirm"
msgstr "Confirmer"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "Mot de passe"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "Se connecter"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Nom de domaine"
@@ -44,45 +42,44 @@ msgstr "Nombre maximum d'utilisateurs"
msgid "Maximum alias count"
msgstr "Nombre maximum d'alias"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Commentaire"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "Créer"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr "Quota"
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "Autoriser l'accès IMAP"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "Autoriser l'accès POP3"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "Enregistrer"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "Nom affiché"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "Activer le filtre anti-spam"
@@ -90,82 +87,80 @@ msgstr "Activer le filtre anti-spam"
msgid "Spam filter threshold"
msgstr "Seuil du filtre anti-spam"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "Enregistrer les préférences"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr "Vérifier le mot de passe"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Changer de mot de passe"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "Activer la redirection"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Destination"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "Mettre à jour"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "Activer les réponses automatique"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "Sujet du message"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "Corps de la réponse"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Utiliser la syntaxe SQL LIKE (par exemple pour les alias catch-all)"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "Email de l'administrateur"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "Valider"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr "E-mail du gérant"
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "Protocole"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "Nom d'hôte ou adresse IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "Port TCP"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "Activer TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Nom d'utilisateur"
@@ -193,6 +188,34 @@ msgstr "Votre compte"
msgid "to access the administration tools"
msgstr "pour accéder aux outils d'administration"
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr "Etat des services"
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr "Service"
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "Etat"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr "PID"
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr "Image"
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr "Démarré depuis"
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "Dernière mise à jour"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Mon compte"
@@ -201,28 +224,28 @@ msgstr "Mon compte"
msgid "Settings"
msgstr "Préférences"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "Redirection"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "Réponse automatique"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr "Comptes externes"
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "Déconnexion"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "Administration"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "Administrateurs"
@@ -230,7 +253,7 @@ msgstr "Administrateurs"
msgid "Mail domains"
msgstr "Domaines"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "Aide"
@@ -318,27 +341,27 @@ msgstr "Nouveau domaine"
msgid "Domain details"
msgstr "Détails du domaine"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "Regénérer les clés"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr "Entrée DNS MX"
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr "Entrées DNS SPF"
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr "Clé publique DKIM"
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr "Entrée DNS DKIM"
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr "Entrée DNS DMARC"
@@ -410,15 +433,15 @@ msgstr "Liste des gérants"
msgid "Add manager"
msgstr "Ajouter le gérant"
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr "Sujet de l'annonce"
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "Corps de l'annonce"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "Envoyer"
@@ -430,7 +453,7 @@ msgstr "Annonce globale"
msgid "from"
msgstr "de"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "Annonce"
@@ -474,11 +497,11 @@ msgstr "Réponse automatique"
msgid "Maximum user quota"
msgstr "Quota maximum par utilisateur"
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "Conserver une copie des messages"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "Conserver les messages sur le serveur"
@@ -494,19 +517,19 @@ msgstr "oui"
msgid "no"
msgstr "non"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr "Nom alternatif"
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr "Nom du domaine relayé"
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "Hôte distant"
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr "Domaines relayé"
@@ -546,15 +569,15 @@ msgstr "Liste des domaines relayés"
msgid "New relayed domain"
msgstr "Nouveau domaine relayé"
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Votre jeton (à conserver, il ne sera plus affiché par la suite)"
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr "Adresse IP autorisée"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr "Jetons d'authentification"
@@ -566,7 +589,7 @@ msgstr "Navigation"
msgid "Webmail"
msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr "Site web"
@@ -582,7 +605,7 @@ msgstr "Nouveau jeton"
msgid "General"
msgstr "Général"
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr "Fonctionnalités et quotas"
@@ -590,85 +613,11 @@ msgstr "Fonctionnalités et quotas"
msgid "General settings"
msgstr "Général"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr "Antispam"
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr "Tolérance du filtre antispam"
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr "Autoriser l'inscription"
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr "Administrateur initial"
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr "Mot de passe administrateur"
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr "Activé"
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr "Adresse e-mail"
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr "S'inscrire"
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr "Fin du mode vacance"
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr "Configuration client"
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr "Protocole"
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr "Nom du serveur"
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr "Inscrire un domaine"
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr "Générer les clés"
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr "Pour enregistrer un nouveau domaine, vous devez d'abord configurer la zone DNS de sorte que le <code>MX</code> du domaine pointe sur ce serveur."
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr "Si vous ne savez pas comment configurer un enregistrement <code>MX</code>, contactez votre fournisseur de DNS ou votre administrateur. Egalement, attendez quelques minutes après avoir modifié le <code>MX</code>, le temps que le cache local au serveur soit rafraîchi."
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr "choix du domaine pour le compte"
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr "Domaine"
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr "Places disponibles"

View File

@@ -15,23 +15,21 @@ msgstr "Indirizzo email non valido."
msgid "Confirm"
msgstr "Conferma"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "Password"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "Entra"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Nome dominio"
@@ -44,45 +42,44 @@ msgstr ""
msgid "Maximum alias count"
msgstr ""
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr ""
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "Crea"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "Conferma pasword"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr "Quota"
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "Consenti accesso IMAP"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "Consenti accesso POP3"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "Salva"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "Nome visualizzato"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "Abilita filtro antispam"
@@ -90,82 +87,80 @@ msgstr "Abilita filtro antispam"
msgid "Spam filter threshold"
msgstr "Soglia del filtro antispam"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "Salva impostazioni"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr ""
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Aggiorna password"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "Abilita inoltro"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Destinazione"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "Aggiorna"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "Abilita risposta automatica"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "Soggetto risposta"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "Corpo risposta"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Usa sintassi SQL LIKE (es. per alias catch-all)"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "Email amministratore"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "Invia"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr "Email manager"
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "Protocollo"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "Hostname o IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "Porta TCP"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "Abilita TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Username"
@@ -194,6 +189,34 @@ msgstr "Il tuo account"
msgid "to access the administration tools"
msgstr ""
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr ""
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr ""
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "Stato"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr "PID"
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr "Immagine"
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr "Avviato"
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "Ultimo aggiornamento"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Il mio account"
@@ -202,28 +225,28 @@ msgstr "Il mio account"
msgid "Settings"
msgstr "Impostazioni"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "Auto-inoltro"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "Auto-risponditore"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr ""
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "Esci"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "Amministrazione"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "Amministratori"
@@ -231,7 +254,7 @@ msgstr "Amministratori"
msgid "Mail domains"
msgstr "Domini mail"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "Aiuto"
@@ -319,27 +342,27 @@ msgstr "Nuovo dominio"
msgid "Domain details"
msgstr "Dettagli dominio"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "Rigenera chiavi"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr ""
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr ""
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr ""
@@ -411,15 +434,15 @@ msgstr ""
msgid "Add manager"
msgstr "Aggiungi manager"
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr ""
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "Corpo dell'annuncio"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "Invia"
@@ -431,7 +454,7 @@ msgstr "Annuncio pubblico"
msgid "from"
msgstr "da"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "Annuncio"
@@ -475,11 +498,11 @@ msgstr "Risposta automatica"
msgid "Maximum user quota"
msgstr ""
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "Conserva una copia delle email"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "Conserva email sul server"
@@ -495,19 +518,19 @@ msgstr "si"
msgid "no"
msgstr "no"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr "Nome alternativo"
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr ""
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "Host remoto"
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr ""
@@ -547,15 +570,15 @@ msgstr ""
msgid "New relayed domain"
msgstr ""
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr "IP Autorizzato"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr "Token di autenticazione"
@@ -567,7 +590,7 @@ msgstr "Vai a"
msgid "Webmail"
msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr "Sito web"
@@ -583,7 +606,7 @@ msgstr "Nuovo token"
msgid "General"
msgstr "Generale"
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr "Funzionalità e quota"
@@ -591,85 +614,11 @@ msgstr "Funzionalità e quota"
msgid "General settings"
msgstr "Impostazioni generali"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr "Antispam"
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr "Tolleranza filtro spam"
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -15,23 +15,21 @@ msgstr "Ongeldig e-mailadres."
msgid "Confirm"
msgstr "Bevestigen"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "Wachtwoord"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "Aanmelden"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Domeinnaam"
@@ -44,45 +42,44 @@ msgstr "Maximaal aantal gebruikers"
msgid "Maximum alias count"
msgstr "Maximaal aantal aliasen"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Opmerking"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "Aanmaken"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "Bevestig wachtwoord"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr "Quotum"
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "IMAP toestaan"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "POP3 toestaan"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "Opslaan"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "Getoonde naam"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "Spamfilter inschakelen"
@@ -90,82 +87,80 @@ msgstr "Spamfilter inschakelen"
msgid "Spam filter threshold"
msgstr "Spamfilter drempel"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "Instellingen opslaan"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr "Wachtwoord controle"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Wachtwoord veranderen"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "Doorsturen inschakelen"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Bestemming"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "Bijwerken"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "Automatisch antwoord inschakelen"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "Antwoord onderwerp"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "Antwoord bericht"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Gebruik SQL LIKE syntax (bijv. voor alles-afvangen aliasen)"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "Beheerder e-mail"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "Verzenden"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr "Manager e-mail"
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "Protocol"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "Hostnaam of IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "TCP poort"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "TLS inschakelen"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Gebruikersnaam"
@@ -183,7 +178,7 @@ msgstr "Docker foutmelding"
#: mailu/ui/templates/docker-error.html:12
msgid "An error occurred while talking to the Docker server."
msgstr "Er is een fout opgetreden tijdens het communiceren met de Docker server."
msgstr "Er is een fout opgetreden tijdens het praten met de Docker server."
#: mailu/admin/templates/login.html:6
msgid "Your account"
@@ -191,7 +186,35 @@ msgstr "Uw account"
#: mailu/ui/templates/login.html:8
msgid "to access the administration tools"
msgstr "om toegang te krijgen tot systeembeheer"
msgstr ""
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr "Status diensten"
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr "Dienst"
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "Status"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr "PID"
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr "Image"
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr "Gestart"
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "Laatste aanpassing"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
@@ -201,28 +224,28 @@ msgstr "Mijn account"
msgid "Settings"
msgstr "Instellingen"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "Automatisch doorsturen"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "Automatisch antwoorden"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr "Opgehaalde accounts"
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "Afmelden"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "Beheer"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "Beheerders"
@@ -230,7 +253,7 @@ msgstr "Beheerders"
msgid "Mail domains"
msgstr "E-mail domeinen"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "Help"
@@ -318,29 +341,29 @@ msgstr "Nieuw domein"
msgid "Domain details"
msgstr "Domein details"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "Hergenereer sleutels"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr "DNS MX-record"
msgstr ""
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr "DNS SPF-records"
msgstr ""
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr "DKIM publieke sleutel"
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr "DNS DKIM-record"
msgstr ""
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr "DNS DMARC-record"
msgstr ""
#: mailu/ui/templates/domain/edit.html:4
msgid "Edit domain"
@@ -392,7 +415,7 @@ msgstr "Account toevoegen"
#: mailu/ui/templates/fetch/list.html:19
msgid "Endpoint"
msgstr "Endpoint"
msgstr ""
#: mailu/ui/templates/fetch/list.html:22
msgid "Last check"
@@ -410,15 +433,15 @@ msgstr "Manager overzicht"
msgid "Add manager"
msgstr "Manager toevoegen"
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr "Mededeling onderwerp"
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "Mededeling bericht"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "Versturen"
@@ -430,7 +453,7 @@ msgstr "Publieke mededeling"
msgid "from"
msgstr "van"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "Mededeling"
@@ -444,7 +467,7 @@ msgstr "Gebruiker aanpassen"
#: mailu/ui/templates/user/forward.html:4
msgid "Forward emails"
msgstr "E-mails doorsturen"
msgstr ""
#: mailu/ui/templates/user/list.html:4
msgid "User list"
@@ -474,11 +497,11 @@ msgstr "Automatisch antwoord"
msgid "Maximum user quota"
msgstr "Maximum quotum gebruikers"
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "Behoud een kopie van de e-mails"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "Behoud de e-mails op de server"
@@ -494,21 +517,21 @@ msgstr "ja"
msgid "no"
msgstr "nee"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr "Alternatieve naam"
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr "Relayed domainnaam"
msgstr ""
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "Externe host"
msgstr ""
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr "Relayed domainen"
msgstr ""
#: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain"
@@ -532,143 +555,69 @@ msgstr "Alternatieven"
#: mailu/ui/templates/relay/create.html:4
msgid "New relay domain"
msgstr "Nieuw relay domein"
msgstr ""
#: mailu/ui/templates/relay/edit.html:4
msgid "Edit relayd domain"
msgstr "Bewerk relay domein"
msgstr ""
#: mailu/ui/templates/relay/list.html:4
msgid "Relayed domain list"
msgstr "Overzicht relayed domeinen"
msgstr ""
#: mailu/ui/templates/relay/list.html:9
msgid "New relayed domain"
msgstr "Nieuw relayed domein"
msgstr ""
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Uw token (bewaar hem goed, want hij wordt nooit meer getoond)"
msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr "Toegestaan IP"
msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr "Authenticatie tokens"
msgstr ""
#: mailu/ui/templates/sidebar.html:72
msgid "Go to"
msgstr "Ga naar"
msgstr ""
#: mailu/ui/templates/sidebar.html:76
msgid "Webmail"
msgstr "Webmail"
msgstr ""
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr "Website"
msgstr ""
#: mailu/ui/templates/token/create.html:4
msgid "Create an authentication token"
msgstr "Authenticatie token aanmaken"
msgstr ""
#: mailu/ui/templates/token/list.html:12
msgid "New token"
msgstr "Nieuw token"
msgstr ""
#: mailu/ui/templates/user/create.html:15
msgid "General"
msgstr "Algemeen"
msgstr ""
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr "Functionaliteiten en quota"
msgstr ""
#: mailu/ui/templates/user/settings.html:14
msgid "General settings"
msgstr "Algemene instellingen"
msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr "Anti-spam"
msgstr ""
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr "Spam filter toleratie"
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -15,23 +15,21 @@ msgstr "Nieprawidłowy adres e-mail."
msgid "Confirm"
msgstr "Zatwierdź"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "Hasło"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "Zaloguj"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Nazwa domeny"
@@ -45,45 +43,44 @@ msgid "Maximum alias count"
msgstr "Maksymalna liczba aliasów"
#. Needs more context - is that a verb or a noun?
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Komentarz"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "Utwórz"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "Potwierdź hasło"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr ""
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "Zezwalaj na dostęp przez protokół IMAP"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "Zezwalaj na dostęp przez protokół POP3"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "Zapisz"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "Nazwa wyświetlana"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "Włącz filtr antyspamowy"
@@ -91,82 +88,80 @@ msgstr "Włącz filtr antyspamowy"
msgid "Spam filter threshold"
msgstr "Próg filtra antyspamowego"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "Zapisz ustawienia"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr ""
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Zmień hasło"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "Włącz przekierowanie poczty"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Adres docelowy"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "Aktualizuj"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "Włącz automatyczną odpowiedź"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "Temat odpowiedzi"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "Treść odpowiedzi"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Używaj składni SQL LIKE (np. do adresów catch-all)"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "E-mail administratora"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "Prześlij"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr ""
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "Protokół"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "Nazwa hosta lub adres IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "Port TCP"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "Włącz TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Nazwa użytkownika"
@@ -194,6 +189,34 @@ msgstr "Twoje konto"
msgid "to access the administration tools"
msgstr ""
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr "Status usług"
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr "Usługa"
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "Status"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr ""
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr ""
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr ""
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "Ostatnia aktualizacja"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Moje konto"
@@ -202,28 +225,28 @@ msgstr "Moje konto"
msgid "Settings"
msgstr "Ustawienia"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "Automatyczne przekierowanie"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "Automatyczna odpowiedź"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr ""
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "Wyloguj"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "Administracja"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "Administratorzy"
@@ -231,7 +254,7 @@ msgstr "Administratorzy"
msgid "Mail domains"
msgstr "Domeny pocztowe"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "Pomoc"
@@ -319,27 +342,27 @@ msgstr "Nowa domena"
msgid "Domain details"
msgstr "Szczegóły domeny"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "Wygeneruj ponownie klucze"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr "Wpis MX DNS"
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr "Wpisy SPF DNS"
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr "Publiczny klucz DKIM"
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr "Wpis DKIM DNS"
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr "Wpis DMARC DNS"
@@ -411,15 +434,15 @@ msgstr ""
msgid "Add manager"
msgstr ""
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr "Temat ogłoszenia"
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "Treść ogłoszenia"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "Wyślij"
@@ -431,7 +454,7 @@ msgstr "Publiczne ogłoszenie"
msgid "from"
msgstr "od"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "Ogłoszenie"
@@ -475,11 +498,11 @@ msgstr "Automatyczna odpowiedź"
msgid "Maximum user quota"
msgstr ""
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "Przechowuj kopię wiadomości"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "Przechowuj wiadomości na serwerze"
@@ -495,19 +518,19 @@ msgstr "Tak"
msgid "no"
msgstr "Nie"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr ""
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr ""
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr ""
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr ""
@@ -547,15 +570,15 @@ msgstr ""
msgid "New relayed domain"
msgstr ""
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr ""
@@ -567,7 +590,7 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr "Strona internetowa"
@@ -583,7 +606,7 @@ msgstr ""
msgid "General"
msgstr ""
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr ""
@@ -591,85 +614,11 @@ msgstr ""
msgid "General settings"
msgstr "Ustawienia ogólne"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr "Filtr antyspamowy"
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr ""
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -15,23 +15,21 @@ msgstr "Endereço de e-mail inválido"
msgid "Confirm"
msgstr "Confirmar"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "Senha"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "Entrar"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Domínio"
@@ -44,45 +42,44 @@ msgstr "Quantidade máxima de usuários"
msgid "Maximum alias count"
msgstr "Quantidade máxima de alias"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Comentário"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "Criar"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "Confirmar senha"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr "Quota"
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "Permitir acesso IMAP"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "Permitir acesso POP3"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "Salvar"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "Nome de exibição"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "Habilitar filtro de spam"
@@ -90,82 +87,80 @@ msgstr "Habilitar filtro de spam"
msgid "Spam filter threshold"
msgstr "Limite de filtro de spam"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "Salvar configurações"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr "Confirmação de senha"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Alterar senha"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "Habilitar encaminhamento"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Destinatário"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "Atualizar"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "Habilitar resposta automática"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "Assunto da resposta"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "Corpo da resposta"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Usar sintaxe estilo SQL(ex: for catch-all aliases)"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "E-mail do administrador"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "Enviar"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr "E-mail do gerente"
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "Protocolo"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "Hostname ou IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "Porta TCP"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "Habilitar TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Usuário"
@@ -193,6 +188,34 @@ msgstr "Sua conta"
msgid "to access the administration tools"
msgstr "para acessar as ferramentas administrativas"
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr "Status do serviço"
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr "Serviço"
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "Status"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr "PID"
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr "Imagem"
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr "Iniciado"
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "Última atualização"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Minha conta"
@@ -201,28 +224,28 @@ msgstr "Minha conta"
msgid "Settings"
msgstr "Configurações"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "Encaminhamento automático"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "Resposta automática"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr "Contas importadas"
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "Sair"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "Administração"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "Administradores"
@@ -230,7 +253,7 @@ msgstr "Administradores"
msgid "Mail domains"
msgstr "Domínios de e-mail"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "Ajuda"
@@ -318,27 +341,27 @@ msgstr "Novo domínio"
msgid "Domain details"
msgstr "Detalhes do domínio"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "Gerar novas chaves"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr "Entrada DNS MX"
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr "Entrada DNS SPF"
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr "Chave pública do DKIM"
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr "Entrada DNS DKIM"
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr "Entrada DNS DMARC"
@@ -410,15 +433,15 @@ msgstr "Lista de gerentes"
msgid "Add manager"
msgstr "Adicionar gerente"
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr "Título do comunicado"
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "Corpo do comunicado"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "Enviar"
@@ -430,7 +453,7 @@ msgstr "Comunicado geral"
msgid "from"
msgstr "de"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "Comunicado"
@@ -474,11 +497,11 @@ msgstr "Resposta automática"
msgid "Maximum user quota"
msgstr "Cota máxima por usuário"
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "Manter uma cópia dos emails"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "Manter os e-mails no servidor"
@@ -494,19 +517,19 @@ msgstr "sim"
msgid "no"
msgstr "não"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr "Nome alternativo"
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr "Nome de domínio para encaminhar"
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "Host remoto"
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr "Domínios para encaminhamento"
@@ -546,15 +569,15 @@ msgstr "Lista de domínios para encaminhamento"
msgid "New relayed domain"
msgstr "Novo domínio de encaminhamento"
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr ""
@@ -566,7 +589,7 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr ""
@@ -582,7 +605,7 @@ msgstr ""
msgid "General"
msgstr ""
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr ""
@@ -590,85 +613,11 @@ msgstr ""
msgid "General settings"
msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr ""
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr ""
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -1,674 +0,0 @@
msgid ""
msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: POEditor.com\n"
"Project-Id-Version: Mailu\n"
"Language: ru\n"
#: mailu/ui/forms.py:32
msgid "Invalid email address."
msgstr "Неправильный адрес электронной почты"
#: mailu/ui/forms.py:36
msgid "Confirm"
msgstr "Подтвердить"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
msgid "E-mail"
msgstr "Электронная почта"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password"
msgstr "Пароль"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
msgid "Sign in"
msgstr "Войти"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Доменное имя"
#: mailu/ui/forms.py:47
msgid "Maximum user count"
msgstr "Максимальное число пользователей"
#: mailu/ui/forms.py:48
msgid "Maximum alias count"
msgstr "Максимальное число псевдонимов"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Комментарий"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
msgid "Create"
msgstr "Создать"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
msgid "Confirm password"
msgstr "Подтвердить пароль"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota"
msgstr "Квота"
#: mailu/ui/forms.py:81
msgid "Allow IMAP access"
msgstr "Разрешить доступ через IMAP"
#: mailu/ui/forms.py:82
msgid "Allow POP3 access"
msgstr "Разрешить доступ через POP3"
#: mailu/ui/forms.py:85
msgid "Save"
msgstr "Сохранить"
#: mailu/ui/forms.py:97
msgid "Displayed name"
msgstr "Отображаемое имя"
#: mailu/ui/forms.py:98
msgid "Enable spam filter"
msgstr "Включить спам-фильтр"
#: mailu/ui/forms.py:80
msgid "Spam filter threshold"
msgstr "Порог чувствительности спам-фильтра"
#: mailu/ui/forms.py:105
msgid "Save settings"
msgstr "Сохранить настройки"
#: mailu/ui/forms.py:110
msgid "Password check"
msgstr "Проверка пароля"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Обновить пароль"
#: mailu/ui/forms.py:100
msgid "Enable forwarding"
msgstr "Включить переадресацию"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Адрес получателя"
#: mailu/ui/forms.py:120
msgid "Update"
msgstr "Обновить"
#: mailu/ui/forms.py:115
msgid "Enable automatic reply"
msgstr "Включить автоответчик"
#: mailu/ui/forms.py:116
msgid "Reply subject"
msgstr "Заголовок автоответа"
#: mailu/ui/forms.py:117
msgid "Reply body"
msgstr "Сообщение автоответа"
#: mailu/ui/forms.py:136
msgid "Alias"
msgstr "Псевдоним"
#: mailu/ui/forms.py:138
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Использовать SQL-подобный синтаксис"
#: mailu/ui/forms.py:145
msgid "Admin email"
msgstr "Адрес администратора"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
msgid "Submit"
msgstr "Отправить"
#: mailu/ui/forms.py:150
msgid "Manager email"
msgstr "Адрес менеджера"
#: mailu/ui/forms.py:155
msgid "Protocol"
msgstr "Протокол"
#: mailu/ui/forms.py:158
msgid "Hostname or IP"
msgstr "Имя хоста или IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
msgid "TCP port"
msgstr "Порт TCP"
#: mailu/ui/forms.py:160
msgid "Enable TLS"
msgstr "Включить TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Имя пользователя"
#: mailu/ui/templates/confirm.html:4
msgid "Confirm action"
msgstr "Подтвердить действие"
#: mailu/ui/templates/confirm.html:13
msgid "You are about to %(action)s. Please confirm your action."
msgstr "Вы собираетесь совершить %(action). Подтвердить?"
#: mailu/ui/templates/docker-error.html:4
msgid "Docker error"
msgstr "Ошибка Docker"
#: mailu/ui/templates/docker-error.html:12
msgid "An error occurred while talking to the Docker server."
msgstr "Произошла ошибка при обращении к серверу Docker"
#: mailu/admin/templates/login.html:6
msgid "Your account"
msgstr "Ваша учетная запись"
#: mailu/ui/templates/login.html:8
msgid "to access the administration tools"
msgstr "для доступа к утилитам администрирования"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Моя учетная запись"
#: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
msgid "Settings"
msgstr "Настройки"
#: mailu/ui/templates/user/settings.html:22
msgid "Auto-forward"
msgstr "Автоматическая пересылка"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-reply"
msgstr "Автоматический ответ"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
msgid "Fetched accounts"
msgstr "Учетные записи сторонних серверов"
#: mailu/ui/templates/sidebar.html:105
msgid "Sign out"
msgstr "Выйти"
#: mailu/ui/templates/sidebar.html:35
msgid "Administration"
msgstr "Администрирование"
#: mailu/ui/templates/sidebar.html:49
msgid "Administrators"
msgstr "Администраторы"
#: mailu/ui/templates/sidebar.html:66
msgid "Mail domains"
msgstr "Почтовые домены"
#: mailu/ui/templates/sidebar.html:92
msgid "Help"
msgstr "Помощь"
#: mailu/ui/templates/working.html:4
msgid "We are still working on this feature!"
msgstr "Мы еще работаем над данным функционалом!"
#: mailu/ui/templates/admin/create.html:4
msgid "Add a global administrator"
msgstr "Добавить глобального администратора"
#: mailu/ui/templates/admin/list.html:4
msgid "Global administrators"
msgstr "Глобальные администраторы"
#: mailu/ui/templates/admin/list.html:9
msgid "Add administrator"
msgstr "Добавить администратора"
#: mailu/ui/templates/admin/list.html:16 mailu/ui/templates/alias/list.html:18
#: mailu/ui/templates/alternative/list.html:18
#: mailu/ui/templates/domain/list.html:16 mailu/ui/templates/fetch/list.html:18
#: mailu/ui/templates/manager/list.html:18
#: mailu/ui/templates/relay/list.html:16 mailu/ui/templates/token/list.html:18
#: mailu/ui/templates/user/list.html:18
msgid "Actions"
msgstr "Действия"
#: mailu/ui/templates/admin/list.html:17 mailu/ui/templates/alias/list.html:19
#: mailu/ui/templates/manager/list.html:19 mailu/ui/templates/user/list.html:20
msgid "Email"
msgstr "Электронная почта"
#: mailu/ui/templates/admin/list.html:22 mailu/ui/templates/alias/list.html:29
#: mailu/ui/templates/alternative/list.html:25
#: mailu/ui/templates/domain/list.html:31 mailu/ui/templates/fetch/list.html:31
#: mailu/ui/templates/manager/list.html:24
#: mailu/ui/templates/relay/list.html:27 mailu/ui/templates/token/list.html:26
#: mailu/ui/templates/user/list.html:31
msgid "Delete"
msgstr "Удалить"
#: mailu/ui/templates/alias/create.html:4
msgid "Create alias"
msgstr "Создать псевдоним"
#: mailu/ui/templates/alias/edit.html:4
msgid "Edit alias"
msgstr "Изменить псевдоним"
#: mailu/ui/templates/alias/list.html:4
msgid "Alias list"
msgstr "Список псевдонимов"
#: mailu/ui/templates/alias/list.html:12
msgid "Add alias"
msgstr "Добавить псевдоним"
#: mailu/ui/templates/alias/list.html:22
#: mailu/ui/templates/alternative/list.html:20
#: mailu/ui/templates/domain/list.html:22 mailu/ui/templates/fetch/list.html:24
#: mailu/ui/templates/relay/list.html:20 mailu/ui/templates/token/list.html:21
#: mailu/ui/templates/user/list.html:24
msgid "Created"
msgstr "Создано"
#: mailu/ui/templates/alias/list.html:23 mailu/ui/templates/domain/list.html:23
#: mailu/ui/templates/fetch/list.html:25 mailu/ui/templates/relay/list.html:21
#: mailu/ui/templates/user/list.html:25
msgid "Last edit"
msgstr "Последнее изменение"
#: mailu/ui/templates/alias/list.html:28 mailu/ui/templates/domain/list.html:30
#: mailu/ui/templates/fetch/list.html:30 mailu/ui/templates/relay/list.html:26
#: mailu/ui/templates/user/list.html:30
msgid "Edit"
msgstr "Изменить"
#: mailu/ui/templates/domain/create.html:4
#: mailu/ui/templates/domain/list.html:9
msgid "New domain"
msgstr "Новый домен"
#: mailu/ui/templates/domain/details.html:4
msgid "Domain details"
msgstr "Подробности домена"
#: mailu/ui/templates/domain/details.html:15
msgid "Regenerate keys"
msgstr "Перегенерировать ключи"
#: mailu/ui/templates/domain/details.html:31
msgid "DNS MX entry"
msgstr "DNS MX запись"
#: mailu/ui/templates/domain/details.html:35
msgid "DNS SPF entries"
msgstr "DNS SPF запись"
#: mailu/ui/templates/domain/details.html:42
msgid "DKIM public key"
msgstr "Публичный ключ DKIM"
#: mailu/ui/templates/domain/details.html:46
msgid "DNS DKIM entry"
msgstr "DNS DKIM запись"
#: mailu/ui/templates/domain/details.html:50
msgid "DNS DMARC entry"
msgstr "DNS DMARC запись"
#: mailu/ui/templates/domain/edit.html:4
msgid "Edit domain"
msgstr "Изменить домен"
#: mailu/ui/templates/domain/list.html:4
msgid "Domain list"
msgstr "Список доменов"
#: mailu/ui/templates/domain/list.html:17
msgid "Manage"
msgstr "Управление"
#: mailu/ui/templates/domain/list.html:19
msgid "Mailbox count"
msgstr "Количество ящиков"
#: mailu/ui/templates/domain/list.html:20
msgid "Alias count"
msgstr "Количество псевдонимов"
#: mailu/ui/templates/domain/list.html:28
msgid "Details"
msgstr "Подробно"
#: mailu/ui/templates/domain/list.html:35
msgid "Users"
msgstr "Пользователи"
#: mailu/ui/templates/domain/list.html:36
msgid "Aliases"
msgstr "Псевдонимы"
#: mailu/ui/templates/domain/list.html:37
msgid "Managers"
msgstr "Менеджеры"
#: mailu/ui/templates/fetch/create.html:4
msgid "Add a fetched account"
msgstr "Добавить учетную запись стороннего сервера"
#: mailu/ui/templates/fetch/edit.html:4
msgid "Update a fetched account"
msgstr "Обновить учетную запись стороннего сервера"
#: mailu/ui/templates/fetch/list.html:12
msgid "Add an account"
msgstr "Добавить учетную запись"
#: mailu/ui/templates/fetch/list.html:19
msgid "Endpoint"
msgstr "Конечная точка"
#: mailu/ui/templates/fetch/list.html:22
msgid "Last check"
msgstr "Последняя проверка"
#: mailu/ui/templates/manager/create.html:4
msgid "Add a manager"
msgstr "Добавить менеджера"
#: mailu/ui/templates/manager/list.html:4
msgid "Manager list"
msgstr "Список менеджеров"
#: mailu/ui/templates/manager/list.html:12
msgid "Add manager"
msgstr "Добавить менеджера"
#: mailu/ui/forms.py:168
msgid "Announcement subject"
msgstr "Тема объявления"
#: mailu/ui/forms.py:170
msgid "Announcement body"
msgstr "Содержание объявления"
#: mailu/ui/forms.py:172
msgid "Send"
msgstr "Отправить"
#: mailu/ui/templates/announcement.html:4
msgid "Public announcement"
msgstr "Публичное объявление"
#: mailu/ui/templates/announcement.html:8
msgid "from"
msgstr "От"
#: mailu/ui/templates/sidebar.html:44
msgid "Announcement"
msgstr "Объявление"
#: mailu/ui/templates/user/create.html:4
msgid "New user"
msgstr "Новый пользователь"
#: mailu/ui/templates/user/edit.html:4
msgid "Edit user"
msgstr "Изменить пользователя"
#: mailu/ui/templates/user/forward.html:4
msgid "Forward emails"
msgstr "Перенаправлять письма"
#: mailu/ui/templates/user/list.html:4
msgid "User list"
msgstr "Список пользователей"
#: mailu/ui/templates/user/list.html:12
msgid "Add user"
msgstr "Добавить пользователя"
#: mailu/ui/templates/user/list.html:19 mailu/ui/templates/user/settings.html:4
msgid "User settings"
msgstr "Настройки пользователя"
#: mailu/ui/templates/user/list.html:21
msgid "Features"
msgstr "Функции"
#: mailu/ui/templates/user/password.html:4
msgid "Password update"
msgstr "Изменение пароля"
#: mailu/ui/templates/user/reply.html:4
msgid "Automatic reply"
msgstr "Автоматический ответ"
#: mailu/ui/forms.py:49
msgid "Maximum user quota"
msgstr "Квота на пользователя"
#: mailu/ui/forms.py:101
msgid "Keep a copy of the emails"
msgstr "Хранить копии писем"
#: mailu/ui/forms.py:163
msgid "Keep emails on the server"
msgstr "Хранить письма на сервере"
#: mailu/ui/templates/fetch/list.html:21
msgid "Keep emails"
msgstr "Сохранять письма"
#: mailu/ui/templates/fetch/list.html:35
msgid "yes"
msgstr "да"
#: mailu/ui/templates/fetch/list.html:35
msgid "no"
msgstr "нет"
#: mailu/ui/forms.py:65
msgid "Alternative name"
msgstr "Имя альтернативного домена"
#: mailu/ui/forms.py:70
msgid "Relayed domain name"
msgstr "Имя релейного домена"
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "Удаленный хост"
#: mailu/ui/templates/sidebar.html:54
msgid "Relayed domains"
msgstr "Релейные домены"
#: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain"
msgstr "Создать альтернативный домен"
#: mailu/ui/templates/alternative/list.html:4
msgid "Alternative domain list"
msgstr "Список альтернативных доменов"
#: mailu/ui/templates/alternative/list.html:12
msgid "Add alternative"
msgstr "Добавить альтернативный домен"
#: mailu/ui/templates/alternative/list.html:19
msgid "Name"
msgstr "Имя"
#: mailu/ui/templates/domain/list.html:39
msgid "Alternatives"
msgstr "Альтернативные домены"
#: mailu/ui/templates/relay/create.html:4
msgid "New relay domain"
msgstr "Новый релейный домен"
#: mailu/ui/templates/relay/edit.html:4
msgid "Edit relayd domain"
msgstr "Изменить релейный домен"
#: mailu/ui/templates/relay/list.html:4
msgid "Relayed domain list"
msgstr "Список релейных доменов"
#: mailu/ui/templates/relay/list.html:9
msgid "New relayed domain"
msgstr "Новый релейный домен"
#: mailu/ui/forms.py:125
msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Ваш токен (перепишите его, больше он показываться не будет)"
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr "Авторизованные IP-адреса"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr "Авторизационные токены"
#: mailu/ui/templates/sidebar.html:72
msgid "Go to"
msgstr "Перейти к"
#: mailu/ui/templates/sidebar.html:76
msgid "Webmail"
msgstr "Электронная почта"
#: mailu/ui/templates/sidebar.html:87
msgid "Website"
msgstr "Сайт"
#: mailu/ui/templates/token/create.html:4
msgid "Create an authentication token"
msgstr "Создать токен авторизации"
#: mailu/ui/templates/token/list.html:12
msgid "New token"
msgstr "Новый токен"
#: mailu/ui/templates/user/create.html:15
msgid "General"
msgstr "Общие"
#: mailu/ui/templates/user/create.html:22
msgid "Features and quotas"
msgstr "Функции и квоты"
#: mailu/ui/templates/user/settings.html:14
msgid "General settings"
msgstr "Общие настройки"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
msgid "Antispam"
msgstr "Антиспам"
#: mailu/ui/forms.py:99
msgid "Spam filter tolerance"
msgstr "Порог спам-фильтра"
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -15,23 +15,21 @@ msgstr "Ogiltig adress"
msgid "Confirm"
msgstr "Bekräfta"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "E-post"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "Lösenord"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "Logga in"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "Domännamn"
@@ -44,45 +42,44 @@ msgstr "Max antal användare"
msgid "Maximum alias count"
msgstr "Max antal alias"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "Kommentar"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "Skapa"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "Bekräfta lösenord"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr "Quota"
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "Tillåt IMAP"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "Tillåt POP3"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "Spara"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "Visat namn"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "Aktivera spamfilter"
@@ -90,82 +87,80 @@ msgstr "Aktivera spamfilter"
msgid "Spam filter threshold"
msgstr "Spamfilter gräns"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "Spara inställningar"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr "Lösenordskoll"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "Uppdatera lösenord"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "Aktivera vidarebefordring"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "Destination"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "Uppdatera"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "Aktivera autosvar"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "Svar ämne"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "Svar meddelande"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "Alias"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Använd SQL-liknande syntax (t.ex. för catch-all alias)"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "Admin e-post"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "Skicka in"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr "Manager e-post"
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "Protokoll"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "Hostnamn eller IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "TCP port"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "Aktivera TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "Användarnamn"
@@ -193,6 +188,34 @@ msgstr "Ditt konto"
msgid "to access the administration tools"
msgstr "att komma åt administrationsverktygen"
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr "Tjänster status"
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr "Tjänst"
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "Status"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr "PID"
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr "Bild"
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr "Startad"
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "Senast uppdaterad"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "Mitt konto"
@@ -201,28 +224,28 @@ msgstr "Mitt konto"
msgid "Settings"
msgstr "Inställningar"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "Auto-forward"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "Autosvar"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr "Hämtade konton"
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "Logga ut"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "Administration"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "Administratörer"
@@ -230,7 +253,7 @@ msgstr "Administratörer"
msgid "Mail domains"
msgstr "Domäner"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "Hjälp"
@@ -318,27 +341,27 @@ msgstr "Ny domän"
msgid "Domain details"
msgstr "Domändetaljer"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "Generera nycklar"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr "DNS MX post"
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr "DNS SPF post"
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr "Publik DKIM-nyckel"
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr "DNS DKIM post"
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr "DNS DMARC post"
@@ -410,15 +433,15 @@ msgstr "Managerlista"
msgid "Add manager"
msgstr "Skapa manager"
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr "Publikt meddelande ämne"
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "Publikt meddelande"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "Skicka"
@@ -430,7 +453,7 @@ msgstr "Publikt meddelande"
msgid "from"
msgstr "från"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "Meddelande"
@@ -474,11 +497,11 @@ msgstr "Automatiskt svar"
msgid "Maximum user quota"
msgstr "Max användar-quota"
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "Behåll en kopia av e-posten"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "Behåll e-post på servern"
@@ -494,19 +517,19 @@ msgstr "ja"
msgid "no"
msgstr "nej"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr "Aleternativt namn"
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr "Reläade domännamn"
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "Server"
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr "Reläade domäner"
@@ -546,15 +569,15 @@ msgstr "Reläade domäner"
msgid "New relayed domain"
msgstr "Ny reläad domän"
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Din token (notera, eftersom den inte kommer att visas igen)"
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr "Autentiserat IP"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr "Autentiserade tokens"
@@ -566,7 +589,7 @@ msgstr "Gå till"
msgid "Webmail"
msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr "Websida"
@@ -582,7 +605,7 @@ msgstr "Ny token"
msgid "General"
msgstr "Allmänt"
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr "Funktioner och quota"
@@ -590,85 +613,11 @@ msgstr "Funktioner och quota"
msgid "General settings"
msgstr "Allmäna inställningar"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr "Antispam"
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr ""
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -15,23 +15,21 @@ msgstr "无效的邮件地址"
msgid "Confirm"
msgstr "确认"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr "电子邮件"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr "密码"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr "注册"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr "域名"
@@ -44,45 +42,44 @@ msgstr "最大用户数"
msgid "Maximum alias count"
msgstr "最大别名数"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr "说明"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr "创建"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr "确认密码"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr "配额"
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr "允许IMAP访问"
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr "允许POP3访问"
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr "保存"
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr "显示名称"
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr "启用垃圾邮件过滤"
@@ -90,82 +87,80 @@ msgstr "启用垃圾邮件过滤"
msgid "Spam filter threshold"
msgstr "垃圾邮件过滤器阈值"
#: mailu/ui/forms.py:105
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr "保存设置"
#: mailu/ui/forms.py:110
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr "检查密码"
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr "更新密码"
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr "启用转发"
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr "目的地址"
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr "更新"
#: mailu/ui/forms.py:115
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr "启用自动回复"
#: mailu/ui/forms.py:116
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr "回复主题"
#: mailu/ui/forms.py:117
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr "回复正文"
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr "别名"
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "使用SQL LIKE语法例如用于全部别名"
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr "管理员邮箱"
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr "提交"
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr "管理员邮箱"
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr "协议"
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr "主机名或IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr "TCP端口"
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr "启用TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr "用户名"
@@ -175,7 +170,7 @@ msgstr "确认操作"
#: mailu/ui/templates/confirm.html:13
msgid "You are about to %(action)s. Please confirm your action."
msgstr "即将%(action)s请确认您的操作。"
msgstr "即将%(action)s请确认您的操作。"
#: mailu/ui/templates/docker-error.html:4
msgid "Docker error"
@@ -193,6 +188,34 @@ msgstr "你的帐户"
msgid "to access the administration tools"
msgstr "访问管理员工具"
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr "服务状态"
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr "服务"
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr "状态"
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr "进程ID"
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr "镜像"
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr "已开始"
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr "最后更新"
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr "我的帐户"
@@ -201,28 +224,28 @@ msgstr "我的帐户"
msgid "Settings"
msgstr "设置"
#: mailu/ui/templates/user/settings.html:22
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr "自动转发"
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr "自动回复"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr "代收帐户"
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr "登出"
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr "管理"
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr "管理员"
@@ -230,13 +253,13 @@ msgstr "管理员"
msgid "Mail domains"
msgstr "邮件域"
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr "帮"
msgstr "帮帮我"
#: mailu/ui/templates/working.html:4
msgid "We are still working on this feature!"
msgstr "该功能开发中……"
msgstr "开发中……"
#: mailu/ui/templates/admin/create.html:4
msgid "Add a global administrator"
@@ -318,27 +341,27 @@ msgstr "新域"
msgid "Domain details"
msgstr "域详情"
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr "重新生成密钥"
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr "DNS MX条目"
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr "DNS SPF条目"
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr "DKIM公钥"
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr "DNS DKIM条目"
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr "DNS DMARC条目"
@@ -410,15 +433,15 @@ msgstr "管理员列表"
msgid "Add manager"
msgstr "添加管理员"
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr "公告主题"
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr "公告正文"
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr "发送"
@@ -430,7 +453,7 @@ msgstr "公告"
msgid "from"
msgstr "来自"
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr "公告"
@@ -474,13 +497,13 @@ msgstr "自动回复"
msgid "Maximum user quota"
msgstr "最大用户容量"
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr "保留电子邮件副本"
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr "保留电子邮件在服务器上"
msgstr "电子邮件保存在服务器上"
#: mailu/ui/templates/fetch/list.html:21
msgid "Keep emails"
@@ -494,19 +517,19 @@ msgstr "是"
msgid "no"
msgstr "否"
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr "替代名称"
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr "中继域域名"
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr "远程主机"
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr "中继域"
@@ -546,15 +569,15 @@ msgstr "中继域列表"
msgid "New relayed domain"
msgstr "新的中继域"
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr "您的令牌(请记录,它只显示这一次)"
msgstr "您的令牌(请保存下来,它只显示这一次)"
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr "授权IP"
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr "认证令牌"
@@ -566,7 +589,7 @@ msgstr "转到"
msgid "Webmail"
msgstr "网页邮箱"
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr "网站"
@@ -580,9 +603,9 @@ msgstr "新的令牌"
#: mailu/ui/templates/user/create.html:15
msgid "General"
msgstr "通用"
msgstr "一般"
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr "功能和配额"
@@ -590,85 +613,11 @@ msgstr "功能和配额"
msgid "General settings"
msgstr "常规设置"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr "反垃圾邮件"
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr "垃圾邮件过滤器容忍度"
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid "In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid "If you do not know how to setup an <code>MX</code> record for your DNS zone,\n"
" please contact your DNS provider or administrator. Also, please wait a\n"
" couple minutes after the <code>MX</code> is set so the local server cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr ""

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import forms
import flask

View File

@@ -6,7 +6,6 @@ import flask_login
import flask_wtf
import re
LOCALPART_REGEX = "^[a-zA-Z0-9.!#$%&*+/=?^_`{|}~-]+$"
class DestinationField(fields.SelectMultipleField):
""" Allow for multiple emails selection from current user choices and
@@ -48,62 +47,37 @@ class DomainForm(flask_wtf.FlaskForm):
max_users = fields_.IntegerField(_('Maximum user count'), default=10)
max_aliases = fields_.IntegerField(_('Maximum alias count'), default=10)
max_quota_bytes = fields_.IntegerSliderField(_('Maximum user quota'), default=0)
signup_enabled = fields.BooleanField(_('Enable sign-up'), default=False)
comment = fields.StringField(_('Comment'))
submit = fields.SubmitField(_('Save'))
class DomainSignupForm(flask_wtf.FlaskForm):
name = fields.StringField(_('Domain name'), [validators.DataRequired()])
localpart = fields.StringField(_('Initial admin'), [validators.DataRequired()])
pw = fields.PasswordField(_('Admin password'), [validators.DataRequired()])
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
captcha = flask_wtf.RecaptchaField()
submit = fields.SubmitField(_('Create'))
class AlternativeForm(flask_wtf.FlaskForm):
name = fields.StringField(_('Alternative name'), [validators.DataRequired()])
submit = fields.SubmitField(_('Save'))
submit = fields.SubmitField(_('Create'))
class RelayForm(flask_wtf.FlaskForm):
name = fields.StringField(_('Relayed domain name'), [validators.DataRequired()])
smtp = fields.StringField(_('Remote host'))
comment = fields.StringField(_('Comment'))
submit = fields.SubmitField(_('Save'))
submit = fields.SubmitField(_('Create'))
class UserForm(flask_wtf.FlaskForm):
localpart = fields.StringField(_('E-mail'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)])
localpart = fields.StringField(_('E-mail'), [validators.DataRequired()])
pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
quota_bytes = fields_.IntegerSliderField(_('Quota'), default=1000000000)
enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True)
enable_pop = fields.BooleanField(_('Allow POP3 access'), default=True)
comment = fields.StringField(_('Comment'))
enabled = fields.BooleanField(_('Enabled'), default=True)
submit = fields.SubmitField(_('Save'))
class UserSignupForm(flask_wtf.FlaskForm):
localpart = fields.StringField(_('Email address'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)])
pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
submit = fields.SubmitField(_('Sign up'))
class UserSignupFormCaptcha(UserSignupForm):
captcha = flask_wtf.RecaptchaField()
class UserSettingsForm(flask_wtf.FlaskForm):
displayed_name = fields.StringField(_('Displayed name'))
spam_enabled = fields.BooleanField(_('Enable spam filter'))
spam_threshold = fields_.IntegerSliderField(_('Spam filter tolerance'))
forward_enabled = fields.BooleanField(_('Enable forwarding'))
forward_keep = fields.BooleanField(_('Keep a copy of the emails'))
forward_destination = fields.StringField(
_('Destination'), [validators.Optional(), validators.Email()]
)
submit = fields.SubmitField(_('Save settings'))
@@ -113,12 +87,20 @@ class UserPasswordForm(flask_wtf.FlaskForm):
submit = fields.SubmitField(_('Update password'))
class UserForwardForm(flask_wtf.FlaskForm):
forward_enabled = fields.BooleanField(_('Enable forwarding'))
forward_keep = fields.BooleanField(_('Keep a copy of the emails'))
forward_destination = fields.StringField(
_('Destination'), [validators.Optional(), validators.Email()]
)
submit = fields.SubmitField(_('Update'))
class UserReplyForm(flask_wtf.FlaskForm):
reply_enabled = fields.BooleanField(_('Enable automatic reply'))
reply_subject = fields.StringField(_('Reply subject'))
reply_body = fields.StringField(_('Reply body'),
widget=widgets.TextArea())
reply_startdate = fields.html5.DateField(_('Start of vacation'))
reply_enddate = fields.html5.DateField(_('End of vacation'))
submit = fields.SubmitField(_('Update'))
@@ -132,7 +114,7 @@ class TokenForm(flask_wtf.FlaskForm):
ip = fields.StringField(
_('Authorized IP'), [validators.Optional(), validators.IPAddress()]
)
submit = fields.SubmitField(_('Save'))
submit = fields.SubmitField(_('Create'))
class AliasForm(flask_wtf.FlaskForm):
@@ -141,7 +123,7 @@ class AliasForm(flask_wtf.FlaskForm):
_('Use SQL LIKE Syntax (e.g. for catch-all aliases)'))
destination = DestinationField(_('Destination'))
comment = fields.StringField(_('Comment'))
submit = fields.SubmitField(_('Save'))
submit = fields.SubmitField(_('Create'))
class AdminForm(flask_wtf.FlaskForm):

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 434 KiB

View File

@@ -5,7 +5,7 @@
{% block styles %}
{{super()}}
<link rel="stylesheet" href="{{ url_for('.static', filename='select2/css/select2.min.css') }}">
<link rel="stylesheet" href="{{ url_for('.static', filename='fontawesome/css/font-awesome.min.css') }}">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
<link rel="stylesheet" href="{{ url_for('.static', filename='adminlte/css/AdminLTE.min.css') }}">
<link rel="stylesheet" href="{{ url_for('.static', filename='adminlte/css/skin-blue.min.css') }}">
<link rel="stylesheet" href="{{ url_for('.static', filename='app.css') }}">

View File

@@ -1,65 +0,0 @@
{% extends "base.html" %}
{% block title %}
{% trans %}Client setup{% endtrans %}
{% endblock %}
{% block subtitle %}
configure your email client
{% endblock %}
{% block content %}
{% call macros.box(title="Incoming mail") %}
<table class="table table-bordered">
<tbody>
<tr>
<th>{% trans %}Mail protocol{% endtrans %}</th>
<td>IMAP</td>
</tr>
<tr>
<th>{% trans %}TCP port{% endtrans %}</th>
<td>{{ "143" if config["TLS_FLAVOR"] == "notls" else "993 (TLS) or 143 (STARTTLS)" }}</td>
</tr>
<tr>
<th>{% trans %}Server name{% endtrans %}</th>
<td><pre>{{ config["HOSTNAMES"].split(',')[0] }}</pre></td>
</tr>
<tr>
<th>{% trans %}Username{% endtrans %}</th>
<td><pre>{{ current_user if current_user.is_authenticated else "******" }}</pre></td>
</tr>
<tr>
<th>{% trans %}Password{% endtrans %}</th>
<td><pre>*******</pre></td>
</tr>
</tbody>
</table>
{% endcall %}
{% call macros.box(title="Outgoing mail") %}
<table class="table table-bordered">
<tbody>
<tr>
<th>{% trans %}Mail protocol{% endtrans %}</th>
<td>SMTP</td>
</tr>
<tr>
<th>{% trans %}TCP port{% endtrans %}</th>
<td>{{ "25" if config["TLS_FLAVOR"] == "notls" else "465 (TLS) or 587 (STARTTLS)" }}</td>
</tr>
<tr>
<th>{% trans %}Server name{% endtrans %}</th>
<td><pre>{{ config["HOSTNAMES"].split(',')[0] }}</pre></td>
</tr>
<tr>
<th>{% trans %}Username{% endtrans %}</th>
<td><pre>{{ current_user or "******" }}</pre></td>
</tr>
<tr>
<th>{% trans %}Password{% endtrans %}</th>
<td><pre>*******</pre></td>
</tr>
</tbody>
</table>
{% endcall %}
{% endblock %}

View File

@@ -13,7 +13,6 @@
{{ macros.form_field(form.max_quota_bytes, step=1000000000, max=50000000000,
prepend='<span class="input-group-addon"><span id="quota">'+((form.max_quota_bytes.data//1000000000).__str__() if form.max_quota_bytes.data else '∞')+'</span> GiB</span>',
oninput='$("#quota").text(this.value == 0 ? "∞" : this.value/1000000000);') }}
{{ macros.form_field(form.signup_enabled) }}
{{ macros.form_field(form.comment) }}
{{ macros.form_field(form.submit) }}
</form>

View File

@@ -10,13 +10,7 @@
{% block main_action %}
{% if current_user.global_admin %}
<a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}">
{% if domain.dkim_publickey %}
{% trans %}Regenerate keys{% endtrans %}
{% else %}
{% trans %}Generate keys{% endtrans %}
{% endif %}
</a>
<a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}">{% trans %}Regenerate keys{% endtrans %}</a>
{% endif %}
{% endblock %}
@@ -28,7 +22,7 @@
<td>{{ domain.name }}</td>
</tr>
<tr>
<th>{% trans %}DNS MX entry{% endtrans %} <i class="fa {{ 'fa-check-circle' if domain.check_mx() else 'fa-exclamation-circle' }}"></i></th>
<th>{% trans %}DNS MX entry{% endtrans %}</th>
<td><pre>{{ domain.name }}. 600 IN MX 10 {{ hostname }}.</pre></td>
</tr>
<tr>

View File

@@ -1,36 +0,0 @@
{% extends "base.html" %}
{% block title %}
{% trans %}Register a domain{% endtrans %}
{% endblock %}
{% block content %}
<form class="form" method="post" role="form">
{{ form.hidden_tag() }}
{% call macros.box(title="Requirements") %}
<p>{% trans %}In order to register a new domain, you must first setup the
domain zone so that the domain <code>MX</code> points to this server{% endtrans %}
(<code>{{ config["HOSTNAMES"].split(",")[0] }}</code>).
</p>
<p>
{% trans %}If you do not know how to setup an <code>MX</code> record for your DNS zone,
please contact your DNS provider or administrator. Also, please wait a
couple minutes after the <code>MX</code> is set so the local server cache
expires.{% endtrans %}
</p>
{% endcall %}
{% call macros.box() %}
{% if form.localpart %}
{{ macros.form_fields((form.localpart, form.name), append='<span class="input-group-addon">@</span>') }}
{{ macros.form_fields((form.pw, form.pw2)) }}
{% else %}
{{ macros.form_field(form.name) }}
{% endif %}
{{ macros.form_field(form.captcha) }}
{{ macros.form_field(form.submit) }}
{% endcall %}
</form>
{% endblock %}

View File

@@ -22,10 +22,6 @@
{{ macros.form_field(form.password) }}
{% endcall %}
{% call macros.box(title="Settings") %}
{{ macros.form_field(form.keep) }}
{% endcall %}
{{ macros.form_field(form.submit) }}
</form>
{% endblock %}

View File

@@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block title %}
{% trans %}Services status{% endtrans %}
{% endblock %}
{% block content %}
{% call macros.table() %}
<tr>
<th>{% trans %}Service{% endtrans %}</th>
<th>{% trans %}Status{% endtrans %}</th>
<th>{% trans %}PID{% endtrans %}</th>
<th>{% trans %}Image{% endtrans %}</th>
<th>{% trans %}Started{% endtrans %}</th>
<th>{% trans %}Last update{% endtrans %}</th>
</tr>
{% for name, container in containers.items() %}
<tr>
<td>{{ name }}</td>
<td><span class="label label-{{ "success" if container['State']['Running'] else "danger" }}">{{ container['State']['Status'] }}</span></td>
<td>{{ container['State']['Pid'] }}</td>
<td>{{ container['Config']['Image'] }}</td>
<td>{{ container['State']['StartedAt'] }}</td>
<td>{{ container['Image']['Created'] }}
</tr>
{% endfor %}
{% endcall %}
{% endblock %}

View File

@@ -16,6 +16,11 @@
<i class="fa fa-lock"></i> <span>{% trans %}Update password{% endtrans %}</span>
</a>
</li>
<li>
<a href="{{ url_for('.user_forward') }}">
<i class="fa fa-share"></i> <span>{% trans %}Auto-forward{% endtrans %}</span>
</a>
</li>
<li>
<a href="{{ url_for('.user_reply') }}">
<i class="fa fa-plane"></i> <span>{% trans %}Auto-reply{% endtrans %}</span>
@@ -32,10 +37,13 @@
</a>
</li>
{% if current_user.manager_of or current_user.global_admin %}
<li class="header">{% trans %}Administration{% endtrans %}</li>
{% endif %}
{% if current_user.global_admin %}
<li>
<a href="{{ url_for('.services') }}">
<i class="fa fa-dashboard"></i> <span>{% trans %}Services status{% endtrans %}</span>
</a>
</li>
<li>
<a href="{{ url_for('.announcement') }}">
<i class="fa fa-bullhorn"></i> <span>{% trans %}Announcement{% endtrans %}</span>
@@ -74,11 +82,6 @@
</a>
</li>
{% endif %}
<li>
<a href="{{ url_for('.client') }}">
<i class="fa fa-laptop"></i> <span>{% trans %}Client setup{% endtrans %}</span>
</a>
</li>
<li>
<a href="{{ config["WEBSITE"] }}">
<i class="fa fa-globe"></i> <span>{% trans %}Website{% endtrans %}</span>
@@ -89,13 +92,6 @@
<i class="fa fa-life-ring"></i> <span>{% trans %}Help{% endtrans %}</span>
</a>
</li>
{% if config['DOMAIN_REGISTRATION'] %}
<li>
<a href="{{ url_for('.domain_signup') }}">
<i class="fa fa-plus-square"></i> <span>{% trans %}Register a domain{% endtrans %}</span>
</a>
</li>
{% endif %}
{% if current_user.is_authenticated %}
<li>
<a href="{{ url_for('.logout') }}">
@@ -104,17 +100,10 @@
</li>
{% else %}
<li>
<a href="{{ url_for('.login') }}">
<a href="#">
<i class="fa fa-sign-in"></i> <span>{% trans %}Sign in{% endtrans %}</span>
</a>
</li>
{% if signup_domains %}
<li>
<a href="{{ url_for('.user_signup') }}">
<i class="fa fa-user-plus"></i> <span>{% trans %}Sign up{% endtrans %}</span>
</a>
</li>
{% endif %}
{% endif %}
</ul>
</section>

View File

@@ -16,13 +16,12 @@
{{ macros.form_field(form.localpart, append='<span class="input-group-addon">@'+domain.name+'</span>') }}
{{ macros.form_fields((form.pw, form.pw2)) }}
{{ macros.form_field(form.comment) }}
{{ macros.form_field(form.enabled) }}
{% endcall %}
{% call macros.box(_("Features and quotas"), theme="success") %}
{{ macros.form_field(form.quota_bytes, step=1000000000, max=(max_quota_bytes or domain.max_quota_bytes or 50000000000),
prepend='<span class="input-group-addon"><span id="quota">'+((form.quota_bytes.data//1000000000).__str__() if form.quota_bytes.data else '∞')+'</span> GiB</span>',
oninput='$("#quota").text(this.value == 0 ? "∞" : this.value/1000000000);') }}
prepend='<span class="input-group-addon"><span id="quota">'+(form.quota_bytes.data//1000000000).__str__()+'</span> GiB</span>',
oninput='$("#quota").text(this.value/1000000000);') }}
{{ macros.form_field(form.enable_imap) }}
{{ macros.form_field(form.enable_pop) }}
{% endcall %}

View File

@@ -32,6 +32,7 @@
</td>
<td>
<a href="{{ url_for('.user_settings', user_email=user.email) }}" title="{% trans %}Settings{% endtrans %}"><i class="fa fa-wrench"></i></a>&nbsp;
<a href="{{ url_for('.user_forward', user_email=user.email) }}" title="{% trans %}Auto-forward{% endtrans %}"><i class="fa fa-share"></i></a>&nbsp;
<a href="{{ url_for('.user_reply', user_email=user.email) }}" title="{% trans %}Auto-reply{% endtrans %}"><i class="fa fa-plane"></i></a>&nbsp;
<a href="{{ url_for('.fetch_list', user_email=user.email) }}" title="{% trans %}Fetched accounts{% endtrans %}"><i class="fa fa-download"></i></a>&nbsp;
</td>
@@ -40,7 +41,7 @@
{% if user.enable_imap %}<span class="label label-info">imap</span>{% endif %}
{% if user.enable_pop %}<span class="label label-info">pop3</span>{% endif %}
</td>
<td>{{ user.quota_bytes_used | filesizeformat }} / {{ (user.quota_bytes | filesizeformat) if user.quota_bytes else '∞' }}</td>
<td>{{ user.quota_bytes | filesizeformat }}</td>
<td>{{ user.comment or '-' }}</td>
<td>{{ user.created_at }}</td>
<td>{{ user.updated_at or '' }}</td>

View File

@@ -13,17 +13,14 @@
<form class="form" method="post" role="form">
{{ form.hidden_tag() }}
{{ macros.form_field(form.reply_enabled,
onchange="if(this.checked){$('#reply_subject,#reply_body,#reply_enddate,#reply_startdate').removeAttr('readonly')}
onchange="if(this.checked){$('#reply_subject,#reply_body,#reply_enddate').removeAttr('readonly')}
else{$('#reply_subject,#reply_body,#reply_enddate').attr('readonly', '')}") }}
{{ macros.form_field(form.reply_subject,
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
{{ macros.form_field(form.reply_body, rows=10,
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
{{ macros.form_field(form.reply_enddate,
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
{{ macros.form_field(form.reply_startdate,
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
**{("rw" if user.reply_enabled else "readonly"): ""}) }}
{{ macros.form_field(form.submit) }}
</form>
{% endcall %}

View File

@@ -11,6 +11,9 @@
{% block content %}
<form class="form" method="post" role="form">
{{ form.hidden_tag() }}
{% call macros.box(title=_("General settings")) %}
{{ macros.form_field(form.displayed_name) }}
{% endcall %}
{% call macros.box(title=_("Antispam")) %}
{{ macros.form_field(form.spam_enabled) }}
@@ -18,17 +21,6 @@
prepend='<span class="input-group-addon"><span id="threshold">'+form.spam_threshold.data.__str__()+'</span>&nbsp;/&nbsp;100</span>',
oninput='$("#threshold").text(this.value);') }}
{% endcall %}
{% call macros.box(title=_("Auto-forward")) %}
{{ macros.form_field(form.forward_enabled,
onchange="if(this.checked){$('#forward_destination,#forward_keep').removeAttr('disabled')}
else{$('#forward_destination,#forward_keep').attr('disabled', '')}") }}
{{ macros.form_field(form.forward_keep,
**{("enabled" if user.forward_enabled else "disabled"): ""}) }}
{{ macros.form_field(form.forward_destination,
**{("enabled" if user.forward_enabled else "disabled"): ""}) }}
{% endcall %}
{{ macros.form_field(form.submit) }}
</form>
{% endblock %}

View File

@@ -1,23 +0,0 @@
{% extends "base.html" %}
{% block title %}
{% trans %}Sign up{% endtrans %}
{% endblock %}
{% block subtitle %}
{{ domain }}
{% endblock %}
{% block content %}
<form class="form" method="post" role="form">
{{ form.hidden_tag() }}
{% call macros.box() %}
{{ macros.form_field(form.localpart, append='<span class="input-group-addon">@'+domain.name+'</span>') }}
{{ macros.form_fields((form.pw, form.pw2)) }}
{% if form.captcha %}
{{ macros.form_field(form.captcha) }}
{% endif %}
{{ macros.form_field(form.submit) }}
{% endcall %}
</form>
{% endblock %}

View File

@@ -1,26 +0,0 @@
{% extends "base.html" %}
{% block title %}
{% trans %}Sign up{% endtrans %}
{% endblock %}
{% block subtitle %}
{% trans %}pick a domain for the new account{% endtrans %}
{% endblock %}
{% block content %}
{% call macros.table() %}
<tr>
<th>{% trans %}Domain{% endtrans %}</th>
<th>{% trans %}Available slots{% endtrans %}</th>
<th>{% trans %}Quota{% endtrans %}</th>
</tr>
{% for domain_name, domain in available_domains.items() %}
<tr>
<td><a href="{{ url_for('.user_signup', domain_name=domain_name) }}">{{ domain_name }}</a></td>
<td>{{ domain.max_users - (domain.users | count) if domain.max_users else '∞' }}</td>
<td>{{ domain.max_quota_bytes or config['DEFAULT_QUOTA'] | filesizeformat }}</td>
</tr>
{% endfor %}
{% endcall %}
{% endblock %}

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, forms, access
import flask
@@ -25,7 +25,7 @@ def admin_create():
user = models.User.query.get(form.admin.data)
if user:
user.global_admin = True
models.db.session.commit()
db.session.commit()
flask.flash('User %s is now admin' % user)
return flask.redirect(flask.url_for('.admin_list'))
else:
@@ -40,7 +40,7 @@ def admin_delete(admin):
user = models.User.query.get(admin)
if user:
user.global_admin = False
models.db.session.commit()
db.session.commit()
flask.flash('User %s is no longer admin' % user)
return flask.redirect(flask.url_for('.admin_list'))
else:

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, forms, access
import flask
@@ -27,8 +27,8 @@ def alias_create(domain_name):
else:
alias = models.Alias(domain=domain)
form.populate_obj(alias)
models.db.session.add(alias)
models.db.session.commit()
db.session.add(alias)
db.session.commit()
flask.flash('Alias %s created' % alias)
return flask.redirect(
flask.url_for('.alias_list', domain_name=domain.name))
@@ -45,7 +45,7 @@ def alias_edit(alias):
form.localpart.validators = []
if form.validate_on_submit():
form.populate_obj(alias)
models.db.session.commit()
db.session.commit()
flask.flash('Alias %s updated' % alias)
return flask.redirect(
flask.url_for('.alias_list', domain_name=alias.domain.name))
@@ -59,8 +59,8 @@ def alias_edit(alias):
def alias_delete(alias):
alias = models.Alias.query.get(alias) or flask.abort(404)
domain = alias.domain
models.db.session.delete(alias)
models.db.session.commit()
db.session.delete(alias)
db.session.commit()
flask.flash('Alias %s deleted' % alias)
return flask.redirect(
flask.url_for('.alias_list', domain_name=domain.name))

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, forms, access
import flask
@@ -26,8 +26,8 @@ def alternative_create(domain_name):
else:
alternative = models.Alternative(domain=domain)
form.populate_obj(alternative)
models.db.session.add(alternative)
models.db.session.commit()
db.session.add(alternative)
db.session.commit()
flask.flash('Alternative domain %s created' % alternative)
return flask.redirect(
flask.url_for('.alternative_list', domain_name=domain.name))
@@ -41,8 +41,8 @@ def alternative_create(domain_name):
def alternative_delete(alternative):
alternative = models.Alternative.query.get(alternative) or flask.abort(404)
domain = alternative.domain
models.db.session.delete(alternative)
models.db.session.commit()
db.session.delete(alternative)
db.session.commit()
flask.flash('Alternative %s deleted' % alternative)
return flask.redirect(
flask.url_for('.alternative_list', domain_name=domain.name))

View File

@@ -1,9 +1,11 @@
from mailu import models
from mailu import dockercli, app, db, models
from mailu.ui import ui, forms, access
import flask
import flask_login
from urllib import parse
@ui.route('/', methods=["GET"])
@access.authenticated
@@ -18,7 +20,7 @@ def login():
user = models.User.login(form.email.data, form.pw.data)
if user:
flask_login.login_user(user)
endpoint = flask.request.args.get('next', '.index')
endpoint = flask.request.args.get('next')
return flask.redirect(flask.url_for(endpoint)
or flask.url_for('.index'))
else:
@@ -33,6 +35,16 @@ def logout():
return flask.redirect(flask.url_for('.index'))
@ui.route('/services', methods=['GET'])
@access.global_admin
def services():
try:
containers = dockercli.get()
except Exception as error:
return flask.render_template('docker-error.html', error=error)
return flask.render_template('services.html', containers=containers)
@ui.route('/announcement', methods=['GET', 'POST'])
@access.global_admin
def announcement():
@@ -46,8 +58,3 @@ def announcement():
form.announcement_body.data = ''
flask.flash('Your announcement was sent', 'success')
return flask.render_template('announcement.html', form=form)
@ui.route('/client', methods=['GET'])
def client():
return flask.render_template('client.html')

View File

@@ -1,11 +1,8 @@
from mailu import models
from mailu import app, db, models
from mailu.ui import ui, forms, access
from flask import current_app as app
import flask
import flask_login
import wtforms_components
import dns.resolver
@ui.route('/domain', methods=['GET'])
@@ -27,8 +24,8 @@ def domain_create():
else:
domain = models.Domain()
form.populate_obj(domain)
models.db.session.add(domain)
models.db.session.commit()
db.session.add(domain)
db.session.commit()
flask.flash('Domain %s created' % domain)
return flask.redirect(flask.url_for('.domain_list'))
return flask.render_template('domain/create.html', form=form)
@@ -43,7 +40,7 @@ def domain_edit(domain_name):
form.name.validators = []
if form.validate_on_submit():
form.populate_obj(domain)
models.db.session.commit()
db.session.commit()
flask.flash('Domain %s saved' % domain)
return flask.redirect(flask.url_for('.domain_list'))
return flask.render_template('domain/edit.html', form=form,
@@ -55,8 +52,8 @@ def domain_edit(domain_name):
@access.confirmation_required("delete {domain_name}")
def domain_delete(domain_name):
domain = models.Domain.query.get(domain_name) or flask.abort(404)
models.db.session.delete(domain)
models.db.session.commit()
db.session.delete(domain)
db.session.commit()
flask.flash('Domain %s deleted' % domain)
return flask.redirect(flask.url_for('.domain_list'))
@@ -76,44 +73,3 @@ def domain_genkeys(domain_name):
domain.generate_dkim_key()
return flask.redirect(
flask.url_for(".domain_details", domain_name=domain_name))
@ui.route('/domain/signup', methods=['GET', 'POST'])
def domain_signup(domain_name=None):
if not app.config['DOMAIN_REGISTRATION']:
flask.abort(403)
form = forms.DomainSignupForm()
if flask_login.current_user.is_authenticated:
del form.localpart
del form.pw
del form.pw2
if form.validate_on_submit():
conflicting_domain = models.Domain.query.get(form.name.data)
conflicting_alternative = models.Alternative.query.get(form.name.data)
conflicting_relay = models.Relay.query.get(form.name.data)
if conflicting_domain or conflicting_alternative or conflicting_relay:
flask.flash('Domain %s is already used' % form.name.data, 'error')
else:
domain = models.Domain()
form.populate_obj(domain)
domain.max_quota_bytes = app.config['DEFAULT_QUOTA']
domain.max_users = 10
domain.max_aliases = 10
if domain.check_mx():
models.db.session.add(domain)
if flask_login.current_user.is_authenticated:
user = models.User.query.get(flask_login.current_user.email)
else:
user = models.User()
user.domain = domain
form.populate_obj(user)
user.set_password(form.pw.data)
user.quota_bytes = domain.max_quota_bytes
models.db.session.add(user)
domain.managers.append(user)
models.db.session.commit()
flask.flash('Domain %s created' % domain)
return flask.redirect(flask.url_for('.domain_list'))
else:
flask.flash('The MX record was not properly set', 'error')
return flask.render_template('domain/signup.html', form=form)

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, forms, access
import flask
@@ -24,8 +24,8 @@ def fetch_create(user_email):
if form.validate_on_submit():
fetch = models.Fetch(user=user)
form.populate_obj(fetch)
models.db.session.add(fetch)
models.db.session.commit()
db.session.add(fetch)
db.session.commit()
flask.flash('Fetch configuration created')
return flask.redirect(
flask.url_for('.fetch_list', user_email=user.email))
@@ -39,7 +39,7 @@ def fetch_edit(fetch_id):
form = forms.FetchForm(obj=fetch)
if form.validate_on_submit():
form.populate_obj(fetch)
models.db.session.commit()
db.session.commit()
flask.flash('Fetch configuration updated')
return flask.redirect(
flask.url_for('.fetch_list', user_email=fetch.user.email))
@@ -53,8 +53,8 @@ def fetch_edit(fetch_id):
def fetch_delete(fetch_id):
fetch = models.Fetch.query.get(fetch_id) or flask.abort(404)
user = fetch.user
models.db.session.delete(fetch)
models.db.session.commit()
db.session.delete(fetch)
db.session.commit()
flask.flash('Fetch configuration delete')
return flask.redirect(
flask.url_for('.fetch_list', user_email=user.email))

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, forms, access
import flask
@@ -30,7 +30,7 @@ def manager_create(domain_name):
flask.flash('User %s is already manager' % user, 'error')
else:
domain.managers.append(user)
models.db.session.commit()
db.session.commit()
flask.flash('User %s can now manage %s' % (user, domain.name))
return flask.redirect(
flask.url_for('.manager_list', domain_name=domain.name))
@@ -46,7 +46,7 @@ def manager_delete(domain_name, user_email):
user = models.User.query.get(user_email) or flask.abort(404)
if user in domain.managers:
domain.managers.remove(user)
models.db.session.commit()
db.session.commit()
flask.flash('User %s can no longer manager %s' % (user, domain))
else:
flask.flash('User %s is not manager' % user, 'error')

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, forms, access
import flask
@@ -25,8 +25,8 @@ def relay_create():
else:
relay = models.Relay()
form.populate_obj(relay)
models.db.session.add(relay)
models.db.session.commit()
db.session.add(relay)
db.session.commit()
flask.flash('Relayed domain %s created' % relay)
return flask.redirect(flask.url_for('.relay_list'))
return flask.render_template('relay/create.html', form=form)
@@ -41,7 +41,7 @@ def relay_edit(relay_name):
form.name.validators = []
if form.validate_on_submit():
form.populate_obj(relay)
models.db.session.commit()
db.session.commit()
flask.flash('Relayed domain %s saved' % relay)
return flask.redirect(flask.url_for('.relay_list'))
return flask.render_template('relay/edit.html', form=form,
@@ -53,8 +53,8 @@ def relay_edit(relay_name):
@access.confirmation_required("delete {relay_name}")
def relay_delete(relay_name):
relay = models.Relay.query.get(relay_name) or flask.abort(404)
models.db.session.delete(relay)
models.db.session.commit()
db.session.delete(relay)
db.session.commit()
flask.flash('Relayed domain %s deleted' % relay)
return flask.redirect(flask.url_for('.relay_list'))

View File

@@ -1,4 +1,4 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, forms, access
from passlib import pwd
@@ -32,8 +32,8 @@ def token_create(user_email):
token = models.Token(user=user)
token.set_password(form.raw_password.data)
form.populate_obj(token)
models.db.session.add(token)
models.db.session.commit()
db.session.add(token)
db.session.commit()
flask.flash('Authentication token created')
return flask.redirect(
flask.url_for('.token_list', user_email=user.email))
@@ -46,8 +46,8 @@ def token_create(user_email):
def token_delete(token_id):
token = models.Token.query.get(token_id) or flask.abort(404)
user = token.user
models.db.session.delete(token)
models.db.session.commit()
db.session.delete(token)
db.session.commit()
flask.flash('Authentication token deleted')
return flask.redirect(
flask.url_for('.token_list', user_email=user.email))

View File

@@ -1,6 +1,5 @@
from mailu import models
from mailu import db, models
from mailu.ui import ui, access, forms
from flask import current_app as app
import flask
import flask_login
@@ -34,8 +33,8 @@ def user_create(domain_name):
user = models.User(domain=domain)
form.populate_obj(user)
user.set_password(form.pw.data)
models.db.session.add(user)
models.db.session.commit()
db.session.add(user)
db.session.commit()
user.send_welcome()
flask.flash('User %s created' % user)
return flask.redirect(
@@ -64,7 +63,7 @@ def user_edit(user_email):
form.populate_obj(user)
if form.pw.data:
user.set_password(form.pw.data)
models.db.session.commit()
db.session.commit()
flask.flash('User %s updated' % user)
return flask.redirect(
flask.url_for('.user_list', domain_name=user.domain.name))
@@ -78,8 +77,8 @@ def user_edit(user_email):
def user_delete(user_email):
user = models.User.query.get(user_email) or flask.abort(404)
domain = user.domain
models.db.session.delete(user)
models.db.session.commit()
db.session.delete(user)
db.session.commit()
flask.flash('User %s deleted' % user)
return flask.redirect(
flask.url_for('.user_list', domain_name=domain.name))
@@ -94,7 +93,7 @@ def user_settings(user_email):
form = forms.UserSettingsForm(obj=user)
if form.validate_on_submit():
form.populate_obj(user)
models.db.session.commit()
db.session.commit()
flask.flash('Settings updated for %s' % user)
if user_email:
return flask.redirect(
@@ -114,7 +113,7 @@ def user_password(user_email):
flask.flash('Passwords do not match', 'error')
else:
user.set_password(form.pw.data)
models.db.session.commit()
db.session.commit()
flask.flash('Password updated for %s' % user)
if user_email:
return flask.redirect(flask.url_for('.user_list',
@@ -131,7 +130,7 @@ def user_forward(user_email):
form = forms.UserForwardForm(obj=user)
if form.validate_on_submit():
form.populate_obj(user)
models.db.session.commit()
db.session.commit()
flask.flash('Forward destination updated for %s' % user)
if user_email:
return flask.redirect(
@@ -148,45 +147,9 @@ def user_reply(user_email):
form = forms.UserReplyForm(obj=user)
if form.validate_on_submit():
form.populate_obj(user)
models.db.session.commit()
db.session.commit()
flask.flash('Auto-reply message updated for %s' % user)
if user_email:
return flask.redirect(
flask.url_for('.user_list', domain_name=user.domain.name))
return flask.render_template('user/reply.html', form=form, user=user)
@ui.route('/user/signup', methods=['GET', 'POST'])
@ui.route('/user/signup/<domain_name>', methods=['GET', 'POST'])
def user_signup(domain_name=None):
available_domains = {
domain.name: domain
for domain in models.Domain.query.filter_by(signup_enabled=True).all()
if not domain.max_users or len(domain.users) < domain.max_users
}
if not available_domains:
flask.flash('No domain available for registration')
if not domain_name:
return flask.render_template('user/signup_domain.html',
available_domains=available_domains)
domain = available_domains.get(domain_name) or flask.abort(404)
quota_bytes = domain.max_quota_bytes or app.config['DEFAULT_QUOTA']
if app.config['RECAPTCHA_PUBLIC_KEY'] == "" or app.config['RECAPTCHA_PRIVATE_KEY'] == "":
form = forms.UserSignupForm()
else:
form = forms.UserSignupFormCaptcha()
if form.validate_on_submit():
if domain.has_email(form.localpart.data):
flask.flash('Email is already used', 'error')
else:
user = models.User(domain=domain)
form.populate_obj(user)
user.set_password(form.pw.data)
user.quota_bytes = quota_bytes
models.db.session.add(user)
models.db.session.commit()
user.send_welcome()
flask.flash('Successfully signed up %s' % user)
return flask.redirect(flask.url_for('.index'))
return flask.render_template('user/signup.html', domain=domain, form=form)

View File

@@ -1,53 +0,0 @@
from mailu import models
import flask
import flask_login
import flask_script
import flask_migrate
import flask_babel
import flask_limiter
from werkzeug.contrib import fixers
# Login configuration
login = flask_login.LoginManager()
login.login_view = "ui.login"
@login.unauthorized_handler
def handle_needs_login():
return flask.redirect(
flask.url_for('ui.login', next=flask.request.endpoint)
)
# Request rate limitation
limiter = flask_limiter.Limiter(key_func=lambda: current_user.username)
# Application translation
babel = flask_babel.Babel()
@babel.localeselector
def get_locale():
translations = list(map(str, babel.list_translations()))
return flask.request.accept_languages.best_match(translations)
# Proxy fixer
class PrefixMiddleware(object):
def __call__(self, environ, start_response):
prefix = environ.get('HTTP_X_FORWARDED_PREFIX', '')
if prefix:
environ['SCRIPT_NAME'] = prefix
return self.app(environ, start_response)
def init_app(self, app):
self.app = fixers.ProxyFix(app.wsgi_app)
app.wsgi_app = self
proxy = PrefixMiddleware()
# Data migrate
migrate = flask_migrate.Migrate()

View File

@@ -1,26 +1,11 @@
from mailu import models
from mailu import app, manager, db, models
from flask import current_app as app
from flask import cli as flask_cli
import flask
import os
import socket
import uuid
import click
db = models.db
@click.group()
def mailu(cls=flask_cli.FlaskGroup):
""" Mailu command line
"""
@mailu.command()
@flask_cli.with_appcontext
@manager.command
def advertise():
""" Advertise this server against statistic services.
"""
@@ -38,11 +23,7 @@ def advertise():
pass
@mailu.command()
@click.argument('localpart')
@click.argument('domain_name')
@click.argument('password')
@flask_cli.with_appcontext
@manager.command
def admin(localpart, domain_name, password):
""" Create an admin user
"""
@@ -60,17 +41,11 @@ def admin(localpart, domain_name, password):
db.session.commit()
@mailu.command()
@click.argument('localpart')
@click.argument('domain_name')
@click.argument('password')
@click.argument('hash_scheme')
@flask_cli.with_appcontext
def user(localpart, domain_name, password, hash_scheme=None):
@manager.command
def user(localpart, domain_name, password,
hash_scheme=app.config['PASSWORD_SCHEME']):
""" Create a user
"""
if hash_scheme is None:
hash_scheme = app.config['PASSWORD_SCHEME']
domain = models.Domain.query.get(domain_name)
if not domain:
domain = models.Domain(name=domain_name)
@@ -85,12 +60,10 @@ def user(localpart, domain_name, password, hash_scheme=None):
db.session.commit()
@mailu.command()
@click.option('-n', '--domain_name')
@click.option('-u', '--max_users')
@click.option('-a', '--max_aliases')
@click.option('-q', '--max_quota_bytes')
@flask_cli.with_appcontext
@manager.option('-n', '--domain_name', dest='domain_name')
@manager.option('-u', '--max_users', dest='max_users')
@manager.option('-a', '--max_aliases', dest='max_aliases')
@manager.option('-q', '--max_quota_bytes', dest='max_quota_bytes')
def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0):
domain = models.Domain.query.get(domain_name)
if not domain:
@@ -99,17 +72,15 @@ def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0):
db.session.commit()
@mailu.command()
@click.argument('localpart')
@click.argument('domain_name')
@click.argument('password_hash')
@click.argument('hash_scheme')
@flask_cli.with_appcontext
def user_import(localpart, domain_name, password_hash, hash_scheme = None):
""" Import a user along with password hash.
@manager.command
def user_import(localpart, domain_name, password_hash,
hash_scheme=app.config['PASSWORD_SCHEME']):
""" Import a user along with password hash. Available hashes:
'SHA512-CRYPT'
'SHA256-CRYPT'
'MD5-CRYPT'
'CRYPT'
"""
if hash_scheme is None:
hash_scheme = app.config['PASSWORD_SCHEME']
domain = models.Domain.query.get(domain_name)
if not domain:
domain = models.Domain(name=domain_name)
@@ -124,10 +95,7 @@ def user_import(localpart, domain_name, password_hash, hash_scheme = None):
db.session.commit()
@mailu.command()
@click.option('-v', '--verbose')
@click.option('-d', '--delete_objects')
@flask_cli.with_appcontext
@manager.command
def config_update(verbose=False, delete_objects=False):
"""sync configuration with data from YAML-formatted stdin"""
import yaml
@@ -266,9 +234,7 @@ def config_update(verbose=False, delete_objects=False):
db.session.commit()
@mailu.command()
@click.argument('email')
@flask_cli.with_appcontext
@manager.command
def user_delete(email):
"""delete user"""
user = models.User.query.get(email)
@@ -277,9 +243,7 @@ def user_delete(email):
db.session.commit()
@mailu.command()
@click.argument('email')
@flask_cli.with_appcontext
@manager.command
def alias_delete(email):
"""delete alias"""
alias = models.Alias.query.get(email)
@@ -288,11 +252,7 @@ def alias_delete(email):
db.session.commit()
@mailu.command()
@click.argument('localpart')
@click.argument('domain_name')
@click.argument('destination')
@flask_cli.with_appcontext
@manager.command
def alias(localpart, domain_name, destination):
""" Create an alias
"""
@@ -309,31 +269,24 @@ def alias(localpart, domain_name, destination):
db.session.add(alias)
db.session.commit()
# Set limits to a domain
@mailu.command()
@click.argument('domain_name')
@click.argument('max_users')
@click.argument('max_aliases')
@click.argument('max_quota_bytes')
@flask_cli.with_appcontext
@manager.command
def setlimits(domain_name, max_users, max_aliases, max_quota_bytes):
""" Set domain limits
"""
domain = models.Domain.query.get(domain_name)
domain.max_users = max_users
domain.max_aliases = max_aliases
domain.max_quota_bytes = max_quota_bytes
db.session.add(domain)
db.session.commit()
# Make the user manager of a domain
@mailu.command()
@click.argument('domain_name')
@click.argument('user_name')
@flask_cli.with_appcontext
@manager.command
def setmanager(domain_name, user_name='manager'):
""" Make a user manager of a domain
"""
domain = models.Domain.query.get(domain_name)
manageruser = models.User.query.get(user_name + '@' + domain_name)
domain.managers.append(manageruser)
@@ -341,5 +294,5 @@ def setmanager(domain_name, user_name='manager'):
db.session.commit()
if __name__ == '__main__':
cli()
if __name__ == "__main__":
manager.run()

View File

@@ -1,21 +1,21 @@
# Translations template for PROJECT.
# Copyright (C) 2018 ORGANIZATION
# Copyright (C) 2017 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2018-04-22 12:10+0200\n"
"POT-Creation-Date: 2017-11-05 17:17+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.5.3\n"
"Generated-By: Babel 2.5.1\n"
#: mailu/ui/forms.py:32
msgid "Invalid email address."
@@ -25,23 +25,21 @@ msgstr ""
msgid "Confirm"
msgstr ""
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77
#: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail"
msgstr ""
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
#: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:146
msgid "Password"
msgstr ""
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4
#: mailu/ui/templates/sidebar.html:111
#: mailu/ui/templates/sidebar.html:99
msgid "Sign in"
msgstr ""
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name"
msgstr ""
@@ -58,198 +56,165 @@ msgstr ""
msgid "Maximum user quota"
msgstr ""
#: mailu/ui/forms.py:50
msgid "Enable sign-up"
msgstr ""
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140
#: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:112 mailu/ui/forms.py:124
#: mailu/ui/templates/alias/list.html:21 mailu/ui/templates/domain/list.html:21
#: mailu/ui/templates/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23
msgid "Comment"
msgstr ""
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141
#: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create"
msgstr ""
#: mailu/ui/forms.py:57
msgid "Initial admin"
msgstr ""
#: mailu/ui/forms.py:58
msgid "Admin password"
msgstr ""
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91
msgid "Confirm password"
msgstr ""
#: mailu/ui/forms.py:65
#: mailu/ui/forms.py:55
msgid "Alternative name"
msgstr ""
#: mailu/ui/forms.py:70
#: mailu/ui/forms.py:60
msgid "Relayed domain name"
msgstr ""
#: mailu/ui/forms.py:71 mailu/ui/templates/relay/list.html:18
#: mailu/ui/forms.py:61 mailu/ui/templates/relay/list.html:18
msgid "Remote host"
msgstr ""
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
#: mailu/ui/forms.py:69
msgid "Confirm password"
msgstr ""
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota"
msgstr ""
#: mailu/ui/forms.py:81
#: mailu/ui/forms.py:71
msgid "Allow IMAP access"
msgstr ""
#: mailu/ui/forms.py:82
#: mailu/ui/forms.py:72
msgid "Allow POP3 access"
msgstr ""
#: mailu/ui/forms.py:84
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:85
#: mailu/ui/forms.py:74
msgid "Save"
msgstr ""
#: mailu/ui/forms.py:89
msgid "Email address"
msgstr ""
#: mailu/ui/forms.py:93 mailu/ui/templates/sidebar.html:117
#: mailu/ui/templates/user/signup.html:4
#: mailu/ui/templates/user/signup_domain.html:4
msgid "Sign up"
msgstr ""
#: mailu/ui/forms.py:97
#: mailu/ui/forms.py:78
msgid "Displayed name"
msgstr ""
#: mailu/ui/forms.py:98
#: mailu/ui/forms.py:79
msgid "Enable spam filter"
msgstr ""
#: mailu/ui/forms.py:99
#: mailu/ui/forms.py:80
msgid "Spam filter tolerance"
msgstr ""
#: mailu/ui/forms.py:100
#: mailu/ui/forms.py:81
msgid "Save settings"
msgstr ""
#: mailu/ui/forms.py:86
msgid "Password check"
msgstr ""
#: mailu/ui/forms.py:87 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr ""
#: mailu/ui/forms.py:91
msgid "Enable forwarding"
msgstr ""
#: mailu/ui/forms.py:101
#: mailu/ui/forms.py:92
msgid "Keep a copy of the emails"
msgstr ""
#: mailu/ui/forms.py:103 mailu/ui/forms.py:139
#: mailu/ui/forms.py:94 mailu/ui/forms.py:123
#: mailu/ui/templates/alias/list.html:20
msgid "Destination"
msgstr ""
#: mailu/ui/forms.py:105
msgid "Save settings"
msgstr ""
#: mailu/ui/forms.py:110
msgid "Password check"
msgstr ""
#: mailu/ui/forms.py:111 mailu/ui/templates/sidebar.html:16
msgid "Update password"
msgstr ""
#: mailu/ui/forms.py:115
msgid "Enable automatic reply"
msgstr ""
#: mailu/ui/forms.py:116
msgid "Reply subject"
msgstr ""
#: mailu/ui/forms.py:117
msgid "Reply body"
msgstr ""
#: mailu/ui/forms.py:119
msgid "End of vacation"
msgstr ""
#: mailu/ui/forms.py:120
#: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update"
msgstr ""
#: mailu/ui/forms.py:125
#: mailu/ui/forms.py:100
msgid "Enable automatic reply"
msgstr ""
#: mailu/ui/forms.py:101
msgid "Reply subject"
msgstr ""
#: mailu/ui/forms.py:102
msgid "Reply body"
msgstr ""
#: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)"
msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20
#: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP"
msgstr ""
#: mailu/ui/forms.py:136
#: mailu/ui/forms.py:120
msgid "Alias"
msgstr ""
#: mailu/ui/forms.py:138
#: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr ""
#: mailu/ui/forms.py:145
#: mailu/ui/forms.py:129
msgid "Admin email"
msgstr ""
#: mailu/ui/forms.py:146 mailu/ui/forms.py:151 mailu/ui/forms.py:164
#: mailu/ui/forms.py:130 mailu/ui/forms.py:135 mailu/ui/forms.py:148
msgid "Submit"
msgstr ""
#: mailu/ui/forms.py:150
#: mailu/ui/forms.py:134
msgid "Manager email"
msgstr ""
#: mailu/ui/forms.py:155
#: mailu/ui/forms.py:139
msgid "Protocol"
msgstr ""
#: mailu/ui/forms.py:158
#: mailu/ui/forms.py:142
msgid "Hostname or IP"
msgstr ""
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20
#: mailu/ui/templates/client.html:47
#: mailu/ui/forms.py:143
msgid "TCP port"
msgstr ""
#: mailu/ui/forms.py:160
#: mailu/ui/forms.py:144
msgid "Enable TLS"
msgstr ""
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
msgid "Username"
msgstr ""
#: mailu/ui/forms.py:163
#: mailu/ui/forms.py:147
msgid "Keep emails on the server"
msgstr ""
#: mailu/ui/forms.py:168
#: mailu/ui/forms.py:152
msgid "Announcement subject"
msgstr ""
#: mailu/ui/forms.py:170
#: mailu/ui/forms.py:154
msgid "Announcement body"
msgstr ""
#: mailu/ui/forms.py:172
#: mailu/ui/forms.py:156
msgid "Send"
msgstr ""
@@ -257,16 +222,8 @@ msgstr ""
msgid "Public announcement"
msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82
msgid "Client setup"
msgstr ""
#: mailu/ui/templates/client.html:16 mailu/ui/templates/client.html:43
msgid "Mail protocol"
msgstr ""
#: mailu/ui/templates/client.html:24 mailu/ui/templates/client.html:51
msgid "Server name"
#: mailu/ui/templates/announcement.html:8
msgid "from"
msgstr ""
#: mailu/ui/templates/confirm.html:4
@@ -290,43 +247,75 @@ msgstr ""
msgid "to access the administration tools"
msgstr ""
#: mailu/ui/templates/services.html:4 mailu/ui/templates/sidebar.html:44
msgid "Services status"
msgstr ""
#: mailu/ui/templates/services.html:10
msgid "Service"
msgstr ""
#: mailu/ui/templates/fetch/list.html:23 mailu/ui/templates/services.html:11
msgid "Status"
msgstr ""
#: mailu/ui/templates/services.html:12
msgid "PID"
msgstr ""
#: mailu/ui/templates/services.html:13
msgid "Image"
msgstr ""
#: mailu/ui/templates/services.html:14
msgid "Started"
msgstr ""
#: mailu/ui/templates/services.html:15
msgid "Last update"
msgstr ""
#: mailu/ui/templates/sidebar.html:8
msgid "My account"
msgstr ""
#: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
msgid "Settings"
msgstr ""
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward"
msgstr ""
#: mailu/ui/templates/sidebar.html:26 mailu/ui/templates/user/list.html:36
msgid "Auto-reply"
msgstr ""
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26
#: mailu/ui/templates/user/list.html:36
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts"
msgstr ""
#: mailu/ui/templates/sidebar.html:31 mailu/ui/templates/token/list.html:4
#: mailu/ui/templates/sidebar.html:36 mailu/ui/templates/token/list.html:4
msgid "Authentication tokens"
msgstr ""
#: mailu/ui/templates/sidebar.html:35
#: mailu/ui/templates/sidebar.html:40
msgid "Administration"
msgstr ""
#: mailu/ui/templates/sidebar.html:44
#: mailu/ui/templates/sidebar.html:49
msgid "Announcement"
msgstr ""
#: mailu/ui/templates/sidebar.html:49
#: mailu/ui/templates/sidebar.html:54
msgid "Administrators"
msgstr ""
#: mailu/ui/templates/sidebar.html:54
#: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains"
msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
msgid "Antispam"
msgstr ""
#: mailu/ui/templates/sidebar.html:66
msgid "Mail domains"
msgstr ""
@@ -339,19 +328,15 @@ msgstr ""
msgid "Webmail"
msgstr ""
#: mailu/ui/templates/sidebar.html:87
#: mailu/ui/templates/sidebar.html:82
msgid "Website"
msgstr ""
#: mailu/ui/templates/sidebar.html:92
#: mailu/ui/templates/sidebar.html:87
msgid "Help"
msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/sidebar.html:105
#: mailu/ui/templates/sidebar.html:93
msgid "Sign out"
msgstr ""
@@ -455,31 +440,27 @@ msgstr ""
msgid "Domain details"
msgstr ""
#: mailu/ui/templates/domain/details.html:15
#: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys"
msgstr ""
#: mailu/ui/templates/domain/details.html:17
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/details.html:31
#: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:35
#: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries"
msgstr ""
#: mailu/ui/templates/domain/details.html:42
#: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key"
msgstr ""
#: mailu/ui/templates/domain/details.html:46
#: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry"
msgstr ""
#: mailu/ui/templates/domain/details.html:50
#: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry"
msgstr ""
@@ -523,23 +504,6 @@ msgstr ""
msgid "Alternatives"
msgstr ""
#: mailu/ui/templates/domain/signup.html:13
msgid ""
"In order to register a new domain, you must first setup the\n"
" domain zone so that the domain <code>MX</code> points to this server"
msgstr ""
#: mailu/ui/templates/domain/signup.html:18
msgid ""
"If you do not know how to setup an <code>MX</code> record for your DNS "
"zone,\n"
" please contact your DNS provider or administrator. Also, please wait "
"a\n"
" couple minutes after the <code>MX</code> is set so the local server "
"cache\n"
" expires."
msgstr ""
#: mailu/ui/templates/fetch/create.html:4
msgid "Add a fetched account"
msgstr ""
@@ -616,7 +580,7 @@ msgstr ""
msgid "General"
msgstr ""
#: mailu/ui/templates/user/create.html:22
#: mailu/ui/templates/user/create.html:21
msgid "Features and quotas"
msgstr ""
@@ -652,19 +616,11 @@ msgstr ""
msgid "Automatic reply"
msgstr ""
#: mailu/ui/templates/user/settings.html:22
msgid "Auto-forward"
#: mailu/ui/templates/user/settings.html:14
msgid "General settings"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8
msgid "pick a domain for the new account"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
#: mailu/ui/templates/user/settings.html:18
msgid "Antispam"
msgstr ""

View File

@@ -1,25 +0,0 @@
""" Enforce the nocase collation on the email table
Revision ID: 049fed905da7
Revises: 49d77a93118e
Create Date: 2018-04-21 13:23:56.571524
"""
# revision identifiers, used by Alembic.
revision = '049fed905da7'
down_revision = '49d77a93118e'
from alembic import op
import sqlalchemy as sa
def upgrade():
with op.batch_alter_table('user') as batch:
batch.alter_column('email', type_=sa.String(length=255, collation="NOCASE"))
def downgrade():
with op.batch_alter_table('user') as batch:
batch.alter_column('email', type_=sa.String(length=255))

View File

@@ -1,28 +0,0 @@
""" Add a column for used quota
Revision ID: 25fd6c7bcb4a
Revises: 049fed905da7
Create Date: 2018-07-25 21:56:09.729153
"""
# revision identifiers, used by Alembic.
revision = '25fd6c7bcb4a'
down_revision = '049fed905da7'
from alembic import op
import sqlalchemy as sa
from alembic import op
import sqlalchemy as sa
def upgrade():
with op.batch_alter_table('user') as batch:
batch.add_column(sa.Column('quota_bytes_used', sa.Integer(), nullable=False, server_default='0'))
def downgrade():
with op.batch_alter_table('user') as batch:
batch.drop_column('user', 'quota_bytes_used')

View File

@@ -1,24 +0,0 @@
""" Add a start day for vacations
Revision ID: 3b281286c7bd
Revises: 25fd6c7bcb4a
Create Date: 2018-09-27 22:20:08.158553
"""
revision = '3b281286c7bd'
down_revision = '25fd6c7bcb4a'
from alembic import op
import sqlalchemy as sa
def upgrade():
with op.batch_alter_table('user') as batch:
batch.add_column(sa.Column('reply_startdate', sa.Date(), nullable=False,
server_default="1900-01-01"))
def downgrade():
with op.batch_alter_table('user') as batch:
batch.drop_column('reply_startdate')

View File

@@ -13,6 +13,8 @@ down_revision = '2335c80a6bc3'
from alembic import op
import sqlalchemy as sa
from mailu import app
fetch_table = sa.Table(
'fetch',
@@ -22,7 +24,13 @@ fetch_table = sa.Table(
def upgrade():
connection = op.get_bind()
op.add_column('fetch', sa.Column('keep', sa.Boolean(), nullable=False, server_default=sa.sql.expression.false()))
# also apply the current config value if set
if app.config.get("FETCHMAIL_KEEP", "False") == "True":
connection.execute(
fetch_table.update().values(keep=True)
)
def downgrade():

View File

@@ -1,24 +0,0 @@
""" Enable signup per domain
Revision ID: 423155f8fc15
Revises: 77aa22ad72e2
Create Date: 2017-12-02 15:07:40.052320
"""
# revision identifiers, used by Alembic.
revision = '423155f8fc15'
down_revision = '77aa22ad72e2'
from alembic import op
import sqlalchemy as sa
def upgrade():
with op.batch_alter_table('domain') as batch:
batch.add_column(sa.Column('signup_enabled', sa.Boolean(), nullable=False, server_default=sa.sql.expression.false()))
def downgrade():
with op.batch_alter_table('domain') as batch:
batch.drop_column('signup_enabled')

View File

@@ -1,24 +0,0 @@
""" Add enabled flag to user model
Revision ID: 49d77a93118e
Revises: 423155f8fc15
Create Date: 2018-04-15 11:17:32.306088
"""
# revision identifiers, used by Alembic.
revision = '49d77a93118e'
down_revision = '423155f8fc15'
from alembic import op
import sqlalchemy as sa
def upgrade():
with op.batch_alter_table('user') as batch:
batch.add_column(sa.Column('enabled', sa.Boolean(), nullable=False, server_default=sa.sql.expression.true()))
def downgrade():
with op.batch_alter_table('user') as batch:
batch.drop_column('user', 'enabled')

View File

@@ -1,25 +0,0 @@
""" Add a configuration table
Revision ID: cd79ed46d9c2
Revises: 25fd6c7bcb4a
Create Date: 2018-10-17 21:44:48.924921
"""
revision = 'cd79ed46d9c2'
down_revision = '3b281286c7bd'
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table('config',
sa.Column('name', sa.String(length=255), nullable=False),
sa.Column('value', sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint('name')
)
def downgrade():
op.drop_table('config')

View File

@@ -1,47 +1,51 @@
alembic==1.0.2
asn1crypto==0.24.0
Babel==2.6.0
bcrypt==3.1.5
alembic==0.9.6
asn1crypto==0.23.0
Babel==2.5.1
blinker==1.4
cffi==1.11.5
Click==7.0
cryptography==2.3.1
decorator==4.3.0
dnspython==1.16.0
dominate==2.3.4
Flask==1.0.2
Flask-Babel==0.12.2
certifi==2017.7.27.1
cffi==1.11.2
chardet==3.0.4
click==6.7
cryptography==2.1.2
decorator==4.1.2
docker-py==1.10.6
docker-pycreds==0.2.1
dominate==2.3.1
Flask==0.12.2
Flask-Babel==0.11.2
Flask-Bootstrap==3.3.7.1
Flask-DebugToolbar==0.10.1
Flask-Limiter==1.0.1
Flask-Login==0.4.1
Flask-Migrate==2.3.1
Flask-Limiter==0.9.5.1
Flask-Login==0.4.0
Flask-Migrate==2.1.1
Flask-Script==2.0.6
Flask-SQLAlchemy==2.3.2
Flask-WTF==0.14.2
gunicorn==19.9.0
idna==2.7
gunicorn==19.7.1
idna==2.6
infinity==1.4
intervals==0.8.1
itsdangerous==1.1.0
Jinja2==2.10
limits==1.3
intervals==0.8.0
itsdangerous==0.24
Jinja2==2.9.6
limits==1.2.1
Mako==1.0.7
MarkupSafe==1.1.0
MarkupSafe==1.0
passlib==1.7.1
pycparser==2.19
pyOpenSSL==18.0.0
python-dateutil==2.7.5
pycparser==2.18
pyOpenSSL==17.3.0
python-dateutil==2.6.1
python-editor==1.0.3
pytz==2018.7
PyYAML==3.13
redis==3.0.1
pytz==2017.2
PyYAML==3.12
redis==2.10.6
requests==2.18.4
six==1.11.0
SQLAlchemy==1.2.13
tabulate==0.8.2
tenacity==5.0.2
validators==0.12.2
SQLAlchemy==1.1.14
tabulate==0.8.1
urllib3==1.22
validators==0.12.0
visitor==0.1.3
Werkzeug==0.14.1
WTForms==2.2.1
websocket-client==0.44.0
Werkzeug==0.12.2
WTForms==2.1
WTForms-Components==0.10.3

View File

@@ -12,8 +12,7 @@ redis
WTForms-Components
passlib
gunicorn
docker-py
tabulate
PyYAML
PyOpenSSL
dnspython
bcrypt

7
core/admin/run.py Normal file
View File

@@ -0,0 +1,7 @@
import os
if __name__ == "__main__":
os.environ["DEBUG"] = "True"
from mailu import app
app.run()

View File

@@ -1,7 +0,0 @@
#!/usr/bin/python3
import os
os.system("flask mailu advertise")
os.system("flask db upgrade")
os.system("gunicorn -w 4 -b :80 --access-logfile - --error-logfile - --preload 'mailu:create_app()'")

5
core/admin/start.sh Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
python manage.py advertise
python manage.py db upgrade
gunicorn -w 4 -b 0.0.0.0:80 --access-logfile - --error-logfile - --preload mailu:app

View File

@@ -1,23 +1,12 @@
FROM alpine:3.8
# python3 shared with most images
RUN apk add --no-cache \
python3 py3-pip \
&& pip3 install --upgrade pip
# Shared layer between rspamd, postfix, dovecot, unbound and nginx
RUN pip3 install jinja2
# Shared layer between rspamd, postfix, dovecot
RUN pip3 install tenacity
# Image specific layers under this line
RUN apk add --no-cache \
dovecot dovecot-pigeonhole-plugin dovecot-fts-lucene rspamd-client bash \
&& pip3 install podop
FROM alpine:3.13
RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
&& apk add --no-cache \
dovecot dovecot-sqlite dovecot-pigeonhole-plugin \
rspamd-client python3 py3-jinja2
COPY conf /conf
COPY sieve /var/lib/dovecot
COPY start.py /start.py
EXPOSE 110/tcp 143/tcp 993/tcp 4190/tcp 2525/tcp
VOLUME ["/data", "/mail"]
CMD /start.py
HEALTHCHECK --start-period=350s CMD echo QUIT|nc localhost 110|grep "Dovecot ready."

View File

@@ -1,5 +0,0 @@
uri = proxy:/tmp/podop.socket:auth
iterate_disable = yes
default_pass_scheme = plain
password_key = passdb/%u
user_key = userdb/%u

View File

@@ -1,4 +0,0 @@
#!/bin/bash
tee >(rspamc -h antispam:11334 -P mailu learn_ham /dev/stdin) \
| rspamc -h antispam:11334 -P mailu -f 13 fuzzy_add /dev/stdin

View File

@@ -1,4 +0,0 @@
#!/bin/bash
tee >(rspamc -h antispam:11334 -P mailu learn_spam /dev/stdin) \
>(rspamc -h antispam:11334 -P mailu -f 11 fuzzy_add /dev/stdin)

View File

@@ -0,0 +1,14 @@
driver = sqlite
connect = /data/main.db
# Return the user hashed password
password_query = \
SELECT NULL as password, 'Y' as nopassword, '{{ FRONT_ADDRESS }}{% if WEBMAIL_ADDRESS %},{{ WEBMAIL_ADDRESS }}{% endif %}' as allow_nets \
FROM user \
WHERE user.email = '%u'
# Mostly get the user quota
user_query = \
SELECT '*:bytes=' || user.quota_bytes AS quota_rule \
FROM user \
WHERE user.email = '%u'

View File

@@ -5,23 +5,19 @@ log_path = /dev/stderr
protocols = imap pop3 lmtp sieve
postmaster_address = {{ POSTMASTER }}@{{ DOMAIN }}
hostname = {{ HOSTNAMES.split(",")[0] }}
submission_host = {{ FRONT_ADDRESS }}
mail_plugins = $mail_plugins quota
submission_host = front
{% if DISABLE_FTS_LUCENE != 'true' %}
###############
# Full-text search
###############
mail_plugins = $mail_plugins fts fts_lucene
plugin {
fts = lucene
fts_autoindex = yes
fts_autoindex_exclude = \Junk
fts_lucene = whitespace_chars=@.
service dict {
unix_listener dict {
group = mail
mode = 0660
}
}
dict {
sieve = sqlite:/etc/dovecot/pigeonhole-sieve.dict
}
{% endif %}
###############
# Mailboxes
@@ -35,49 +31,42 @@ mail_gid = mail
mail_privileged_group = mail
mail_access_groups = mail
maildir_stat_dirs = yes
mailbox_list_index = yes
mail_vsize_bg_after_count = 100
mail_plugins = $mail_plugins quota quota_clone zlib
namespace inbox {
inbox = yes
{% for mailbox in ("Trash", "Drafts", "Sent", "Junk") %}
mailbox {{ mailbox }} {
mailbox Trash {
auto = subscribe
special_use = \{{ mailbox }}
special_use = \Trash
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
{% endfor %}
}
plugin {
quota = count:User quota
quota_vsizes = yes
quota_clone_dict = proxy:/tmp/podop.socket:quota
{% if COMPRESSION in [ 'gz', 'bz2' ] %}
zlib_save = {{ COMPRESSION }}
{% endif %}
{% if COMPRESSION_LEVEL %}
zlib_save_level = {{ COMPRESSION_LEVEL }}
{% endif %}
}
###############
# Authentication
###############
auth_username_chars =
auth_mechanisms = plain login
disable_plaintext_auth = no
ssl_protocols = !SSLv3
passdb {
driver = dict
args = /etc/dovecot/auth.conf
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = dict
args = /etc/dovecot/auth.conf
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
service auth {
@@ -98,6 +87,7 @@ service auth-worker {
###############
# IMAP & POP
###############
protocol imap {
mail_plugins = $mail_plugins imap_quota imap_sieve
}
@@ -115,6 +105,7 @@ service imap-login {
###############
# Delivery
###############
protocol lmtp {
mail_plugins = $mail_plugins sieve
recipient_delimiter = {{ RECIPIENT_DELIMITER }}
@@ -126,9 +117,15 @@ service lmtp {
}
}
plugin {
quota = maildir:User quota
}
###############
# Filtering
###############
service managesieve-login {
inet_listener sieve {
port = 4190
@@ -140,13 +137,15 @@ service managesieve {
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_before = dict:proxy:/tmp/podop.socket:sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_extensions = +spamtest +spamtestplus +editheader
sieve_global_extensions = +vnd.dovecot.execute
sieve_plugins = sieve_extdata sieve_imapsieve sieve_extprograms
sieve_global_extensions = +vnd.dovecot.extdata +spamtest +spamtestplus +vnd.dovecot.execute
sieve_before = /var/lib/dovecot/before.sieve
sieve_default = /var/lib/dovecot/default.sieve
sieve_after = /var/lib/dovecot/after.sieve
sieve_extdata_dict_uri = proxy::sieve
# Sieve execute
sieve_execute_bin_dir = /conf/bin
sieve_execute_bin_dir = /var/lib/dovecot/bin
# Send vacation replies even for aliases
# See the Pigeonhole documentation about warnings: http://wiki2.dovecot.org/Pigeonhole/Sieve/Extensions/Vacation
@@ -165,11 +164,11 @@ plugin {
# Learn from spam
imapsieve_mailbox1_name = Junk
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_before = file:/conf/report-spam.sieve
imapsieve_mailbox1_before = file:/var/lib/dovecot/report-spam.sieve
imapsieve_mailbox2_name = *
imapsieve_mailbox2_from = Junk
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_before = file:/conf/report-ham.sieve
imapsieve_mailbox2_before = file:/var/lib/dovecot/report-ham.sieve
}
###############

View File

@@ -0,0 +1,43 @@
connect = /data/main.db
map {
pattern = priv/spam_enabled
table = user
username_field = email
value_field = spam_enabled
}
map {
pattern = priv/spam_threshold
table = user
username_field = email
value_field = spam_threshold
}
map {
pattern = priv/reply_enabled
table = user
username_field = email
value_field = reply_enabled
}
map {
pattern = priv/reply_subject
table = user
username_field = email
value_field = reply_subject
}
map {
pattern = priv/reply_body
table = user
username_field = email
value_field = reply_body
}
map {
pattern = priv/reply_enddate
table = user
username_field = email
value_field = reply_enddate
}

View File

@@ -1,3 +0,0 @@
require "vnd.dovecot.execute";
execute :pipe "spam";

View File

View File

@@ -0,0 +1,32 @@
require "variables";
require "vacation";
require "fileinto";
require "envelope";
require "mailbox";
require "imap4flags";
require "regex";
require "relational";
require "date";
require "comparator-i;ascii-numeric";
require "vnd.dovecot.extdata";
require "vnd.dovecot.execute";
require "spamtestplus";
if allof (string :is "${extdata.spam_enabled}" "1",
spamtest :percent :value "gt" :comparator "i;ascii-numeric" "${extdata.spam_threshold}")
{
setflag "\\seen";
fileinto :create "Junk";
stop;
}
if exists "X-Virus" {
discard;
stop;
}
if allof (string :is "${extdata.reply_enabled}" "1",
currentdate :value "le" "date" "${extdata.reply_enddate}")
{
vacation :days 1 :subject "${extdata.reply_subject}" "${extdata.reply_body}";
}

View File

@@ -0,0 +1,3 @@
#!/bin/sh
rspamc -h antispam:11334 -P mailu "learn_$1" /dev/stdin <&0

View File

View File

@@ -8,4 +8,4 @@ if string "${mailbox}" "Trash" {
stop;
}
execute :pipe "ham";
execute :pipe "mailtrain" "ham";

View File

@@ -0,0 +1,3 @@
require "vnd.dovecot.execute";
execute :pipe "mailtrain" "spam";

View File

@@ -4,34 +4,17 @@ import jinja2
import os
import socket
import glob
import multiprocessing
import tenacity
from tenacity import retry
from podop import run_server
def start_podop():
os.setuid(8)
run_server(3 if "DEBUG" in os.environ else 0, "dovecot", "/tmp/podop.socket", [
("quota", "url", "http://admin/internal/dovecot/§"),
("auth", "url", "http://admin/internal/dovecot/§"),
("sieve", "url", "http://admin/internal/dovecot/§"),
])
convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ))
# Actual startup script
resolve = retry(socket.gethostbyname, stop=tenacity.stop_after_attempt(100), wait=tenacity.wait_random(min=2, max=5))
os.environ["FRONT_ADDRESS"] = resolve(os.environ.get("FRONT_ADDRESS", "front"))
os.environ["REDIS_ADDRESS"] = resolve(os.environ.get("REDIS_ADDRESS", "redis"))
os.environ["FRONT_ADDRESS"] = socket.gethostbyname("front")
if os.environ["WEBMAIL"] != "none":
os.environ["WEBMAIL_ADDRESS"] = resolve(os.environ.get("WEBMAIL_ADDRESS", "webmail"))
os.environ["WEBMAIL_ADDRESS"] = socket.gethostbyname("webmail")
for dovecot_file in glob.glob("/conf/*.conf"):
for dovecot_file in glob.glob("/conf/*"):
convert(dovecot_file, os.path.join("/etc/dovecot", os.path.basename(dovecot_file)))
# Run Podop, then postfix
multiprocessing.Process(target=start_podop).start()
os.system("chown -R mail:mail /mail /var/lib/dovecot /conf")
# Run postfix
os.system("chown -R mail:mail /mail /var/lib/dovecot")
os.execv("/usr/sbin/dovecot", ["dovecot", "-c", "/etc/dovecot/dovecot.conf", "-F"])

View File

@@ -1,21 +1,11 @@
FROM alpine:3.8
# python3 shared with most images
RUN apk add --no-cache \
python3 py3-pip \
&& pip3 install --upgrade pip
# Shared layer between rspamd, postfix, dovecot, unbound and nginx
RUN pip3 install jinja2
# Image specific layers under this line
RUN apk add --no-cache certbot nginx nginx-mod-mail openssl curl \
&& pip3 install idna requests watchdog
FROM alpine:3.13
RUN apk add --no-cache nginx nginx-mod-mail python3 py3-jinja2 certbot openssl
# added to fix #522
RUN apk add --no-cache py-requests-toolbelt py-pip
RUN pip install "idna<2.7"
COPY conf /conf
COPY *.py /
EXPOSE 80/tcp 443/tcp 110/tcp 143/tcp 465/tcp 587/tcp 993/tcp 995/tcp 25/tcp 10025/tcp 10143/tcp
VOLUME ["/certs"]
VOLUME ["/overrides"]
CMD /start.py
HEALTHCHECK CMD curl -k -f -L http://localhost/health || exit 1

View File

@@ -1,63 +0,0 @@
#!/usr/bin/python3
"""
Certificate watcher which reloads nginx or reconfigures it, depending on what
happens to externally supplied certificates. Only executed by start.py in case
of TLS_FLAVOR=[mail, cert]
"""
from os.path import exists, split as path_split
from os import system
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, FileDeletedEvent, \
FileCreatedEvent, FileModifiedEvent, FileMovedEvent
class ChangeHandler(FileSystemEventHandler):
"watchdog-handler listening on any event, executing the correct configuration/reload steps"
@staticmethod
def reload_nginx():
"merely reload nginx without re-configuring everything"
if exists("/var/run/nginx.pid"):
print("Reloading a running nginx")
system("nginx -s reload")
@staticmethod
def reexec_config():
"execute a reconfiguration of the system, which also reloads"
print("Reconfiguring system")
system("/config.py")
def on_any_event(self, event):
"event-listener checking if the affected files are the cert-files we're interested in"
if event.is_directory:
return
filename = path_split(event.src_path)[-1]
if isinstance(event, FileMovedEvent):
filename = path_split(event.dest_path)[-1]
if filename in ['cert.pem', 'key.pem']:
# all cases except for FileModified need re-configure
if isinstance(event, (FileCreatedEvent, FileMovedEvent, FileDeletedEvent)):
ChangeHandler.reexec_config()
# file modification needs only a nginx reload without config.py
elif isinstance(event, FileModifiedEvent):
ChangeHandler.reload_nginx()
# cert files have been moved away, re-configure
elif isinstance(event, FileMovedEvent) and path_split(event.src_path)[-1] in ['cert.pem', 'key.pem']:
ChangeHandler.reexec_config()
if __name__ == '__main__':
observer = Observer()
handler = ChangeHandler()
observer.schedule(handler, "/certs", recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()

View File

@@ -20,29 +20,19 @@ http {
absolute_redirect off;
resolver {{ RESOLVER }} valid=30s;
{% if REAL_IP_HEADER %}
real_ip_header {{ REAL_IP_HEADER }};
{% endif %}
{% if REAL_IP_FROM %}{% for from_ip in REAL_IP_FROM.split(',') %}
set_real_ip_from {{ from_ip }};
{% endfor %}{% endif %}
# Header maps
map $http_x_forwarded_proto $proxy_x_forwarded_proto {
default $http_x_forwarded_proto;
'' $scheme;
}
# Disable the main http server when on kubernetes (port 80 and 443)
{% if KUBERNETES_INGRESS != 'true' %}
# Main HTTP server
server {
# Variables for proxifying
set $admin {{ HOST_ADMIN }};
set $antispam {{ HOST_ANTISPAM }};
set $webmail {{ HOST_WEBMAIL }};
set $webdav {{ HOST_WEBDAV }};
set $admin admin;
set $antispam antispam:11334;
set $webmail webmail;
set $webdav webdav:5232;
# Always listen over HTTP
listen 80;
@@ -50,61 +40,45 @@ http {
# Only enable HTTPS if TLS is enabled with no error
{% if TLS and not TLS_ERROR %}
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 443 ssl;
listen [::]:443 ssl;
include /etc/nginx/tls.conf;
ssl_session_cache shared:SSLHTTP:50m;
add_header Strict-Transport-Security 'max-age=31536000';
add_header Strict-Transport-Security max-age=15768000;
{% if not TLS_FLAVOR in [ 'mail', 'mail-letsencrypt' ] %}
if ($proxy_x_forwarded_proto = http) {
{% if not TLS_FLAVOR == "mail" %}
if ($scheme = http) {
return 301 https://$host$request_uri;
}
{% endif %}
{% endif %}
add_header X-Frame-Options 'SAMEORIGIN';
add_header X-Content-Type-Options 'nosniff';
add_header X-Permitted-Cross-Domain-Policies 'none';
add_header X-XSS-Protection '1; mode=block';
add_header Referrer-Policy 'same-origin';
# In any case, enable the proxy for certbot if the flavor is letsencrypt
{% if TLS_FLAVOR in [ 'letsencrypt', 'mail-letsencrypt' ] %}
{% if TLS_FLAVOR == 'letsencrypt' %}
location ^~ /.well-known/acme-challenge/ {
proxy_pass http://127.0.0.1:8008;
}
{% endif %}
# If TLS is failing, prevent access to anything except certbot
{% if TLS_ERROR and not TLS_FLAVOR == "mail" %}
{% if TLS_ERROR %}
location / {
return 403;
}
{% else %}
include /overrides/*.conf;
# Actual logic
{% if WEB_WEBMAIL != '/' %}
location / {
{% if WEBROOT_REDIRECT %}
return 301 {{ WEBROOT_REDIRECT }};
{% else %}
return 404;
{% endif %}
}
{% endif %}
{% if WEBMAIL != 'none' %}
location / {
return 301 {{ WEB_WEBMAIL }};
}
location {{ WEB_WEBMAIL }} {
{% if WEB_WEBMAIL != '/' %}
rewrite ^({{ WEB_WEBMAIL }})$ $1/ permanent;
rewrite ^{{ WEB_WEBMAIL }}/(.*) /$1 break;
{% endif %}
include /etc/nginx/proxy.conf;
client_max_body_size {{ MESSAGE_SIZE_LIMIT|int + 8388608 }};
client_max_body_size 30M;
proxy_pass http://$webmail;
}
{% endif %}
@@ -156,17 +130,12 @@ http {
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
location /health {
return 204;
}
}
{% endif %}
# Forwarding authentication server
server {
# Variables for proxifying
set $admin {{ HOST_ADMIN }};
set $admin admin;
listen 127.0.0.1:8000;
@@ -180,7 +149,6 @@ mail {
server_name {{ HOSTNAMES.split(",")[0] }};
auth_http http://127.0.0.1:8000/auth/email;
proxy_pass_error_message on;
resolver {{ RESOLVER }} valid=30s;
{% if TLS and not TLS_ERROR %}
include /etc/nginx/tls.conf;
@@ -251,7 +219,7 @@ mail {
listen 465 ssl;
listen [::]:465 ssl;
protocol smtp;
smtp_auth plain login;
smtp_auth plain;
}
server {

View File

@@ -1,5 +1,5 @@
# Default proxy setup
proxy_set_header Host $http_host;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;

View File

@@ -2,7 +2,6 @@ ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_tickets off;
ssl_certificate {{ TLS[0] }};
ssl_certificate_key {{ TLS[1] }};
ssl_dhparam /conf/dhparam.pem;

View File

@@ -12,25 +12,13 @@ with open("/etc/resolv.conf") as handle:
content = handle.read().split()
args["RESOLVER"] = content[content.index("nameserver") + 1]
if "HOST_WEBMAIL" not in args:
args["HOST_WEBMAIL"] = "webmail"
if "HOST_ADMIN" not in args:
args["HOST_ADMIN"] = "admin"
if "HOST_WEBDAV" not in args:
args["HOST_WEBDAV"] = "webdav:5232"
if "HOST_ANTISPAM" not in args:
args["HOST_ANTISPAM"] = "antispam:11334"
# TLS configuration
cert_name = os.getenv("TLS_CERT_FILENAME", default="cert.pem")
keypair_name = os.getenv("TLS_KEYPAIR_FILENAME", default="key.pem")
args["TLS"] = {
"cert": ("/certs/%s" % cert_name, "/certs/%s" % keypair_name),
"cert": ("/certs/cert.pem", "/certs/key.pem"),
"mail": ("/certs/cert.pem", "/certs/key.pem"),
"letsencrypt": ("/certs/letsencrypt/live/mailu/fullchain.pem",
"/certs/letsencrypt/live/mailu/privkey.pem"),
"mail": ("/certs/%s" % cert_name, "/certs/%s" % keypair_name),
"mail-letsencrypt": ("/certs/letsencrypt/live/mailu/fullchain.pem",
"/certs/letsencrypt/live/mailu/privkey.pem"),
"notls": None
}[args["TLS_FLAVOR"]]
@@ -38,6 +26,7 @@ if args["TLS"] and not all(os.path.exists(file_path) for file_path in args["TLS"
print("Missing cert or key file, disabling TLS")
args["TLS_ERROR"] = "yes"
# Build final configuration paths
convert("/conf/tls.conf", "/etc/nginx/tls.conf", args)
convert("/conf/proxy.conf", "/etc/nginx/proxy.conf", args)

View File

@@ -7,10 +7,8 @@ import subprocess
if os.path.exists("/var/run/nginx.pid"):
os.remove("/var/run/nginx.pid")
if os.environ["TLS_FLAVOR"] in [ "letsencrypt","mail-letsencrypt" ]:
if os.environ["TLS_FLAVOR"] == "letsencrypt":
subprocess.Popen(["/letsencrypt.py"])
elif os.environ["TLS_FLAVOR"] in [ "mail", "cert" ]:
subprocess.Popen(["/certwatcher.py"])
subprocess.call(["/config.py"])
os.execv("/usr/sbin/nginx", ["nginx", "-g", "daemon off;"])

Some files were not shown because too many files have changed in this diff Show More