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: python:
- "3.6" - "3.6"
install: 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 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 - sudo chmod +x /usr/local/bin/docker-compose
before_script: before_script:
- docker-compose -v - docker-compose -v
- docker-compose -f tests/build.yml build - docker-compose -f tests/build.yml build
- sudo -- sh -c 'mkdir -p /mailu && cp -r tests/certs /mailu && chmod 600 /mailu/certs/*'
script: script:
# test.py, test name and timeout between start and tests. - /bin/true
- 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
deploy: deploy:
provider: script 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. 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 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 - **Standard email server**, IMAP and IMAP+, SMTP and Submission
- **Advanced email features**, aliases, domain aliases, custom routing - **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 - **User features**, aliases, auto-reply, auto-forward, fetched accounts
- **Admin features**, global admins, announcements, per-domain delegation, quotas - **Admin features**, global admins, announcements, per-domain delegation, quotas
- **Security**, enforced TLS, Letsencrypt!, outgoing DKIM, anti-virus scanner - **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 FROM python:3-alpine3.13
# python3 shared with most images
RUN apk add --no-cache \
python3 py3-pip \
&& pip3 install --upgrade pip
# Image specific layers under this line
RUN mkdir -p /app RUN mkdir -p /app
WORKDIR /app WORKDIR /app
COPY requirements-prod.txt requirements.txt 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 \ && apk add --no-cache --virtual build-dep openssl-dev libffi-dev python3-dev build-base \
&& pip3 install -r requirements.txt \ && pip install -r requirements.txt \
&& apk del --no-cache build-dep && apk del build-dep
COPY mailu ./mailu COPY mailu ./mailu
COPY migrations ./migrations COPY migrations ./migrations
COPY start.py /start.py COPY manage.py .
COPY start.sh /start.sh
RUN pybabel compile -d mailu/translations RUN pybabel compile -d mailu/translations
EXPOSE 80/tcp CMD ["/start.sh"]
VOLUME ["/data","/dkim"]
ENV FLASK_APP mailu
CMD /start.py
HEALTHCHECK CMD curl -f -L http://localhost/ui/login?next=ui.index || exit 1

View File

@@ -1,56 +1,120 @@
import flask import flask
import flask_sqlalchemy
import flask_bootstrap 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 application
""" Create a new application based on the given configuration app = flask.Flask(__name__)
"""
app = flask.Flask(__name__)
app.cli.add_command(manage.mailu)
# Bootstrap is used for basic JS and CSS loading default_config = {
# TODO: remove this and use statically generated assets instead # Specific to the admin UI
app.bootstrap = flask_bootstrap.Bootstrap(app) '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 # Load configuration from the environment if available
config.init_app(app) for key, value in default_config.items():
models.db.init_app(app) app.config[key] = os.environ.get(key, value)
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)
# Initialize debugging tools # Base application
if app.config.get("DEBUG"): flask_bootstrap.Bootstrap(app)
debug.toolbar.init_app(app) db = flask_sqlalchemy.SQLAlchemy(app)
# TODO: add a specific configuration variable for profiling migrate = flask_migrate.Migrate(app, db)
# debug.profiler.init_app(app) limiter = flask_limiter.Limiter(app, key_func=lambda: current_user.username)
# Inject the default variables in the Jinja parser # Debugging toolbar
# TODO: move this to blueprints when needed if app.config.get("DEBUG"):
@app.context_processor import flask_debugtoolbar
def inject_defaults(): toolbar = flask_debugtoolbar.DebugToolbarExtension(app)
signup_domains = models.Domain.query.filter_by(signup_enabled=True).all()
return dict(
signup_domains=signup_domains,
config=app.config
)
# Import views # Manager commnad
from mailu import ui, internal manager = flask_script.Manager(app)
app.register_blueprint(ui.ui, url_prefix='/ui') manager.add_command('db', flask_migrate.MigrateCommand)
app.register_blueprint(internal.internal, url_prefix='/internal')
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(): # Login configuration
""" Create a new application based on the config module login_manager = flask_login.LoginManager()
""" login_manager.init_app(app)
config = configuration.ConfigManager() login_manager.login_view = "ui.login"
return create_app_from_config(config)
@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 limiter
from mailu import utils
import socket import socket
import flask import flask
internal = flask.Blueprint('internal', __name__, template_folder='templates') internal = flask.Blueprint('internal', __name__)
@internal.app_errorhandler(RateLimitExceeded) @limiter.request_filter
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
def whitelist_webmail(): def whitelist_webmail():
try: try:
return flask.request.headers["Client-Ip"] ==\ return flask.request.headers["Client-Ip"] ==\
@@ -28,4 +16,4 @@ def whitelist_webmail():
return False return False
from mailu.internal.views import * from mailu.internal import views

View File

@@ -1,7 +1,5 @@
from mailu import models from mailu import db, models
from flask import current_app as app
import re
import socket import socket
import urllib import urllib
@@ -52,7 +50,7 @@ def handle_authentication(headers):
status = False status = False
elif protocol == "pop3" and not user.enable_pop: elif protocol == "pop3" and not user.enable_pop:
status = False status = False
if status and user.enabled: if status:
return { return {
"Auth-Status": "OK", "Auth-Status": "OK",
"Auth-Server": server, "Auth-Server": server,
@@ -75,19 +73,14 @@ def get_status(protocol, status):
status, codes = STATUSES[status] status, codes = STATUSES[status]
return status, codes[protocol] 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): def get_server(protocol, authenticated=False):
if protocol == "imap": if protocol == "imap":
hostname, port = extract_host_port(app.config['HOST_IMAP'], 143) hostname, port = "imap", 143
elif protocol == "pop3": elif protocol == "pop3":
hostname, port = extract_host_port(app.config['HOST_POP3'], 110) hostname, port = "imap", 110
elif protocol == "smtp": elif protocol == "smtp":
if authenticated: hostname = "smtp"
hostname, port = extract_host_port(app.config['HOST_AUTHSMTP'], 10025) port = 10025 if authenticated else 25
else:
hostname, port = extract_host_port(app.config['HOST_SMTP'], 25)
address = socket.gethostbyname(hostname) address = socket.gethostbyname(hostname)
return address, port 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 mailu.internal import internal, nginx
from flask import current_app as app
import flask import flask
import flask_login import flask_login
import base64 import base64
import urllib
@internal.route("/auth/email") @internal.route("/auth/email")
@utils.limiter.limit( @limiter.limit(
lambda: app.config["AUTH_RATELIMIT"], app.config["AUTH_RATELIMIT"],
lambda: flask.request.headers["Client-Ip"] lambda: flask.request.headers["Client-Ip"]
) )
def nginx_authentication(): def nginx_authentication():
@@ -27,8 +27,7 @@ def admin_authentication():
""" Fails if the user is not an authenticated admin. """ Fails if the user is not an authenticated admin.
""" """
if (not flask_login.current_user.is_anonymous if (not flask_login.current_user.is_anonymous
and flask_login.current_user.global_admin and flask_login.current_user.global_admin):
and flask_login.current_user.enabled):
return "" return ""
return flask.abort(403) return flask.abort(403)
@@ -42,7 +41,7 @@ def basic_authentication():
encoded = authorization.replace("Basic ", "") encoded = authorization.replace("Basic ", "")
user_email, password = base64.b64decode(encoded).split(b":") user_email, password = base64.b64decode(encoded).split(b":")
user = models.User.query.get(user_email.decode("utf8")) 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 = flask.Response()
response.headers["X-User"] = user.email response.headers["X-User"] = user.email
return response 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 sqlalchemy.ext import declarative
from passlib import context, hash from passlib import context, hash
from datetime import datetime, date from datetime import datetime, date
from email.mime import text from email.mime import text
from flask import current_app as app
import flask_sqlalchemy
import sqlalchemy
import re import re
import time import time
import os import os
import glob import glob
import smtplib import smtplib
import idna
import dns
db = flask_sqlalchemy.SQLAlchemy() # Many-to-many association table for domain managers
managers = db.Table('manager',
db.Column('domain_name', db.String(80), db.ForeignKey('domain.name')),
class IdnaDomain(db.TypeDecorator): db.Column('user_email', db.String(255), db.ForeignKey('user.email'))
""" 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),
)
class CommaSeparatedList(db.TypeDecorator): class CommaSeparatedList(db.TypeDecorator):
@@ -72,35 +35,7 @@ class CommaSeparatedList(db.TypeDecorator):
return ",".join(value) return ",".join(value)
def process_result_value(self, value, dialect): def process_result_value(self, value, dialect):
return filter(bool, value.split(",")) if value else [] return filter(bool, value.split(","))
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'))
)
class Base(db.Model): class Base(db.Model):
@@ -119,13 +54,12 @@ class Domain(Base):
""" """
__tablename__ = "domain" __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, managers = db.relationship('User', secondary=managers,
backref=db.backref('manager_of'), lazy='dynamic') backref=db.backref('manager_of'), lazy='dynamic')
max_users = db.Column(db.Integer, nullable=False, default=0) max_users = db.Column(db.Integer, nullable=False, default=0)
max_aliases = 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) max_quota_bytes = db.Column(db.Integer(), nullable=False, default=0)
signup_enabled = db.Column(db.Boolean(), nullable=False, default=False)
@property @property
def dkim_key(self): def dkim_key(self):
@@ -158,16 +92,6 @@ class Domain(Base):
else: else:
return False 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): def __str__(self):
return self.name return self.name
@@ -185,8 +109,8 @@ class Alternative(Base):
__tablename__ = "alternative" __tablename__ = "alternative"
name = db.Column(IdnaDomain, primary_key=True, nullable=False) name = db.Column(db.String(80), primary_key=True, nullable=False)
domain_name = db.Column(IdnaDomain, db.ForeignKey(Domain.name)) domain_name = db.Column(db.String(80), db.ForeignKey(Domain.name))
domain = db.relationship(Domain, domain = db.relationship(Domain,
backref=db.backref('alternatives', cascade='all, delete-orphan')) backref=db.backref('alternatives', cascade='all, delete-orphan'))
@@ -216,62 +140,33 @@ class Email(object):
@declarative.declared_attr @declarative.declared_attr
def domain_name(cls): def domain_name(cls):
return db.Column(IdnaDomain, db.ForeignKey(Domain.name), return db.Column(db.String(80), db.ForeignKey(Domain.name),
nullable=False, default=IdnaDomain) nullable=False)
# This field is redundant with both localpart and domain name. # This field is redundant with both localpart and domain name.
# It is however very useful for quick lookups without joining tables, # 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 @declarative.declared_attr
def email(cls): def email(cls):
updater = lambda context: "{0}@{1}".format( updater = lambda context: "{0}@{1}".format(
context.current_parameters["localpart"], context.current_parameters["localpart"],
context.current_parameters["domain_name"], context.current_parameters["domain_name"],
) )
return db.Column(IdnaEmail, return db.Column(db.String(255, collation="NOCASE"),
primary_key=True, nullable=False, primary_key=True, nullable=False,
default=updater) default=updater)
def sendmail(self, subject, body): def sendmail(self, subject, body):
""" Send an email to the address. """ Send an email to the address.
""" """
from_address = "{0}@{1}".format( from_address = '{}@{}'.format(
app.config['POSTMASTER'], app.config['POSTMASTER'], app.config['DOMAIN'])
idna.encode(app.config['DOMAIN']).decode('ascii'), with smtplib.SMTP('smtp', port=10025) as smtp:
)
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'),
)
msg = text.MIMEText(body) msg = text.MIMEText(body)
msg['Subject'] = subject msg['Subject'] = subject
msg['From'] = from_address msg['From'] = from_address
msg['To'] = to_address msg['To'] = self.email
smtp.sendmail(from_address, [to_address], msg.as_string()) smtp.sendmail(from_address, [self.email], 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
def __str__(self): def __str__(self):
return self.email return self.email
@@ -286,9 +181,7 @@ class User(Base, Email):
backref=db.backref('users', cascade='all, delete-orphan')) backref=db.backref('users', cascade='all, delete-orphan'))
password = db.Column(db.String(255), nullable=False) password = db.Column(db.String(255), nullable=False)
quota_bytes = db.Column(db.Integer(), nullable=False, default=10**9) 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) global_admin = db.Column(db.Boolean(), nullable=False, default=False)
enabled = db.Column(db.Boolean(), nullable=False, default=True)
# Features # Features
enable_imap = db.Column(db.Boolean(), nullable=False, default=True) enable_imap = db.Column(db.Boolean(), nullable=False, default=True)
@@ -296,13 +189,11 @@ class User(Base, Email):
# Filters # Filters
forward_enabled = db.Column(db.Boolean(), nullable=False, default=False) 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) forward_keep = db.Column(db.Boolean(), nullable=False, default=True)
reply_enabled = db.Column(db.Boolean(), nullable=False, default=False) reply_enabled = db.Column(db.Boolean(), nullable=False, default=False)
reply_subject = db.Column(db.String(255), nullable=True, default=None) reply_subject = db.Column(db.String(255), nullable=True, default=None)
reply_body = db.Column(db.Text(), 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, reply_enddate = db.Column(db.Date, nullable=False,
default=date(2999, 12, 31)) default=date(2999, 12, 31))
@@ -319,59 +210,28 @@ class User(Base, Email):
def get_id(self): def get_id(self):
return self.email return self.email
@property scheme_dict = {'SHA512-CRYPT': "sha512_crypt",
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",
'SHA256-CRYPT': "sha256_crypt", 'SHA256-CRYPT': "sha256_crypt",
'MD5-CRYPT': "md5_crypt", 'MD5-CRYPT': "md5_crypt",
'CRYPT': "des_crypt"} 'CRYPT': "des_crypt"}
pw_context = context.CryptContext(
def get_password_context(self): schemes = scheme_dict.values(),
return context.CryptContext( default=scheme_dict[app.config['PASSWORD_SCHEME']],
schemes=self.scheme_dict.values(), )
default=self.scheme_dict[app.config['PASSWORD_SCHEME']],
)
def check_password(self, password): def check_password(self, password):
context = self.get_password_context()
reference = re.match('({[^}]+})?(.*)', self.password).group(2) reference = re.match('({[^}]+})?(.*)', self.password).group(2)
result = context.verify(password, reference) return User.pw_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
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 """Set password for user with specified encryption scheme
@password: plain text password to encrypt (if raw == True the hash itself) @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 # for the list of hash schemes see https://wiki2.dovecot.org/Authentication/PasswordSchemes
if raw: if raw:
self.password = '{'+hash_scheme+'}' + password self.password = '{'+hash_scheme+'}' + password
else: 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): def get_managed_domains(self):
if self.global_admin: if self.global_admin:
@@ -392,14 +252,12 @@ class User(Base, Email):
self.sendmail(app.config["WELCOME_SUBJECT"], self.sendmail(app.config["WELCOME_SUBJECT"],
app.config["WELCOME_BODY"]) app.config["WELCOME_BODY"])
@classmethod
def get(cls, email):
return cls.query.get(email)
@classmethod @classmethod
def login(cls, email, password): def login(cls, email, password):
user = cls.query.get(email) 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): class Alias(Base, Email):
@@ -412,22 +270,6 @@ class Alias(Base, Email):
wildcard = db.Column(db.Boolean(), nullable=False, default=False) wildcard = db.Column(db.Boolean(), nullable=False, default=False)
destination = db.Column(CommaSeparatedList, nullable=False, default=[]) 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): class Token(Base):
""" A token is an application password for a given user. """ A token is an application password for a given user.

View File

@@ -15,23 +15,21 @@ msgstr "Ungültige E-Mail-Adresse."
msgid "Confirm" msgid "Confirm"
msgstr "Bestätigen" 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" msgid "E-mail"
msgstr "E-Mail" msgstr "E-Mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "Passwort" msgstr "Passwort"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "Anmelden" msgstr "Anmelden"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "Domain-Name" msgstr "Domain-Name"
@@ -44,45 +42,44 @@ msgstr "Maximale Anzahl Benutzer"
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "Maximale Anzahl Aliase" msgstr "Maximale Anzahl Aliase"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "Erstellen" 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" msgid "Confirm password"
msgstr "Passwort bestätigen" msgstr "Passwort bestätigen"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "Quota" msgstr "Quota"
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Zugriff via IMAP erlauben" msgstr "Zugriff via IMAP erlauben"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Zugriff via POP3 erlauben" msgstr "Zugriff via POP3 erlauben"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "Angezeigter Name" msgstr "Angezeigter Name"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Spamfilter aktivieren" msgstr "Spamfilter aktivieren"
@@ -90,82 +87,80 @@ msgstr "Spamfilter aktivieren"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "Schwellenwert für Spamfilter" msgstr "Schwellenwert für Spamfilter"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "Einstellungen speichern" msgstr "Einstellungen speichern"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "Passwort wiederholen" 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" msgid "Update password"
msgstr "Passwort aktualisieren" msgstr "Passwort aktualisieren"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Weiterleitung aktivieren" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "Ziel" msgstr "Ziel"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "Aktualisieren" msgstr "Aktualisieren"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Automatische Antwort aktivieren" msgstr "Automatische Antwort aktivieren"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "Betreff" msgstr "Betreff"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "Text" msgstr "Text"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "SQL LIKE Syntax nutzen (z.B. für Catch-All-Aliase)" msgstr "SQL LIKE Syntax nutzen (z.B. für Catch-All-Aliase)"
#: mailu/ui/forms.py:145 #: mailu/ui/forms.py:129
msgid "Admin email" msgid "Admin email"
msgstr "Administrator E-Mail" 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" msgid "Submit"
msgstr "Absenden" msgstr "Absenden"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "Manager E-Mail" msgstr "Manager E-Mail"
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "Protokoll" msgstr "Protokoll"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Hostname oder IP" msgstr "Hostname oder IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "Port" msgstr "Port"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Verschlüsselung aktivieren" msgstr "Verschlüsselung aktivieren"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "Benutzername" msgstr "Benutzername"
@@ -193,6 +188,34 @@ msgstr "Konto"
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "für administrativen Zugriff" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "Mein Konto" msgstr "Mein Konto"
@@ -201,28 +224,28 @@ msgstr "Mein Konto"
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" 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" msgid "Auto-forward"
msgstr "Auto-Weiterleitung" 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" msgid "Auto-reply"
msgstr "Auto-Antwort" msgstr "Auto-Antwort"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "Abgerufene Konten" msgstr "Abgerufene Konten"
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "Abmelden" msgstr "Abmelden"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "Administration" msgstr "Administration"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "Administratoren" msgstr "Administratoren"
@@ -230,7 +253,7 @@ msgstr "Administratoren"
msgid "Mail domains" msgid "Mail domains"
msgstr "E-Mail-Domains" msgstr "E-Mail-Domains"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "Hilfe" msgstr "Hilfe"
@@ -318,27 +341,27 @@ msgstr "Neue Domain"
msgid "Domain details" msgid "Domain details"
msgstr "Domain-Details" msgstr "Domain-Details"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "Schlüssel neu erzeugen" msgstr "Schlüssel neu erzeugen"
#: mailu/ui/templates/domain/details.html:31 #: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "DNS MX Eintrag" msgstr "DNS MX Eintrag"
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "DNS SPF Einträge" msgstr "DNS SPF Einträge"
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "DKIM öffentlicher Schlüssel" msgstr "DKIM öffentlicher Schlüssel"
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "DNS DKIM Eintrag" msgstr "DNS DKIM Eintrag"
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "DNS DMARC Eintrag" msgstr "DNS DMARC Eintrag"
@@ -410,15 +433,15 @@ msgstr "Manager"
msgid "Add manager" msgid "Add manager"
msgstr "Manager hinzufügen" msgstr "Manager hinzufügen"
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Betreff" msgstr "Betreff"
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "Text" msgstr "Text"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "Absenden" msgstr "Absenden"
@@ -430,7 +453,7 @@ msgstr "Öffentliche Bekanntmachung"
msgid "from" msgid "from"
msgstr "von" msgstr "von"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "Bekanntmachung" msgstr "Bekanntmachung"
@@ -474,11 +497,11 @@ msgstr "Automatische Antwort"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Maximale Quota pro Benutzer" msgstr "Maximale Quota pro Benutzer"
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Kopie der E-Mails behalten" msgstr "Kopie der E-Mails behalten"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "E-Mails auf dem Server belassen" msgstr "E-Mails auf dem Server belassen"
@@ -494,19 +517,19 @@ msgstr "ja"
msgid "no" msgid "no"
msgstr "nein" msgstr "nein"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "Alternativer Name" msgstr "Alternativer Name"
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "Relay-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" msgid "Remote host"
msgstr "Entfernter Host" msgstr "Entfernter Host"
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Relay-Domains" msgstr "Relay-Domains"
@@ -546,15 +569,15 @@ msgstr "Relay-Domains"
msgid "New relayed domain" msgid "New relayed domain"
msgstr "Neue Relay-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)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Token (bitte speichern, da er hier nach nicht mehr angezeigt wird)" msgstr "Token (bitte speichern, da er hier nach nicht mehr angezeigt wird)"
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20 #: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP" msgid "Authorized IP"
msgstr "Authorisierte IP-Adresse" 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" msgid "Authentication tokens"
msgstr "Authentifizierungs-Tokens" msgstr "Authentifizierungs-Tokens"
@@ -566,7 +589,7 @@ msgstr "Wechseln zu"
msgid "Webmail" msgid "Webmail"
msgstr "Webmail" msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "Website" msgstr "Website"
@@ -582,7 +605,7 @@ msgstr "Neuer Token"
msgid "General" msgid "General"
msgstr "Allgemein" msgstr "Allgemein"
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "Funktionen und Quotas" msgstr "Funktionen und Quotas"
@@ -590,85 +613,11 @@ msgstr "Funktionen und Quotas"
msgid "General settings" msgid "General settings"
msgstr "Allgemeine Einstellungen" 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" msgid "Antispam"
msgstr "Antispam" msgstr "Antispam"
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "Spamfilter-Grenzwert" 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 "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 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" "PO-Revision-Date: 2016-10-02 15:02+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n" "Language: en\n"
@@ -16,7 +16,7 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.5.3\n" "Generated-By: Babel 2.5.1\n"
#: mailu/ui/forms.py:32 #: mailu/ui/forms.py:32
msgid "Invalid email address." msgid "Invalid email address."
@@ -26,23 +26,21 @@ msgstr ""
msgid "Confirm" msgid "Confirm"
msgstr "" msgstr ""
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77 #: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "" msgstr ""
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "" msgstr ""
@@ -59,198 +57,165 @@ msgstr ""
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:50 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
msgid "Enable sign-up" #: mailu/ui/forms.py:112 mailu/ui/forms.py:124
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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "" msgstr ""
#: mailu/ui/forms.py:57 #: mailu/ui/forms.py:55
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
msgid "Alternative name" msgid "Alternative name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "" 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" msgid "Remote host"
msgstr "" msgstr ""
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:69
#: mailu/ui/templates/user/signup_domain.html:16 msgid "Confirm password"
msgstr ""
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota" msgid "Quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "" msgstr ""
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "" msgstr ""
#: mailu/ui/forms.py:84 #: mailu/ui/forms.py:74
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:85
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: mailu/ui/forms.py:89 #: mailu/ui/forms.py:78
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
msgid "Displayed name" msgid "Displayed name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "" msgstr ""
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "" 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" msgid "Enable forwarding"
msgstr "" msgstr ""
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "" msgstr ""
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
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
msgid "Update" msgid "Update"
msgstr "" 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)" 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" msgid "Authorized IP"
msgstr "" msgstr ""
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "" msgstr ""
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:145 #: mailu/ui/forms.py:129
msgid "Admin email" msgid "Admin email"
msgstr "" 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" msgid "Submit"
msgstr "" msgstr ""
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "" msgstr ""
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "" msgstr ""
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "" msgstr ""
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "" msgstr ""
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "" msgstr ""
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "" msgstr ""
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "" msgstr ""
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "" msgstr ""
@@ -258,16 +223,8 @@ msgstr ""
msgid "Public announcement" msgid "Public announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82 #: mailu/ui/templates/announcement.html:8
msgid "Client setup" msgid "from"
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 "" msgstr ""
#: mailu/ui/templates/confirm.html:4 #: mailu/ui/templates/confirm.html:4
@@ -291,6 +248,34 @@ msgstr ""
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "" msgstr ""
@@ -300,38 +285,38 @@ msgid "Settings"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35 #: 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" msgid "Auto-reply"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "" 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" msgid "Authentication tokens"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
msgid "Antispam"
msgstr ""
#: mailu/ui/templates/sidebar.html:66 #: mailu/ui/templates/sidebar.html:66
msgid "Mail domains" msgid "Mail domains"
msgstr "" msgstr ""
@@ -344,19 +329,15 @@ msgstr ""
msgid "Webmail" msgid "Webmail"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98 #: mailu/ui/templates/sidebar.html:93
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/sidebar.html:105
msgid "Sign out" msgid "Sign out"
msgstr "" msgstr ""
@@ -460,31 +441,27 @@ msgstr ""
msgid "Domain details" msgid "Domain details"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:17 #: mailu/ui/templates/domain/details.html:25
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/details.html:31
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "" msgstr ""
@@ -528,23 +505,6 @@ msgstr ""
msgid "Alternatives" msgid "Alternatives"
msgstr "" 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 #: mailu/ui/templates/fetch/create.html:4
msgid "Add a fetched account" msgid "Add a fetched account"
msgstr "" msgstr ""
@@ -621,7 +581,7 @@ msgstr ""
msgid "General" msgid "General"
msgstr "" msgstr ""
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "" msgstr ""
@@ -657,20 +617,12 @@ msgstr ""
msgid "Automatic reply" msgid "Automatic reply"
msgstr "" msgstr ""
#: mailu/ui/templates/user/settings.html:22 #: mailu/ui/templates/user/settings.html:14
msgid "Auto-forward" msgid "General settings"
msgstr "" msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8 #: mailu/ui/templates/user/settings.html:18
msgid "pick a domain for the new account" msgid "Antispam"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr "" msgstr ""
#~ msgid "Your account" #~ msgid "Your account"
@@ -679,9 +631,3 @@ msgstr ""
#~ msgid "Spam filter threshold" #~ msgid "Spam filter threshold"
#~ msgstr "" #~ 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" msgid "Confirm"
msgstr "Confirmer" 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" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "Mot de passe" msgstr "Mot de passe"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "Se connecter" msgstr "Se connecter"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "Nom de domaine" msgstr "Nom de domaine"
@@ -44,45 +42,44 @@ msgstr "Nombre maximum d'utilisateurs"
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "Nombre maximum d'alias" msgstr "Nombre maximum d'alias"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "Commentaire" msgstr "Commentaire"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "Créer" 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" msgid "Confirm password"
msgstr "Confirmer le mot de passe" msgstr "Confirmer le mot de passe"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "Quota" msgstr "Quota"
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Autoriser l'accès IMAP" msgstr "Autoriser l'accès IMAP"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Autoriser l'accès POP3" msgstr "Autoriser l'accès POP3"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "Enregistrer" msgstr "Enregistrer"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "Nom affiché" msgstr "Nom affiché"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Activer le filtre anti-spam" msgstr "Activer le filtre anti-spam"
@@ -90,82 +87,80 @@ msgstr "Activer le filtre anti-spam"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "Seuil du filtre anti-spam" msgstr "Seuil du filtre anti-spam"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "Enregistrer les préférences" msgstr "Enregistrer les préférences"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "Vérifier le mot de passe" 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" msgid "Update password"
msgstr "Changer de mot de passe" msgstr "Changer de mot de passe"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Activer la redirection" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "Destination" msgstr "Destination"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "Mettre à jour" msgstr "Mettre à jour"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Activer les réponses automatique" msgstr "Activer les réponses automatique"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "Sujet du message" msgstr "Sujet du message"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "Corps de la réponse" msgstr "Corps de la réponse"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Utiliser la syntaxe SQL LIKE (par exemple pour les alias catch-all)" 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" msgid "Admin email"
msgstr "Email de l'administrateur" 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" msgid "Submit"
msgstr "Valider" msgstr "Valider"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "E-mail du gérant" msgstr "E-mail du gérant"
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "Protocole" msgstr "Protocole"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Nom d'hôte ou adresse IP" msgstr "Nom d'hôte ou adresse IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "Port TCP" msgstr "Port TCP"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Activer TLS" msgstr "Activer TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "Nom d'utilisateur" msgstr "Nom d'utilisateur"
@@ -193,6 +188,34 @@ msgstr "Votre compte"
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "pour accéder aux outils d'administration" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "Mon compte" msgstr "Mon compte"
@@ -201,28 +224,28 @@ msgstr "Mon compte"
msgid "Settings" msgid "Settings"
msgstr "Préférences" 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" msgid "Auto-forward"
msgstr "Redirection" 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" msgid "Auto-reply"
msgstr "Réponse automatique" msgstr "Réponse automatique"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "Comptes externes" msgstr "Comptes externes"
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "Déconnexion" msgstr "Déconnexion"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "Administration" msgstr "Administration"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "Administrateurs" msgstr "Administrateurs"
@@ -230,7 +253,7 @@ msgstr "Administrateurs"
msgid "Mail domains" msgid "Mail domains"
msgstr "Domaines" msgstr "Domaines"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "Aide" msgstr "Aide"
@@ -318,27 +341,27 @@ msgstr "Nouveau domaine"
msgid "Domain details" msgid "Domain details"
msgstr "Détails du domaine" msgstr "Détails du domaine"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "Regénérer les clés" 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" msgid "DNS MX entry"
msgstr "Entrée DNS MX" msgstr "Entrée DNS MX"
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "Entrées DNS SPF" msgstr "Entrées DNS SPF"
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "Clé publique DKIM" msgstr "Clé publique DKIM"
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "Entrée DNS DKIM" msgstr "Entrée DNS DKIM"
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "Entrée DNS DMARC" msgstr "Entrée DNS DMARC"
@@ -410,15 +433,15 @@ msgstr "Liste des gérants"
msgid "Add manager" msgid "Add manager"
msgstr "Ajouter le gérant" msgstr "Ajouter le gérant"
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Sujet de l'annonce" msgstr "Sujet de l'annonce"
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "Corps de l'annonce" msgstr "Corps de l'annonce"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "Envoyer" msgstr "Envoyer"
@@ -430,7 +453,7 @@ msgstr "Annonce globale"
msgid "from" msgid "from"
msgstr "de" msgstr "de"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "Annonce" msgstr "Annonce"
@@ -474,11 +497,11 @@ msgstr "Réponse automatique"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Quota maximum par utilisateur" msgstr "Quota maximum par utilisateur"
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Conserver une copie des messages" msgstr "Conserver une copie des messages"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "Conserver les messages sur le serveur" msgstr "Conserver les messages sur le serveur"
@@ -494,19 +517,19 @@ msgstr "oui"
msgid "no" msgid "no"
msgstr "non" msgstr "non"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "Nom alternatif" msgstr "Nom alternatif"
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "Nom du domaine relayé" 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" msgid "Remote host"
msgstr "Hôte distant" msgstr "Hôte distant"
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Domaines relayé" msgstr "Domaines relayé"
@@ -546,15 +569,15 @@ msgstr "Liste des domaines relayés"
msgid "New relayed domain" msgid "New relayed domain"
msgstr "Nouveau domaine relayé" 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)" 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)" 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" msgid "Authorized IP"
msgstr "Adresse IP autorisée" 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" msgid "Authentication tokens"
msgstr "Jetons d'authentification" msgstr "Jetons d'authentification"
@@ -566,7 +589,7 @@ msgstr "Navigation"
msgid "Webmail" msgid "Webmail"
msgstr "Webmail" msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "Site web" msgstr "Site web"
@@ -582,7 +605,7 @@ msgstr "Nouveau jeton"
msgid "General" msgid "General"
msgstr "Général" msgstr "Général"
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "Fonctionnalités et quotas" msgstr "Fonctionnalités et quotas"
@@ -590,85 +613,11 @@ msgstr "Fonctionnalités et quotas"
msgid "General settings" msgid "General settings"
msgstr "Général" 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" msgid "Antispam"
msgstr "Antispam" msgstr "Antispam"
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "Tolérance du filtre antispam" 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" msgid "Confirm"
msgstr "Conferma" 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" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "Password" msgstr "Password"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "Entra" msgstr "Entra"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "Nome dominio" msgstr "Nome dominio"
@@ -44,45 +42,44 @@ msgstr ""
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "" msgstr ""
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "Crea" 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" msgid "Confirm password"
msgstr "Conferma pasword" msgstr "Conferma pasword"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "Quota" msgstr "Quota"
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Consenti accesso IMAP" msgstr "Consenti accesso IMAP"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Consenti accesso POP3" msgstr "Consenti accesso POP3"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "Salva" msgstr "Salva"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "Nome visualizzato" msgstr "Nome visualizzato"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Abilita filtro antispam" msgstr "Abilita filtro antispam"
@@ -90,82 +87,80 @@ msgstr "Abilita filtro antispam"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "Soglia del filtro antispam" msgstr "Soglia del filtro antispam"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "Salva impostazioni" msgstr "Salva impostazioni"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "" 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" msgid "Update password"
msgstr "Aggiorna password" msgstr "Aggiorna password"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Abilita inoltro" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "Destinazione" msgstr "Destinazione"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "Aggiorna" msgstr "Aggiorna"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Abilita risposta automatica" msgstr "Abilita risposta automatica"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "Soggetto risposta" msgstr "Soggetto risposta"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "Corpo risposta" msgstr "Corpo risposta"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Usa sintassi SQL LIKE (es. per alias catch-all)" msgstr "Usa sintassi SQL LIKE (es. per alias catch-all)"
#: mailu/ui/forms.py:145 #: mailu/ui/forms.py:129
msgid "Admin email" msgid "Admin email"
msgstr "Email amministratore" 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" msgid "Submit"
msgstr "Invia" msgstr "Invia"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "Email manager" msgstr "Email manager"
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "Protocollo" msgstr "Protocollo"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Hostname o IP" msgstr "Hostname o IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "Porta TCP" msgstr "Porta TCP"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Abilita TLS" msgstr "Abilita TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "Username" msgstr "Username"
@@ -194,6 +189,34 @@ msgstr "Il tuo account"
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "Il mio account" msgstr "Il mio account"
@@ -202,28 +225,28 @@ msgstr "Il mio account"
msgid "Settings" msgid "Settings"
msgstr "Impostazioni" 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" msgid "Auto-forward"
msgstr "Auto-inoltro" 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" msgid "Auto-reply"
msgstr "Auto-risponditore" msgstr "Auto-risponditore"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "Esci" msgstr "Esci"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "Amministrazione" msgstr "Amministrazione"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "Amministratori" msgstr "Amministratori"
@@ -231,7 +254,7 @@ msgstr "Amministratori"
msgid "Mail domains" msgid "Mail domains"
msgstr "Domini mail" msgstr "Domini mail"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "Aiuto" msgstr "Aiuto"
@@ -319,27 +342,27 @@ msgstr "Nuovo dominio"
msgid "Domain details" msgid "Domain details"
msgstr "Dettagli dominio" msgstr "Dettagli dominio"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "Rigenera chiavi" msgstr "Rigenera chiavi"
#: mailu/ui/templates/domain/details.html:31 #: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "" msgstr ""
@@ -411,15 +434,15 @@ msgstr ""
msgid "Add manager" msgid "Add manager"
msgstr "Aggiungi manager" msgstr "Aggiungi manager"
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "" msgstr ""
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "Corpo dell'annuncio" msgstr "Corpo dell'annuncio"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "Invia" msgstr "Invia"
@@ -431,7 +454,7 @@ msgstr "Annuncio pubblico"
msgid "from" msgid "from"
msgstr "da" msgstr "da"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "Annuncio" msgstr "Annuncio"
@@ -475,11 +498,11 @@ msgstr "Risposta automatica"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Conserva una copia delle email" msgstr "Conserva una copia delle email"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "Conserva email sul server" msgstr "Conserva email sul server"
@@ -495,19 +518,19 @@ msgstr "si"
msgid "no" msgid "no"
msgstr "no" msgstr "no"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "Nome alternativo" msgstr "Nome alternativo"
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "" 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" msgid "Remote host"
msgstr "Host remoto" msgstr "Host remoto"
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "" msgstr ""
@@ -547,15 +570,15 @@ msgstr ""
msgid "New relayed domain" msgid "New relayed domain"
msgstr "" msgstr ""
#: mailu/ui/forms.py:125 #: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20 #: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP" msgid "Authorized IP"
msgstr "IP Autorizzato" 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" msgid "Authentication tokens"
msgstr "Token di autenticazione" msgstr "Token di autenticazione"
@@ -567,7 +590,7 @@ msgstr "Vai a"
msgid "Webmail" msgid "Webmail"
msgstr "Webmail" msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "Sito web" msgstr "Sito web"
@@ -583,7 +606,7 @@ msgstr "Nuovo token"
msgid "General" msgid "General"
msgstr "Generale" msgstr "Generale"
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "Funzionalità e quota" msgstr "Funzionalità e quota"
@@ -591,85 +614,11 @@ msgstr "Funzionalità e quota"
msgid "General settings" msgid "General settings"
msgstr "Impostazioni generali" 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" msgid "Antispam"
msgstr "Antispam" msgstr "Antispam"
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "Tolleranza filtro spam" 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" msgid "Confirm"
msgstr "Bevestigen" 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" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "Wachtwoord" msgstr "Wachtwoord"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "Aanmelden" msgstr "Aanmelden"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "Domeinnaam" msgstr "Domeinnaam"
@@ -44,45 +42,44 @@ msgstr "Maximaal aantal gebruikers"
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "Maximaal aantal aliasen" msgstr "Maximaal aantal aliasen"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "Opmerking" msgstr "Opmerking"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "Aanmaken" 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" msgid "Confirm password"
msgstr "Bevestig wachtwoord" msgstr "Bevestig wachtwoord"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "Quotum" msgstr "Quotum"
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "IMAP toestaan" msgstr "IMAP toestaan"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "POP3 toestaan" msgstr "POP3 toestaan"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "Opslaan" msgstr "Opslaan"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "Getoonde naam" msgstr "Getoonde naam"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Spamfilter inschakelen" msgstr "Spamfilter inschakelen"
@@ -90,82 +87,80 @@ msgstr "Spamfilter inschakelen"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "Spamfilter drempel" msgstr "Spamfilter drempel"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "Instellingen opslaan" msgstr "Instellingen opslaan"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "Wachtwoord controle" 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" msgid "Update password"
msgstr "Wachtwoord veranderen" msgstr "Wachtwoord veranderen"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Doorsturen inschakelen" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "Bestemming" msgstr "Bestemming"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "Bijwerken" msgstr "Bijwerken"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Automatisch antwoord inschakelen" msgstr "Automatisch antwoord inschakelen"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "Antwoord onderwerp" msgstr "Antwoord onderwerp"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "Antwoord bericht" msgstr "Antwoord bericht"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Gebruik SQL LIKE syntax (bijv. voor alles-afvangen aliasen)" msgstr "Gebruik SQL LIKE syntax (bijv. voor alles-afvangen aliasen)"
#: mailu/ui/forms.py:145 #: mailu/ui/forms.py:129
msgid "Admin email" msgid "Admin email"
msgstr "Beheerder e-mail" 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" msgid "Submit"
msgstr "Verzenden" msgstr "Verzenden"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "Manager e-mail" msgstr "Manager e-mail"
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "Protocol" msgstr "Protocol"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Hostnaam of IP" msgstr "Hostnaam of IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "TCP poort" msgstr "TCP poort"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "TLS inschakelen" msgstr "TLS inschakelen"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "Gebruikersnaam" msgstr "Gebruikersnaam"
@@ -183,7 +178,7 @@ msgstr "Docker foutmelding"
#: mailu/ui/templates/docker-error.html:12 #: mailu/ui/templates/docker-error.html:12
msgid "An error occurred while talking to the Docker server." 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 #: mailu/admin/templates/login.html:6
msgid "Your account" msgid "Your account"
@@ -191,7 +186,35 @@ msgstr "Uw account"
#: mailu/ui/templates/login.html:8 #: mailu/ui/templates/login.html:8
msgid "to access the administration tools" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
@@ -201,28 +224,28 @@ msgstr "Mijn account"
msgid "Settings" msgid "Settings"
msgstr "Instellingen" 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" msgid "Auto-forward"
msgstr "Automatisch doorsturen" 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" msgid "Auto-reply"
msgstr "Automatisch antwoorden" msgstr "Automatisch antwoorden"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "Opgehaalde accounts" msgstr "Opgehaalde accounts"
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "Afmelden" msgstr "Afmelden"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "Beheer" msgstr "Beheer"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "Beheerders" msgstr "Beheerders"
@@ -230,7 +253,7 @@ msgstr "Beheerders"
msgid "Mail domains" msgid "Mail domains"
msgstr "E-mail domeinen" msgstr "E-mail domeinen"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "Help" msgstr "Help"
@@ -318,29 +341,29 @@ msgstr "Nieuw domein"
msgid "Domain details" msgid "Domain details"
msgstr "Domein details" msgstr "Domein details"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "Hergenereer sleutels" msgstr "Hergenereer sleutels"
#: mailu/ui/templates/domain/details.html:31 #: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry" 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" 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" msgid "DKIM public key"
msgstr "DKIM publieke sleutel" msgstr "DKIM publieke sleutel"
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" 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" msgid "DNS DMARC entry"
msgstr "DNS DMARC-record" msgstr ""
#: mailu/ui/templates/domain/edit.html:4 #: mailu/ui/templates/domain/edit.html:4
msgid "Edit domain" msgid "Edit domain"
@@ -392,7 +415,7 @@ msgstr "Account toevoegen"
#: mailu/ui/templates/fetch/list.html:19 #: mailu/ui/templates/fetch/list.html:19
msgid "Endpoint" msgid "Endpoint"
msgstr "Endpoint" msgstr ""
#: mailu/ui/templates/fetch/list.html:22 #: mailu/ui/templates/fetch/list.html:22
msgid "Last check" msgid "Last check"
@@ -410,15 +433,15 @@ msgstr "Manager overzicht"
msgid "Add manager" msgid "Add manager"
msgstr "Manager toevoegen" msgstr "Manager toevoegen"
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Mededeling onderwerp" msgstr "Mededeling onderwerp"
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "Mededeling bericht" msgstr "Mededeling bericht"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "Versturen" msgstr "Versturen"
@@ -430,7 +453,7 @@ msgstr "Publieke mededeling"
msgid "from" msgid "from"
msgstr "van" msgstr "van"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "Mededeling" msgstr "Mededeling"
@@ -444,7 +467,7 @@ msgstr "Gebruiker aanpassen"
#: mailu/ui/templates/user/forward.html:4 #: mailu/ui/templates/user/forward.html:4
msgid "Forward emails" msgid "Forward emails"
msgstr "E-mails doorsturen" msgstr ""
#: mailu/ui/templates/user/list.html:4 #: mailu/ui/templates/user/list.html:4
msgid "User list" msgid "User list"
@@ -474,11 +497,11 @@ msgstr "Automatisch antwoord"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Maximum quotum gebruikers" msgstr "Maximum quotum gebruikers"
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Behoud een kopie van de e-mails" msgstr "Behoud een kopie van de e-mails"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "Behoud de e-mails op de server" msgstr "Behoud de e-mails op de server"
@@ -494,21 +517,21 @@ msgstr "ja"
msgid "no" msgid "no"
msgstr "nee" msgstr "nee"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "Alternatieve naam" msgstr "Alternatieve naam"
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" 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" msgid "Remote host"
msgstr "Externe host" msgstr ""
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Relayed domainen" msgstr ""
#: mailu/ui/templates/alternative/create.html:4 #: mailu/ui/templates/alternative/create.html:4
msgid "Create alternative domain" msgid "Create alternative domain"
@@ -532,143 +555,69 @@ msgstr "Alternatieven"
#: mailu/ui/templates/relay/create.html:4 #: mailu/ui/templates/relay/create.html:4
msgid "New relay domain" msgid "New relay domain"
msgstr "Nieuw relay domein" msgstr ""
#: mailu/ui/templates/relay/edit.html:4 #: mailu/ui/templates/relay/edit.html:4
msgid "Edit relayd domain" msgid "Edit relayd domain"
msgstr "Bewerk relay domein" msgstr ""
#: mailu/ui/templates/relay/list.html:4 #: mailu/ui/templates/relay/list.html:4
msgid "Relayed domain list" msgid "Relayed domain list"
msgstr "Overzicht relayed domeinen" msgstr ""
#: mailu/ui/templates/relay/list.html:9 #: mailu/ui/templates/relay/list.html:9
msgid "New relayed domain" 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)" 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" 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" msgid "Authentication tokens"
msgstr "Authenticatie tokens" msgstr ""
#: mailu/ui/templates/sidebar.html:72 #: mailu/ui/templates/sidebar.html:72
msgid "Go to" msgid "Go to"
msgstr "Ga naar" msgstr ""
#: mailu/ui/templates/sidebar.html:76 #: mailu/ui/templates/sidebar.html:76
msgid "Webmail" msgid "Webmail"
msgstr "Webmail" msgstr ""
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "Website" msgstr ""
#: mailu/ui/templates/token/create.html:4 #: mailu/ui/templates/token/create.html:4
msgid "Create an authentication token" msgid "Create an authentication token"
msgstr "Authenticatie token aanmaken" msgstr ""
#: mailu/ui/templates/token/list.html:12 #: mailu/ui/templates/token/list.html:12
msgid "New token" msgid "New token"
msgstr "Nieuw token" msgstr ""
#: mailu/ui/templates/user/create.html:15 #: mailu/ui/templates/user/create.html:15
msgid "General" msgid "General"
msgstr "Algemeen" msgstr ""
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "Functionaliteiten en quota" msgstr ""
#: mailu/ui/templates/user/settings.html:14 #: mailu/ui/templates/user/settings.html:14
msgid "General settings" 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" msgid "Antispam"
msgstr "Anti-spam" msgstr ""
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" 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 "" msgstr ""

View File

@@ -15,23 +15,21 @@ msgstr "Nieprawidłowy adres e-mail."
msgid "Confirm" msgid "Confirm"
msgstr "Zatwierdź" 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" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "Hasło" msgstr "Hasło"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "Zaloguj" msgstr "Zaloguj"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "Nazwa domeny" msgstr "Nazwa domeny"
@@ -45,45 +43,44 @@ msgid "Maximum alias count"
msgstr "Maksymalna liczba aliasów" msgstr "Maksymalna liczba aliasów"
#. Needs more context - is that a verb or a noun? #. 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:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "Komentarz" msgstr "Komentarz"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "Utwórz" 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" msgid "Confirm password"
msgstr "Potwierdź hasło" msgstr "Potwierdź hasło"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Zezwalaj na dostęp przez protokół IMAP" msgstr "Zezwalaj na dostęp przez protokół IMAP"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Zezwalaj na dostęp przez protokół POP3" msgstr "Zezwalaj na dostęp przez protokół POP3"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "Zapisz" msgstr "Zapisz"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "Nazwa wyświetlana" msgstr "Nazwa wyświetlana"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Włącz filtr antyspamowy" msgstr "Włącz filtr antyspamowy"
@@ -91,82 +88,80 @@ msgstr "Włącz filtr antyspamowy"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "Próg filtra antyspamowego" msgstr "Próg filtra antyspamowego"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "Zapisz ustawienia" msgstr "Zapisz ustawienia"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "" 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" msgid "Update password"
msgstr "Zmień hasło" msgstr "Zmień hasło"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Włącz przekierowanie poczty" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "Adres docelowy" msgstr "Adres docelowy"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "Aktualizuj" msgstr "Aktualizuj"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Włącz automatyczną odpowiedź" msgstr "Włącz automatyczną odpowiedź"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "Temat odpowiedzi" msgstr "Temat odpowiedzi"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "Treść odpowiedzi" msgstr "Treść odpowiedzi"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Używaj składni SQL LIKE (np. do adresów catch-all)" 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" msgid "Admin email"
msgstr "E-mail administratora" 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" msgid "Submit"
msgstr "Prześlij" msgstr "Prześlij"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "" msgstr ""
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "Protokół" msgstr "Protokół"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Nazwa hosta lub adres IP" msgstr "Nazwa hosta lub adres IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "Port TCP" msgstr "Port TCP"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Włącz TLS" msgstr "Włącz TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "Nazwa użytkownika" msgstr "Nazwa użytkownika"
@@ -194,6 +189,34 @@ msgstr "Twoje konto"
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "Moje konto" msgstr "Moje konto"
@@ -202,28 +225,28 @@ msgstr "Moje konto"
msgid "Settings" msgid "Settings"
msgstr "Ustawienia" 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" msgid "Auto-forward"
msgstr "Automatyczne przekierowanie" 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" msgid "Auto-reply"
msgstr "Automatyczna odpowiedź" msgstr "Automatyczna odpowiedź"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "Wyloguj" msgstr "Wyloguj"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "Administracja" msgstr "Administracja"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "Administratorzy" msgstr "Administratorzy"
@@ -231,7 +254,7 @@ msgstr "Administratorzy"
msgid "Mail domains" msgid "Mail domains"
msgstr "Domeny pocztowe" msgstr "Domeny pocztowe"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "Pomoc" msgstr "Pomoc"
@@ -319,27 +342,27 @@ msgstr "Nowa domena"
msgid "Domain details" msgid "Domain details"
msgstr "Szczegóły domeny" msgstr "Szczegóły domeny"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "Wygeneruj ponownie klucze" msgstr "Wygeneruj ponownie klucze"
#: mailu/ui/templates/domain/details.html:31 #: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "Wpis MX DNS" msgstr "Wpis MX DNS"
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "Wpisy SPF DNS" msgstr "Wpisy SPF DNS"
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "Publiczny klucz DKIM" msgstr "Publiczny klucz DKIM"
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "Wpis DKIM DNS" msgstr "Wpis DKIM DNS"
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "Wpis DMARC DNS" msgstr "Wpis DMARC DNS"
@@ -411,15 +434,15 @@ msgstr ""
msgid "Add manager" msgid "Add manager"
msgstr "" msgstr ""
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Temat ogłoszenia" msgstr "Temat ogłoszenia"
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "Treść ogłoszenia" msgstr "Treść ogłoszenia"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "Wyślij" msgstr "Wyślij"
@@ -431,7 +454,7 @@ msgstr "Publiczne ogłoszenie"
msgid "from" msgid "from"
msgstr "od" msgstr "od"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "Ogłoszenie" msgstr "Ogłoszenie"
@@ -475,11 +498,11 @@ msgstr "Automatyczna odpowiedź"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Przechowuj kopię wiadomości" msgstr "Przechowuj kopię wiadomości"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "Przechowuj wiadomości na serwerze" msgstr "Przechowuj wiadomości na serwerze"
@@ -495,19 +518,19 @@ msgstr "Tak"
msgid "no" msgid "no"
msgstr "Nie" msgstr "Nie"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "" 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" msgid "Remote host"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "" msgstr ""
@@ -547,15 +570,15 @@ msgstr ""
msgid "New relayed domain" msgid "New relayed domain"
msgstr "" msgstr ""
#: mailu/ui/forms.py:125 #: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20 #: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP" msgid "Authorized IP"
msgstr "" 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" msgid "Authentication tokens"
msgstr "" msgstr ""
@@ -567,7 +590,7 @@ msgstr ""
msgid "Webmail" msgid "Webmail"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "Strona internetowa" msgstr "Strona internetowa"
@@ -583,7 +606,7 @@ msgstr ""
msgid "General" msgid "General"
msgstr "" msgstr ""
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "" msgstr ""
@@ -591,85 +614,11 @@ msgstr ""
msgid "General settings" msgid "General settings"
msgstr "Ustawienia ogólne" 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" msgid "Antispam"
msgstr "Filtr antyspamowy" msgstr "Filtr antyspamowy"
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "" 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" msgid "Confirm"
msgstr "Confirmar" 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" msgid "E-mail"
msgstr "E-mail" msgstr "E-mail"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "Senha" msgstr "Senha"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "Entrar" msgstr "Entrar"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "Domínio" msgstr "Domínio"
@@ -44,45 +42,44 @@ msgstr "Quantidade máxima de usuários"
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "Quantidade máxima de alias" 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:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "Comentário" msgstr "Comentário"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "Criar" 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" msgid "Confirm password"
msgstr "Confirmar senha" msgstr "Confirmar senha"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "Quota" msgstr "Quota"
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Permitir acesso IMAP" msgstr "Permitir acesso IMAP"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Permitir acesso POP3" msgstr "Permitir acesso POP3"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "Salvar" msgstr "Salvar"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "Nome de exibição" msgstr "Nome de exibição"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Habilitar filtro de spam" msgstr "Habilitar filtro de spam"
@@ -90,82 +87,80 @@ msgstr "Habilitar filtro de spam"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "Limite de filtro de spam" msgstr "Limite de filtro de spam"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "Salvar configurações" msgstr "Salvar configurações"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "Confirmação de senha" 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" msgid "Update password"
msgstr "Alterar senha" msgstr "Alterar senha"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Habilitar encaminhamento" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "Destinatário" msgstr "Destinatário"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "Atualizar" msgstr "Atualizar"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Habilitar resposta automática" msgstr "Habilitar resposta automática"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "Assunto da resposta" msgstr "Assunto da resposta"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "Corpo da resposta" msgstr "Corpo da resposta"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Usar sintaxe estilo SQL(ex: 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" msgid "Admin email"
msgstr "E-mail do administrador" 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" msgid "Submit"
msgstr "Enviar" msgstr "Enviar"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "E-mail do gerente" msgstr "E-mail do gerente"
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "Protocolo" msgstr "Protocolo"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Hostname ou IP" msgstr "Hostname ou IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "Porta TCP" msgstr "Porta TCP"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Habilitar TLS" msgstr "Habilitar TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "Usuário" msgstr "Usuário"
@@ -193,6 +188,34 @@ msgstr "Sua conta"
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "para acessar as ferramentas administrativas" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "Minha conta" msgstr "Minha conta"
@@ -201,28 +224,28 @@ msgstr "Minha conta"
msgid "Settings" msgid "Settings"
msgstr "Configurações" 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" msgid "Auto-forward"
msgstr "Encaminhamento automático" 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" msgid "Auto-reply"
msgstr "Resposta automática" msgstr "Resposta automática"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "Contas importadas" msgstr "Contas importadas"
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "Sair" msgstr "Sair"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "Administração" msgstr "Administração"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "Administradores" msgstr "Administradores"
@@ -230,7 +253,7 @@ msgstr "Administradores"
msgid "Mail domains" msgid "Mail domains"
msgstr "Domínios de e-mail" msgstr "Domínios de e-mail"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "Ajuda" msgstr "Ajuda"
@@ -318,27 +341,27 @@ msgstr "Novo domínio"
msgid "Domain details" msgid "Domain details"
msgstr "Detalhes do domínio" msgstr "Detalhes do domínio"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "Gerar novas chaves" msgstr "Gerar novas chaves"
#: mailu/ui/templates/domain/details.html:31 #: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "Entrada DNS MX" msgstr "Entrada DNS MX"
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "Entrada DNS SPF" msgstr "Entrada DNS SPF"
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "Chave pública do DKIM" msgstr "Chave pública do DKIM"
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "Entrada DNS DKIM" msgstr "Entrada DNS DKIM"
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "Entrada DNS DMARC" msgstr "Entrada DNS DMARC"
@@ -410,15 +433,15 @@ msgstr "Lista de gerentes"
msgid "Add manager" msgid "Add manager"
msgstr "Adicionar gerente" msgstr "Adicionar gerente"
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Título do comunicado" msgstr "Título do comunicado"
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "Corpo do comunicado" msgstr "Corpo do comunicado"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "Enviar" msgstr "Enviar"
@@ -430,7 +453,7 @@ msgstr "Comunicado geral"
msgid "from" msgid "from"
msgstr "de" msgstr "de"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "Comunicado" msgstr "Comunicado"
@@ -474,11 +497,11 @@ msgstr "Resposta automática"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Cota máxima por usuário" msgstr "Cota máxima por usuário"
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Manter uma cópia dos emails" msgstr "Manter uma cópia dos emails"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "Manter os e-mails no servidor" msgstr "Manter os e-mails no servidor"
@@ -494,19 +517,19 @@ msgstr "sim"
msgid "no" msgid "no"
msgstr "não" msgstr "não"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "Nome alternativo" msgstr "Nome alternativo"
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "Nome de domínio para encaminhar" 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" msgid "Remote host"
msgstr "Host remoto" msgstr "Host remoto"
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Domínios para encaminhamento" msgstr "Domínios para encaminhamento"
@@ -546,15 +569,15 @@ msgstr "Lista de domínios para encaminhamento"
msgid "New relayed domain" msgid "New relayed domain"
msgstr "Novo domínio de encaminhamento" 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)" 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" msgid "Authorized IP"
msgstr "" 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" msgid "Authentication tokens"
msgstr "" msgstr ""
@@ -566,7 +589,7 @@ msgstr ""
msgid "Webmail" msgid "Webmail"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "" msgstr ""
@@ -582,7 +605,7 @@ msgstr ""
msgid "General" msgid "General"
msgstr "" msgstr ""
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "" msgstr ""
@@ -590,85 +613,11 @@ msgstr ""
msgid "General settings" msgid "General settings"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15 #: mailu/ui/templates/user/settings.html:18
msgid "Antispam" msgid "Antispam"
msgstr "" msgstr ""
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "" 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" msgid "Confirm"
msgstr "Bekräfta" 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" msgid "E-mail"
msgstr "E-post" msgstr "E-post"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "Lösenord" msgstr "Lösenord"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "Logga in" msgstr "Logga in"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "Domännamn" msgstr "Domännamn"
@@ -44,45 +42,44 @@ msgstr "Max antal användare"
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "Max antal alias" msgstr "Max antal alias"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "Skapa" 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" msgid "Confirm password"
msgstr "Bekräfta lösenord" msgstr "Bekräfta lösenord"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "Quota" msgstr "Quota"
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "Tillåt IMAP" msgstr "Tillåt IMAP"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "Tillåt POP3" msgstr "Tillåt POP3"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "Spara" msgstr "Spara"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "Visat namn" msgstr "Visat namn"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "Aktivera spamfilter" msgstr "Aktivera spamfilter"
@@ -90,82 +87,80 @@ msgstr "Aktivera spamfilter"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "Spamfilter gräns" msgstr "Spamfilter gräns"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "Spara inställningar" msgstr "Spara inställningar"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "Lösenordskoll" 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" msgid "Update password"
msgstr "Uppdatera lösenord" msgstr "Uppdatera lösenord"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "Aktivera vidarebefordring" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "Destination" msgstr "Destination"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "Uppdatera" msgstr "Uppdatera"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "Aktivera autosvar" msgstr "Aktivera autosvar"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "Svar ämne" msgstr "Svar ämne"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "Svar meddelande" msgstr "Svar meddelande"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "Alias" msgstr "Alias"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "Använd SQL-liknande syntax (t.ex. för catch-all alias)" 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" msgid "Admin email"
msgstr "Admin e-post" 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" msgid "Submit"
msgstr "Skicka in" msgstr "Skicka in"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "Manager e-post" msgstr "Manager e-post"
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "Protokoll" msgstr "Protokoll"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "Hostnamn eller IP" msgstr "Hostnamn eller IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "TCP port" msgstr "TCP port"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "Aktivera TLS" msgstr "Aktivera TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "Användarnamn" msgstr "Användarnamn"
@@ -193,6 +188,34 @@ msgstr "Ditt konto"
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "att komma åt administrationsverktygen" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "Mitt konto" msgstr "Mitt konto"
@@ -201,28 +224,28 @@ msgstr "Mitt konto"
msgid "Settings" msgid "Settings"
msgstr "Inställningar" 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" msgid "Auto-forward"
msgstr "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" msgid "Auto-reply"
msgstr "Autosvar" msgstr "Autosvar"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "Hämtade konton" msgstr "Hämtade konton"
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "Logga ut" msgstr "Logga ut"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "Administration" msgstr "Administration"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "Administratörer" msgstr "Administratörer"
@@ -230,7 +253,7 @@ msgstr "Administratörer"
msgid "Mail domains" msgid "Mail domains"
msgstr "Domäner" msgstr "Domäner"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "Hjälp" msgstr "Hjälp"
@@ -318,27 +341,27 @@ msgstr "Ny domän"
msgid "Domain details" msgid "Domain details"
msgstr "Domändetaljer" msgstr "Domändetaljer"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "Generera nycklar" msgstr "Generera nycklar"
#: mailu/ui/templates/domain/details.html:31 #: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "DNS MX post" msgstr "DNS MX post"
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "DNS SPF post" msgstr "DNS SPF post"
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "Publik DKIM-nyckel" msgstr "Publik DKIM-nyckel"
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "DNS DKIM post" msgstr "DNS DKIM post"
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "DNS DMARC post" msgstr "DNS DMARC post"
@@ -410,15 +433,15 @@ msgstr "Managerlista"
msgid "Add manager" msgid "Add manager"
msgstr "Skapa manager" msgstr "Skapa manager"
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "Publikt meddelande ämne" msgstr "Publikt meddelande ämne"
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "Publikt meddelande" msgstr "Publikt meddelande"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "Skicka" msgstr "Skicka"
@@ -430,7 +453,7 @@ msgstr "Publikt meddelande"
msgid "from" msgid "from"
msgstr "från" msgstr "från"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "Meddelande" msgstr "Meddelande"
@@ -474,11 +497,11 @@ msgstr "Automatiskt svar"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "Max användar-quota" msgstr "Max användar-quota"
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "Behåll en kopia av e-posten" msgstr "Behåll en kopia av e-posten"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "Behåll e-post på servern" msgstr "Behåll e-post på servern"
@@ -494,19 +517,19 @@ msgstr "ja"
msgid "no" msgid "no"
msgstr "nej" msgstr "nej"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "Aleternativt namn" msgstr "Aleternativt namn"
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "Reläade domännamn" 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" msgid "Remote host"
msgstr "Server" msgstr "Server"
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "Reläade domäner" msgstr "Reläade domäner"
@@ -546,15 +569,15 @@ msgstr "Reläade domäner"
msgid "New relayed domain" msgid "New relayed domain"
msgstr "Ny reläad domän" 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)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "Din token (notera, eftersom den inte kommer att visas igen)" 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" msgid "Authorized IP"
msgstr "Autentiserat 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" msgid "Authentication tokens"
msgstr "Autentiserade tokens" msgstr "Autentiserade tokens"
@@ -566,7 +589,7 @@ msgstr "Gå till"
msgid "Webmail" msgid "Webmail"
msgstr "Webmail" msgstr "Webmail"
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "Websida" msgstr "Websida"
@@ -582,7 +605,7 @@ msgstr "Ny token"
msgid "General" msgid "General"
msgstr "Allmänt" msgstr "Allmänt"
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "Funktioner och quota" msgstr "Funktioner och quota"
@@ -590,85 +613,11 @@ msgstr "Funktioner och quota"
msgid "General settings" msgid "General settings"
msgstr "Allmäna inställningar" 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" msgid "Antispam"
msgstr "Antispam" msgstr "Antispam"
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "" 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" msgid "Confirm"
msgstr "确认" msgstr "确认"
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77 #: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail" msgid "E-mail"
msgstr "电子邮件" msgstr "电子邮件"
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "密码" msgstr "密码"
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "注册" msgstr "注册"
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "域名" msgstr "域名"
@@ -44,45 +42,44 @@ msgstr "最大用户数"
msgid "Maximum alias count" msgid "Maximum alias count"
msgstr "最大别名数" msgstr "最大别名数"
#: mailu/ui/forms.py:51 mailu/ui/forms.py:72 mailu/ui/forms.py:83 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
#: mailu/ui/forms.py:128 mailu/ui/forms.py:140 #: 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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "说明" msgstr "说明"
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "创建" msgstr "创建"
#: mailu/ui/forms.py:59 mailu/ui/forms.py:79 mailu/ui/forms.py:91 #: mailu/ui/forms.py:69
msgid "Confirm password" msgid "Confirm password"
msgstr "确认密码" msgstr "确认密码"
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
#: mailu/ui/templates/user/signup_domain.html:16
msgid "Quota" msgid "Quota"
msgstr "配额" msgstr "配额"
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "允许IMAP访问" msgstr "允许IMAP访问"
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "允许POP3访问" msgstr "允许POP3访问"
#: mailu/ui/forms.py:85 #: mailu/ui/forms.py:74
msgid "Save" msgid "Save"
msgstr "保存" msgstr "保存"
#: mailu/ui/forms.py:97 #: mailu/ui/forms.py:78
msgid "Displayed name" msgid "Displayed name"
msgstr "显示名称" msgstr "显示名称"
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "启用垃圾邮件过滤" msgstr "启用垃圾邮件过滤"
@@ -90,82 +87,80 @@ msgstr "启用垃圾邮件过滤"
msgid "Spam filter threshold" msgid "Spam filter threshold"
msgstr "垃圾邮件过滤器阈值" msgstr "垃圾邮件过滤器阈值"
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:81
msgid "Save settings" msgid "Save settings"
msgstr "保存设置" msgstr "保存设置"
#: mailu/ui/forms.py:110 #: mailu/ui/forms.py:86
msgid "Password check" msgid "Password check"
msgstr "检查密码" 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" msgid "Update password"
msgstr "更新密码" msgstr "更新密码"
#: mailu/ui/forms.py:100 #: mailu/ui/forms.py:91
msgid "Enable forwarding" msgid "Enable forwarding"
msgstr "启用转发" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "目的地址" msgstr "目的地址"
#: mailu/ui/forms.py:120 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
msgid "Update" msgid "Update"
msgstr "更新" msgstr "更新"
#: mailu/ui/forms.py:115 #: mailu/ui/forms.py:100
msgid "Enable automatic reply" msgid "Enable automatic reply"
msgstr "启用自动回复" msgstr "启用自动回复"
#: mailu/ui/forms.py:116 #: mailu/ui/forms.py:101
msgid "Reply subject" msgid "Reply subject"
msgstr "回复主题" msgstr "回复主题"
#: mailu/ui/forms.py:117 #: mailu/ui/forms.py:102
msgid "Reply body" msgid "Reply body"
msgstr "回复正文" msgstr "回复正文"
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "别名" msgstr "别名"
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "使用SQL LIKE语法例如用于全部别名" msgstr "使用SQL LIKE语法例如用于全部别名"
#: mailu/ui/forms.py:145 #: mailu/ui/forms.py:129
msgid "Admin email" msgid "Admin email"
msgstr "管理员邮箱" 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" msgid "Submit"
msgstr "提交" msgstr "提交"
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "管理员邮箱" msgstr "管理员邮箱"
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "主机名或IP" msgstr "主机名或IP"
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "TCP端口" msgstr "TCP端口"
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "启用TLS" msgstr "启用TLS"
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"
@@ -175,7 +170,7 @@ msgstr "确认操作"
#: mailu/ui/templates/confirm.html:13 #: mailu/ui/templates/confirm.html:13
msgid "You are about to %(action)s. Please confirm your action." msgid "You are about to %(action)s. Please confirm your action."
msgstr "即将%(action)s请确认您的操作。" msgstr "即将%(action)s请确认您的操作。"
#: mailu/ui/templates/docker-error.html:4 #: mailu/ui/templates/docker-error.html:4
msgid "Docker error" msgid "Docker error"
@@ -193,6 +188,34 @@ msgstr "你的帐户"
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "访问管理员工具" 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 #: mailu/ui/templates/sidebar.html:8
msgid "My account" msgid "My account"
msgstr "我的帐户" msgstr "我的帐户"
@@ -201,28 +224,28 @@ msgstr "我的帐户"
msgid "Settings" msgid "Settings"
msgstr "设置" msgstr "设置"
#: mailu/ui/templates/user/settings.html:22 #: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35
msgid "Auto-forward" msgid "Auto-forward"
msgstr "自动转发" 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" msgid "Auto-reply"
msgstr "自动回复" msgstr "自动回复"
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "代收帐户" msgstr "代收帐户"
#: mailu/ui/templates/sidebar.html:105 #: mailu/ui/templates/sidebar.html:93
msgid "Sign out" msgid "Sign out"
msgstr "登出" msgstr "登出"
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "管理" msgstr "管理"
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "管理员" msgstr "管理员"
@@ -230,13 +253,13 @@ msgstr "管理员"
msgid "Mail domains" msgid "Mail domains"
msgstr "邮件域" msgstr "邮件域"
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "帮" msgstr "帮帮我"
#: mailu/ui/templates/working.html:4 #: mailu/ui/templates/working.html:4
msgid "We are still working on this feature!" msgid "We are still working on this feature!"
msgstr "该功能开发中……" msgstr "开发中……"
#: mailu/ui/templates/admin/create.html:4 #: mailu/ui/templates/admin/create.html:4
msgid "Add a global administrator" msgid "Add a global administrator"
@@ -318,27 +341,27 @@ msgstr "新域"
msgid "Domain details" msgid "Domain details"
msgstr "域详情" msgstr "域详情"
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "重新生成密钥" msgstr "重新生成密钥"
#: mailu/ui/templates/domain/details.html:31 #: mailu/ui/templates/domain/details.html:25
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "DNS MX条目" msgstr "DNS MX条目"
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "DNS SPF条目" msgstr "DNS SPF条目"
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "DKIM公钥" msgstr "DKIM公钥"
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "DNS DKIM条目" msgstr "DNS DKIM条目"
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "DNS DMARC条目" msgstr "DNS DMARC条目"
@@ -410,15 +433,15 @@ msgstr "管理员列表"
msgid "Add manager" msgid "Add manager"
msgstr "添加管理员" msgstr "添加管理员"
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "公告主题" msgstr "公告主题"
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "公告正文" msgstr "公告正文"
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "发送" msgstr "发送"
@@ -430,7 +453,7 @@ msgstr "公告"
msgid "from" msgid "from"
msgstr "来自" msgstr "来自"
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "公告" msgstr "公告"
@@ -474,13 +497,13 @@ msgstr "自动回复"
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "最大用户容量" msgstr "最大用户容量"
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "保留电子邮件副本" msgstr "保留电子邮件副本"
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "保留电子邮件在服务器上" msgstr "电子邮件保存在服务器上"
#: mailu/ui/templates/fetch/list.html:21 #: mailu/ui/templates/fetch/list.html:21
msgid "Keep emails" msgid "Keep emails"
@@ -494,19 +517,19 @@ msgstr "是"
msgid "no" msgid "no"
msgstr "否" msgstr "否"
#: mailu/ui/forms.py:65 #: mailu/ui/forms.py:55
msgid "Alternative name" msgid "Alternative name"
msgstr "替代名称" msgstr "替代名称"
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "中继域域名" 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" msgid "Remote host"
msgstr "远程主机" msgstr "远程主机"
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "中继域" msgstr "中继域"
@@ -546,15 +569,15 @@ msgstr "中继域列表"
msgid "New relayed domain" msgid "New relayed domain"
msgstr "新的中继域" msgstr "新的中继域"
#: mailu/ui/forms.py:125 #: mailu/ui/forms.py:109
msgid "Your token (write it down, as it will never be displayed again)" msgid "Your token (write it down, as it will never be displayed again)"
msgstr "您的令牌(请记录,它只显示这一次)" msgstr "您的令牌(请保存下来,它只显示这一次)"
#: mailu/ui/forms.py:130 mailu/ui/templates/token/list.html:20 #: mailu/ui/forms.py:114 mailu/ui/templates/token/list.html:20
msgid "Authorized IP" msgid "Authorized IP"
msgstr "授权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" msgid "Authentication tokens"
msgstr "认证令牌" msgstr "认证令牌"
@@ -566,7 +589,7 @@ msgstr "转到"
msgid "Webmail" msgid "Webmail"
msgstr "网页邮箱" msgstr "网页邮箱"
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "网站" msgstr "网站"
@@ -580,9 +603,9 @@ msgstr "新的令牌"
#: mailu/ui/templates/user/create.html:15 #: mailu/ui/templates/user/create.html:15
msgid "General" msgid "General"
msgstr "通用" msgstr "一般"
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "功能和配额" msgstr "功能和配额"
@@ -590,85 +613,11 @@ msgstr "功能和配额"
msgid "General settings" msgid "General settings"
msgstr "常规设置" msgstr "常规设置"
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15 #: mailu/ui/templates/user/settings.html:18
msgid "Antispam" msgid "Antispam"
msgstr "反垃圾邮件" msgstr "反垃圾邮件"
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" 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 "" msgstr ""

View File

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

View File

@@ -6,7 +6,6 @@ import flask_login
import flask_wtf import flask_wtf
import re import re
LOCALPART_REGEX = "^[a-zA-Z0-9.!#$%&*+/=?^_`{|}~-]+$"
class DestinationField(fields.SelectMultipleField): class DestinationField(fields.SelectMultipleField):
""" Allow for multiple emails selection from current user choices and """ Allow for multiple emails selection from current user choices and
@@ -48,62 +47,37 @@ class DomainForm(flask_wtf.FlaskForm):
max_users = fields_.IntegerField(_('Maximum user count'), default=10) max_users = fields_.IntegerField(_('Maximum user count'), default=10)
max_aliases = fields_.IntegerField(_('Maximum alias count'), default=10) max_aliases = fields_.IntegerField(_('Maximum alias count'), default=10)
max_quota_bytes = fields_.IntegerSliderField(_('Maximum user quota'), default=0) max_quota_bytes = fields_.IntegerSliderField(_('Maximum user quota'), default=0)
signup_enabled = fields.BooleanField(_('Enable sign-up'), default=False)
comment = fields.StringField(_('Comment')) 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')) submit = fields.SubmitField(_('Create'))
class AlternativeForm(flask_wtf.FlaskForm): class AlternativeForm(flask_wtf.FlaskForm):
name = fields.StringField(_('Alternative name'), [validators.DataRequired()]) name = fields.StringField(_('Alternative name'), [validators.DataRequired()])
submit = fields.SubmitField(_('Save')) submit = fields.SubmitField(_('Create'))
class RelayForm(flask_wtf.FlaskForm): class RelayForm(flask_wtf.FlaskForm):
name = fields.StringField(_('Relayed domain name'), [validators.DataRequired()]) name = fields.StringField(_('Relayed domain name'), [validators.DataRequired()])
smtp = fields.StringField(_('Remote host')) smtp = fields.StringField(_('Remote host'))
comment = fields.StringField(_('Comment')) comment = fields.StringField(_('Comment'))
submit = fields.SubmitField(_('Save')) submit = fields.SubmitField(_('Create'))
class UserForm(flask_wtf.FlaskForm): class UserForm(flask_wtf.FlaskForm):
localpart = fields.StringField(_('E-mail'), [validators.DataRequired(), validators.Regexp(LOCALPART_REGEX)]) localpart = fields.StringField(_('E-mail'), [validators.DataRequired()])
pw = fields.PasswordField(_('Password'), [validators.DataRequired()]) pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')]) pw2 = fields.PasswordField(_('Confirm password'), [validators.EqualTo('pw')])
quota_bytes = fields_.IntegerSliderField(_('Quota'), default=1000000000) quota_bytes = fields_.IntegerSliderField(_('Quota'), default=1000000000)
enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True) enable_imap = fields.BooleanField(_('Allow IMAP access'), default=True)
enable_pop = fields.BooleanField(_('Allow POP3 access'), default=True) enable_pop = fields.BooleanField(_('Allow POP3 access'), default=True)
comment = fields.StringField(_('Comment')) comment = fields.StringField(_('Comment'))
enabled = fields.BooleanField(_('Enabled'), default=True)
submit = fields.SubmitField(_('Save')) 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): class UserSettingsForm(flask_wtf.FlaskForm):
displayed_name = fields.StringField(_('Displayed name')) displayed_name = fields.StringField(_('Displayed name'))
spam_enabled = fields.BooleanField(_('Enable spam filter')) spam_enabled = fields.BooleanField(_('Enable spam filter'))
spam_threshold = fields_.IntegerSliderField(_('Spam filter tolerance')) 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')) submit = fields.SubmitField(_('Save settings'))
@@ -113,12 +87,20 @@ class UserPasswordForm(flask_wtf.FlaskForm):
submit = fields.SubmitField(_('Update password')) 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): class UserReplyForm(flask_wtf.FlaskForm):
reply_enabled = fields.BooleanField(_('Enable automatic reply')) reply_enabled = fields.BooleanField(_('Enable automatic reply'))
reply_subject = fields.StringField(_('Reply subject')) reply_subject = fields.StringField(_('Reply subject'))
reply_body = fields.StringField(_('Reply body'), reply_body = fields.StringField(_('Reply body'),
widget=widgets.TextArea()) widget=widgets.TextArea())
reply_startdate = fields.html5.DateField(_('Start of vacation'))
reply_enddate = fields.html5.DateField(_('End of vacation')) reply_enddate = fields.html5.DateField(_('End of vacation'))
submit = fields.SubmitField(_('Update')) submit = fields.SubmitField(_('Update'))
@@ -132,7 +114,7 @@ class TokenForm(flask_wtf.FlaskForm):
ip = fields.StringField( ip = fields.StringField(
_('Authorized IP'), [validators.Optional(), validators.IPAddress()] _('Authorized IP'), [validators.Optional(), validators.IPAddress()]
) )
submit = fields.SubmitField(_('Save')) submit = fields.SubmitField(_('Create'))
class AliasForm(flask_wtf.FlaskForm): class AliasForm(flask_wtf.FlaskForm):
@@ -141,7 +123,7 @@ class AliasForm(flask_wtf.FlaskForm):
_('Use SQL LIKE Syntax (e.g. for catch-all aliases)')) _('Use SQL LIKE Syntax (e.g. for catch-all aliases)'))
destination = DestinationField(_('Destination')) destination = DestinationField(_('Destination'))
comment = fields.StringField(_('Comment')) comment = fields.StringField(_('Comment'))
submit = fields.SubmitField(_('Save')) submit = fields.SubmitField(_('Create'))
class AdminForm(flask_wtf.FlaskForm): 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 %} {% block styles %}
{{super()}} {{super()}}
<link rel="stylesheet" href="{{ url_for('.static', filename='select2/css/select2.min.css') }}"> <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/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='adminlte/css/skin-blue.min.css') }}">
<link rel="stylesheet" href="{{ url_for('.static', filename='app.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, {{ 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>', 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);') }} oninput='$("#quota").text(this.value == 0 ? "∞" : this.value/1000000000);') }}
{{ macros.form_field(form.signup_enabled) }}
{{ macros.form_field(form.comment) }} {{ macros.form_field(form.comment) }}
{{ macros.form_field(form.submit) }} {{ macros.form_field(form.submit) }}
</form> </form>

View File

@@ -10,13 +10,7 @@
{% block main_action %} {% block main_action %}
{% if current_user.global_admin %} {% if current_user.global_admin %}
<a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}"> <a class="btn btn-primary" href="{{ url_for(".domain_genkeys", domain_name=domain.name) }}">{% trans %}Regenerate keys{% endtrans %}</a>
{% if domain.dkim_publickey %}
{% trans %}Regenerate keys{% endtrans %}
{% else %}
{% trans %}Generate keys{% endtrans %}
{% endif %}
</a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
@@ -28,7 +22,7 @@
<td>{{ domain.name }}</td> <td>{{ domain.name }}</td>
</tr> </tr>
<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> <td><pre>{{ domain.name }}. 600 IN MX 10 {{ hostname }}.</pre></td>
</tr> </tr>
<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) }} {{ macros.form_field(form.password) }}
{% endcall %} {% endcall %}
{% call macros.box(title="Settings") %}
{{ macros.form_field(form.keep) }}
{% endcall %}
{{ macros.form_field(form.submit) }} {{ macros.form_field(form.submit) }}
</form> </form>
{% endblock %} {% 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> <i class="fa fa-lock"></i> <span>{% trans %}Update password{% endtrans %}</span>
</a> </a>
</li> </li>
<li>
<a href="{{ url_for('.user_forward') }}">
<i class="fa fa-share"></i> <span>{% trans %}Auto-forward{% endtrans %}</span>
</a>
</li>
<li> <li>
<a href="{{ url_for('.user_reply') }}"> <a href="{{ url_for('.user_reply') }}">
<i class="fa fa-plane"></i> <span>{% trans %}Auto-reply{% endtrans %}</span> <i class="fa fa-plane"></i> <span>{% trans %}Auto-reply{% endtrans %}</span>
@@ -32,10 +37,13 @@
</a> </a>
</li> </li>
{% if current_user.manager_of or current_user.global_admin %}
<li class="header">{% trans %}Administration{% endtrans %}</li> <li class="header">{% trans %}Administration{% endtrans %}</li>
{% endif %}
{% if current_user.global_admin %} {% 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> <li>
<a href="{{ url_for('.announcement') }}"> <a href="{{ url_for('.announcement') }}">
<i class="fa fa-bullhorn"></i> <span>{% trans %}Announcement{% endtrans %}</span> <i class="fa fa-bullhorn"></i> <span>{% trans %}Announcement{% endtrans %}</span>
@@ -74,11 +82,6 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li>
<a href="{{ url_for('.client') }}">
<i class="fa fa-laptop"></i> <span>{% trans %}Client setup{% endtrans %}</span>
</a>
</li>
<li> <li>
<a href="{{ config["WEBSITE"] }}"> <a href="{{ config["WEBSITE"] }}">
<i class="fa fa-globe"></i> <span>{% trans %}Website{% endtrans %}</span> <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> <i class="fa fa-life-ring"></i> <span>{% trans %}Help{% endtrans %}</span>
</a> </a>
</li> </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 %} {% if current_user.is_authenticated %}
<li> <li>
<a href="{{ url_for('.logout') }}"> <a href="{{ url_for('.logout') }}">
@@ -104,17 +100,10 @@
</li> </li>
{% else %} {% else %}
<li> <li>
<a href="{{ url_for('.login') }}"> <a href="#">
<i class="fa fa-sign-in"></i> <span>{% trans %}Sign in{% endtrans %}</span> <i class="fa fa-sign-in"></i> <span>{% trans %}Sign in{% endtrans %}</span>
</a> </a>
</li> </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 %} {% endif %}
</ul> </ul>
</section> </section>

View File

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

View File

@@ -32,6 +32,7 @@
</td> </td>
<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_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('.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; <a href="{{ url_for('.fetch_list', user_email=user.email) }}" title="{% trans %}Fetched accounts{% endtrans %}"><i class="fa fa-download"></i></a>&nbsp;
</td> </td>
@@ -40,7 +41,7 @@
{% if user.enable_imap %}<span class="label label-info">imap</span>{% endif %} {% if user.enable_imap %}<span class="label label-info">imap</span>{% endif %}
{% if user.enable_pop %}<span class="label label-info">pop3</span>{% endif %} {% if user.enable_pop %}<span class="label label-info">pop3</span>{% endif %}
</td> </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.comment or '-' }}</td>
<td>{{ user.created_at }}</td> <td>{{ user.created_at }}</td>
<td>{{ user.updated_at or '' }}</td> <td>{{ user.updated_at or '' }}</td>

View File

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

View File

@@ -11,6 +11,9 @@
{% block content %} {% block content %}
<form class="form" method="post" role="form"> <form class="form" method="post" role="form">
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
{% call macros.box(title=_("General settings")) %}
{{ macros.form_field(form.displayed_name) }}
{% endcall %}
{% call macros.box(title=_("Antispam")) %} {% call macros.box(title=_("Antispam")) %}
{{ macros.form_field(form.spam_enabled) }} {{ 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>', prepend='<span class="input-group-addon"><span id="threshold">'+form.spam_threshold.data.__str__()+'</span>&nbsp;/&nbsp;100</span>',
oninput='$("#threshold").text(this.value);') }} oninput='$("#threshold").text(this.value);') }}
{% endcall %} {% 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) }} {{ macros.form_field(form.submit) }}
</form> </form>
{% endblock %} {% 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 from mailu.ui import ui, forms, access
import flask import flask
@@ -25,7 +25,7 @@ def admin_create():
user = models.User.query.get(form.admin.data) user = models.User.query.get(form.admin.data)
if user: if user:
user.global_admin = True user.global_admin = True
models.db.session.commit() db.session.commit()
flask.flash('User %s is now admin' % user) flask.flash('User %s is now admin' % user)
return flask.redirect(flask.url_for('.admin_list')) return flask.redirect(flask.url_for('.admin_list'))
else: else:
@@ -40,7 +40,7 @@ def admin_delete(admin):
user = models.User.query.get(admin) user = models.User.query.get(admin)
if user: if user:
user.global_admin = False user.global_admin = False
models.db.session.commit() db.session.commit()
flask.flash('User %s is no longer admin' % user) flask.flash('User %s is no longer admin' % user)
return flask.redirect(flask.url_for('.admin_list')) return flask.redirect(flask.url_for('.admin_list'))
else: else:

View File

@@ -1,4 +1,4 @@
from mailu import models from mailu import db, models
from mailu.ui import ui, forms, access from mailu.ui import ui, forms, access
import flask import flask
@@ -27,8 +27,8 @@ def alias_create(domain_name):
else: else:
alias = models.Alias(domain=domain) alias = models.Alias(domain=domain)
form.populate_obj(alias) form.populate_obj(alias)
models.db.session.add(alias) db.session.add(alias)
models.db.session.commit() db.session.commit()
flask.flash('Alias %s created' % alias) flask.flash('Alias %s created' % alias)
return flask.redirect( return flask.redirect(
flask.url_for('.alias_list', domain_name=domain.name)) flask.url_for('.alias_list', domain_name=domain.name))
@@ -45,7 +45,7 @@ def alias_edit(alias):
form.localpart.validators = [] form.localpart.validators = []
if form.validate_on_submit(): if form.validate_on_submit():
form.populate_obj(alias) form.populate_obj(alias)
models.db.session.commit() db.session.commit()
flask.flash('Alias %s updated' % alias) flask.flash('Alias %s updated' % alias)
return flask.redirect( return flask.redirect(
flask.url_for('.alias_list', domain_name=alias.domain.name)) flask.url_for('.alias_list', domain_name=alias.domain.name))
@@ -59,8 +59,8 @@ def alias_edit(alias):
def alias_delete(alias): def alias_delete(alias):
alias = models.Alias.query.get(alias) or flask.abort(404) alias = models.Alias.query.get(alias) or flask.abort(404)
domain = alias.domain domain = alias.domain
models.db.session.delete(alias) db.session.delete(alias)
models.db.session.commit() db.session.commit()
flask.flash('Alias %s deleted' % alias) flask.flash('Alias %s deleted' % alias)
return flask.redirect( return flask.redirect(
flask.url_for('.alias_list', domain_name=domain.name)) 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 from mailu.ui import ui, forms, access
import flask import flask
@@ -26,8 +26,8 @@ def alternative_create(domain_name):
else: else:
alternative = models.Alternative(domain=domain) alternative = models.Alternative(domain=domain)
form.populate_obj(alternative) form.populate_obj(alternative)
models.db.session.add(alternative) db.session.add(alternative)
models.db.session.commit() db.session.commit()
flask.flash('Alternative domain %s created' % alternative) flask.flash('Alternative domain %s created' % alternative)
return flask.redirect( return flask.redirect(
flask.url_for('.alternative_list', domain_name=domain.name)) flask.url_for('.alternative_list', domain_name=domain.name))
@@ -41,8 +41,8 @@ def alternative_create(domain_name):
def alternative_delete(alternative): def alternative_delete(alternative):
alternative = models.Alternative.query.get(alternative) or flask.abort(404) alternative = models.Alternative.query.get(alternative) or flask.abort(404)
domain = alternative.domain domain = alternative.domain
models.db.session.delete(alternative) db.session.delete(alternative)
models.db.session.commit() db.session.commit()
flask.flash('Alternative %s deleted' % alternative) flask.flash('Alternative %s deleted' % alternative)
return flask.redirect( return flask.redirect(
flask.url_for('.alternative_list', domain_name=domain.name)) 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 from mailu.ui import ui, forms, access
import flask import flask
import flask_login import flask_login
from urllib import parse
@ui.route('/', methods=["GET"]) @ui.route('/', methods=["GET"])
@access.authenticated @access.authenticated
@@ -18,7 +20,7 @@ def login():
user = models.User.login(form.email.data, form.pw.data) user = models.User.login(form.email.data, form.pw.data)
if user: if user:
flask_login.login_user(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) return flask.redirect(flask.url_for(endpoint)
or flask.url_for('.index')) or flask.url_for('.index'))
else: else:
@@ -33,6 +35,16 @@ def logout():
return flask.redirect(flask.url_for('.index')) 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']) @ui.route('/announcement', methods=['GET', 'POST'])
@access.global_admin @access.global_admin
def announcement(): def announcement():
@@ -46,8 +58,3 @@ def announcement():
form.announcement_body.data = '' form.announcement_body.data = ''
flask.flash('Your announcement was sent', 'success') flask.flash('Your announcement was sent', 'success')
return flask.render_template('announcement.html', form=form) 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 mailu.ui import ui, forms, access
from flask import current_app as app
import flask import flask
import flask_login
import wtforms_components import wtforms_components
import dns.resolver
@ui.route('/domain', methods=['GET']) @ui.route('/domain', methods=['GET'])
@@ -27,8 +24,8 @@ def domain_create():
else: else:
domain = models.Domain() domain = models.Domain()
form.populate_obj(domain) form.populate_obj(domain)
models.db.session.add(domain) db.session.add(domain)
models.db.session.commit() db.session.commit()
flask.flash('Domain %s created' % domain) flask.flash('Domain %s created' % domain)
return flask.redirect(flask.url_for('.domain_list')) return flask.redirect(flask.url_for('.domain_list'))
return flask.render_template('domain/create.html', form=form) return flask.render_template('domain/create.html', form=form)
@@ -43,7 +40,7 @@ def domain_edit(domain_name):
form.name.validators = [] form.name.validators = []
if form.validate_on_submit(): if form.validate_on_submit():
form.populate_obj(domain) form.populate_obj(domain)
models.db.session.commit() db.session.commit()
flask.flash('Domain %s saved' % domain) flask.flash('Domain %s saved' % domain)
return flask.redirect(flask.url_for('.domain_list')) return flask.redirect(flask.url_for('.domain_list'))
return flask.render_template('domain/edit.html', form=form, return flask.render_template('domain/edit.html', form=form,
@@ -55,8 +52,8 @@ def domain_edit(domain_name):
@access.confirmation_required("delete {domain_name}") @access.confirmation_required("delete {domain_name}")
def domain_delete(domain_name): def domain_delete(domain_name):
domain = models.Domain.query.get(domain_name) or flask.abort(404) domain = models.Domain.query.get(domain_name) or flask.abort(404)
models.db.session.delete(domain) db.session.delete(domain)
models.db.session.commit() db.session.commit()
flask.flash('Domain %s deleted' % domain) flask.flash('Domain %s deleted' % domain)
return flask.redirect(flask.url_for('.domain_list')) return flask.redirect(flask.url_for('.domain_list'))
@@ -76,44 +73,3 @@ def domain_genkeys(domain_name):
domain.generate_dkim_key() domain.generate_dkim_key()
return flask.redirect( return flask.redirect(
flask.url_for(".domain_details", domain_name=domain_name)) 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 from mailu.ui import ui, forms, access
import flask import flask
@@ -24,8 +24,8 @@ def fetch_create(user_email):
if form.validate_on_submit(): if form.validate_on_submit():
fetch = models.Fetch(user=user) fetch = models.Fetch(user=user)
form.populate_obj(fetch) form.populate_obj(fetch)
models.db.session.add(fetch) db.session.add(fetch)
models.db.session.commit() db.session.commit()
flask.flash('Fetch configuration created') flask.flash('Fetch configuration created')
return flask.redirect( return flask.redirect(
flask.url_for('.fetch_list', user_email=user.email)) flask.url_for('.fetch_list', user_email=user.email))
@@ -39,7 +39,7 @@ def fetch_edit(fetch_id):
form = forms.FetchForm(obj=fetch) form = forms.FetchForm(obj=fetch)
if form.validate_on_submit(): if form.validate_on_submit():
form.populate_obj(fetch) form.populate_obj(fetch)
models.db.session.commit() db.session.commit()
flask.flash('Fetch configuration updated') flask.flash('Fetch configuration updated')
return flask.redirect( return flask.redirect(
flask.url_for('.fetch_list', user_email=fetch.user.email)) flask.url_for('.fetch_list', user_email=fetch.user.email))
@@ -53,8 +53,8 @@ def fetch_edit(fetch_id):
def fetch_delete(fetch_id): def fetch_delete(fetch_id):
fetch = models.Fetch.query.get(fetch_id) or flask.abort(404) fetch = models.Fetch.query.get(fetch_id) or flask.abort(404)
user = fetch.user user = fetch.user
models.db.session.delete(fetch) db.session.delete(fetch)
models.db.session.commit() db.session.commit()
flask.flash('Fetch configuration delete') flask.flash('Fetch configuration delete')
return flask.redirect( return flask.redirect(
flask.url_for('.fetch_list', user_email=user.email)) 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 from mailu.ui import ui, forms, access
import flask import flask
@@ -30,7 +30,7 @@ def manager_create(domain_name):
flask.flash('User %s is already manager' % user, 'error') flask.flash('User %s is already manager' % user, 'error')
else: else:
domain.managers.append(user) domain.managers.append(user)
models.db.session.commit() db.session.commit()
flask.flash('User %s can now manage %s' % (user, domain.name)) flask.flash('User %s can now manage %s' % (user, domain.name))
return flask.redirect( return flask.redirect(
flask.url_for('.manager_list', domain_name=domain.name)) 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) user = models.User.query.get(user_email) or flask.abort(404)
if user in domain.managers: if user in domain.managers:
domain.managers.remove(user) domain.managers.remove(user)
models.db.session.commit() db.session.commit()
flask.flash('User %s can no longer manager %s' % (user, domain)) flask.flash('User %s can no longer manager %s' % (user, domain))
else: else:
flask.flash('User %s is not manager' % user, 'error') 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 from mailu.ui import ui, forms, access
import flask import flask
@@ -25,8 +25,8 @@ def relay_create():
else: else:
relay = models.Relay() relay = models.Relay()
form.populate_obj(relay) form.populate_obj(relay)
models.db.session.add(relay) db.session.add(relay)
models.db.session.commit() db.session.commit()
flask.flash('Relayed domain %s created' % relay) flask.flash('Relayed domain %s created' % relay)
return flask.redirect(flask.url_for('.relay_list')) return flask.redirect(flask.url_for('.relay_list'))
return flask.render_template('relay/create.html', form=form) return flask.render_template('relay/create.html', form=form)
@@ -41,7 +41,7 @@ def relay_edit(relay_name):
form.name.validators = [] form.name.validators = []
if form.validate_on_submit(): if form.validate_on_submit():
form.populate_obj(relay) form.populate_obj(relay)
models.db.session.commit() db.session.commit()
flask.flash('Relayed domain %s saved' % relay) flask.flash('Relayed domain %s saved' % relay)
return flask.redirect(flask.url_for('.relay_list')) return flask.redirect(flask.url_for('.relay_list'))
return flask.render_template('relay/edit.html', form=form, return flask.render_template('relay/edit.html', form=form,
@@ -53,8 +53,8 @@ def relay_edit(relay_name):
@access.confirmation_required("delete {relay_name}") @access.confirmation_required("delete {relay_name}")
def relay_delete(relay_name): def relay_delete(relay_name):
relay = models.Relay.query.get(relay_name) or flask.abort(404) relay = models.Relay.query.get(relay_name) or flask.abort(404)
models.db.session.delete(relay) db.session.delete(relay)
models.db.session.commit() db.session.commit()
flask.flash('Relayed domain %s deleted' % relay) flask.flash('Relayed domain %s deleted' % relay)
return flask.redirect(flask.url_for('.relay_list')) 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 mailu.ui import ui, forms, access
from passlib import pwd from passlib import pwd
@@ -32,8 +32,8 @@ def token_create(user_email):
token = models.Token(user=user) token = models.Token(user=user)
token.set_password(form.raw_password.data) token.set_password(form.raw_password.data)
form.populate_obj(token) form.populate_obj(token)
models.db.session.add(token) db.session.add(token)
models.db.session.commit() db.session.commit()
flask.flash('Authentication token created') flask.flash('Authentication token created')
return flask.redirect( return flask.redirect(
flask.url_for('.token_list', user_email=user.email)) flask.url_for('.token_list', user_email=user.email))
@@ -46,8 +46,8 @@ def token_create(user_email):
def token_delete(token_id): def token_delete(token_id):
token = models.Token.query.get(token_id) or flask.abort(404) token = models.Token.query.get(token_id) or flask.abort(404)
user = token.user user = token.user
models.db.session.delete(token) db.session.delete(token)
models.db.session.commit() db.session.commit()
flask.flash('Authentication token deleted') flask.flash('Authentication token deleted')
return flask.redirect( return flask.redirect(
flask.url_for('.token_list', user_email=user.email)) 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 mailu.ui import ui, access, forms
from flask import current_app as app
import flask import flask
import flask_login import flask_login
@@ -34,8 +33,8 @@ def user_create(domain_name):
user = models.User(domain=domain) user = models.User(domain=domain)
form.populate_obj(user) form.populate_obj(user)
user.set_password(form.pw.data) user.set_password(form.pw.data)
models.db.session.add(user) db.session.add(user)
models.db.session.commit() db.session.commit()
user.send_welcome() user.send_welcome()
flask.flash('User %s created' % user) flask.flash('User %s created' % user)
return flask.redirect( return flask.redirect(
@@ -64,7 +63,7 @@ def user_edit(user_email):
form.populate_obj(user) form.populate_obj(user)
if form.pw.data: if form.pw.data:
user.set_password(form.pw.data) user.set_password(form.pw.data)
models.db.session.commit() db.session.commit()
flask.flash('User %s updated' % user) flask.flash('User %s updated' % user)
return flask.redirect( return flask.redirect(
flask.url_for('.user_list', domain_name=user.domain.name)) flask.url_for('.user_list', domain_name=user.domain.name))
@@ -78,8 +77,8 @@ def user_edit(user_email):
def user_delete(user_email): def user_delete(user_email):
user = models.User.query.get(user_email) or flask.abort(404) user = models.User.query.get(user_email) or flask.abort(404)
domain = user.domain domain = user.domain
models.db.session.delete(user) db.session.delete(user)
models.db.session.commit() db.session.commit()
flask.flash('User %s deleted' % user) flask.flash('User %s deleted' % user)
return flask.redirect( return flask.redirect(
flask.url_for('.user_list', domain_name=domain.name)) flask.url_for('.user_list', domain_name=domain.name))
@@ -94,7 +93,7 @@ def user_settings(user_email):
form = forms.UserSettingsForm(obj=user) form = forms.UserSettingsForm(obj=user)
if form.validate_on_submit(): if form.validate_on_submit():
form.populate_obj(user) form.populate_obj(user)
models.db.session.commit() db.session.commit()
flask.flash('Settings updated for %s' % user) flask.flash('Settings updated for %s' % user)
if user_email: if user_email:
return flask.redirect( return flask.redirect(
@@ -114,7 +113,7 @@ def user_password(user_email):
flask.flash('Passwords do not match', 'error') flask.flash('Passwords do not match', 'error')
else: else:
user.set_password(form.pw.data) user.set_password(form.pw.data)
models.db.session.commit() db.session.commit()
flask.flash('Password updated for %s' % user) flask.flash('Password updated for %s' % user)
if user_email: if user_email:
return flask.redirect(flask.url_for('.user_list', return flask.redirect(flask.url_for('.user_list',
@@ -131,7 +130,7 @@ def user_forward(user_email):
form = forms.UserForwardForm(obj=user) form = forms.UserForwardForm(obj=user)
if form.validate_on_submit(): if form.validate_on_submit():
form.populate_obj(user) form.populate_obj(user)
models.db.session.commit() db.session.commit()
flask.flash('Forward destination updated for %s' % user) flask.flash('Forward destination updated for %s' % user)
if user_email: if user_email:
return flask.redirect( return flask.redirect(
@@ -148,45 +147,9 @@ def user_reply(user_email):
form = forms.UserReplyForm(obj=user) form = forms.UserReplyForm(obj=user)
if form.validate_on_submit(): if form.validate_on_submit():
form.populate_obj(user) form.populate_obj(user)
models.db.session.commit() db.session.commit()
flask.flash('Auto-reply message updated for %s' % user) flask.flash('Auto-reply message updated for %s' % user)
if user_email: if user_email:
return flask.redirect( return flask.redirect(
flask.url_for('.user_list', domain_name=user.domain.name)) flask.url_for('.user_list', domain_name=user.domain.name))
return flask.render_template('user/reply.html', form=form, user=user) 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 os
import socket import socket
import uuid import uuid
import click
db = models.db @manager.command
@click.group()
def mailu(cls=flask_cli.FlaskGroup):
""" Mailu command line
"""
@mailu.command()
@flask_cli.with_appcontext
def advertise(): def advertise():
""" Advertise this server against statistic services. """ Advertise this server against statistic services.
""" """
@@ -38,11 +23,7 @@ def advertise():
pass pass
@mailu.command() @manager.command
@click.argument('localpart')
@click.argument('domain_name')
@click.argument('password')
@flask_cli.with_appcontext
def admin(localpart, domain_name, password): def admin(localpart, domain_name, password):
""" Create an admin user """ Create an admin user
""" """
@@ -60,17 +41,11 @@ def admin(localpart, domain_name, password):
db.session.commit() db.session.commit()
@mailu.command() @manager.command
@click.argument('localpart') def user(localpart, domain_name, password,
@click.argument('domain_name') hash_scheme=app.config['PASSWORD_SCHEME']):
@click.argument('password')
@click.argument('hash_scheme')
@flask_cli.with_appcontext
def user(localpart, domain_name, password, hash_scheme=None):
""" Create a user """ Create a user
""" """
if hash_scheme is None:
hash_scheme = app.config['PASSWORD_SCHEME']
domain = models.Domain.query.get(domain_name) domain = models.Domain.query.get(domain_name)
if not domain: if not domain:
domain = models.Domain(name=domain_name) domain = models.Domain(name=domain_name)
@@ -85,12 +60,10 @@ def user(localpart, domain_name, password, hash_scheme=None):
db.session.commit() db.session.commit()
@mailu.command() @manager.option('-n', '--domain_name', dest='domain_name')
@click.option('-n', '--domain_name') @manager.option('-u', '--max_users', dest='max_users')
@click.option('-u', '--max_users') @manager.option('-a', '--max_aliases', dest='max_aliases')
@click.option('-a', '--max_aliases') @manager.option('-q', '--max_quota_bytes', dest='max_quota_bytes')
@click.option('-q', '--max_quota_bytes')
@flask_cli.with_appcontext
def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0): def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0):
domain = models.Domain.query.get(domain_name) domain = models.Domain.query.get(domain_name)
if not domain: if not domain:
@@ -99,17 +72,15 @@ def domain(domain_name, max_users=0, max_aliases=0, max_quota_bytes=0):
db.session.commit() db.session.commit()
@mailu.command() @manager.command
@click.argument('localpart') def user_import(localpart, domain_name, password_hash,
@click.argument('domain_name') hash_scheme=app.config['PASSWORD_SCHEME']):
@click.argument('password_hash') """ Import a user along with password hash. Available hashes:
@click.argument('hash_scheme') 'SHA512-CRYPT'
@flask_cli.with_appcontext 'SHA256-CRYPT'
def user_import(localpart, domain_name, password_hash, hash_scheme = None): 'MD5-CRYPT'
""" Import a user along with password hash. 'CRYPT'
""" """
if hash_scheme is None:
hash_scheme = app.config['PASSWORD_SCHEME']
domain = models.Domain.query.get(domain_name) domain = models.Domain.query.get(domain_name)
if not domain: if not domain:
domain = models.Domain(name=domain_name) domain = models.Domain(name=domain_name)
@@ -124,10 +95,7 @@ def user_import(localpart, domain_name, password_hash, hash_scheme = None):
db.session.commit() db.session.commit()
@mailu.command() @manager.command
@click.option('-v', '--verbose')
@click.option('-d', '--delete_objects')
@flask_cli.with_appcontext
def config_update(verbose=False, delete_objects=False): def config_update(verbose=False, delete_objects=False):
"""sync configuration with data from YAML-formatted stdin""" """sync configuration with data from YAML-formatted stdin"""
import yaml import yaml
@@ -266,9 +234,7 @@ def config_update(verbose=False, delete_objects=False):
db.session.commit() db.session.commit()
@mailu.command() @manager.command
@click.argument('email')
@flask_cli.with_appcontext
def user_delete(email): def user_delete(email):
"""delete user""" """delete user"""
user = models.User.query.get(email) user = models.User.query.get(email)
@@ -277,9 +243,7 @@ def user_delete(email):
db.session.commit() db.session.commit()
@mailu.command() @manager.command
@click.argument('email')
@flask_cli.with_appcontext
def alias_delete(email): def alias_delete(email):
"""delete alias""" """delete alias"""
alias = models.Alias.query.get(email) alias = models.Alias.query.get(email)
@@ -288,11 +252,7 @@ def alias_delete(email):
db.session.commit() db.session.commit()
@mailu.command() @manager.command
@click.argument('localpart')
@click.argument('domain_name')
@click.argument('destination')
@flask_cli.with_appcontext
def alias(localpart, domain_name, destination): def alias(localpart, domain_name, destination):
""" Create an alias """ Create an alias
""" """
@@ -309,31 +269,24 @@ def alias(localpart, domain_name, destination):
db.session.add(alias) db.session.add(alias)
db.session.commit() db.session.commit()
# Set limits to a domain
@mailu.command()
@click.argument('domain_name') @manager.command
@click.argument('max_users')
@click.argument('max_aliases')
@click.argument('max_quota_bytes')
@flask_cli.with_appcontext
def setlimits(domain_name, max_users, max_aliases, max_quota_bytes): def setlimits(domain_name, max_users, max_aliases, max_quota_bytes):
""" Set domain limits
"""
domain = models.Domain.query.get(domain_name) domain = models.Domain.query.get(domain_name)
domain.max_users = max_users domain.max_users = max_users
domain.max_aliases = max_aliases domain.max_aliases = max_aliases
domain.max_quota_bytes = max_quota_bytes domain.max_quota_bytes = max_quota_bytes
db.session.add(domain) db.session.add(domain)
db.session.commit() db.session.commit()
# Make the user manager of a domain
@mailu.command()
@click.argument('domain_name') @manager.command
@click.argument('user_name')
@flask_cli.with_appcontext
def setmanager(domain_name, user_name='manager'): def setmanager(domain_name, user_name='manager'):
""" Make a user manager of a domain
"""
domain = models.Domain.query.get(domain_name) domain = models.Domain.query.get(domain_name)
manageruser = models.User.query.get(user_name + '@' + domain_name) manageruser = models.User.query.get(user_name + '@' + domain_name)
domain.managers.append(manageruser) domain.managers.append(manageruser)
@@ -341,5 +294,5 @@ def setmanager(domain_name, user_name='manager'):
db.session.commit() db.session.commit()
if __name__ == '__main__': if __name__ == "__main__":
cli() manager.run()

View File

@@ -1,21 +1,21 @@
# Translations template for PROJECT. # Translations template for PROJECT.
# Copyright (C) 2018 ORGANIZATION # Copyright (C) 2017 ORGANIZATION
# This file is distributed under the same license as the PROJECT project. # This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2018. # FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PROJECT VERSION\n" "Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.5.3\n" "Generated-By: Babel 2.5.1\n"
#: mailu/ui/forms.py:32 #: mailu/ui/forms.py:32
msgid "Invalid email address." msgid "Invalid email address."
@@ -25,23 +25,21 @@ msgstr ""
msgid "Confirm" msgid "Confirm"
msgstr "" msgstr ""
#: mailu/ui/forms.py:40 mailu/ui/forms.py:77 #: mailu/ui/forms.py:40 mailu/ui/forms.py:67
msgid "E-mail" msgid "E-mail"
msgstr "" msgstr ""
#: mailu/ui/forms.py:41 mailu/ui/forms.py:78 mailu/ui/forms.py:90 #: mailu/ui/forms.py:41 mailu/ui/forms.py:68 mailu/ui/forms.py:85
#: mailu/ui/forms.py:109 mailu/ui/forms.py:162 #: mailu/ui/forms.py:146
#: mailu/ui/templates/client.html:32 mailu/ui/templates/client.html:59
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: mailu/ui/forms.py:42 mailu/ui/templates/login.html:4 #: 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" msgid "Sign in"
msgstr "" msgstr ""
#: mailu/ui/forms.py:46 mailu/ui/forms.py:56 #: mailu/ui/forms.py:46 mailu/ui/templates/domain/details.html:21
#: mailu/ui/templates/domain/details.html:27
#: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17 #: mailu/ui/templates/domain/list.html:18 mailu/ui/templates/relay/list.html:17
msgid "Domain name" msgid "Domain name"
msgstr "" msgstr ""
@@ -58,198 +56,165 @@ msgstr ""
msgid "Maximum user quota" msgid "Maximum user quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:50 #: mailu/ui/forms.py:50 mailu/ui/forms.py:62 mailu/ui/forms.py:73
msgid "Enable sign-up" #: mailu/ui/forms.py:112 mailu/ui/forms.py:124
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/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/relay/list.html:19 mailu/ui/templates/token/list.html:19
#: mailu/ui/templates/user/list.html:23 #: mailu/ui/templates/user/list.html:23
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: mailu/ui/forms.py:52 mailu/ui/forms.py:61 mailu/ui/forms.py:66 #: mailu/ui/forms.py:51 mailu/ui/forms.py:56 mailu/ui/forms.py:63
#: mailu/ui/forms.py:73 mailu/ui/forms.py:132 mailu/ui/forms.py:141 #: mailu/ui/forms.py:116 mailu/ui/forms.py:125
msgid "Create" msgid "Create"
msgstr "" msgstr ""
#: mailu/ui/forms.py:57 #: mailu/ui/forms.py:55
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
msgid "Alternative name" msgid "Alternative name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:70 #: mailu/ui/forms.py:60
msgid "Relayed domain name" msgid "Relayed domain name"
msgstr "" 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" msgid "Remote host"
msgstr "" msgstr ""
#: mailu/ui/forms.py:80 mailu/ui/templates/user/list.html:22 #: mailu/ui/forms.py:69
#: mailu/ui/templates/user/signup_domain.html:16 msgid "Confirm password"
msgstr ""
#: mailu/ui/forms.py:70 mailu/ui/templates/user/list.html:22
msgid "Quota" msgid "Quota"
msgstr "" msgstr ""
#: mailu/ui/forms.py:81 #: mailu/ui/forms.py:71
msgid "Allow IMAP access" msgid "Allow IMAP access"
msgstr "" msgstr ""
#: mailu/ui/forms.py:82 #: mailu/ui/forms.py:72
msgid "Allow POP3 access" msgid "Allow POP3 access"
msgstr "" msgstr ""
#: mailu/ui/forms.py:84 #: mailu/ui/forms.py:74
msgid "Enabled"
msgstr ""
#: mailu/ui/forms.py:85
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: mailu/ui/forms.py:89 #: mailu/ui/forms.py:78
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
msgid "Displayed name" msgid "Displayed name"
msgstr "" msgstr ""
#: mailu/ui/forms.py:98 #: mailu/ui/forms.py:79
msgid "Enable spam filter" msgid "Enable spam filter"
msgstr "" msgstr ""
#: mailu/ui/forms.py:99 #: mailu/ui/forms.py:80
msgid "Spam filter tolerance" msgid "Spam filter tolerance"
msgstr "" 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" msgid "Enable forwarding"
msgstr "" msgstr ""
#: mailu/ui/forms.py:101 #: mailu/ui/forms.py:92
msgid "Keep a copy of the emails" msgid "Keep a copy of the emails"
msgstr "" 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 #: mailu/ui/templates/alias/list.html:20
msgid "Destination" msgid "Destination"
msgstr "" msgstr ""
#: mailu/ui/forms.py:105 #: mailu/ui/forms.py:96 mailu/ui/forms.py:104
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
msgid "Update" msgid "Update"
msgstr "" 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)" 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" msgid "Authorized IP"
msgstr "" msgstr ""
#: mailu/ui/forms.py:136 #: mailu/ui/forms.py:120
msgid "Alias" msgid "Alias"
msgstr "" msgstr ""
#: mailu/ui/forms.py:138 #: mailu/ui/forms.py:122
msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)" msgid "Use SQL LIKE Syntax (e.g. for catch-all aliases)"
msgstr "" msgstr ""
#: mailu/ui/forms.py:145 #: mailu/ui/forms.py:129
msgid "Admin email" msgid "Admin email"
msgstr "" 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" msgid "Submit"
msgstr "" msgstr ""
#: mailu/ui/forms.py:150 #: mailu/ui/forms.py:134
msgid "Manager email" msgid "Manager email"
msgstr "" msgstr ""
#: mailu/ui/forms.py:155 #: mailu/ui/forms.py:139
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: mailu/ui/forms.py:158 #: mailu/ui/forms.py:142
msgid "Hostname or IP" msgid "Hostname or IP"
msgstr "" msgstr ""
#: mailu/ui/forms.py:159 mailu/ui/templates/client.html:20 #: mailu/ui/forms.py:143
#: mailu/ui/templates/client.html:47
msgid "TCP port" msgid "TCP port"
msgstr "" msgstr ""
#: mailu/ui/forms.py:160 #: mailu/ui/forms.py:144
msgid "Enable TLS" msgid "Enable TLS"
msgstr "" msgstr ""
#: mailu/ui/forms.py:161 mailu/ui/templates/client.html:28 #: mailu/ui/forms.py:145 mailu/ui/templates/fetch/list.html:20
#: mailu/ui/templates/client.html:55 mailu/ui/templates/fetch/list.html:20
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: mailu/ui/forms.py:163 #: mailu/ui/forms.py:147
msgid "Keep emails on the server" msgid "Keep emails on the server"
msgstr "" msgstr ""
#: mailu/ui/forms.py:168 #: mailu/ui/forms.py:152
msgid "Announcement subject" msgid "Announcement subject"
msgstr "" msgstr ""
#: mailu/ui/forms.py:170 #: mailu/ui/forms.py:154
msgid "Announcement body" msgid "Announcement body"
msgstr "" msgstr ""
#: mailu/ui/forms.py:172 #: mailu/ui/forms.py:156
msgid "Send" msgid "Send"
msgstr "" msgstr ""
@@ -257,16 +222,8 @@ msgstr ""
msgid "Public announcement" msgid "Public announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/client.html:4 mailu/ui/templates/sidebar.html:82 #: mailu/ui/templates/announcement.html:8
msgid "Client setup" msgid "from"
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 "" msgstr ""
#: mailu/ui/templates/confirm.html:4 #: mailu/ui/templates/confirm.html:4
@@ -290,43 +247,75 @@ msgstr ""
msgid "to access the administration tools" msgid "to access the administration tools"
msgstr "" 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 #: mailu/ui/templates/sidebar.html:11 mailu/ui/templates/user/list.html:34
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:21 mailu/ui/templates/user/list.html:35 #: 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" msgid "Auto-reply"
msgstr "" msgstr ""
#: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:26 #: mailu/ui/templates/fetch/list.html:4 mailu/ui/templates/sidebar.html:31
#: mailu/ui/templates/user/list.html:36 #: mailu/ui/templates/user/list.html:37
msgid "Fetched accounts" msgid "Fetched accounts"
msgstr "" 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" msgid "Authentication tokens"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:35 #: mailu/ui/templates/sidebar.html:40
msgid "Administration" msgid "Administration"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:44 #: mailu/ui/templates/sidebar.html:49
msgid "Announcement" msgid "Announcement"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:49 #: mailu/ui/templates/sidebar.html:54
msgid "Administrators" msgid "Administrators"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:54 #: mailu/ui/templates/sidebar.html:59
msgid "Relayed domains" msgid "Relayed domains"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:59 mailu/ui/templates/user/settings.html:15
msgid "Antispam"
msgstr ""
#: mailu/ui/templates/sidebar.html:66 #: mailu/ui/templates/sidebar.html:66
msgid "Mail domains" msgid "Mail domains"
msgstr "" msgstr ""
@@ -339,19 +328,15 @@ msgstr ""
msgid "Webmail" msgid "Webmail"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:87 #: mailu/ui/templates/sidebar.html:82
msgid "Website" msgid "Website"
msgstr "" msgstr ""
#: mailu/ui/templates/sidebar.html:92 #: mailu/ui/templates/sidebar.html:87
msgid "Help" msgid "Help"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/signup.html:4 mailu/ui/templates/sidebar.html:98 #: mailu/ui/templates/sidebar.html:93
msgid "Register a domain"
msgstr ""
#: mailu/ui/templates/sidebar.html:105
msgid "Sign out" msgid "Sign out"
msgstr "" msgstr ""
@@ -455,31 +440,27 @@ msgstr ""
msgid "Domain details" msgid "Domain details"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:15 #: mailu/ui/templates/domain/details.html:13
msgid "Regenerate keys" msgid "Regenerate keys"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:17 #: mailu/ui/templates/domain/details.html:25
msgid "Generate keys"
msgstr ""
#: mailu/ui/templates/domain/details.html:31
msgid "DNS MX entry" msgid "DNS MX entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:35 #: mailu/ui/templates/domain/details.html:29
msgid "DNS SPF entries" msgid "DNS SPF entries"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:42 #: mailu/ui/templates/domain/details.html:36
msgid "DKIM public key" msgid "DKIM public key"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:46 #: mailu/ui/templates/domain/details.html:40
msgid "DNS DKIM entry" msgid "DNS DKIM entry"
msgstr "" msgstr ""
#: mailu/ui/templates/domain/details.html:50 #: mailu/ui/templates/domain/details.html:44
msgid "DNS DMARC entry" msgid "DNS DMARC entry"
msgstr "" msgstr ""
@@ -523,23 +504,6 @@ msgstr ""
msgid "Alternatives" msgid "Alternatives"
msgstr "" 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 #: mailu/ui/templates/fetch/create.html:4
msgid "Add a fetched account" msgid "Add a fetched account"
msgstr "" msgstr ""
@@ -616,7 +580,7 @@ msgstr ""
msgid "General" msgid "General"
msgstr "" msgstr ""
#: mailu/ui/templates/user/create.html:22 #: mailu/ui/templates/user/create.html:21
msgid "Features and quotas" msgid "Features and quotas"
msgstr "" msgstr ""
@@ -652,19 +616,11 @@ msgstr ""
msgid "Automatic reply" msgid "Automatic reply"
msgstr "" msgstr ""
#: mailu/ui/templates/user/settings.html:22 #: mailu/ui/templates/user/settings.html:14
msgid "Auto-forward" msgid "General settings"
msgstr "" msgstr ""
#: mailu/ui/templates/user/signup_domain.html:8 #: mailu/ui/templates/user/settings.html:18
msgid "pick a domain for the new account" msgid "Antispam"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:14
msgid "Domain"
msgstr ""
#: mailu/ui/templates/user/signup_domain.html:15
msgid "Available slots"
msgstr "" 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 from alembic import op
import sqlalchemy as sa import sqlalchemy as sa
from mailu import app
fetch_table = sa.Table( fetch_table = sa.Table(
'fetch', 'fetch',
@@ -22,7 +24,13 @@ fetch_table = sa.Table(
def upgrade(): def upgrade():
connection = op.get_bind()
op.add_column('fetch', sa.Column('keep', sa.Boolean(), nullable=False, server_default=sa.sql.expression.false())) 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(): 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 alembic==0.9.6
asn1crypto==0.24.0 asn1crypto==0.23.0
Babel==2.6.0 Babel==2.5.1
bcrypt==3.1.5
blinker==1.4 blinker==1.4
cffi==1.11.5 certifi==2017.7.27.1
Click==7.0 cffi==1.11.2
cryptography==2.3.1 chardet==3.0.4
decorator==4.3.0 click==6.7
dnspython==1.16.0 cryptography==2.1.2
dominate==2.3.4 decorator==4.1.2
Flask==1.0.2 docker-py==1.10.6
Flask-Babel==0.12.2 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-Bootstrap==3.3.7.1
Flask-DebugToolbar==0.10.1 Flask-DebugToolbar==0.10.1
Flask-Limiter==1.0.1 Flask-Limiter==0.9.5.1
Flask-Login==0.4.1 Flask-Login==0.4.0
Flask-Migrate==2.3.1 Flask-Migrate==2.1.1
Flask-Script==2.0.6 Flask-Script==2.0.6
Flask-SQLAlchemy==2.3.2 Flask-SQLAlchemy==2.3.2
Flask-WTF==0.14.2 Flask-WTF==0.14.2
gunicorn==19.9.0 gunicorn==19.7.1
idna==2.7 idna==2.6
infinity==1.4 infinity==1.4
intervals==0.8.1 intervals==0.8.0
itsdangerous==1.1.0 itsdangerous==0.24
Jinja2==2.10 Jinja2==2.9.6
limits==1.3 limits==1.2.1
Mako==1.0.7 Mako==1.0.7
MarkupSafe==1.1.0 MarkupSafe==1.0
passlib==1.7.1 passlib==1.7.1
pycparser==2.19 pycparser==2.18
pyOpenSSL==18.0.0 pyOpenSSL==17.3.0
python-dateutil==2.7.5 python-dateutil==2.6.1
python-editor==1.0.3 python-editor==1.0.3
pytz==2018.7 pytz==2017.2
PyYAML==3.13 PyYAML==3.12
redis==3.0.1 redis==2.10.6
requests==2.18.4
six==1.11.0 six==1.11.0
SQLAlchemy==1.2.13 SQLAlchemy==1.1.14
tabulate==0.8.2 tabulate==0.8.1
tenacity==5.0.2 urllib3==1.22
validators==0.12.2 validators==0.12.0
visitor==0.1.3 visitor==0.1.3
Werkzeug==0.14.1 websocket-client==0.44.0
WTForms==2.2.1 Werkzeug==0.12.2
WTForms==2.1
WTForms-Components==0.10.3 WTForms-Components==0.10.3

View File

@@ -12,8 +12,7 @@ redis
WTForms-Components WTForms-Components
passlib passlib
gunicorn gunicorn
docker-py
tabulate tabulate
PyYAML PyYAML
PyOpenSSL 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 FROM alpine:3.13
# python3 shared with most images
RUN apk add --no-cache \ RUN echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \
python3 py3-pip \ && apk add --no-cache \
&& pip3 install --upgrade pip dovecot dovecot-sqlite dovecot-pigeonhole-plugin \
# Shared layer between rspamd, postfix, dovecot, unbound and nginx rspamd-client python3 py3-jinja2
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
COPY conf /conf COPY conf /conf
COPY sieve /var/lib/dovecot
COPY start.py /start.py COPY start.py /start.py
EXPOSE 110/tcp 143/tcp 993/tcp 4190/tcp 2525/tcp
VOLUME ["/data", "/mail"]
CMD /start.py 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 protocols = imap pop3 lmtp sieve
postmaster_address = {{ POSTMASTER }}@{{ DOMAIN }} postmaster_address = {{ POSTMASTER }}@{{ DOMAIN }}
hostname = {{ HOSTNAMES.split(",")[0] }} hostname = {{ HOSTNAMES.split(",")[0] }}
submission_host = {{ FRONT_ADDRESS }} mail_plugins = $mail_plugins quota
submission_host = front
{% if DISABLE_FTS_LUCENE != 'true' %} service dict {
############### unix_listener dict {
# Full-text search group = mail
############### mode = 0660
mail_plugins = $mail_plugins fts fts_lucene }
}
plugin {
fts = lucene dict {
sieve = sqlite:/etc/dovecot/pigeonhole-sieve.dict
fts_autoindex = yes
fts_autoindex_exclude = \Junk
fts_lucene = whitespace_chars=@.
} }
{% endif %}
############### ###############
# Mailboxes # Mailboxes
@@ -35,49 +31,42 @@ mail_gid = mail
mail_privileged_group = mail mail_privileged_group = mail
mail_access_groups = mail mail_access_groups = mail
maildir_stat_dirs = yes maildir_stat_dirs = yes
mailbox_list_index = yes
mail_vsize_bg_after_count = 100
mail_plugins = $mail_plugins quota quota_clone zlib
namespace inbox { namespace inbox {
inbox = yes inbox = yes
{% for mailbox in ("Trash", "Drafts", "Sent", "Junk") %} mailbox Trash {
mailbox {{ mailbox }} {
auto = subscribe 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 # Authentication
############### ###############
auth_username_chars =
auth_mechanisms = plain login auth_mechanisms = plain login
disable_plaintext_auth = no disable_plaintext_auth = no
ssl_protocols = !SSLv3
passdb { passdb {
driver = dict driver = sql
args = /etc/dovecot/auth.conf args = /etc/dovecot/dovecot-sql.conf.ext
} }
userdb { userdb {
driver = dict driver = sql
args = /etc/dovecot/auth.conf args = /etc/dovecot/dovecot-sql.conf.ext
} }
service auth { service auth {
@@ -98,6 +87,7 @@ service auth-worker {
############### ###############
# IMAP & POP # IMAP & POP
############### ###############
protocol imap { protocol imap {
mail_plugins = $mail_plugins imap_quota imap_sieve mail_plugins = $mail_plugins imap_quota imap_sieve
} }
@@ -115,6 +105,7 @@ service imap-login {
############### ###############
# Delivery # Delivery
############### ###############
protocol lmtp { protocol lmtp {
mail_plugins = $mail_plugins sieve mail_plugins = $mail_plugins sieve
recipient_delimiter = {{ RECIPIENT_DELIMITER }} recipient_delimiter = {{ RECIPIENT_DELIMITER }}
@@ -126,9 +117,15 @@ service lmtp {
} }
} }
plugin {
quota = maildir:User quota
}
############### ###############
# Filtering # Filtering
############### ###############
service managesieve-login { service managesieve-login {
inet_listener sieve { inet_listener sieve {
port = 4190 port = 4190
@@ -140,13 +137,15 @@ service managesieve {
plugin { plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_before = dict:proxy:/tmp/podop.socket:sieve sieve_plugins = sieve_extdata sieve_imapsieve sieve_extprograms
sieve_plugins = sieve_imapsieve sieve_extprograms sieve_global_extensions = +vnd.dovecot.extdata +spamtest +spamtestplus +vnd.dovecot.execute
sieve_extensions = +spamtest +spamtestplus +editheader sieve_before = /var/lib/dovecot/before.sieve
sieve_global_extensions = +vnd.dovecot.execute sieve_default = /var/lib/dovecot/default.sieve
sieve_after = /var/lib/dovecot/after.sieve
sieve_extdata_dict_uri = proxy::sieve
# Sieve execute # Sieve execute
sieve_execute_bin_dir = /conf/bin sieve_execute_bin_dir = /var/lib/dovecot/bin
# Send vacation replies even for aliases # Send vacation replies even for aliases
# See the Pigeonhole documentation about warnings: http://wiki2.dovecot.org/Pigeonhole/Sieve/Extensions/Vacation # See the Pigeonhole documentation about warnings: http://wiki2.dovecot.org/Pigeonhole/Sieve/Extensions/Vacation
@@ -165,11 +164,11 @@ plugin {
# Learn from spam # Learn from spam
imapsieve_mailbox1_name = Junk imapsieve_mailbox1_name = Junk
imapsieve_mailbox1_causes = COPY 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_name = *
imapsieve_mailbox2_from = Junk imapsieve_mailbox2_from = Junk
imapsieve_mailbox2_causes = COPY 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; 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 os
import socket import socket
import glob 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)) convert = lambda src, dst: open(dst, "w").write(jinja2.Template(open(src).read()).render(**os.environ))
# Actual startup script # 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"] = socket.gethostbyname("front")
os.environ["FRONT_ADDRESS"] = resolve(os.environ.get("FRONT_ADDRESS", "front"))
os.environ["REDIS_ADDRESS"] = resolve(os.environ.get("REDIS_ADDRESS", "redis"))
if os.environ["WEBMAIL"] != "none": 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))) convert(dovecot_file, os.path.join("/etc/dovecot", os.path.basename(dovecot_file)))
# Run Podop, then postfix # Run postfix
multiprocessing.Process(target=start_podop).start() os.system("chown -R mail:mail /mail /var/lib/dovecot")
os.system("chown -R mail:mail /mail /var/lib/dovecot /conf")
os.execv("/usr/sbin/dovecot", ["dovecot", "-c", "/etc/dovecot/dovecot.conf", "-F"]) os.execv("/usr/sbin/dovecot", ["dovecot", "-c", "/etc/dovecot/dovecot.conf", "-F"])

View File

@@ -1,21 +1,11 @@
FROM alpine:3.8 FROM alpine:3.13
# python3 shared with most images
RUN apk add --no-cache \ RUN apk add --no-cache nginx nginx-mod-mail python3 py3-jinja2 certbot openssl
python3 py3-pip \ # added to fix #522
&& pip3 install --upgrade pip RUN apk add --no-cache py-requests-toolbelt py-pip
# Shared layer between rspamd, postfix, dovecot, unbound and nginx RUN pip install "idna<2.7"
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
COPY conf /conf COPY conf /conf
COPY *.py / 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 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; absolute_redirect off;
resolver {{ RESOLVER }} valid=30s; 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 # Header maps
map $http_x_forwarded_proto $proxy_x_forwarded_proto { map $http_x_forwarded_proto $proxy_x_forwarded_proto {
default $http_x_forwarded_proto; default $http_x_forwarded_proto;
'' $scheme; '' $scheme;
} }
# Disable the main http server when on kubernetes (port 80 and 443)
{% if KUBERNETES_INGRESS != 'true' %}
# Main HTTP server # Main HTTP server
server { server {
# Variables for proxifying # Variables for proxifying
set $admin {{ HOST_ADMIN }}; set $admin admin;
set $antispam {{ HOST_ANTISPAM }}; set $antispam antispam:11334;
set $webmail {{ HOST_WEBMAIL }}; set $webmail webmail;
set $webdav {{ HOST_WEBDAV }}; set $webdav webdav:5232;
# Always listen over HTTP # Always listen over HTTP
listen 80; listen 80;
@@ -50,61 +40,45 @@ http {
# Only enable HTTPS if TLS is enabled with no error # Only enable HTTPS if TLS is enabled with no error
{% if TLS and not TLS_ERROR %} {% if TLS and not TLS_ERROR %}
listen 443 ssl http2; listen 443 ssl;
listen [::]:443 ssl http2; listen [::]:443 ssl;
include /etc/nginx/tls.conf; include /etc/nginx/tls.conf;
ssl_session_cache shared:SSLHTTP:50m; 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 not TLS_FLAVOR == "mail" %}
if ($proxy_x_forwarded_proto = http) { if ($scheme = http) {
return 301 https://$host$request_uri; return 301 https://$host$request_uri;
} }
{% endif %} {% endif %}
{% 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 # 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/ { location ^~ /.well-known/acme-challenge/ {
proxy_pass http://127.0.0.1:8008; proxy_pass http://127.0.0.1:8008;
} }
{% endif %} {% endif %}
# If TLS is failing, prevent access to anything except certbot # If TLS is failing, prevent access to anything except certbot
{% if TLS_ERROR and not TLS_FLAVOR == "mail" %} {% if TLS_ERROR %}
location / { location / {
return 403; return 403;
} }
{% else %} {% else %}
include /overrides/*.conf;
# Actual logic # Actual logic
{% if WEB_WEBMAIL != '/' %}
location / {
{% if WEBROOT_REDIRECT %}
return 301 {{ WEBROOT_REDIRECT }};
{% else %}
return 404;
{% endif %}
}
{% endif %}
{% if WEBMAIL != 'none' %} {% if WEBMAIL != 'none' %}
location / {
return 301 {{ WEB_WEBMAIL }};
}
location {{ WEB_WEBMAIL }} { location {{ WEB_WEBMAIL }} {
{% if WEB_WEBMAIL != '/' %}
rewrite ^({{ WEB_WEBMAIL }})$ $1/ permanent; rewrite ^({{ WEB_WEBMAIL }})$ $1/ permanent;
rewrite ^{{ WEB_WEBMAIL }}/(.*) /$1 break; rewrite ^{{ WEB_WEBMAIL }}/(.*) /$1 break;
{% endif %}
include /etc/nginx/proxy.conf; include /etc/nginx/proxy.conf;
client_max_body_size {{ MESSAGE_SIZE_LIMIT|int + 8388608 }}; client_max_body_size 30M;
proxy_pass http://$webmail; proxy_pass http://$webmail;
} }
{% endif %} {% endif %}
@@ -156,17 +130,12 @@ http {
proxy_pass_request_body off; proxy_pass_request_body off;
proxy_set_header Content-Length ""; proxy_set_header Content-Length "";
} }
location /health {
return 204;
}
} }
{% endif %}
# Forwarding authentication server # Forwarding authentication server
server { server {
# Variables for proxifying # Variables for proxifying
set $admin {{ HOST_ADMIN }}; set $admin admin;
listen 127.0.0.1:8000; listen 127.0.0.1:8000;
@@ -180,7 +149,6 @@ mail {
server_name {{ HOSTNAMES.split(",")[0] }}; server_name {{ HOSTNAMES.split(",")[0] }};
auth_http http://127.0.0.1:8000/auth/email; auth_http http://127.0.0.1:8000/auth/email;
proxy_pass_error_message on; proxy_pass_error_message on;
resolver {{ RESOLVER }} valid=30s;
{% if TLS and not TLS_ERROR %} {% if TLS and not TLS_ERROR %}
include /etc/nginx/tls.conf; include /etc/nginx/tls.conf;
@@ -251,7 +219,7 @@ mail {
listen 465 ssl; listen 465 ssl;
listen [::]:465 ssl; listen [::]:465 ssl;
protocol smtp; protocol smtp;
smtp_auth plain login; smtp_auth plain;
} }
server { server {

View File

@@ -1,5 +1,5 @@
# Default proxy setup # 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-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; 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_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_prefer_server_ciphers on;
ssl_session_timeout 10m; ssl_session_timeout 10m;
ssl_session_tickets off;
ssl_certificate {{ TLS[0] }}; ssl_certificate {{ TLS[0] }};
ssl_certificate_key {{ TLS[1] }}; ssl_certificate_key {{ TLS[1] }};
ssl_dhparam /conf/dhparam.pem; ssl_dhparam /conf/dhparam.pem;

View File

@@ -12,25 +12,13 @@ with open("/etc/resolv.conf") as handle:
content = handle.read().split() content = handle.read().split()
args["RESOLVER"] = content[content.index("nameserver") + 1] 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 # TLS configuration
cert_name = os.getenv("TLS_CERT_FILENAME", default="cert.pem")
keypair_name = os.getenv("TLS_KEYPAIR_FILENAME", default="key.pem")
args["TLS"] = { 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", "letsencrypt": ("/certs/letsencrypt/live/mailu/fullchain.pem",
"/certs/letsencrypt/live/mailu/privkey.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 "notls": None
}[args["TLS_FLAVOR"]] }[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") print("Missing cert or key file, disabling TLS")
args["TLS_ERROR"] = "yes" args["TLS_ERROR"] = "yes"
# Build final configuration paths # Build final configuration paths
convert("/conf/tls.conf", "/etc/nginx/tls.conf", args) convert("/conf/tls.conf", "/etc/nginx/tls.conf", args)
convert("/conf/proxy.conf", "/etc/nginx/proxy.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"): if os.path.exists("/var/run/nginx.pid"):
os.remove("/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"]) subprocess.Popen(["/letsencrypt.py"])
elif os.environ["TLS_FLAVOR"] in [ "mail", "cert" ]:
subprocess.Popen(["/certwatcher.py"])
subprocess.call(["/config.py"]) subprocess.call(["/config.py"])
os.execv("/usr/sbin/nginx", ["nginx", "-g", "daemon off;"]) 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