Merge branch 'dev' into master

master
André Peters 2018-02-28 15:38:56 +01:00 committed by GitHub
commit b175125d02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
93 changed files with 2693 additions and 2140 deletions

1
.gitignore vendored
View File

@ -21,4 +21,3 @@ data/conf/nginx/*.conf
data/conf/nginx/*.custom
data/conf/nginx/*.bak
data/conf/dovecot/extra.conf
data/conf/rspamd/override.d/worker-controller-password.inc

View File

@ -7,6 +7,7 @@ if [[ "${SKIP_CLAMD}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
fi
# Create log pipes
mkdir /var/log/clamav
touch /var/log/clamav/clamd.log /var/log/clamav/freshclam.log
mkfifo -m 600 /tmp/logpipe_clamd
mkfifo -m 600 /tmp/logpipe_freshclam

View File

@ -2,7 +2,7 @@ FROM python:2-alpine
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
RUN apk add -U --no-cache iptables ip6tables
RUN pip install docker flask flask-restful
RUN pip install docker==3.0.1 flask flask-restful
COPY server.py /
CMD ["python2", "-u", "/server.py"]

View File

@ -22,7 +22,7 @@ class containers_get(Resource):
containers.update({container.attrs['Id']: container.attrs})
return containers
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
class container_get(Resource):
def get(self, container_id):
@ -31,7 +31,7 @@ class container_get(Resource):
for container in docker_client.containers.list(all=True, filters={"id": container_id}):
return container.attrs
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
else:
return jsonify(type='danger', msg='no or invalid id defined')
@ -44,7 +44,7 @@ class container_post(Resource):
container.stop()
return jsonify(type='success', msg='command completed successfully')
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
elif post_action == 'start':
try:
@ -52,7 +52,7 @@ class container_post(Resource):
container.start()
return jsonify(type='success', msg='command completed successfully')
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
elif post_action == 'restart':
try:
@ -60,36 +60,53 @@ class container_post(Resource):
container.restart()
return jsonify(type='success', msg='command completed successfully')
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
elif post_action == 'exec':
if not request.json or not 'cmd' in request.json:
return jsonify(type='danger', msg='cmd is missing')
if request.json['cmd'] == 'sieve_list' and request.json['username']:
if request.json['cmd'] == 'df' and request.json['dir']:
try:
for container in docker_client.containers.list(filters={"id": container_id}):
return container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve list -u '" + request.json['username'].replace("'", "'\\''") + "'"], user='vmail')
# Should be changed to be able to validate a path
directory = re.sub('[^0-9a-zA-Z/]+', '', request.json['dir'])
df_return = container.exec_run(["/bin/bash", "-c", "/bin/df -H " + directory + " | /usr/bin/tail -n1 | /usr/bin/tr -s [:blank:] | /usr/bin/tr ' ' ','"], user='nobody')
if df_return.exit_code == 0:
return df_return.output.rstrip()
else:
return "0,0,0,0,0,0"
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
elif request.json['cmd'] == 'sieve_list' and request.json['username']:
try:
for container in docker_client.containers.list(filters={"id": container_id}):
sieve_return = container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve list -u '" + request.json['username'].replace("'", "'\\''") + "'"], user='vmail')
return sieve_return.output
except Exception as e:
return jsonify(type='danger', msg=str(e))
elif request.json['cmd'] == 'sieve_print' and request.json['script_name'] and request.json['username']:
try:
for container in docker_client.containers.list(filters={"id": container_id}):
return container.exec_run(["/bin/bash", "-c", "/usr/local/bin/doveadm sieve get -u '" + request.json['username'].replace("'", "'\\''") + "' '" + request.json['script_name'].replace("'", "'\\''") + "'"], user='vmail')
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
elif request.json['cmd'] == 'worker_password' and request.json['raw']:
try:
for container in docker_client.containers.list(filters={"id": container_id}):
hash = container.exec_run(["/bin/bash", "-c", "/usr/bin/rspamadm pw -e -p '" + request.json['raw'].replace("'", "'\\''") + "' 2> /dev/null"], user='_rspamd')
f = open("/access.inc", "w")
f.write('enable_password = "' + re.sub('[^0-9a-zA-Z\$]+', '', hash.rstrip()) + '";\n')
f.close()
container.restart()
return jsonify(type='success', msg='command completed successfully')
if hash.exit_code == 0:
hash = str(hash.output)
f = open("/access.inc", "w")
f.write('enable_password = "' + re.sub('[^0-9a-zA-Z\$]+', '', hash.rstrip()) + '";\n')
f.close()
container.restart()
return jsonify(type='success', msg='command completed successfully')
else:
return jsonify(type='danger', msg='command did not complete, exit code was ' + int(hash.exit_code))
except Exception as e:
return jsonify(type='danger', msg=e)
return jsonify(type='danger', msg=str(e))
else:
return jsonify(type='danger', msg='Unknown command')

View File

@ -82,7 +82,7 @@ cat <<EOF > /usr/local/etc/dovecot/sql/dovecot-dict-sql-passdb.conf
driver = mysql
connect = "host=mysql dbname=${DBNAME} user=${DBUSER} password=${DBPASS}"
default_pass_scheme = SSHA256
password_query = SELECT password FROM mailbox WHERE username = '%u' AND domain IN (SELECT domain FROM domain WHERE domain='%d' AND active='1')
password_query = SELECT password FROM mailbox WHERE username = '%u' AND domain IN (SELECT domain FROM domain WHERE domain='%d' AND active='1') AND JSON_EXTRACT(attributes, "$.force_pw_update") NOT LIKE '%1%'
user_query = SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, 5000 AS uid, 5000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT username FROM mailbox WHERE active='1';
EOF

View File

@ -1,4 +1,4 @@
#!/bin/bash
/usr/bin/curl -s --data-binary @- http://rspamd:11334/learnham < /dev/stdin
/usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/learnham < /dev/stdin
# Always return 0 to satisfy Dovecot...
exit 0

View File

@ -1,4 +1,4 @@
#!/bin/bash
/usr/bin/curl -s --data-binary @- http://rspamd:11334/learnspam < /dev/stdin
/usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/learnspam < /dev/stdin
# Always return 0 to satisfy Dovecot...
exit 0

View File

@ -1,8 +0,0 @@
FROM python:2-alpine
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
RUN apk add -U --no-cache iptables ip6tables
RUN pip install redis ipaddress
COPY logwatch.py /
CMD ["python2", "-u", "/logwatch.py"]

View File

@ -1,192 +0,0 @@
#!/usr/bin/env python2
import re
import os
import time
import atexit
import signal
import ipaddress
import subprocess
from threading import Thread
import redis
import time
import json
yes_regex = re.compile(r'([yY][eE][sS]|[yY])+$')
if re.search(yes_regex, os.getenv('SKIP_FAIL2BAN', 0)):
print 'SKIP_FAIL2BAN=y, Skipping Fail2ban container...'
time.sleep(31536000)
raise SystemExit
r = redis.StrictRedis(host=os.getenv('IPV4_NETWORK', '172.22.1') + '.249', decode_responses=True, port=6379, db=0)
pubsub = r.pubsub()
RULES = {}
RULES[1] = 'warning: .*\[([0-9a-f\.:]+)\]: SASL .+ authentication failed'
RULES[2] = '-login: Disconnected \(auth failed, .+\): user=.*, method=.+, rip=([0-9a-f\.:]+),'
RULES[3] = '-login: Aborted login \(no auth .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
RULES[4] = '-login: Aborted login \(tried to use disallowed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
RULES[5] = 'SOGo.+ Login from \'([0-9a-f\.:]+)\' for user .+ might not have worked'
RULES[6] = 'mailcow UI: Invalid password for .+ by ([0-9a-f\.:]+)'
r.setnx('F2B_BAN_TIME', '1800')
r.setnx('F2B_MAX_ATTEMPTS', '10')
r.setnx('F2B_RETRY_WINDOW', '600')
r.setnx('F2B_NETBAN_IPV6', '64')
r.setnx('F2B_NETBAN_IPV4', '24')
bans = {}
log = {}
quit_now = False
def ban(address):
BAN_TIME = int(r.get('F2B_BAN_TIME'))
MAX_ATTEMPTS = int(r.get('F2B_MAX_ATTEMPTS'))
RETRY_WINDOW = int(r.get('F2B_RETRY_WINDOW'))
WHITELIST = r.hgetall('F2B_WHITELIST')
NETBAN_IPV6 = '/' + str(r.get('F2B_NETBAN_IPV6'))
NETBAN_IPV4 = '/' + str(r.get('F2B_NETBAN_IPV4'))
ip = ipaddress.ip_address(address.decode('ascii'))
if type(ip) is ipaddress.IPv6Address and ip.ipv4_mapped:
ip = ip.ipv4_mapped
address = str(ip)
if ip.is_private or ip.is_loopback:
return
self_network = ipaddress.ip_network(address.decode('ascii'))
if WHITELIST:
for wl_key in WHITELIST:
wl_net = ipaddress.ip_network(wl_key.decode('ascii'), False)
if wl_net.overlaps(self_network):
log['time'] = int(round(time.time()))
log['priority'] = 'info'
log['message'] = 'Address %s is whitelisted by rule %s' % (self_network, wl_net)
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
print 'Address %s is whitelisted by rule %s' % (self_network, wl_net)
return
net = ipaddress.ip_network((address + (NETBAN_IPV4 if type(ip) is ipaddress.IPv4Address else NETBAN_IPV6)).decode('ascii'), strict=False)
net = str(net)
if not net in bans or time.time() - bans[net]['last_attempt'] > RETRY_WINDOW:
bans[net] = { 'attempts': 0 }
active_window = RETRY_WINDOW
else:
active_window = time.time() - bans[net]['last_attempt']
bans[net]['attempts'] += 1
bans[net]['last_attempt'] = time.time()
active_window = time.time() - bans[net]['last_attempt']
if bans[net]['attempts'] >= MAX_ATTEMPTS:
log['time'] = int(round(time.time()))
log['priority'] = 'crit'
log['message'] = 'Banning %s' % net
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
print 'Banning %s for %d minutes' % (net, BAN_TIME / 60)
if type(ip) is ipaddress.IPv4Address:
subprocess.call(['iptables', '-I', 'INPUT', '-s', net, '-j', 'REJECT'])
subprocess.call(['iptables', '-I', 'FORWARD', '-s', net, '-j', 'REJECT'])
else:
subprocess.call(['ip6tables', '-I', 'INPUT', '-s', net, '-j', 'REJECT'])
subprocess.call(['ip6tables', '-I', 'FORWARD', '-s', net, '-j', 'REJECT'])
r.hset('F2B_ACTIVE_BANS', '%s' % net, log['time'] + BAN_TIME)
else:
log['time'] = int(round(time.time()))
log['priority'] = 'warn'
log['message'] = '%d more attempts in the next %d seconds until %s is banned' % (MAX_ATTEMPTS - bans[net]['attempts'], RETRY_WINDOW, net)
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
print '%d more attempts in the next %d seconds until %s is banned' % (MAX_ATTEMPTS - bans[net]['attempts'], RETRY_WINDOW, net)
def unban(net):
log['time'] = int(round(time.time()))
log['priority'] = 'info'
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
if not net in bans:
log['message'] = '%s is not banned, skipping unban and deleting from queue (if any)' % net
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
print '%s is not banned, skipping unban and deleting from queue (if any)' % net
r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
return
log['message'] = 'Unbanning %s' % net
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
print 'Unbanning %s' % net
if type(ipaddress.ip_network(net.decode('ascii'))) is ipaddress.IPv4Network:
subprocess.call(['iptables', '-D', 'INPUT', '-s', net, '-j', 'REJECT'])
subprocess.call(['iptables', '-D', 'FORWARD', '-s', net, '-j', 'REJECT'])
else:
subprocess.call(['ip6tables', '-D', 'INPUT', '-s', net, '-j', 'REJECT'])
subprocess.call(['ip6tables', '-D', 'FORWARD', '-s', net, '-j', 'REJECT'])
r.hdel('F2B_ACTIVE_BANS', '%s' % net)
r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
del bans[net]
def quit(signum, frame):
global quit_now
quit_now = True
def clear():
log['time'] = int(round(time.time()))
log['priority'] = 'info'
log['message'] = 'Clearing all bans'
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
print 'Clearing all bans'
for net in bans.copy():
unban(net)
pubsub.unsubscribe()
def watch():
log['time'] = int(round(time.time()))
log['priority'] = 'info'
log['message'] = 'Watching Redis channel F2B_CHANNEL'
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
pubsub.subscribe('F2B_CHANNEL')
print 'Subscribing to Redis channel F2B_CHANNEL'
while True:
for item in pubsub.listen():
for rule_id, rule_regex in RULES.iteritems():
if item['data'] and item['type'] == 'message':
result = re.search(rule_regex, item['data'])
if result:
addr = result.group(1)
ip = ipaddress.ip_address(addr.decode('ascii'))
if ip.is_private or ip.is_loopback:
continue
print '%s matched rule id %d' % (addr, rule_id)
log['time'] = int(round(time.time()))
log['priority'] = 'warn'
log['message'] = '%s matched rule id %d' % (addr, rule_id)
r.lpush('F2B_LOG', json.dumps(log, ensure_ascii=False))
ban(addr)
def autopurge():
while not quit_now:
BAN_TIME = int(r.get('F2B_BAN_TIME'))
MAX_ATTEMPTS = int(r.get('F2B_MAX_ATTEMPTS'))
QUEUE_UNBAN = r.hgetall('F2B_QUEUE_UNBAN')
if QUEUE_UNBAN:
for net in QUEUE_UNBAN:
unban(str(net))
for net in bans.copy():
if bans[net]['attempts'] >= MAX_ATTEMPTS:
if time.time() - bans[net]['last_attempt'] > BAN_TIME:
unban(net)
time.sleep(10)
if __name__ == '__main__':
watch_thread = Thread(target=watch)
watch_thread.daemon = True
watch_thread.start()
autopurge_thread = Thread(target=autopurge)
autopurge_thread.daemon = True
autopurge_thread.start()
signal.signal(signal.SIGTERM, quit)
atexit.register(clear)
while not quit_now:
time.sleep(0.5)

View File

@ -0,0 +1,9 @@
FROM alpine:3.7
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
RUN apk add -U python2 python-dev py-pip gcc musl-dev iptables ip6tables \
&& pip2 install --upgrade python-iptables redis ipaddress \
&& apk del python-dev py2-pip gcc
COPY server.py /
CMD ["python2", "-u", "/server.py"]

View File

@ -0,0 +1,275 @@
#!/usr/bin/env python2
import re
import os
import time
import atexit
import signal
import ipaddress
import subprocess
from threading import Thread
import redis
import time
import json
import iptc
r = redis.StrictRedis(host=os.getenv('IPV4_NETWORK', '172.22.1') + '.249', decode_responses=True, port=6379, db=0)
pubsub = r.pubsub()
RULES = {}
RULES[1] = 'warning: .*\[([0-9a-f\.:]+)\]: SASL .+ authentication failed'
RULES[2] = '-login: Disconnected \(auth failed, .+\): user=.*, method=.+, rip=([0-9a-f\.:]+),'
RULES[3] = '-login: Aborted login \(no auth .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
RULES[4] = '-login: Aborted login \(tried to use disallowed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+'
RULES[5] = 'SOGo.+ Login from \'([0-9a-f\.:]+)\' for user .+ might not have worked'
RULES[6] = 'mailcow UI: Invalid password for .+ by ([0-9a-f\.:]+)'
if not r.get('F2B_OPTIONS'):
f2boptions = {}
f2boptions['ban_time'] = int
f2boptions['max_attempts'] = int
f2boptions['retry_window'] = int
f2boptions['netban_ipv4'] = int
f2boptions['netban_ipv6'] = int
f2boptions['ban_time'] = r.get('F2B_BAN_TIME') or 1800
f2boptions['max_attempts'] = r.get('F2B_MAX_ATTEMPTS') or 10
f2boptions['retry_window'] = r.get('F2B_RETRY_WINDOW') or 600
f2boptions['netban_ipv4'] = r.get('F2B_NETBAN_IPV4') or 24
f2boptions['netban_ipv6'] = r.get('F2B_NETBAN_IPV6') or 64
r.set('F2B_OPTIONS', json.dumps(f2boptions, ensure_ascii=False))
else:
try:
f2boptions = {}
f2boptions = json.loads(r.get('F2B_OPTIONS'))
except ValueError, e:
print 'Error loading F2B options: F2B_OPTIONS is not json'
raise SystemExit(1)
if r.exists('F2B_LOG'):
r.rename('F2B_LOG', 'NETFILTER_LOG')
bans = {}
log = {}
quit_now = False
def ban(address):
BAN_TIME = int(f2boptions['ban_time'])
MAX_ATTEMPTS = int(f2boptions['max_attempts'])
RETRY_WINDOW = int(f2boptions['retry_window'])
NETBAN_IPV4 = '/' + str(f2boptions['netban_ipv4'])
NETBAN_IPV6 = '/' + str(f2boptions['netban_ipv6'])
WHITELIST = r.hgetall('F2B_WHITELIST')
ip = ipaddress.ip_address(address.decode('ascii'))
if type(ip) is ipaddress.IPv6Address and ip.ipv4_mapped:
ip = ip.ipv4_mapped
address = str(ip)
if ip.is_private or ip.is_loopback:
return
self_network = ipaddress.ip_network(address.decode('ascii'))
if WHITELIST:
for wl_key in WHITELIST:
wl_net = ipaddress.ip_network(wl_key.decode('ascii'), False)
if wl_net.overlaps(self_network):
log['time'] = int(round(time.time()))
log['priority'] = 'info'
log['message'] = 'Address %s is whitelisted by rule %s' % (self_network, wl_net)
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
print 'Address %s is whitelisted by rule %s' % (self_network, wl_net)
return
net = ipaddress.ip_network((address + (NETBAN_IPV4 if type(ip) is ipaddress.IPv4Address else NETBAN_IPV6)).decode('ascii'), strict=False)
net = str(net)
if not net in bans or time.time() - bans[net]['last_attempt'] > RETRY_WINDOW:
bans[net] = { 'attempts': 0 }
active_window = RETRY_WINDOW
else:
active_window = time.time() - bans[net]['last_attempt']
bans[net]['attempts'] += 1
bans[net]['last_attempt'] = time.time()
active_window = time.time() - bans[net]['last_attempt']
if bans[net]['attempts'] >= MAX_ATTEMPTS:
log['time'] = int(round(time.time()))
log['priority'] = 'crit'
log['message'] = 'Banning %s' % net
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
print 'Banning %s for %d minutes' % (net, BAN_TIME / 60)
if type(ip) is ipaddress.IPv4Address:
for c in ['INPUT', 'FORWARD']:
chain = iptc.Chain(iptc.Table(iptc.Table.FILTER), c)
rule = iptc.Rule()
rule.src = net
target = iptc.Target(rule, "REJECT")
rule.target = target
if rule not in chain.rules:
chain.insert_rule(rule)
else:
for c in ['INPUT', 'FORWARD']:
chain = iptc.Chain(iptc.Table6(iptc.Table6.FILTER), c)
rule = iptc.Rule6()
rule.src = net
target = iptc.Target(rule, "REJECT")
rule.target = target
if rule not in chain.rules:
chain.insert_rule(rule)
r.hset('F2B_ACTIVE_BANS', '%s' % net, log['time'] + BAN_TIME)
else:
log['time'] = int(round(time.time()))
log['priority'] = 'warn'
log['message'] = '%d more attempts in the next %d seconds until %s is banned' % (MAX_ATTEMPTS - bans[net]['attempts'], RETRY_WINDOW, net)
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
print '%d more attempts in the next %d seconds until %s is banned' % (MAX_ATTEMPTS - bans[net]['attempts'], RETRY_WINDOW, net)
def unban(net):
log['time'] = int(round(time.time()))
log['priority'] = 'info'
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
#if not net in bans:
# log['message'] = '%s is not banned, skipping unban and deleting from queue (if any)' % net
# r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
# print '%s is not banned, skipping unban and deleting from queue (if any)' % net
# r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
# return
log['message'] = 'Unbanning %s' % net
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
print 'Unbanning %s' % net
if type(ipaddress.ip_network(net.decode('ascii'))) is ipaddress.IPv4Network:
for c in ['INPUT', 'FORWARD']:
chain = iptc.Chain(iptc.Table(iptc.Table.FILTER), c)
rule = iptc.Rule()
rule.src = net
target = iptc.Target(rule, "REJECT")
rule.target = target
if rule in chain.rules:
chain.delete_rule(rule)
else:
for c in ['INPUT', 'FORWARD']:
chain = iptc.Chain(iptc.Table6(iptc.Table6.FILTER), c)
rule = iptc.Rule6()
rule.src = net
target = iptc.Target(rule, "REJECT")
rule.target = target
if rule in chain.rules:
chain.delete_rule(rule)
r.hdel('F2B_ACTIVE_BANS', '%s' % net)
r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
if net in bans:
del bans[net]
def quit(signum, frame):
global quit_now
quit_now = True
def clear():
log['time'] = int(round(time.time()))
log['priority'] = 'info'
log['message'] = 'Clearing all bans'
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
print 'Clearing all bans'
for net in bans.copy():
unban(net)
pubsub.unsubscribe()
def watch():
log['time'] = int(round(time.time()))
log['priority'] = 'info'
log['message'] = 'Watching Redis channel F2B_CHANNEL'
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
pubsub.subscribe('F2B_CHANNEL')
print 'Subscribing to Redis channel F2B_CHANNEL'
while True:
for item in pubsub.listen():
for rule_id, rule_regex in RULES.iteritems():
if item['data'] and item['type'] == 'message':
result = re.search(rule_regex, item['data'])
if result:
addr = result.group(1)
ip = ipaddress.ip_address(addr.decode('ascii'))
if ip.is_private or ip.is_loopback:
continue
print '%s matched rule id %d' % (addr, rule_id)
log['time'] = int(round(time.time()))
log['priority'] = 'warn'
log['message'] = '%s matched rule id %d' % (addr, rule_id)
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
ban(addr)
def snat(snat_target):
def get_snat_rule():
rule = iptc.Rule()
rule.position = 1
rule.src = os.getenv('IPV4_NETWORK', '172.22.1') + '.0/24'
rule.dst = '!' + rule.src
target = rule.create_target("SNAT")
target.to_source = snat_target
return rule
while True:
table = iptc.Table('nat')
table.autocommit = False
chain = iptc.Chain(table, 'POSTROUTING')
if get_snat_rule() not in chain.rules:
log['time'] = int(round(time.time()))
log['priority'] = 'info'
log['message'] = 'Added POSTROUTING rule for source network ' + get_snat_rule().src + ' to SNAT target ' + snat_target
r.lpush('NETFILTER_LOG', json.dumps(log, ensure_ascii=False))
print log['message']
chain.insert_rule(get_snat_rule())
table.commit()
table.refresh()
time.sleep(10)
def autopurge():
while not quit_now:
BAN_TIME = f2boptions['ban_time']
MAX_ATTEMPTS = f2boptions['max_attempts']
QUEUE_UNBAN = r.hgetall('F2B_QUEUE_UNBAN')
if QUEUE_UNBAN:
for net in QUEUE_UNBAN:
unban(str(net))
for net in bans.copy():
if bans[net]['attempts'] >= MAX_ATTEMPTS:
if time.time() - bans[net]['last_attempt'] > BAN_TIME:
unban(net)
time.sleep(10)
def cleanPrevious():
print "Cleaning previously cached bans"
F2B_ACTIVE_BANS = r.hgetall('F2B_ACTIVE_BANS')
if F2B_ACTIVE_BANS:
for net in F2B_ACTIVE_BANS:
unban(str(net))
if __name__ == '__main__':
cleanPrevious()
watch_thread = Thread(target=watch)
watch_thread.daemon = True
watch_thread.start()
if os.getenv('SNAT_TO_SOURCE') and os.getenv('SNAT_TO_SOURCE') is not 'n':
try:
snat_ip = os.getenv('SNAT_TO_SOURCE').decode('ascii')
snat_ipo = ipaddress.ip_address(snat_ip)
if type(snat_ipo) is ipaddress.IPv4Address:
snat_thread = Thread(target=snat,args=(snat_ip,))
snat_thread.daemon = True
snat_thread.start()
except ValueError:
print os.getenv('SNAT_TO_SOURCE') + ' is not a valid IPv4 address'
autopurge_thread = Thread(target=autopurge)
autopurge_thread.daemon = True
autopurge_thread.start()
signal.signal(signal.SIGTERM, quit)
atexit.register(clear)
while not quit_now:
time.sleep(0.5)

View File

@ -33,6 +33,12 @@ RUN apk add -U --no-cache libxml2-dev \
imagemagick-dev \
imagemagick \
libtool \
freetype \
libpng \
libjpeg-turbo \
freetype-dev \
libpng-dev \
libjpeg-turbo-dev\
gettext-dev \
openldap-dev \
librsvg \
@ -46,10 +52,33 @@ RUN apk add -U --no-cache libxml2-dev \
&& docker-php-ext-enable redis apcu memcached imagick mailparse \
&& pecl clear-cache \
&& docker-php-ext-configure intl \
&& docker-php-ext-configure gd \
--with-gd \
--enable-gd-native-ttf \
--with-freetype-dir=/usr/include/ \
--with-png-dir=/usr/include/ \
--with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j 4 intl gettext ldap sockets soap pdo pdo_mysql xmlrpc gd zip pcntl opcache \
&& docker-php-ext-configure imap --with-imap --with-imap-ssl \
&& docker-php-ext-install -j 4 imap \
&& apk del --purge autoconf g++ make libxml2-dev icu-dev imap-dev openssl-dev cyrus-sasl-dev pcre-dev libpng-dev libpng-dev libjpeg-turbo-dev libwebp-dev zlib-dev imagemagick-dev
&& apk del --purge autoconf \
g++ \
make \
libxml2-dev \
icu-dev \
imap-dev \
openssl-dev \
cyrus-sasl-dev \
pcre-dev \
libpng-dev \
libpng-dev \
libjpeg-turbo-dev \
libwebp-dev \
zlib-dev \
imagemagick-dev \
freetype-dev \
libpng-dev \
libjpeg-turbo-dev
COPY ./docker-entrypoint.sh /

View File

@ -15,7 +15,6 @@ until [ $(redis-cli -h redis-mailcow PING) == "PONG" ]; do
done
# Migrate domain map
declare -a DOMAIN_ARR
redis-cli -h redis-mailcow DEL DOMAIN_MAP
while read line
@ -34,57 +33,4 @@ for domain in "${DOMAIN_ARR[@]}"; do
done
fi
# Migrate tag settings map
declare -a SUBJ_TAG_ARR
redis-cli -h redis-mailcow DEL SUBJ_TAG_ARR
while read line
do
SUBJ_TAG_ARR+=("$line")
done < <(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT username FROM mailbox WHERE wants_tagged_subject='1'" -Bs)
if [[ ! -z ${SUBJ_TAG_ARR} ]]; then
for user in "${SUBJ_TAG_ARR[@]}"; do
redis-cli -h redis-mailcow HSET RCPT_WANTS_SUBJECT_TAG ${user} 1
mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "UPDATE mailbox SET wants_tagged_subject='2' WHERE username = '${user}'"
done
fi
# Migrate DKIM keys
for file in $(ls /data/dkim/keys/); do
domain=${file%.dkim}
if [[ -f /data/dkim/txt/${file} ]]; then
redis-cli -h redis-mailcow HSET DKIM_PUB_KEYS "${domain}" "$(cat /data/dkim/txt/${file})"
redis-cli -h redis-mailcow HSET DKIM_PRIV_KEYS "dkim.${domain}" "$(cat /data/dkim/keys/${file})"
redis-cli -h redis-mailcow HSET DKIM_SELECTORS "${domain}" "dkim"
fi
rm /data/dkim/{keys,txt}/${file}
done
# Fix DKIM keys
# Fetch domains
declare -a DOMAIN_ARRAY
while read line
do
DOMAIN_ARRAY+=("$line")
done < <(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain" -Bs)
while read line
do
DOMAIN_ARRAY+=("$line")
done < <(mysql -h mysql-mailcow -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT alias_domain FROM alias_domain" -Bs)
# Loop through array and fix keys
if [[ ! -z ${DOMAIN_ARRAY} ]]; then
for domain in "${DOMAIN_ARRAY[@]}"; do
WRONG_KEY=$(redis-cli -h redis-mailcow HGET DKIM_PRIV_KEYS ${domain} | tr -d \")
if [[ ! -z ${WRONG_KEY} ]]; then
echo "Migrating defect key for domain ${domain}"
redis-cli -h redis-mailcow HSET DKIM_PRIV_KEYS "dkim.${domain}" ${WRONG_KEY}
redis-cli -h redis-mailcow HDEL DKIM_PRIV_KEYS "${domain}"
fi
done
fi
exec "$@"

View File

@ -39,7 +39,7 @@ query = SELECT IF(EXISTS(
SELECT CONCAT('%u', '@', target_domain) FROM alias_domain
WHERE alias_domain='%d'
)
) AND mailbox.tls_enforce_in = '1' AND mailbox.active = '1'
) AND json_extract(attributes, '$.tls_enforce_in') LIKE '%%1%%' AND mailbox.active = '1'
), 'reject_plaintext_session', NULL) AS 'tls_enforce_in';
EOF
@ -58,7 +58,7 @@ query = SELECT GROUP_CONCAT(transport SEPARATOR '') AS transport_maps
WHERE alias_domain = '%d'
)
)
AND mailbox.tls_enforce_out = '1'
AND json_extract(attributes, '$.tls_enforce_out') LIKE '%%1%%'
AND mailbox.active = '1'
), 'smtp_enforced_tls:', 'smtp:') AS 'transport'
UNION ALL
@ -145,6 +145,16 @@ query = SELECT bcc_dest FROM bcc_maps
AND active='1';
EOF
cat <<EOF > /opt/postfix/conf/sql/mysql_recipient_canonical_maps.cf
user = ${DBUSER}
password = ${DBPASS}
hosts = mysql
dbname = ${DBNAME}
query = SELECT new_dest FROM recipient_maps
WHERE old_dest='%s'
AND active='1';
EOF
cat <<EOF > /opt/postfix/conf/sql/mysql_virtual_domains_maps.cf
user = ${DBUSER}
password = ${DBPASS}

View File

@ -1,5 +1,6 @@
#!/bin/bash
chown -R _rspamd:_rspamd /var/lib/rspamd
[[ ! -f /etc/rspamd/override.d/worker-controller-password.inc ]] && echo '# Placeholder' > /etc/rspamd/override.d/worker-controller-password.inc
exec /sbin/tini -- "$@"

View File

@ -42,6 +42,9 @@ RUN mkdir /usr/share/doc/sogo \
COPY ./bootstrap-sogo.sh /
COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
COPY supervisord.conf /etc/supervisor/supervisord.conf
COPY theme-blue.js /usr/lib/GNUstep/SOGo/WebServerResources/js/theme-blue.js
COPY theme-green.js /usr/lib/GNUstep/SOGo/WebServerResources/js/theme-green.js
COPY sogo-full.svg /usr/lib/GNUstep/SOGo/WebServerResources/img/sogo-full.svg
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf

View File

@ -19,14 +19,13 @@ mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS so
mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
CREATE VIEW sogo_view (c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, home, kind, multiple_bookings) AS
SELECT mailbox.username, mailbox.domain, mailbox.username, mailbox.password, mailbox.name, mailbox.username, IFNULL(GROUP_CONCAT(ga.aliases SEPARATOR ' '), ''), IFNULL(gda.ad_alias, ''), CONCAT('/var/vmail/', maildir), mailbox.kind, mailbox.multiple_bookings FROM mailbox
SELECT mailbox.username, mailbox.domain, mailbox.username, if(json_extract(attributes, '$.force_pw_update') LIKE '%0%', password, 'invalid'), mailbox.name, mailbox.username, IFNULL(GROUP_CONCAT(ga.aliases SEPARATOR ' '), ''), IFNULL(gda.ad_alias, ''), CONCAT('/var/vmail/', maildir), mailbox.kind, mailbox.multiple_bookings FROM mailbox
LEFT OUTER JOIN grouped_mail_aliases ga ON ga.username REGEXP CONCAT('(^|,)', mailbox.username, '($|,)')
LEFT OUTER JOIN grouped_domain_alias_address gda ON gda.username = mailbox.username
WHERE mailbox.active = '1'
GROUP BY mailbox.username;
EOF
mkdir -p /var/lib/sogo/GNUstep/Defaults/
# Generate plist header with timezone data

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
width="640px"
height="350px"
viewBox="78.712 58.488 640 350"
style="enable-background:new 78.712 58.488 640 350;"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="sogo-full.svg"><metadata
id="metadata4143"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs4141" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1721"
inkscape:window-height="1177"
id="namedview4139"
showgrid="false"
inkscape:zoom="1.8359375"
inkscape:cx="320"
inkscape:cy="175"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" /><path
style="fill:#f1f1f1;fill-opacity:0.96078432"
d="M648.541,145.679c-9.947,0-17.009-7.278-17.009-17.048c0-9.777,7.062-17.057,17.009-17.057 c10.024,0,17.086,7.279,17.086,17.057C665.627,138.401,658.565,145.679,648.541,145.679z M648.511,94.893 c-19.693,0-33.679,14.4-33.679,33.738c0,19.33,13.985,33.729,33.679,33.729c19.822,0,33.808-14.4,33.808-33.729 C682.318,109.293,668.333,94.893,648.511,94.893z M648.482,179.843c-29.889,0-51.123-21.868-51.123-51.212 c0-29.353,21.234-51.209,51.123-51.209c30.082,0,51.307,21.856,51.307,51.209C699.789,157.975,678.564,179.843,648.482,179.843z M648.442,58.488c-40.929,0-69.995,29.946-69.995,70.143c0,40.189,29.066,70.125,69.995,70.125c41.194,0,70.27-29.937,70.27-70.125 C718.712,88.434,689.637,58.488,648.442,58.488z M158.166,183.902l-21.018-5.008c-19.131-4.396-28.849-9.413-28.849-23.21 c0-15.684,15.99-21.965,30.419-21.965c14.667,0,25.382,7.329,31.693,18.737c0.02,0.048,0.051,0.097,0.09,0.157 c0.127,0.247,0.276,0.484,0.403,0.731l0.03-0.02c1.985,3.002,5.323,5.008,8.919,5.008c6.122,0,10.558-4.425,10.558-10.547 c0-2.341-0.504-4.82-1.601-6.688c-10.764-18.302-28.513-26.192-48.838-26.192c-27.594,0-54.262,13.797-54.262,44.218 c0,27.921,27.605,36.079,37.64,38.578l20.069,4.71c15.368,3.763,27.912,8.791,27.912,23.517c0,16.938-17.561,23.943-34.499,23.943 c-17.245,0-30.015-9.37-38.814-22.37h-0.01c-1.956-3-4.988-4.328-8.702-4.328c-5.984,0-10.805,5.185-10.587,11.162 c0.098,2.438,0.909,4.637,2.153,6.405c13.787,20.633,33.728,28.41,55.96,28.41c28.543,0,57.085-13.143,57.085-45.132 C193.918,203.325,178.551,188.613,158.166,183.902z M298.479,250.312c-33.866,0-55.199-25.403-55.199-58.331 c0-32.939,21.333-58.343,55.199-58.343c34.192,0,55.516,25.403,55.516,58.343C353.996,224.91,332.672,250.312,298.479,250.312z M298.479,114.823c-45.471,0-77.777,32.93-77.777,77.158c0,44.217,32.306,77.146,77.777,77.146 c45.786,0,78.093-32.929,78.093-77.146C376.572,147.753,344.266,114.823,298.479,114.823z M518.715,234.312 c-0.771,0.74-1.549,1.472-2.399,2.175c-1.106,1.014-2.391,2.112-3.854,3.208c-8.829,6.391-19.979,10.094-33.017,10.094 c-33.876,0-55.198-25.402-55.198-58.332c0-32.939,21.322-58.342,55.198-58.342c34.183,0,55.506,25.403,55.506,58.342 C534.951,208.653,529.135,223.774,518.715,234.312z M468.097,317.938c2.528,0,5.146-0.168,7.863-0.504 c5.018-0.631,9.588-0.909,13.729-0.909c19.24,0.109,29.036,5.7,34.943,12.158c5.895,6.499,8.168,15.311,8.158,22.796 c0.01,3.586-0.555,6.795-1.177,8.721c-2.944,8.93-8.888,15.002-17.996,19.576c-9.035,4.484-21.095,6.777-33.707,6.757 c-4.514,0-9.105-0.288-13.639-0.831c-8.573-0.987-19.911-4.671-28.13-11.093c-4.138-3.199-6.458-6.991-8.858-11.485 c-2.379-4.514-2.783-9.748-2.783-16.442v-0.742c0-12.346,4.84-20.544,11.051-26.5c3.07-2.904,5.69-5.064,7.99-6.438 c0.366-0.218,0.438-0.416,0.755-0.593C452.39,316.014,459.684,317.968,468.097,317.938z M479.445,114.301 c-45.471,0-77.786,32.929-77.786,77.157c0,29.887,14.765,54.598,38.378,67.489c-0.314,0.314-0.621,0.641-0.916,0.966 c-6.104,6.687-9.226,15.25-9.236,23.913c-0.008,3.821,0.624,7.741,1.977,11.494c-3.062,1.956-6.717,4.634-10.46,8.147 c-9.026,8.408-18.734,22.541-19.021,42.097c-0.01,0.454-0.01,0.829-0.01,1.118c-0.01,10.071,2.379,19.157,6.459,26.774 c6.133,11.466,15.683,19.445,25.539,24.77c9.917,5.334,20.257,8.166,29.273,9.274c5.373,0.643,10.826,0.988,16.268,0.988 c15.151-0.02,30.261-2.578,43.409-9.019c13.085-6.34,24.333-17.253,29.192-32.562c1.443-4.553,2.212-9.719,2.231-15.428 c-0.02-11.595-3.349-25.759-13.767-37.452c-10.421-11.734-27.654-19.566-51.288-19.459c-5.138,0-10.606,0.356-16.426,1.078 c-1.877,0.227-3.596,0.334-5.166,0.334c-7.239-0.048-10.872-2.053-13.036-4.098c-2.133-2.084-3.2-4.839-3.229-8.058 c-0.01-3.28,1.284-6.727,3.467-9.078c2.231-2.332,5.008-3.91,9.846-3.97c0.436,0,0.9,0.01,1.374,0.05 c3.101,0.216,6.112,0.325,9.037,0.325c24.188,0.047,42.38-7.448,54.756-17.759c12.415-10.312,18.971-22.854,22.071-32.76l-0.04-0.01 c3.37-8.899,5.197-18.715,5.197-29.166C557.539,147.229,525.234,114.301,479.445,114.301z"
id="path4137" /></svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -0,0 +1,60 @@
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
(function() {
'use strict';
angular.module('SOGo.Common')
.config(configure)
/**
* @ngInject
*/
configure.$inject = ['$mdThemingProvider'];
function configure($mdThemingProvider) {
/**
* Define the Alternative theme
*/
$mdThemingProvider.theme('mailcow')
.primaryPalette('indigo', {
'default': '700', // top toolbar
'hue-1': '400',
'hue-2': '600', // sidebar toolbar
'hue-3': 'A700'
})
.accentPalette('indigo', {
'default': '500', // fab buttons
'hue-1': '50', // center list toolbar
'hue-2': '400',
'hue-3': 'A700'
})
.backgroundPalette('grey', {
'default': '50', // center list background
'hue-1': '100',
'hue-2': '200',
'hue-3': '300'
});
$mdThemingProvider.theme('default')
.primaryPalette('indigo', {
'default': '700', // top toolbar
'hue-1': '400',
'hue-2': '600', // sidebar toolbar
'hue-3': 'A700'
})
.accentPalette('indigo', {
'default': '500', // fab buttons
'hue-1': '50', // center list toolbar
'hue-2': '400',
'hue-3': 'A700'
})
.backgroundPalette('grey', {
'default': '50', // center list background
'hue-1': '100',
'hue-2': '200',
'hue-3': '300'
});
$mdThemingProvider.setDefaultTheme('mailcow');
$mdThemingProvider.generateThemesOnDemand(false);
}
})();

View File

@ -0,0 +1,61 @@
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
(function() {
'use strict';
angular.module('SOGo.Common')
.config(configure)
/**
* @ngInject
*/
configure.$inject = ['$mdThemingProvider'];
function configure($mdThemingProvider) {
/**
* Define the Alternative theme
*/
$mdThemingProvider.theme('mailcow')
.primaryPalette('green', {
'default': '600', // top toolbar
'hue-1': '200',
'hue-2': '600', // sidebar toolbar
'hue-3': 'A700'
})
.accentPalette('green', {
'default': '600', // fab buttons
'hue-1': '50', // center list toolbar
'hue-2': '400',
'hue-3': 'A700'
})
.backgroundPalette('grey', {
'default': '50', // center list background
'hue-1': '50',
'hue-2': '100',
'hue-3': '100'
});
$mdThemingProvider.theme('default')
.primaryPalette('green', {
'default': '600', // top toolbar
'hue-1': '200',
'hue-2': '600', // sidebar toolbar
'hue-3': 'A700'
})
.accentPalette('green', {
'default': '600', // fab buttons
'hue-1': '50', // center list toolbar
'hue-2': '400',
'hue-3': 'A700'
})
.backgroundPalette('grey', {
'default': '50', // center list background
'hue-1': '50',
'hue-2': '100',
'hue-3': '100'
});
$mdThemingProvider.setDefaultTheme('mailcow');
$mdThemingProvider.generateThemesOnDemand(false);
}
})();

View File

@ -211,7 +211,7 @@ rspamd_checks() {
while [ ${err_count} -lt ${THRESHOLD} ]; do
host_ip=$(get_container_ip rspamd-mailcow)
err_c_cur=${err_count}
SCORE=$(curl --silent ${host_ip}:11333/scan -d '
SCORE=$(/usr/bin/curl -s --data-binary @- --unix-socket /rspamd-sock/rspamd.sock http://rspamd/scan -d '
To: null@localhost
From: watchdog@localhost

View File

@ -24,6 +24,7 @@ server {
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Frame-Options "SAMEORIGIN";
server_name NC_SUBD;
@ -54,7 +55,7 @@ server {
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
set_real_ip_from fd00::/8;
set_real_ip_from fc00::/7;
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;

View File

@ -33,6 +33,7 @@
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Frame-Options "SAMEORIGIN";
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {

View File

@ -174,7 +174,7 @@ namespace {
type = shared
separator = /
prefix = Shared/%%u/
location = maildir:%%h/:INDEXPVT=~/Shared/%%u
location = maildir:%%h/:INDEX=~/Shared/%%u:INDEXPVT=~/Shared/%%u
subscriptions = no
list = children
}
@ -239,8 +239,10 @@ userdb {
driver = sql
}
protocol imap {
imap_metadata = yes
mail_plugins = quota imap_quota imap_acl acl zlib imap_zlib imap_sieve listescape #mail_crypt
}
mail_attribute_dict = file:%h/dovecot-attributes
protocol lmtp {
mail_plugins = quota sieve acl zlib listescape #mail_crypt
auth_socket_path = /usr/local/var/run/dovecot/auth-master
@ -280,6 +282,8 @@ plugin {
#mail_crypt_global_private_key = </mail_crypt/ecprivkey.pem
#mail_crypt_global_public_key = </mail_crypt/ecpubkey.pem
#mail_crypt_save_version = 2
# Enable compression while saving, lz4 Dovecot v2.2.11+
zlib_save = lz4
}
dict {
sqlquota = mysql:/usr/local/etc/dovecot/sql/dovecot-dict-sql-quota.conf

View File

@ -7,176 +7,13 @@ map $http_x_forwarded_proto $client_req_scheme {
https https;
}
server {
include /etc/nginx/mime.types;
charset utf-8;
override_charset on;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Permitted-Cross-Domain-Policies none;
index index.php index.html;
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/server_name.active;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
absolute_redirect off;
root /web;
location ~ ^/api/v1/(.*)$ {
try_files $uri $uri/ /json_api.php?query=$1;
}
location ^~ /.well-known/acme-challenge/ {
allow all;
default_type "text/plain";
}
# If behind reverse proxy, forwards the correct IP
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
set_real_ip_from fc00::/7;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
rewrite ^/.well-known/caldav$ /SOGo/dav/ permanent;
rewrite ^/.well-known/carddav$ /SOGo/dav/ permanent;
location ^~ /principals {
return 301 /SOGo/dav;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass phpfpm:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PHP_VALUE "max_execution_time = 1200
max_input_time = 1200
memory_limit = 64M";
fastcgi_read_timeout 1200;
}
location /rspamd/ {
proxy_pass http://rspamd:11334/;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
}
location ~* ^/Autodiscover/Autodiscover.xml {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass phpfpm:9000;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files /autodiscover.php =404;
}
location ~* ^/Autodiscover/Autodiscover.json {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass phpfpm:9000;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files /autodiscover-json.php =404;
}
location ~ /(?:m|M)ail/(?:c|C)onfig-v1.1.xml {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass phpfpm:9000;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files /autoconfig.php =404;
}
location ^~ /Microsoft-Server-ActiveSync {
include /etc/nginx/conf.d/sogo_eas.active;
proxy_connect_timeout 1000;
proxy_next_upstream timeout error;
proxy_send_timeout 1000;
proxy_read_timeout 1000;
proxy_buffer_size 8k;
proxy_buffers 4 32k;
proxy_temp_file_write_size 64k;
proxy_busy_buffers_size 64k;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header x-webobjects-server-protocol HTTP/1.0;
proxy_set_header x-webobjects-remote-host $remote_addr;
proxy_set_header x-webobjects-server-name $server_name;
proxy_set_header x-webobjects-server-url $client_req_scheme://$http_host;
proxy_set_header x-webobjects-server-port $server_port;
client_body_buffer_size 128k;
client_max_body_size 0;
}
location ^~ /SOGo {
include /etc/nginx/conf.d/sogo.active;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header x-webobjects-server-protocol HTTP/1.0;
proxy_set_header x-webobjects-remote-host $remote_addr;
proxy_set_header x-webobjects-server-name $server_name;
proxy_set_header x-webobjects-server-url $client_req_scheme://$http_host;
proxy_set_header x-webobjects-server-port $server_port;
client_body_buffer_size 128k;
client_max_body_size 0;
break;
}
location /SOGo.woa/WebServerResources/ {
proxy_pass http://sogo:9192/WebServerResources/;
proxy_set_header Host $http_host;
proxy_cache sogo;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
#alias /usr/lib/GNUstep/SOGo/WebServerResources/;
allow all;
}
location /.woa/WebServerResources/ {
proxy_pass http://sogo:9192/WebServerResources/;
proxy_set_header Host $http_host;
proxy_cache sogo;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
#alias /usr/lib/GNUstep/SOGo/WebServerResources/;
allow all;
}
location /SOGo/WebServerResources/ {
proxy_pass http://sogo:9192/WebServerResources/;
proxy_set_header Host $http_host;
proxy_cache sogo;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
#alias /usr/lib/GNUstep/SOGo/WebServerResources/;
allow all;
}
location (^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$ {
proxy_pass http://sogo:9192/$1.SOGo/Resources/$2;
proxy_set_header Host $http_host;
proxy_cache sogo;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
#alias /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2;
}
include /etc/nginx/conf.d/site.*.custom;
map $sent_http_content_type $expires {
default off;
text/html off;
text/css 1d;
application/javascript 1d;
application/json off;
image/png 1d;
}
server {
@ -184,7 +21,6 @@ server {
charset utf-8;
override_charset on;
ssl on;
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
ssl_protocols TLSv1.2;
@ -204,6 +40,7 @@ server {
index index.php index.html;
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/listen_ssl.active;
include /etc/nginx/conf.d/server_name.active;
@ -233,7 +70,7 @@ server {
rewrite ^/.well-known/carddav$ /SOGo/dav/ permanent;
location ^~ /principals {
return 301 /SOGo/dav;
return 301 /SOGo/dav;
}
location ~ \.php$ {
@ -256,6 +93,7 @@ server {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
expires $expires;
}
location ~* ^/Autodiscover/Autodiscover.xml {
@ -326,6 +164,7 @@ server {
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
#alias /usr/lib/GNUstep/SOGo/WebServerResources/;
expires $expires;
allow all;
}
@ -336,6 +175,7 @@ server {
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
#alias /usr/lib/GNUstep/SOGo/WebServerResources/;
expires $expires;
allow all;
}
@ -349,7 +189,7 @@ server {
allow all;
}
location (^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$ {
location (^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$) {
proxy_pass http://sogo:9192/$1.SOGo/Resources/$2;
proxy_set_header Host $http_host;
proxy_cache sogo;

View File

@ -1,2 +1,2 @@
listen ${HTTPS_PORT} http2;
listen [::]:${HTTPS_PORT} http2;
listen ${HTTPS_PORT} ssl http2;
listen [::]:${HTTPS_PORT} ssl http2;

View File

@ -0,0 +1,3 @@
file_uploads = On
upload_max_filesize = 64M
post_max_size = 64M

View File

@ -45,6 +45,7 @@ proxy_read_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_sender_acl.cf,
proxy:mysql:/opt/postfix/conf/sql/mysql_tls_enforce_in_policy.cf,
proxy:mysql:/opt/postfix/conf/sql/mysql_sender_bcc_maps.cf,
proxy:mysql:/opt/postfix/conf/sql/mysql_recipient_bcc_maps.cf,
proxy:mysql:/opt/postfix/conf/sql/mysql_recipient_canonical_maps.cf,
$local_recipient_maps,
$mydestination,
$virtual_alias_maps,
@ -108,6 +109,8 @@ virtual_mailbox_base = /var/vmail/
virtual_mailbox_domains = proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_domains_maps.cf
recipient_bcc_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_recipient_bcc_maps.cf
sender_bcc_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_sender_bcc_maps.cf
recipient_canonical_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_recipient_canonical_maps.cf
recipient_canonical_classes = envelope_recipient
virtual_mailbox_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 104
virtual_transport = lmtp:inet:dovecot:24

View File

@ -126,7 +126,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
$stmt = $pdo->prepare("SELECT `option`, `value` FROM `filterconf`
@ -172,7 +172,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}
@ -182,7 +182,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}
@ -213,7 +213,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}
@ -223,7 +223,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}
@ -264,7 +264,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}
@ -274,7 +274,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}
@ -305,7 +305,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}
@ -315,7 +315,7 @@ while ($row = array_shift($rows)) {
<?php
foreach (ucl_rcpts($row['object'], strpos($row['object'], '@') === FALSE ? 'domain' : 'mailbox') as $rcpt) {
?>
rcpt = "<?=$rcpt;?>";
rcpt = <?=json_encode($rcpt);?>;
<?php
}
}

View File

@ -0,0 +1,6 @@
provider_type = "rspamd";
provider_info {
ip4 = "asn.rspamd.com";
ip6 = "asn6.rspamd.com";
}
symbol = "ASN";

View File

@ -0,0 +1,24 @@
# how each action is treated in scoring
actions {
reject = 1.0;
"add header" = 0.25;
"rewrite subject" = 0.25;
"no action" = 1.0;
}
# how each component is evaluated
scores {
asn = 0.5;
country = 0.1;
ipnet = 0.8;
ip = 1.0;
}
asn_prefix = "a:";
country_prefix = "c:";
hash = "ip_score";
ipnet_prefix = "n:";
lower_bound = 10;
metric = "default";
max_score = 10;
min_score = -5;
score_divisor = 10;
symbol = "IP_SCORE";

View File

@ -1,5 +1,5 @@
rules {
QUARANTAINE {
QUARANTINE {
backend = "http";
url = "http://nginx:9081/pipe.php";
selector = "is_reject";

View File

@ -0,0 +1,26 @@
# Key prefix for redis - default "Ur."
key_prefix = "Ur.";
# Symbols to insert - defaults as shown
symbols {
white = "URL_REPUTATION_WHITE";
black = "URL_REPUTATION_BLACK";
grey = "URL_REPUTATION_GREY";
neutral = "URL_REPUTATION_NEUTRAL";
}
# DKIM/DMARC/SPF allow symbols - defaults as shown
foreign_symbols {
dmarc = "DMARC_POLICY_ALLOW";
dkim = "R_DKIM_ALLOW";
spf = "R_SPF_ALLOW";
}
# SURBL metatags to ignore - default as shown
ignore_surbl = ["URIBL_BLOCKED", "DBL_PROHIBIT", "SURBL_BLOCKED"];
# Amount of samples required for scoring - default 5
threshold = 5;
# Maximum number of TLDs to update reputation on (default 1)
update_limit = 1;
# Maximum number of TLDs to query reputation on (default 100)
query_limit = 100;
# If true, try to find most 'relevant' URL (default true)
relevance = true;
enabled = true;

View File

@ -133,12 +133,12 @@ foreach (json_decode($rcpts, true) as $rcpt) {
// Loop through all found gotos
foreach ($gotos_array as $index => &$goto) {
error_log("quarantaine pipe: query " . $goto . " as username from mailbox");
error_log("quarantine pipe: query " . $goto . " as username from mailbox");
$stmt = $pdo->prepare("SELECT `username` FROM `mailbox` WHERE `username` = :goto AND `active`= '1';");
$stmt->execute(array(':goto' => $goto));
$username = $stmt->fetch(PDO::FETCH_ASSOC)['username'];
if (!empty($username)) {
error_log("quarantaine pipe: mailbox found: " . $username);
error_log("quarantine pipe: mailbox found: " . $username);
// Current goto is a mailbox, save to rcpt_final_mailboxes if not a duplicate
if (!in_array($username, $rcpt_final_mailboxes)) {
$rcpt_final_mailboxes[] = $username;
@ -153,7 +153,7 @@ foreach (json_decode($rcpts, true) as $rcpt) {
$stmt = $pdo->prepare("SELECT `goto` FROM `alias` WHERE `address` = :goto AND `active` = '1'");
$stmt->execute(array(':goto' => $goto));
$goto_branch = $stmt->fetch(PDO::FETCH_ASSOC)['goto'];
error_log("quarantaine pipe: goto address " . $goto . " is a alias branch for " . $goto_branch);
error_log("quarantine pipe: goto address " . $goto . " is a alias branch for " . $goto_branch);
$goto_branch_array = explode(',', $goto_branch);
}
}
@ -173,7 +173,7 @@ foreach (json_decode($rcpts, true) as $rcpt) {
// Force exit if loop cannot be solved
// Postfix does not allow for alias loops, so this should never happen.
$loop_c++;
error_log("quarantaine pipe: goto array count on loop #". $loop_c . " is " . count($gotos_array));
error_log("quarantine pipe: goto array count on loop #". $loop_c . " is " . count($gotos_array));
}
}
catch (PDOException $e) {
@ -184,9 +184,9 @@ foreach (json_decode($rcpts, true) as $rcpt) {
}
foreach ($rcpt_final_mailboxes as $rcpt) {
error_log("quarantaine pipe: processing quarantaine message for rcpt " . $rcpt);
error_log("quarantine pipe: processing quarantine message for rcpt " . $rcpt);
try {
$stmt = $pdo->prepare("INSERT INTO `quarantaine` (`qid`, `score`, `sender`, `rcpt`, `symbols`, `user`, `ip`, `msg`, `action`)
$stmt = $pdo->prepare("INSERT INTO `quarantine` (`qid`, `score`, `sender`, `rcpt`, `symbols`, `user`, `ip`, `msg`, `action`)
VALUES (:qid, :score, :sender, :rcpt, :symbols, :user, :ip, :msg, :action)");
$stmt->execute(array(
':qid' => $qid,
@ -199,11 +199,11 @@ foreach ($rcpt_final_mailboxes as $rcpt) {
':msg' => $raw_data,
':action' => $action
));
$stmt = $pdo->prepare('DELETE FROM `quarantaine` WHERE `rcpt` = :rcpt AND `id` NOT IN (
$stmt = $pdo->prepare('DELETE FROM `quarantine` WHERE `rcpt` = :rcpt AND `id` NOT IN (
SELECT `id`
FROM (
SELECT `id`
FROM `quarantaine`
FROM `quarantine`
WHERE `rcpt` = :rcpt2
ORDER BY id DESC
LIMIT :retention_size

View File

@ -1 +1 @@
# Placeholder
# Placeholder

View File

@ -1,9 +1,7 @@
bind_socket = "*:11334";
secure_ip = "192.168.0.0/16";
secure_ip = "172.16.0.0/12";
secure_ip = "10.0.0.0/8";
count = 2;
secure_ip = "127.0.0.1";
secure_ip = "::1";
secure_ip = "fd00::/8"
bind_socket = "/rspamd-sock/rspamd.sock mode=0666 owner=nobody";
.include(try=true; priority=10) "$CONFDIR/override.d/worker-controller-password.inc"
.include(try=true; priority=20) "$CONFDIR/override.d/worker-controller.custom.inc"

View File

@ -5,7 +5,7 @@
PrivateDAndTViewer
);
WOWorkersCount = "7";
WOWorkersCount = "14";
SOGoACLsSendEMailNotifications = YES;
SOGoAppointmentSendEMailNotifications = YES;
SOGoDraftsFolderName = "Drafts";
@ -14,6 +14,7 @@
SOGoEnableEMailAlarms = NO;
SOGoFoldersSendEMailNotifications = YES;
SOGoForwardEnabled = YES;
SOGoUIAdditionalJSFiles = (js/theme-blue.js);
// Multi-domain setup
// Domains are isolated, you can define visibility options here.

View File

@ -11,7 +11,7 @@ server:
access-control: 10.0.0.0/8 allow
access-control: 172.16.0.0/12 allow
access-control: 192.168.0.0/16 allow
access-control: fd00::/8 allow
access-control: fc00::/7 allow
access-control: fe80::/10 allow
directory: "/etc/unbound"
username: unbound
@ -20,7 +20,7 @@ server:
private-address: 172.16.0.0/12
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: fd00::/8
private-address: fc00::/7
private-address: fe80::/10
root-hints: "/etc/unbound/root.hints"
hide-identity: yes

View File

@ -147,7 +147,7 @@ $tfa_data = get_tfa();
<a href="#fwdhosts" class="list-group-item"><?=$lang['admin']['forwarding_hosts'];?></a>
<a href="#f2bparams" class="list-group-item"><?=$lang['admin']['f2b_parameters'];?></a>
<a href="#relayhosts" class="list-group-item">Relayhosts</a>
<a href="#quarantaine" class="list-group-item"><?=$lang['admin']['quarantaine'];?></a>
<a href="#quarantine" class="list-group-item"><?=$lang['admin']['quarantine'];?></a>
<a href="#customize" class="list-group-item"><?=$lang['admin']['customize'];?></a>
<a href="#top" class="list-group-item" style="border-top:1px dashed #dadada"> <?=$lang['admin']['to_top'];?></a>
</div>
@ -414,28 +414,28 @@ $tfa_data = get_tfa();
</div>
</div>
<span class="anchor" id="quarantaine"></span>
<span class="anchor" id="quarantine"></span>
<div class="panel panel-default">
<div class="panel-heading"><?=$lang['admin']['quarantaine'];?></div>
<div class="panel-heading"><?=$lang['admin']['quarantine'];?></div>
<div class="panel-body">
<?php $q_data = quarantaine('settings'); ?>
<form class="form" data-id="quarantaine" role="form" method="post">
<?php $q_data = quarantine('settings'); ?>
<form class="form" data-id="quarantine" role="form" method="post">
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label for="retention_size"><?=$lang['admin']['quarantaine_retention_size'];?></label>
<label for="retention_size"><?=$lang['admin']['quarantine_retention_size'];?></label>
<input type="number" class="form-control" id="retention_size" name="retention_size" value="<?=$q_data['retention_size'];?>" required>
</div>
</div>
<div class="col-sm-6">
<div class="form-group">
<label for="max_size"><?=$lang['admin']['quarantaine_max_size'];?></label>
<label for="max_size"><?=$lang['admin']['quarantine_max_size'];?></label>
<input type="number" class="form-control" id="max_size" name="max_size" value="<?=$q_data['max_size'];?>" required>
</div>
</div>
</div>
<div class="form-group">
<label for="exclude_domains"><?=$lang['admin']['quarantaine_exclude_domains'];?></label><br />
<label for="exclude_domains"><?=$lang['admin']['quarantine_exclude_domains'];?></label><br />
<select data-width="100%" id="exclude_domains" name="exclude_domains" class="selectpicker" title="<?=$lang['tfa']['select'];?>" multiple>
<?php
foreach (array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains')) as $domain):
@ -446,7 +446,7 @@ $tfa_data = get_tfa();
?>
</select>
</div>
<button class="btn btn-default" id="edit_selected" data-item="self" data-id="quarantaine" data-api-url='edit/quarantaine' data-api-attr='{"action":"settings"}' href="#"><span class="glyphicon glyphicon-check"></span> <?=$lang['admin']['save'];?></button>
<button class="btn btn-default" id="edit_selected" data-item="self" data-id="quarantine" data-api-url='edit/quarantine' data-api-attr='{"action":"settings"}' href="#"><span class="glyphicon glyphicon-check"></span> <?=$lang['admin']['save'];?></button>
</form>
</div>
</div>

View File

@ -36,9 +36,8 @@ $opt = [
$pdo = new PDO($dsn, $database_user, $database_pass, $opt);
$login_user = strtolower(trim($_SERVER['PHP_AUTH_USER']));
$login_pass = trim(htmlspecialchars_decode($_SERVER['PHP_AUTH_PW']));
$login_role = check_login($login_user, $login_pass);
if (!isset($_SERVER['PHP_AUTH_USER']) OR $login_role !== "user") {
if (empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW'])) {
try {
$json = json_encode(
array(
@ -62,35 +61,36 @@ if (!isset($_SERVER['PHP_AUTH_USER']) OR $login_role !== "user") {
header('HTTP/1.0 401 Unauthorized');
exit(0);
}
else {
if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
if ($login_role === "user") {
header("Content-Type: application/xml");
echo '<?xml version="1.0" encoding="utf-8" ?>' . PHP_EOL;
$login_role = check_login($login_user, $login_pass);
if ($login_role === "user") {
header("Content-Type: application/xml");
echo '<?xml version="1.0" encoding="utf-8" ?>' . PHP_EOL;
?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<?php
if(!$data) {
try {
$json = json_encode(
array(
"time" => time(),
"ua" => $_SERVER['HTTP_USER_AGENT'],
"user" => $_SERVER['PHP_AUTH_USER'],
"service" => "Error: invalid or missing request data"
)
);
$redis->lPush('AUTODISCOVER_LOG', $json);
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
}
catch (RedisException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Redis: '.$e
);
return false;
}
list($usec, $sec) = explode(' ', microtime());
if(!$data) {
try {
$json = json_encode(
array(
"time" => time(),
"ua" => $_SERVER['HTTP_USER_AGENT'],
"user" => $_SERVER['PHP_AUTH_USER'],
"service" => "Error: invalid or missing request data"
)
);
$redis->lPush('AUTODISCOVER_LOG', $json);
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
}
catch (RedisException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Redis: '.$e
);
return false;
}
list($usec, $sec) = explode(' ', microtime());
?>
<Response>
<Error Time="<?=date('H:i:s', $sec) . substr($usec, 0, strlen($usec) - 2);?>" Id="2477272013">
@ -101,54 +101,54 @@ else {
</Response>
</Autodiscover>
<?php
exit(0);
}
try {
$discover = new SimpleXMLElement($data);
$email = $discover->Request->EMailAddress;
} catch (Exception $e) {
$email = $_SERVER['PHP_AUTH_USER'];
}
exit(0);
}
try {
$discover = new SimpleXMLElement($data);
$email = $discover->Request->EMailAddress;
} catch (Exception $e) {
$email = $_SERVER['PHP_AUTH_USER'];
}
$username = trim($email);
try {
$stmt = $pdo->prepare("SELECT `name` FROM `mailbox` WHERE `username`= :username");
$stmt->execute(array(':username' => $username));
$MailboxData = $stmt->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
die("Failed to determine name from SQL");
}
if (!empty($MailboxData['name'])) {
$displayname = $MailboxData['name'];
}
else {
$displayname = $email;
}
try {
$json = json_encode(
array(
"time" => time(),
"ua" => $_SERVER['HTTP_USER_AGENT'],
"user" => $_SERVER['PHP_AUTH_USER'],
"service" => $autodiscover_config['autodiscoverType']
)
);
$redis->lPush('AUTODISCOVER_LOG', $json);
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
}
catch (RedisException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Redis: '.$e
);
return false;
}
if ($autodiscover_config['autodiscoverType'] == 'imap') {
$username = trim($email);
try {
$stmt = $pdo->prepare("SELECT `name` FROM `mailbox` WHERE `username`= :username");
$stmt->execute(array(':username' => $username));
$MailboxData = $stmt->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
die("Failed to determine name from SQL");
}
if (!empty($MailboxData['name'])) {
$displayname = $MailboxData['name'];
}
else {
$displayname = $email;
}
try {
$json = json_encode(
array(
"time" => time(),
"ua" => $_SERVER['HTTP_USER_AGENT'],
"user" => $_SERVER['PHP_AUTH_USER'],
"service" => $autodiscover_config['autodiscoverType']
)
);
$redis->lPush('AUTODISCOVER_LOG', $json);
$redis->lTrim('AUTODISCOVER_LOG', 0, 100);
}
catch (RedisException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Redis: '.$e
);
return false;
}
if ($autodiscover_config['autodiscoverType'] == 'imap') {
?>
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<User>
<DisplayName><?=$displayname;?></DisplayName>
<DisplayName><?=htmlspecialchars($displayname, ENT_XML1 | ENT_QUOTES, 'UTF-8');?></DisplayName>
</User>
<Account>
<AccountType>email</AccountType>
@ -190,13 +190,13 @@ else {
</Account>
</Response>
<?php
}
else if ($autodiscover_config['autodiscoverType'] == 'activesync') {
}
else if ($autodiscover_config['autodiscoverType'] == 'activesync') {
?>
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006">
<Culture>en:en</Culture>
<User>
<DisplayName><?=$displayname;?></DisplayName>
<DisplayName><?=htmlspecialchars($displayname, ENT_XML1 | ENT_QUOTES, 'UTF-8');?></DisplayName>
<EMailAddress><?=$email;?></EMailAddress>
</User>
<Action>
@ -210,11 +210,9 @@ else {
</Action>
</Response>
<?php
}
}
?>
</Autodiscover>
<?php
}
}
}
?>

View File

@ -34,4 +34,4 @@ table.footable>tbody>tr.footable-empty>td {
}
.inputMissingAttr {
border-color: #FF4136;
}
}

View File

@ -28,10 +28,10 @@ table.footable>tbody>tr.footable-empty>td {
width: 80%;
}
}
.mass-actions-quarantaine {
.mass-actions-quarantine {
user-select: none;
padding:10px 0 10px 10px;
}
.inputMissingAttr {
border-color: #FF4136;
}
}

View File

@ -9,21 +9,14 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
<div class="container">
<ul class="nav nav-tabs" role="tablist">
<li class="dropdown active"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Rspamd
<span class="caret"></span></a>
<ul class="dropdown-menu">
<li role="presentation" class="active"><a href="#tab-rspamd-ui" aria-controls="tab-rspamd-ui" role="tab" data-toggle="tab">Rspamd UI</a></li>
<li role="presentation"><a href="#tab-rspamd-settings" aria-controls="tab-rspamd-settings" role="tab" data-toggle="tab">Rspamd settings map</a></li>
</ul>
</li>
<li role="presentation"><a href="#tab-containers" aria-controls="tab-containers" role="tab" data-toggle="tab">Containers</a></li>
<li role="presentation" class="active"><a href="#tab-containers" aria-controls="tab-containers" role="tab" data-toggle="tab">Containers & System</a></li>
<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Logs
<span class="caret"></span></a>
<ul class="dropdown-menu">
<li role="presentation"><a href="#tab-postfix-logs" aria-controls="tab-postfix-logs" role="tab" data-toggle="tab">Postfix</a></li>
<li role="presentation"><a href="#tab-dovecot-logs" aria-controls="tab-dovecot-logs" role="tab" data-toggle="tab">Dovecot</a></li>
<li role="presentation"><a href="#tab-sogo-logs" aria-controls="tab-sogo-logs" role="tab" data-toggle="tab">SOGo</a></li>
<li role="presentation"><a href="#tab-fail2ban-logs" aria-controls="tab-fail2ban-logs" role="tab" data-toggle="tab">Fail2ban</a></li>
<li role="presentation"><a href="#tab-netfilter-logs" aria-controls="tab-netfilter-logs" role="tab" data-toggle="tab">Netfilter</a></li>
<li role="presentation"><a href="#tab-rspamd-history" aria-controls="tab-rspamd-history" role="tab" data-toggle="tab">Rspamd</a></li>
<li role="presentation"><a href="#tab-autodiscover-logs" aria-controls="tab-autodiscover-logs" role="tab" data-toggle="tab">Autodiscover</a></li>
<li role="presentation"><a href="#tab-watchdog-logs" aria-controls="tab-watchdog-logs" role="tab" data-toggle="tab">Watchdog</a></li>
@ -31,67 +24,42 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
<li role="presentation"><a href="#tab-api-logs" aria-controls="tab-api-logs" role="tab" data-toggle="tab">API</a></li>
</ul>
</li>
<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">Rspamd
<span class="caret"></span></a>
<ul class="dropdown-menu">
<li role="presentation"><a href="#tab-rspamd-ui" aria-controls="tab-rspamd-ui" role="tab" data-toggle="tab">Rspamd UI</a></li>
<li role="presentation"><a href="#tab-rspamd-settings" aria-controls="tab-rspamd-settings" role="tab" data-toggle="tab">Rspamd settings map</a></li>
</ul>
</li>
</ul>
<div class="row">
<div class="col-md-12">
<div class="tab-content" style="padding-top:20px">
<div role="tabpanel" class="tab-pane active" id="tab-rspamd-ui">
<?php
$exec_fields = array('cmd' => 'df', 'dir' => '/var/vmail');
$vmail_df = explode(',', json_decode(docker('dovecot-mailcow', 'post', 'exec', $exec_fields), true));
?>
<div role="tabpanel" class="tab-pane active" id="tab-containers">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Rspamd UI</h3>
<h3 class="panel-title">Disk usage</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-9">
<form class="form-horizontal" autocapitalize="none" data-id="admin" autocorrect="off" role="form" method="post">
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<label>
<a href="/rspamd/" target="_blank"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> Rspamd UI</a>
</label>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="rspamd_ui_pass"><?=$lang['admin']['password'];?>:</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="rspamd_ui_pass" id="rspamd_ui_pass">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="rspamd_ui_pass2"><?=$lang['admin']['password_repeat'];?>:</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="rspamd_ui_pass2" id="rspamd_ui_pass2">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<button type="submit" class="btn btn-default" id="rspamd_ui" name="rspamd_ui" href="#"><span class="glyphicon glyphicon-check"></span> <?=$lang['admin']['save'];?></button>
</div>
</div>
</form>
</div>
<div class="col-sm-3">
<img class="img-responsive" src="/img/rspamd_logo.png" alt="Rspamd UI" />
<p>/var/vmail on <?=$vmail_df[0];?></p>
<p><?=$vmail_df[2];?> / <?=$vmail_df[1];?> (<?=$vmail_df[4];?>)</p>
</div>
<div class="col-sm-9">
<div class="progress">
<div class="progress-bar progress-bar-info" role="progressbar" style="width:<?=$vmail_df[4];?>"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane" id="tab-rspamd-settings">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Rspamd settings map</h3>
</div>
<div class="panel-body">
<textarea autocorrect="off" spellcheck="false" autocapitalize="none" class="form-control" rows="20" id="settings_map" name="settings_map" readonly><?=file_get_contents('http://nginx:8081/settings.php');?></textarea>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane" id="tab-containers">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Container information</h3>
@ -112,7 +80,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
'redis-mailcow',
'php-fpm-mailcow',
'mysql-mailcow',
'fail2ban-mailcow',
'netfilter-mailcow',
'clamd-mailcow'
);
foreach ($container_array as $container) {
@ -123,21 +91,26 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
<?php
date_default_timezone_set('UTC');
$StartedAt = date_parse($container_stats['State']['StartedAt']);
$date = new \DateTime();
$date->setTimestamp(mktime(
$StartedAt['hour'],
$StartedAt['minute'],
$StartedAt['second'],
$StartedAt['month'],
$StartedAt['day'],
$StartedAt['year']));
$user_tz = new DateTimeZone(getenv('TZ'));
$date->setTimezone($user_tz);
$started = $date->format('r');
if ($StartedAt['hour'] !== false) {
$date = new \DateTime();
$date->setTimestamp(mktime(
$StartedAt['hour'],
$StartedAt['minute'],
$StartedAt['second'],
$StartedAt['month'],
$StartedAt['day'],
$StartedAt['year']));
$user_tz = new DateTimeZone(getenv('TZ'));
$date->setTimezone($user_tz);
$started = $date->format('r');
}
else {
$started = '?';
}
?>
<small>(Started on <?=$started;?>),
<a href data-toggle="modal" data-container="<?=$container;?>" data-target="#RestartContainer">Restart</a></small>
<span class="pull-right label label-<?=($container_stats['State']['Running'] == 1) ? 'success' : 'danger';?>">&nbsp;&nbsp;&nbsp;</span>
<span class="pull-right label label-<?=($container_stats !== false && !empty($container_stats)) ? (($container_stats['State']['Running'] == 1) ? 'success' : 'danger') : 'default'; ?>">&nbsp;&nbsp;&nbsp;</span>
</li>
<?php
}
@ -198,18 +171,18 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
</div>
</div>
<div role="tabpanel" class="tab-pane" id="tab-fail2ban-logs">
<div role="tabpanel" class="tab-pane" id="tab-netfilter-logs">
<div class="panel panel-default">
<div class="panel-heading">Fail2ban <span class="badge badge-info log-lines"></span>
<div class="panel-heading">Netfilter <span class="badge badge-info log-lines"></span>
<div class="btn-group pull-right">
<button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="fail2ban_log" data-log-url="fail2ban" data-nrows="100">+ 100</button>
<button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="fail2ban_log" data-log-url="fail2ban" data-nrows="1000">+ 1000</button>
<button class="btn btn-xs btn-default" id="refresh_fail2ban_log"><?=$lang['admin']['refresh'];?></button>
<button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="100">+ 100</button>
<button class="btn btn-xs btn-default add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="1000">+ 1000</button>
<button class="btn btn-xs btn-default" id="refresh_netfilter_log"><?=$lang['admin']['refresh'];?></button>
</div>
</div>
<div class="panel-body">
<div class="table-responsive">
<table class="table table-striped table-condensed" id="fail2ban_log"></table>
<table class="table table-striped table-condensed" id="netfilter_log"></table>
</div>
</div>
</div>
@ -300,6 +273,60 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
</div>
</div>
<div role="tabpanel" class="tab-pane" id="tab-rspamd-ui">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Rspamd UI</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-9">
<form class="form-horizontal" autocapitalize="none" data-id="admin" autocorrect="off" role="form" method="post">
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<label>
<a href="/rspamd/" target="_blank"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> Rspamd UI</a>
</label>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="rspamd_ui_pass"><?=$lang['admin']['password'];?>:</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="rspamd_ui_pass" id="rspamd_ui_pass">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-3" for="rspamd_ui_pass2"><?=$lang['admin']['password_repeat'];?>:</label>
<div class="col-sm-9">
<input type="password" class="form-control" name="rspamd_ui_pass2" id="rspamd_ui_pass2">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-9">
<button type="submit" class="btn btn-default" id="rspamd_ui" name="rspamd_ui" href="#"><span class="glyphicon glyphicon-check"></span> <?=$lang['admin']['save'];?></button>
</div>
</div>
</form>
</div>
<div class="col-sm-3">
<img class="img-responsive" src="/img/rspamd_logo.png" alt="Rspamd UI" />
</div>
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane" id="tab-rspamd-settings">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Rspamd settings map</h3>
</div>
<div class="panel-body">
<textarea autocorrect="off" spellcheck="false" autocapitalize="none" class="form-control" rows="20" id="settings_map" name="settings_map" readonly><?=file_get_contents('http://nginx:8081/settings.php');?></textarea>
</div>
</div>
</div>
</div> <!-- /tab-content -->
</div> <!-- /col-md-12 -->
</div> <!-- /row -->

View File

@ -20,7 +20,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
if ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin") {
if (isset($_GET["alias"]) &&
!empty($_GET["alias"])) {
$alias = $_GET["alias"];
$alias = html_entity_decode(rawurldecode($_GET["alias"]));
$result = mailbox('get', 'alias_details', $alias);
if (!empty($result)) {
?>
@ -46,7 +46,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-success" id="edit_selected" data-id="editalias" data-item="<?=$alias;?>" data-api-url='edit/alias' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
<button class="btn btn-success" id="edit_selected" data-id="editalias" data-item="<?=htmlspecialchars($alias);?>" data-api-url='edit/alias' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
</div>
</div>
</form>
@ -313,9 +313,9 @@ if (isset($_SESSION['mailcow_cc_role'])) {
}
}
elseif (isset($_GET['aliasdomain']) &&
is_valid_domain_name($_GET["aliasdomain"]) &&
is_valid_domain_name(html_entity_decode(rawurldecode($_GET["aliasdomain"]))) &&
!empty($_GET["aliasdomain"])) {
$alias_domain = $_GET["aliasdomain"];
$alias_domain = html_entity_decode(rawurldecode($_GET["aliasdomain"]));
$result = mailbox('get', 'alias_domain_details', $alias_domain);
$rl = mailbox('get', 'ratelimit', $alias_domain);
if (!empty($result)) {
@ -380,8 +380,8 @@ if (isset($_SESSION['mailcow_cc_role'])) {
<?php
}
}
elseif (isset($_GET['mailbox']) && filter_var($_GET["mailbox"], FILTER_VALIDATE_EMAIL) && !empty($_GET["mailbox"])) {
$mailbox = $_GET["mailbox"];
elseif (isset($_GET['mailbox']) && filter_var(html_entity_decode(rawurldecode($_GET["mailbox"])), FILTER_VALIDATE_EMAIL) && !empty($_GET["mailbox"])) {
$mailbox = html_entity_decode(rawurldecode($_GET["mailbox"]));
$result = mailbox('get', 'mailbox_details', $mailbox);
$rl = mailbox('get', 'ratelimit', $mailbox);
if (!empty($result)) {
@ -390,6 +390,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
<form class="form-horizontal" data-id="editmailbox" role="form" method="post">
<input type="hidden" value="0" name="sender_acl">
<input type="hidden" value="0" name="active">
<input type="hidden" value="0" name="force_pw_update">
<div class="form-group">
<label class="control-label col-sm-2" for="name"><?=$lang['edit']['full_name'];?>:</label>
<div class="col-sm-10">
@ -476,6 +477,14 @@ if (isset($_SESSION['mailcow_cc_role'])) {
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label><input type="checkbox" value="1" name="force_pw_update" <?=($result['attributes']['force_pw_update']=="1") ? "checked" : null;?>> <?=$lang['edit']['force_pw_update'];?></label>
<small class="help-block"><?=$lang['edit']['force_pw_update_info'];?></small>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-success" id="edit_selected" data-id="editmailbox" data-item="<?=htmlspecialchars($result['username']);?>" data-api-url='edit/mailbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
@ -500,7 +509,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
</select>
</div>
<div class="form-group">
<button class="btn btn-default" id="edit_selected" data-id="mboxratelimit" data-item="<?=$mailbox;?>" data-api-url='edit/ratelimit' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
<button class="btn btn-default" id="edit_selected" data-id="mboxratelimit" data-item="<?=htmlspecialchars($mailbox);?>" data-api-url='edit/ratelimit' data-api-attr='{}' href="#"><?=$lang['admin']['save'];?></button>
</div>
</div>
</div>
@ -555,8 +564,8 @@ if (isset($_SESSION['mailcow_cc_role'])) {
<?php
}
}
elseif (isset($_GET['resource']) && filter_var($_GET["resource"], FILTER_VALIDATE_EMAIL) && !empty($_GET["resource"])) {
$resource = $_GET["resource"];
elseif (isset($_GET['resource']) && filter_var(html_entity_decode(rawurldecode($_GET["resource"])), FILTER_VALIDATE_EMAIL) && !empty($_GET["resource"])) {
$resource = html_entity_decode(rawurldecode($_GET["resource"]));
$result = mailbox('get', 'resource_details', $resource);
if (!empty($result)) {
?>
@ -621,7 +630,7 @@ if (isset($_SESSION['mailcow_cc_role'])) {
<label class="control-label col-sm-2" for="bcc_dest">BCC destination</label>
<div class="col-sm-10">
<textarea id="bcc_dest" class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="bcc_dest" name="bcc_dest" required><?=$result['bcc_dest'];?></textarea>
<small>BCC destinations can only be valid email addresses. Separated by whitespace, semicolon, new line or comma.</small>
<small>BCC destination must be a single valid email address.</small>
</div>
</div>
<div class="form-group">
@ -654,6 +663,43 @@ if (isset($_SESSION['mailcow_cc_role'])) {
<?php
}
}
elseif (isset($_GET['recipient_map']) && !empty($_GET["recipient_map"])) {
$map = intval($_GET["recipient_map"]);
$result = recipient_map('details', $map);
if (!empty($result)) {
?>
<h4>Recipient map: <?=$result['recipient_map_old'];?></h4>
<br />
<form class="form-horizontal" data-id="edit_recipient_map" role="form" method="post">
<input type="hidden" value="0" name="active">
<div class="form-group">
<label class="control-label col-sm-2" for="recipient_map_new">New destination</label>
<div class="col-sm-10">
<textarea id="recipient_map_new" class="form-control" autocapitalize="none" autocorrect="off" rows="10" id="recipient_map_new" name="recipient_map_new" required><?=$result['recipient_map_new'];?></textarea>
<small>Recipient map destinations can only be valid email addresses. Separated by whitespace, semicolon, new line or comma.</small>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label><input type="checkbox" value="1" name="active" <?php if (isset($result['active_int']) && $result['active_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['active'];?></label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-success" id="edit_selected" data-id="edit_recipient_map" data-item="<?=$map;?>" data-api-url='edit/recipient_map' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
</div>
</div>
</form>
<?php
}
else {
?>
<div class="alert alert-info" role="alert"><?=$lang['info']['no_action'];?></div>
<?php
}
}
}
if ($_SESSION['mailcow_cc_role'] == "admin" || $_SESSION['mailcow_cc_role'] == "domainadmin" || $_SESSION['mailcow_cc_role'] == "user") {
if (isset($_GET['syncjob']) &&

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,198 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
width="267.80917"
height="306.93799"
viewBox="0 0 267.80917 306.93799"
enable-background="new 0 0 1600 1200"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="cow_protected_nb.svg"><metadata
id="metadata175"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs173" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1721"
inkscape:window-height="1177"
id="namedview171"
showgrid="false"
inkscape:zoom="1.5733333"
inkscape:cx="29.160751"
inkscape:cy="110.78493"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><g
id="g3"
transform="translate(-661.33429,-371.905)"><g
id="g11"><g
id="g13"><g
id="g15" /></g><g
id="g19"><g
id="g21" /></g><g
id="g25"><g
id="g27"><g
id="g29" /></g></g><g
id="g33"><g
id="g35"><g
id="g37" /></g></g></g><polyline
points="702.43,498.974 684.548,546.739 697.837,612.03 723.777,638.295 "
id="polyline43"
style="fill:#3d5263" /><g
id="g45"><g
id="g47"><polyline
points="669.541,457.293 684.791,493.55 705.121,503.375 735.319,465.213 "
id="polyline49"
style="fill:#fef3df" /><g
id="g51"><path
d="m 721.916,479.683 c 0,0 -22.477,-25.55 -49.782,-18.971 0,0 4.666,34.11 46.339,44.009 l 2.61,8.531 c 0,0 -65.598,-9.687 -59.326,-67.578 0,0 48.997,-19.88 72.582,15.103"
id="path53"
inkscape:connector-curvature="0"
style="fill:#b58765" /><polyline
points="920.935,457.293 905.688,493.55 885.359,503.375 855.16,465.213 "
id="polyline55"
style="fill:#fef3df" /><path
d="m 868.564,479.683 c 0,0 22.475,-25.55 49.779,-18.971 0,0 -4.663,34.11 -46.336,44.009 l -2.612,8.531 c 0,0 65.596,-9.687 59.326,-67.578 0,0 -48.995,-19.88 -72.584,15.103"
id="path57"
inkscape:connector-curvature="0"
style="fill:#b58765" /></g></g><path
d="m 737.898,653.506 55.932,0 20.22445,-212.1817 c -55.801,0 -116.21545,37.4237 -116.21545,85.2487 0,1.454 0.085,2.786 0.121,4.174 0.127,3.933 0.448,7.583 0.856,11.132 1.689,14.813 5.45,27.171 8.459,43.373 1.451,7.829 5.001,23.369 5.001,23.369 0.056,0.408 0.165,0.804 0.224,1.211 2.533,16.542 11.829,32.019 25.398,43.674 z"
id="path59"
inkscape:connector-curvature="0"
style="fill:#b58765"
sodipodi:nodetypes="cccscccccc" /><path
d="m 793.259,439.976 0,213.53 55.932,0 c 13.569,-11.654 22.862,-27.132 25.4,-43.675 0.058,-0.407 0.163,-0.803 0.221,-1.211 0,0 3.548,-15.539 5.001,-23.369 3.01,-16.202 6.773,-28.561 8.462,-43.371 0.404,-3.552 0.724,-7.202 0.846,-11.135 0.042,-1.388 0.126,-2.72 0.126,-4.174 -10e-4,-47.823 -40.183,-86.595 -95.988,-86.595 z"
id="path61"
inkscape:connector-curvature="0"
style="fill:#b58765" /><g
id="g63"><g
id="g65"><path
d="m 872.193,619.949 c 0,28.315 -35.083,51.278 -78.366,51.278 -43.289,0 -78.371,-22.963 -78.371,-51.278 0,-28.319 35.082,-51.278 78.371,-51.278 43.282,0 78.366,22.959 78.366,51.278 z"
id="path67"
inkscape:connector-curvature="0"
style="fill:#fef3df" /></g></g><g
id="g69"><g
id="g71"><g
id="g73"><path
d="m 758.318,612.03 c 0,6.213 -5.039,11.254 -11.258,11.254 -6.208,0 -11.25,-5.04 -11.25,-11.254 0,-6.222 5.042,-11.254 11.25,-11.254 6.218,0 11.258,5.033 11.258,11.254 z"
id="path75"
inkscape:connector-curvature="0"
style="fill:#5a3620" /></g></g><g
id="g77"><g
id="g79"><path
d="m 852.109,612.03 c 0,6.213 -5.036,11.254 -11.254,11.254 -6.216,0 -11.257,-5.04 -11.257,-11.254 0,-6.222 5.04,-11.254 11.257,-11.254 6.218,0 11.254,5.033 11.254,11.254 z"
id="path81"
inkscape:connector-curvature="0"
style="fill:#5a3620" /></g></g></g><g
id="g83"><path
d="m 886.474,532.301 c 0.354,-3.113 0.634,-6.31 0.743,-9.752 0.035,-1.217 0.109,-2.384 0.109,-3.66 0,-40.776 -33.361,-74.027 -80.219,-75.758 l -7.333,0.005 c -0.003,0 -0.003,0 -0.006,0 -0.007,0.018 -26.057,89.686 79.134,141.521 0.945,-4.316 2.078,-10.867 2.73,-14.369 2.638,-14.193 3.363,-25.015 4.842,-37.987 z"
id="path85"
inkscape:connector-curvature="0"
style="fill:#87654a" /></g><g
id="g87"><g
id="g89"><g
id="g91"><g
id="g93"><path
d="m 855.16,526.149 c 0,6.963 -5.649,12.608 -12.616,12.608 -6.961,0 -12.611,-5.645 -12.611,-12.608 0,-6.969 5.65,-12.611 12.611,-12.611 6.967,-10e-4 12.616,5.642 12.616,12.611 z"
id="path95"
inkscape:connector-curvature="0"
style="fill:#5a3620" /></g></g></g><g
id="g97"><g
id="g99"><g
id="g101"><path
d="m 763.301,526.149 c 0,6.963 -5.647,12.608 -12.609,12.608 -6.968,0 -12.609,-5.645 -12.609,-12.608 0,-6.969 5.641,-12.611 12.609,-12.611 6.962,-10e-4 12.609,5.642 12.609,12.611 z"
id="path103"
inkscape:connector-curvature="0"
style="fill:#5a3620" /></g></g></g><g
id="g105"><g
id="g107"><path
d="m 760.023,522.362 c 0,2.557 -2.07,4.628 -4.629,4.628 -2.557,0 -4.632,-2.071 -4.632,-4.628 0,-2.552 2.075,-4.625 4.632,-4.625 2.559,0.001 4.629,2.073 4.629,4.625 z"
id="path109"
inkscape:connector-curvature="0"
style="fill:#ffffff" /></g></g><g
id="g111"><g
id="g113"><path
d="m 851.024,522.362 c 0,2.557 -2.073,4.628 -4.628,4.628 -2.558,0 -4.63,-2.071 -4.63,-4.628 0,-2.552 2.072,-4.625 4.63,-4.625 2.555,0.001 4.628,2.073 4.628,4.625 z"
id="path115"
inkscape:connector-curvature="0"
style="fill:#ffffff" /></g></g></g></g><path
d="m 725.288,441.121 c 0,0 -18.232,-25.193 0,-41.628 0,0 13.123,32.005 40.233,31.495"
id="path117"
inkscape:connector-curvature="0"
style="fill:#fef3df" /><path
d="m 848.318,439.837 c 0,0 18.232,-25.193 0,-41.628 0,0 -13.123,32.005 -40.233,31.495"
id="path119"
inkscape:connector-curvature="0"
style="fill:#fef3df" /><path
d="m 797.53,438.453 c -66.381,0 -120.196,53.815 -120.196,120.196 0,66.381 53.815,120.194 120.196,120.194 66.382,0 120.196,-53.813 120.196,-120.194 C 917.725,492.268 863.912,438.453 797.53,438.453 Z m -11.958,215.653 c -52.997,0 -95.961,-43.845 -95.961,-97.931 0,-54.086 42.963,-97.931 95.961,-97.931 52.995,0 95.958,43.845 95.958,97.931 0,54.086 -42.963,97.931 -95.958,97.931 z"
id="path121"
inkscape:connector-curvature="0"
style="fill:#f1f2f2" /><g
id="g123"><path
d="m 793.003,443.237 c 66.381,0 120.194,53.815 120.194,120.196 0,30.711 -11.523,58.726 -30.475,79.973 21.631,-21.736 35.002,-51.697 35.002,-84.785 0,-66.38 -53.813,-120.196 -120.196,-120.196 -35.67,0 -67.706,15.545 -89.719,40.224 21.769,-21.872 51.899,-35.412 85.194,-35.412 z"
id="path125"
inkscape:connector-curvature="0"
style="fill:#ffffff" /></g><g
id="g127"><path
d="m 694.265,502.313 c 0,0 40.198,-14.957 95.353,-14.022 55.155,0.935 100.027,29.447 100.027,29.447 l 8.413,-57.492 c 0,0 -51.883,-35.524 -77.591,-59.829 -25.708,-24.306 -28.98,-28.512 -28.98,-28.512 0,0 -40.198,41.6 -66.373,56.557 -26.175,14.957 -35.524,20.566 -35.524,20.566 l 4.675,53.285 z"
id="path129"
inkscape:connector-curvature="0"
style="fill:#f1f2f2" /><path
d="m 752.039,427.289 c -5.218,15.301 0.741,45.305 6.446,52.941 4.565,-14.198 1.381,-39.668 -6.446,-52.941 z"
id="path131"
inkscape:connector-curvature="0"
style="fill:#97a3a2" /><path
d="m 792.297,477.645 c 8.422,-10.272 5.501,-61.687 -0.342,-73.723 -6.194,15.191 -10.634,65.438 0.342,73.723 z"
id="path133"
inkscape:connector-curvature="0"
style="fill:#97a3a2" /><path
d="m 720.593,443.412 c -3.983,12.281 1.136,36.168 5.784,42.198 3.474,-11.393 0.625,-31.693 -5.784,-42.198 z"
id="path135"
inkscape:connector-curvature="0"
style="fill:#97a3a2" /><path
d="m 832.42,429.158 c 5.218,15.301 -0.741,45.305 -6.446,52.941 -4.565,-14.197 -1.38,-39.667 6.446,-52.941 z"
id="path137"
inkscape:connector-curvature="0"
style="fill:#97a3a2" /><path
d="m 863.633,447.619 c 3.983,12.281 -1.136,36.168 -5.784,42.198 -3.474,-11.393 -0.625,-31.693 5.784,-42.198 z"
id="path139"
inkscape:connector-curvature="0"
style="fill:#97a3a2" /></g><g
id="g143" /><path
d="m 730.865,636.637 c 0,0 43.49,2.05 64.328,-35.861 0,0 14.758,30.223 46.61,34.759"
id="path157"
inkscape:connector-curvature="0"
style="opacity:0.1;fill:#3d5263" /><path
d="m 795.193,671.227 0,-60.691 c -13.615,27.608 -64.328,26.101 -64.328,26.101 0,0 3.306,8.89 3.788,9.853 0.482,0.963 21.508,12.52 21.508,12.52"
id="path159"
inkscape:connector-curvature="0"
style="fill:#f1f2f2" /><path
d="m 859.521,636.637 c 0,0 -50.713,1.507 -64.328,-26.101 l 0,60.691"
id="path161"
inkscape:connector-curvature="0"
style="fill:#f1f2f2" /><g
id="g163" /></g></svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,6 @@
<?php
session_start();
unset($_SESSION['pending_mailcow_cc_username']);
unset($_SESSION['pending_mailcow_cc_role']);
unset($_SESSION['pending_tfa_method']);
?>

View File

@ -23,7 +23,7 @@ function rrmdir($src) {
}
if (!empty($_GET['id']) && ctype_alnum($_GET['id'])) {
$tmpdir = '/tmp/' . $_GET['id'] . '/';
$mailc = quarantaine('details', $_GET['id']);
$mailc = quarantine('details', $_GET['id']);
if (strlen($mailc['msg']) > 10485760) {
echo json_encode(array('error' => 'Message size exceeds 10 MiB.'));
exit;

View File

@ -61,7 +61,7 @@ $(document).ready(function() {
type: "GET",
cache: false,
dataType: 'script',
url: "/api/v1/get/u2f-authentication/<?= (isset($_SESSION['pending_mailcow_cc_username'])) ? $_SESSION['pending_mailcow_cc_username'] : null; ?>",
url: "/api/v1/get/u2f-authentication/<?= (isset($_SESSION['pending_mailcow_cc_username'])) ? rawurlencode($_SESSION['pending_mailcow_cc_username']) : null; ?>",
complete: function(data){
$('#u2f_status_auth').html('<?=$lang['tfa']['waiting_usb_auth'];?>');
data;
@ -79,6 +79,17 @@ $(document).ready(function() {
});
}
});
$('#ConfirmTFAModal').on('hidden.bs.modal', function(){
$.ajax({
type: "GET",
cache: false,
dataType: 'script',
url: '/inc/ajax/destroy_tfa_auth.php',
complete: function(data){
window.location = window.location.href.split("#")[0];
}
});
});
<?php endif; ?>
// Set TFA modals
@ -100,7 +111,7 @@ $(document).ready(function() {
type: "GET",
cache: false,
dataType: 'script',
url: "/api/v1/get/u2f-registration/<?= (isset($_SESSION['mailcow_cc_username'])) ? $_SESSION['mailcow_cc_username'] : null; ?>",
url: "/api/v1/get/u2f-registration/<?= (isset($_SESSION['mailcow_cc_username'])) ? rawurlencode($_SESSION['mailcow_cc_username']) : null; ?>",
complete: function(data){
data;
setTimeout(function() {
@ -205,7 +216,7 @@ $(document).ready(function() {
$('#triggerRestartContainer').html('<span class="glyphicon glyphicon-ok"></span> ');
$('#statusTriggerRestartContainer2').append(data);
$('#triggerRestartContainer').html('<span class="glyphicon glyphicon-ok"></span> ');
location.reload();
window.location = window.location.href.split("#")[0];
}
});
});

View File

@ -15,7 +15,7 @@ function bcc($_action, $_data = null, $attr = null) {
return false;
}
$local_dest = strtolower(trim($_data['local_dest']));
$bcc_dest = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['bcc_dest']));
$bcc_dest = $_data['bcc_dest'];
$active = intval($_data['active']);
$type = $_data['type'];
if ($type != 'sender' && $type != 'rcpt') {
@ -60,18 +60,10 @@ function bcc($_action, $_data = null, $attr = null) {
else {
return false;
}
foreach ($bcc_dest as &$bcc_dest_e) {
if (!filter_var($bcc_dest_e, FILTER_VALIDATE_EMAIL)) {
$bcc_dest_e = null;;
}
$bcc_dest_e = strtolower($bcc_dest_e);
}
$bcc_dest = array_filter($bcc_dest);
$bcc_dest = implode(",", $bcc_dest);
if (empty($bcc_dest)) {
if (!filter_var($bcc_dest, FILTER_VALIDATE_EMAIL)) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'BCC map destination cannot be empty'
'msg' => 'BCC map must be a valid email address'
);
return false;
}
@ -142,16 +134,14 @@ function bcc($_action, $_data = null, $attr = null) {
);
return false;
}
$bcc_dest = array_map('trim', preg_split( "/( |,|;|\n)/", $bcc_dest));
$active = intval($_data['active']);
foreach ($bcc_dest as &$bcc_dest_e) {
if (!filter_var($bcc_dest_e, FILTER_VALIDATE_EMAIL)) {
$bcc_dest_e = null;;
}
$bcc_dest_e = strtolower($bcc_dest_e);
if (!filter_var($bcc_dest, FILTER_VALIDATE_EMAIL)) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'BCC map must be a valid email address'
);
return false;
}
$bcc_dest = array_filter($bcc_dest);
$bcc_dest = implode(",", $bcc_dest);
if (empty($bcc_dest)) {
$_SESSION['return'] = array(
'type' => 'danger',
@ -289,4 +279,237 @@ function bcc($_action, $_data = null, $attr = null) {
return true;
break;
}
}
}
function recipient_map($_action, $_data = null, $attr = null) {
global $pdo;
global $lang;
if ($_SESSION['mailcow_cc_role'] != "admin") {
return false;
}
switch ($_action) {
case 'add':
$old_dest = strtolower(trim($_data['recipient_map_old']));
$new_dest = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['recipient_map_new']));
$active = intval($_data['active']);
if (empty($new_dest)) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Recipient map destination cannot be empty'
);
return false;
}
if (is_valid_domain_name($old_dest)) {
$old_dest_sane = '@' . idn_to_ascii($old_dest);
}
elseif (filter_var($old_dest, FILTER_VALIDATE_EMAIL)) {
$old_dest_sane = $old_dest;
}
else {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Invalid original recipient specified: ' . $old_dest
);
return false;
}
foreach ($new_dest as &$new_dest_e) {
if (!filter_var($new_dest_e, FILTER_VALIDATE_EMAIL)) {
$new_dest_e = null;;
}
$new_dest_e = strtolower($new_dest_e);
}
$new_dest = array_filter($new_dest);
$new_dest = implode(",", $new_dest);
if (empty($new_dest)) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Recipient map destination cannot be empty'
);
return false;
}
try {
$stmt = $pdo->prepare("SELECT `id` FROM `recipient_maps`
WHERE `old_dest` = :old_dest");
$stmt->execute(array(':old_dest' => $old_dest_sane));
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
}
catch(PDOException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'MySQL: '.$e
);
return false;
}
if ($num_results != 0) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'A Recipient map entry "' . htmlspecialchars($old_dest_sane) . '" exists'
);
return false;
}
try {
$stmt = $pdo->prepare("INSERT INTO `recipient_maps` (`old_dest`, `new_dest`, `active`) VALUES
(:old_dest, :new_dest, :active)");
$stmt->execute(array(
':old_dest' => $old_dest_sane,
':new_dest' => $new_dest,
':active' => $active
));
}
catch (PDOException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'MySQL: '.$e
);
return false;
}
$_SESSION['return'] = array(
'type' => 'success',
'msg' => 'Recipient map entry saved'
);
break;
case 'edit':
$ids = (array)$_data['id'];
foreach ($ids as $id) {
$is_now = recipient_map('details', $id);
if (!empty($is_now)) {
$active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
$new_dest = (!empty($_data['recipient_map_new'])) ? $_data['recipient_map_new'] : $is_now['recipient_map_new'];
$old_dest = $is_now['old_dest'];
}
else {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => sprintf($lang['danger']['access_denied'])
);
return false;
}
$new_dest = array_map('trim', preg_split( "/( |,|;|\n)/", $new_dest));
$active = intval($_data['active']);
foreach ($new_dest as &$new_dest_e) {
if (!filter_var($new_dest_e, FILTER_VALIDATE_EMAIL)) {
$new_dest_e = null;;
}
$new_dest_e = strtolower($new_dest_e);
}
$new_dest = array_filter($new_dest);
$new_dest = implode(",", $new_dest);
if (empty($new_dest)) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'Recipient map destination cannot be empty'
);
return false;
}
try {
$stmt = $pdo->prepare("SELECT `id` FROM `recipient_maps`
WHERE `old_dest` = :old_dest");
$stmt->execute(array(':old_dest' => $old_dest));
$id_now = $stmt->fetch(PDO::FETCH_ASSOC)['id'];
}
catch(PDOException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'MySQL: '.$e
);
return false;
}
if (isset($id_now) && $id_now != $id) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'A Recipient map entry ' . htmlspecialchars($old_dest) . ' exists'
);
return false;
}
try {
$stmt = $pdo->prepare("UPDATE `recipient_maps` SET `new_dest` = :new_dest, `active` = :active WHERE `id`= :id");
$stmt->execute(array(
':new_dest' => $new_dest,
':active' => $active,
':id' => $id
));
}
catch (PDOException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'MySQL: '.$e
);
return false;
}
}
$_SESSION['return'] = array(
'type' => 'success',
'msg' => 'Recipient map entry edited'
);
break;
case 'details':
$mapdata = array();
$id = intval($_data);
try {
$stmt = $pdo->prepare("SELECT `id`,
`old_dest` AS `recipient_map_old`,
`new_dest` AS `recipient_map_new`,
`active` AS `active_int`,
CASE `active` WHEN 1 THEN '".$lang['mailbox']['yes']."' ELSE '".$lang['mailbox']['no']."' END AS `active`,
`created`,
`modified` FROM `recipient_maps`
WHERE `id` = :id");
$stmt->execute(array(':id' => $id));
$mapdata = $stmt->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'MySQL: '.$e
);
return false;
}
return $mapdata;
break;
case 'get':
$mapdata = array();
$all_items = array();
$id = intval($_data);
try {
$stmt = $pdo->query("SELECT `id` FROM `recipient_maps`");
$all_items = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'MySQL: '.$e
);
return false;
}
foreach ($all_items as $i) {
$mapdata[] = $i['id'];
}
$all_items = null;
return $mapdata;
break;
case 'delete':
$ids = (array)$_data['id'];
foreach ($ids as $id) {
if (!is_numeric($id)) {
return false;
}
try {
$stmt = $pdo->prepare("DELETE FROM `recipient_maps` WHERE `id`= :id");
$stmt->execute(array(':id' => $id));
}
catch (PDOException $e) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => 'MySQL: '.$e
);
return false;
}
}
$_SESSION['return'] = array(
'type' => 'success',
'msg' => 'Deleted Recipient map id/s ' . implode(', ', $ids)
);
return true;
break;
}
}

View File

@ -7,6 +7,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea
curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/json');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 0);
curl_setopt($curl, CURLOPT_TIMEOUT, 4);
$response = curl_exec($curl);
if ($response === false) {
$err = curl_error($curl);
@ -32,6 +33,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea
curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/json');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 0);
curl_setopt($curl, CURLOPT_TIMEOUT, 4);
$response = curl_exec($curl);
if ($response === false) {
$err = curl_error($curl);
@ -58,6 +60,7 @@ function docker($service_name, $action, $attr1 = null, $attr2 = null, $extra_hea
if (ctype_xdigit($container_id) && ctype_alnum($attr1)) {
curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/' . $attr1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 4);
if (!empty($attr2)) {
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($attr2));
}

View File

@ -4,30 +4,26 @@ function fail2ban($_action, $_data = null) {
global $lang;
switch ($_action) {
case 'get':
$data = array();
$f2b_options = array();
if ($_SESSION['mailcow_cc_role'] != "admin") {
return false;
}
try {
$data['ban_time'] = $redis->Get('F2B_BAN_TIME');
$data['max_attempts'] = $redis->Get('F2B_MAX_ATTEMPTS');
$data['retry_window'] = $redis->Get('F2B_RETRY_WINDOW');
$data['netban_ipv4'] = $redis->Get('F2B_NETBAN_IPV4');
$data['netban_ipv6'] = $redis->Get('F2B_NETBAN_IPV6');
$f2b_options = json_decode($redis->Get('F2B_OPTIONS'), true);
$wl = $redis->hGetAll('F2B_WHITELIST');
if (is_array($wl)) {
foreach ($wl as $key => $value) {
$tmp_data[] = $key;
}
if (isset($tmp_data)) {
$data['whitelist'] = implode(PHP_EOL, $tmp_data);
$f2b_options['whitelist'] = implode(PHP_EOL, $tmp_data);
}
else {
$data['whitelist'] = "";
$f2b_options['whitelist'] = "";
}
}
else {
$data['whitelist'] = "";
$f2b_options['whitelist'] = "";
}
}
catch (RedisException $e) {
@ -37,7 +33,7 @@ function fail2ban($_action, $_data = null) {
);
return false;
}
return $data;
return $f2b_options;
break;
case 'edit':
if ($_SESSION['mailcow_cc_role'] != "admin") {
@ -63,21 +59,16 @@ function fail2ban($_action, $_data = null) {
return false;
}
$wl = $_data['whitelist'];
$ban_time = ($ban_time < 60) ? 60 : $ban_time;
$netban_ipv4 = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
$netban_ipv6 = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
$netban_ipv4 = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
$netban_ipv6 = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
$max_attempts = ($max_attempts < 1) ? 1 : $max_attempts;
$retry_window = ($retry_window < 1) ? 1 : $retry_window;
$f2b_options = array();
$f2b_options['ban_time'] = ($ban_time < 60) ? 60 : $ban_time;
$f2b_options['netban_ipv4'] = ($netban_ipv4 < 8) ? 8 : $netban_ipv4;
$f2b_options['netban_ipv6'] = ($netban_ipv6 < 8) ? 8 : $netban_ipv6;
$f2b_options['netban_ipv4'] = ($netban_ipv4 > 32) ? 32 : $netban_ipv4;
$f2b_options['netban_ipv6'] = ($netban_ipv6 > 128) ? 128 : $netban_ipv6;
$f2b_options['max_attempts'] = ($max_attempts < 1) ? 1 : $max_attempts;
$f2b_options['retry_window'] = ($retry_window < 1) ? 1 : $retry_window;
try {
$redis->Set('F2B_BAN_TIME', $ban_time);
$redis->Set('F2B_MAX_ATTEMPTS', $max_attempts);
$redis->Set('F2B_RETRY_WINDOW', $retry_window);
$redis->Set('F2B_NETBAN_IPV4', $netban_ipv4);
$redis->Set('F2B_NETBAN_IPV6', $netban_ipv6);
$redis->Set('F2B_OPTIONS', json_encode($f2b_options));
$redis->Del('F2B_WHITELIST');
if(!empty($wl)) {
$wl_array = array_map('trim', preg_split( "/( |,|;|\n)/", $wl));

View File

@ -39,7 +39,7 @@ function hasDomainAccess($username, $role, $domain) {
}
function hasMailboxObjectAccess($username, $role, $object) {
global $pdo;
if (!filter_var($username, FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {
if (!filter_var(html_entity_decode(rawurldecode($username)), FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {
return false;
}
if ($role != 'admin' && $role != 'domainadmin' && $role != 'user') {
@ -74,7 +74,7 @@ function generate_tlsa_digest($hostname, $port, $starttls = null) {
return "Not a valid hostname";
}
if (empty($starttls)) {
$context = stream_context_create(array("ssl" => array("capture_peer_cert" => true, 'verify_peer' => false, 'allow_self_signed' => true)));
$context = stream_context_create(array("ssl" => array("capture_peer_cert" => true, 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true)));
$stream = stream_socket_client('ssl://' . $hostname . ':' . $port, $error_nr, $error_msg, 5, STREAM_CLIENT_CONNECT, $context);
if (!$stream) {
$error_msg = isset($error_msg) ? $error_msg : '-';
@ -112,6 +112,7 @@ function generate_tlsa_digest($hostname, $port, $starttls = null) {
stream_set_blocking($stream, true);
stream_context_set_option($stream, 'ssl', 'capture_peer_cert', true);
stream_context_set_option($stream, 'ssl', 'verify_peer', false);
stream_context_set_option($stream, 'ssl', 'verify_peer_name', false);
stream_context_set_option($stream, 'ssl', 'allow_self_signed', true);
stream_socket_enable_crypto($stream, true, STREAM_CRYPTO_METHOD_ANY_CLIENT);
stream_set_blocking($stream, false);
@ -414,7 +415,7 @@ function edit_user_account($postarray) {
}
$password_hashed = hash_password($password_new);
try {
$stmt = $pdo->prepare("UPDATE `mailbox` SET `password` = :password_hashed WHERE `username` = :username");
$stmt = $pdo->prepare("UPDATE `mailbox` SET `password` = :password_hashed, `attributes` = JSON_SET(`attributes`, '$.force_pw_update', '0') WHERE `username` = :username");
$stmt->execute(array(
':password_hashed' => $password_hashed,
':username' => $username
@ -470,22 +471,18 @@ function user_get_alias_details($username) {
));
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
while ($row = array_shift($run)) {
$data['direct_aliases'] = $row['direct_aliases'];
$data['direct_aliases'][] = $row['direct_aliases'];
}
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ', '), '&#10008;') AS `ad_alias` FROM `mailbox`
$stmt = $pdo->prepare("SELECT GROUP_CONCAT(local_part, '@', alias_domain SEPARATOR ', ') AS `ad_alias` FROM `mailbox`
LEFT OUTER JOIN `alias_domain` on `target_domain` = `domain`
WHERE `username` = :username ;");
$stmt->execute(array(':username' => $username));
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
while ($row = array_shift($run)) {
if (empty($data['direct_aliases'])) {
$data['direct_aliases'] = $row['ad_alias'];
}
else {
// Probably faster than imploding
$data['direct_aliases'] .= ', ' . $row['ad_alias'];
}
$data['direct_aliases'][] = $row['ad_alias'];
}
$data['direct_aliases'] = implode(', ', array_filter($data['direct_aliases']));
$data['direct_aliases'] = empty($data['direct_aliases']) ? '&#10008;' : $data['direct_aliases'];
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`send_as` SEPARATOR ', '), '&#10008;') AS `send_as` FROM `sender_acl` WHERE `logged_in_as` = :username AND `send_as` NOT LIKE '@%';");
$stmt->execute(array(':username' => $username));
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
@ -1134,13 +1131,13 @@ function get_logs($container, $lines = false) {
return $data_array;
}
}
if ($container == "fail2ban-mailcow") {
if ($container == "netfilter-mailcow") {
if (!is_numeric($lines)) {
list ($from, $to) = explode('-', $lines);
$data = $redis->lRange('F2B_LOG', intval($from), intval($to));
$data = $redis->lRange('NETFILTER_LOG', intval($from), intval($to));
}
else {
$data = $redis->lRange('F2B_LOG', 0, intval($lines));
$data = $redis->lRange('NETFILTER_LOG', 0, intval($lines));
}
if ($data) {
foreach ($data as $json_line) {
@ -1166,12 +1163,13 @@ function get_logs($container, $lines = false) {
}
if ($container == "rspamd-history") {
$curl = curl_init();
curl_setopt($curl, CURLOPT_UNIX_SOCKET_PATH, '/rspamd-sock/rspamd.sock');
if (!is_numeric($lines)) {
list ($from, $to) = explode('-', $lines);
curl_setopt($curl, CURLOPT_URL,"http://rspamd-mailcow:11334/history?from=" . intval($from) . "&to=" . intval($to));
curl_setopt($curl, CURLOPT_URL,"http://rspamd/history?from=" . intval($from) . "&to=" . intval($to));
}
else {
curl_setopt($curl, CURLOPT_URL,"http://rspamd-mailcow:11334/history?to=" . intval($lines));
curl_setopt($curl, CURLOPT_URL,"http://rspamd/history?to=" . intval($lines));
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$history = curl_exec($curl);

View File

@ -891,8 +891,8 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
return false;
}
try {
$stmt = $pdo->prepare("INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `active`)
VALUES (:username, :password_hashed, :name, :maildir, :quota_b, :local_part, :domain, :active)");
$stmt = $pdo->prepare("INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `attributes`, `active`)
VALUES (:username, :password_hashed, :name, :maildir, :quota_b, :local_part, :domain, '{\"force_pw_update\": \"0\", \"tls_enforce_in\": \"0\", \"tls_enforce_out\": \"0\"}', :active)");
$stmt->execute(array(
':username' => $username,
':password_hashed' => $password_hashed,
@ -1152,10 +1152,10 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
return false;
}
try {
$stmt = $pdo->prepare("UPDATE `mailbox` SET `tls_enforce_out` = :tls_out, `tls_enforce_in` = :tls_in WHERE `username` = :username");
$stmt = $pdo->prepare("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.tls_enforce_out', :tls_out), `attributes` = JSON_SET(`attributes`, '$.tls_enforce_in', :tls_in) WHERE `username` = :username");
$stmt->execute(array(
':tls_out' => $tls_enforce_out,
':tls_in' => $tls_enforce_in,
':tls_out' => intval($tls_enforce_out),
':tls_in' => intval($tls_enforce_in),
':username' => $username
));
}
@ -1954,6 +1954,7 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
$is_now = mailbox('get', 'mailbox_details', $username);
if (!empty($is_now)) {
$active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active_int'];
(int)$force_pw_update = (isset($_data['force_pw_update'])) ? intval($_data['force_pw_update']) : intval($is_now['attributes']['force_pw_update']);
$name = (!empty($_data['name'])) ? $_data['name'] : $is_now['name'];
$domain = $is_now['domain'];
$quota_m = (!empty($_data['quota'])) ? $_data['quota'] : ($is_now['quota'] / 1048576);
@ -2113,24 +2114,11 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
}
$password_hashed = hash_password($password);
try {
$stmt = $pdo->prepare("UPDATE `alias` SET
`active` = :active
WHERE `address` = :address");
$stmt->execute(array(
':address' => $username,
':active' => $active
));
$stmt = $pdo->prepare("UPDATE `mailbox` SET
`active` = :active,
`password` = :password_hashed,
`name`= :name,
`quota` = :quota_b
`password` = :password_hashed
WHERE `username` = :username");
$stmt->execute(array(
':password_hashed' => $password_hashed,
':active' => $active,
':name' => $name,
':quota_b' => $quota_b,
':username' => $username
));
}
@ -2153,12 +2141,14 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
$stmt = $pdo->prepare("UPDATE `mailbox` SET
`active` = :active,
`name`= :name,
`quota` = :quota_b
`quota` = :quota_b,
`attributes` = JSON_SET(`attributes`, '$.force_pw_update', :force_pw_update)
WHERE `username` = :username");
$stmt->execute(array(
':active' => $active,
':name' => $name,
':quota_b' => $quota_b,
':force_pw_update' => $force_pw_update,
':username' => $username
));
}
@ -2402,7 +2392,7 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
return $mailboxes;
break;
case 'tls_policy':
$policydata = array();
$attrs = array();
if (isset($_data) && filter_var($_data, FILTER_VALIDATE_EMAIL)) {
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) {
return false;
@ -2412,9 +2402,9 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
$_data = $_SESSION['mailcow_cc_username'];
}
try {
$stmt = $pdo->prepare("SELECT `tls_enforce_out`, `tls_enforce_in` FROM `mailbox` WHERE `username` = :username");
$stmt = $pdo->prepare("SELECT `attributes` FROM `mailbox` WHERE `username` = :username");
$stmt->execute(array(':username' => $_data));
$policydata = $stmt->fetch(PDO::FETCH_ASSOC);
$attrs = $stmt->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e) {
$_SESSION['return'] = array(
@ -2423,7 +2413,11 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
);
return false;
}
return $policydata;
$attrs = json_decode($attrs['attributes'], true);
return array(
'tls_enforce_in' => $attrs['tls_enforce_in'],
'tls_enforce_out' => $attrs['tls_enforce_out']
);
break;
case 'filters':
$filters = array();
@ -3070,6 +3064,7 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
`mailbox`.`domain`,
`mailbox`.`quota`,
`quota2`.`bytes`,
`attributes`,
`quota2`.`messages`
FROM `mailbox`, `quota2`, `domain`
WHERE `mailbox`.`kind` NOT REGEXP 'location|thing|group' AND `mailbox`.`username` = `quota2`.`username` AND `domain`.`domain` = `mailbox`.`domain` AND `mailbox`.`username` = :mailbox");
@ -3097,6 +3092,7 @@ function mailbox($_action, $_type, $_data = null, $attr = null) {
$mailboxdata['active_int'] = $row['active_int'];
$mailboxdata['domain'] = $row['domain'];
$mailboxdata['quota'] = $row['quota'];
$mailboxdata['attributes'] = json_decode($row['attributes'], true);
$mailboxdata['quota_used'] = intval($row['bytes']);
$mailboxdata['percent_in_use'] = round((intval($row['bytes']) / intval($row['quota'])) * 100);
$mailboxdata['messages'] = $row['messages'];

View File

@ -94,7 +94,7 @@ function policy($_action, $_scope, $_data = null) {
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $object)) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => sprintf($lang['danger']['access_denied'])
'msg' => $object
);
return false;
}

View File

@ -1,5 +1,5 @@
<?php
function quarantaine($_action, $_data = null) {
function quarantine($_action, $_data = null) {
global $pdo;
global $redis;
global $lang;
@ -12,7 +12,7 @@ function quarantaine($_action, $_data = null) {
else {
$ids = $_data['id'];
}
if (!isset($_SESSION['acl']['quarantaine']) || $_SESSION['acl']['quarantaine'] != "1" ) {
if (!isset($_SESSION['acl']['quarantine']) || $_SESSION['acl']['quarantine'] != "1" ) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => sprintf($lang['danger']['access_denied'])
@ -28,12 +28,12 @@ function quarantaine($_action, $_data = null) {
return false;
}
try {
$stmt = $pdo->prepare('SELECT `rcpt` FROM `quarantaine` WHERE `id` = :id');
$stmt = $pdo->prepare('SELECT `rcpt` FROM `quarantine` WHERE `id` = :id');
$stmt->execute(array(':id' => $id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
try {
$stmt = $pdo->prepare("DELETE FROM `quarantaine` WHERE `id` = :id");
$stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `id` = :id");
$stmt->execute(array(
':id' => $id
));
@ -67,7 +67,7 @@ function quarantaine($_action, $_data = null) {
);
break;
case 'edit':
if (!isset($_SESSION['acl']['quarantaine']) || $_SESSION['acl']['quarantaine'] != "1" ) {
if (!isset($_SESSION['acl']['quarantine']) || $_SESSION['acl']['quarantine'] != "1" ) {
$_SESSION['return'] = array(
'type' => 'danger',
'msg' => sprintf($lang['danger']['access_denied'])
@ -121,7 +121,7 @@ function quarantaine($_action, $_data = null) {
return false;
}
try {
$stmt = $pdo->prepare('SELECT `msg`, `qid`, `sender`, `rcpt` FROM `quarantaine` WHERE `id` = :id');
$stmt = $pdo->prepare('SELECT `msg`, `qid`, `sender`, `rcpt` FROM `quarantine` WHERE `id` = :id');
$stmt->execute(array(':id' => $id));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
@ -167,13 +167,13 @@ function quarantaine($_action, $_data = null) {
$mail->Port = 590;
$mail->setFrom($sender);
$mail->CharSet = 'UTF-8';
$mail->Subject = sprintf($lang['quarantaine']['release_subject'], $row['qid']);
$mail->Subject = sprintf($lang['quarantine']['release_subject'], $row['qid']);
$mail->addAddress($row['rcpt']);
$mail->IsHTML(false);
$msg_tmpf = tempnam("/tmp", $row['qid']);
file_put_contents($msg_tmpf, $row['msg']);
$mail->addAttachment($msg_tmpf, $row['qid'] . '.eml');
$mail->Body = sprintf($lang['quarantaine']['release_body']);
$mail->Body = sprintf($lang['quarantine']['release_body']);
$mail->send();
unlink($msg_tmpf);
}
@ -186,7 +186,7 @@ function quarantaine($_action, $_data = null) {
return false;
}
try {
$stmt = $pdo->prepare("DELETE FROM `quarantaine` WHERE `id` = :id");
$stmt = $pdo->prepare("DELETE FROM `quarantine` WHERE `id` = :id");
$stmt->execute(array(
':id' => $id
));
@ -209,7 +209,7 @@ function quarantaine($_action, $_data = null) {
case 'get':
try {
if ($_SESSION['mailcow_cc_role'] == "user") {
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantaine` WHERE `rcpt` = :mbox');
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine` WHERE `rcpt` = :mbox');
$stmt->execute(array(':mbox' => $_SESSION['mailcow_cc_username']));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
while($row = array_shift($rows)) {
@ -217,7 +217,7 @@ function quarantaine($_action, $_data = null) {
}
}
elseif ($_SESSION['mailcow_cc_role'] == "admin") {
$stmt = $pdo->query('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantaine`');
$stmt = $pdo->query('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine`');
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
while($row = array_shift($rows)) {
$q_meta[] = $row;
@ -226,7 +226,7 @@ function quarantaine($_action, $_data = null) {
else {
$domains = array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains'));
foreach ($domains as $domain) {
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantaine` WHERE `rcpt` REGEXP :domain');
$stmt = $pdo->prepare('SELECT `id`, `qid`, `rcpt`, `sender`, UNIX_TIMESTAMP(`created`) AS `created` FROM `quarantine` WHERE `rcpt` REGEXP :domain');
$stmt->execute(array(':domain' => '@' . $domain . '$'));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
while($row = array_shift($rows)) {
@ -270,7 +270,7 @@ function quarantaine($_action, $_data = null) {
return false;
}
try {
$stmt = $pdo->prepare('SELECT `rcpt`, `symbols`, `msg`, `domain` FROM `quarantaine` WHERE `id`= :id');
$stmt = $pdo->prepare('SELECT `rcpt`, `symbols`, `msg`, `domain` FROM `quarantine` WHERE `id`= :id');
$stmt->execute(array(':id' => $_data));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $row['rcpt'])) {
@ -287,4 +287,4 @@ function quarantaine($_action, $_data = null) {
return false;
break;
}
}
}

View File

@ -1,9 +1,10 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="<?= $_SESSION['mailcow_locale'] ?>">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#F5D76E"/>
<meta http-equiv="Referrer-Policy" content="same-origin">
<title><?=$UI_TEXTS['title_name'];?></title>
<!--[if lt IE 9]>
@ -29,7 +30,7 @@
<?= (preg_match("/admin.php/i", $_SERVER['REQUEST_URI'])) ? '<link rel="stylesheet" href="/css/admin.css">' : null; ?>
<?= (preg_match("/user.php/i", $_SERVER['REQUEST_URI'])) ? '<link rel="stylesheet" href="/css/user.css">' : null; ?>
<?= (preg_match("/edit.php/i", $_SERVER['REQUEST_URI'])) ? '<link rel="stylesheet" href="/css/edit.css">' : null; ?>
<?= (preg_match("/quarantaine.php/i", $_SERVER['REQUEST_URI'])) ? '<link rel="stylesheet" href="/css/quarantaine.css">' : null; ?>
<?= (preg_match("/quarantine.php/i", $_SERVER['REQUEST_URI'])) ? '<link rel="stylesheet" href="/css/quarantine.css">' : null; ?>
<?= (preg_match("/debug.php/i", $_SERVER['REQUEST_URI'])) ? '<link rel="stylesheet" href="/css/debug.css">' : null; ?>
<link rel="shortcut icon" href="/favicon.png" type="image/png">
<link rel="icon" href="/favicon.png" type="image/png">
@ -74,8 +75,8 @@
if (isset($_SESSION['mailcow_cc_role'])) {
if ($_SESSION['mailcow_cc_role'] == 'admin') {
?>
<li<?= (preg_match("/debug/i", $_SERVER['REQUEST_URI'])) ? ' class="active"' : ''; ?>><a href="/debug.php"><?= $lang['header']['debug']; ?></a></li>
<li<?= (preg_match("/admin/i", $_SERVER['REQUEST_URI'])) ? ' class="active"' : ''; ?>><a href="/admin.php"><?= $lang['header']['administration']; ?></a></li>
<li<?= (preg_match("/debug/i", $_SERVER['REQUEST_URI'])) ? ' class="active"' : ''; ?>><a href="/debug.php"><?= $lang['header']['debug']; ?></a></li>
<?php
}
if ($_SESSION['mailcow_cc_role'] == 'admin' || $_SESSION['mailcow_cc_role'] == 'domainadmin') {
@ -95,7 +96,7 @@
<?php
if (isset($_SESSION['mailcow_cc_role'])) {
?>
<li<?= (preg_match("/quarantaine/i", $_SERVER['REQUEST_URI'])) ? ' class="active"' : ''; ?>><a href="/quarantaine.php"><span class="glyphicon glyphicon-briefcase"></span> <?= $lang['header']['quarantaine']; ?></a></li>
<li<?= (preg_match("/quarantine/i", $_SERVER['REQUEST_URI'])) ? ' class="active"' : ''; ?>><a href="/quarantine.php"><span class="glyphicon glyphicon-briefcase"></span> <?= $lang['header']['quarantine']; ?></a></li>
<?php
}
if ($_SESSION['mailcow_cc_role'] == 'admin') {
@ -118,7 +119,7 @@
foreach ($row as $key => $val):
?>
<li><a href="<?= htmlspecialchars($val); ?>"><?= htmlspecialchars($key); ?></a></li>
<?php
<?php
endforeach;
}
?>
@ -128,11 +129,11 @@
}
if (!isset($_SESSION['dual-login']) && isset($_SESSION['mailcow_cc_username'])):
?>
<li class="logged-in-as"><a href="#" onclick="logout.submit()"><b><?= $_SESSION['mailcow_cc_username']; ?></b> <span class="glyphicon glyphicon-log-out"></span></a></li>
<li class="logged-in-as"><a href="#" onclick="logout.submit()"><b><?= htmlspecialchars($_SESSION['mailcow_cc_username']); ?></b> <span class="glyphicon glyphicon-log-out"></span></a></li>
<?php
elseif (isset($_SESSION['dual-login'])):
?>
<li class="logged-in-as"><a href="#" onclick="logout.submit()"><b><?= $_SESSION['mailcow_cc_username']; ?> <span class="text-info">(<?= $_SESSION['dual-login']['username']; ?>)</span> </b><span class="glyphicon glyphicon-log-out"></span></a></li>
<li class="logged-in-as"><a href="#" onclick="logout.submit()"><b><?= htmlspecialchars($_SESSION['mailcow_cc_username']); ?> <span class="text-info">(<?= htmlspecialchars($_SESSION['dual-login']['username']); ?>)</span> </b><span class="glyphicon glyphicon-log-out"></span></a></li>
<?php
endif;
?>

View File

@ -3,7 +3,7 @@ function init_db_schema() {
try {
global $pdo;
$db_version = "08022018_1219";
$db_version = "19022018_0839";
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
@ -158,7 +158,7 @@ function init_db_schema() {
),
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
),
"quarantaine" => array(
"quarantine" => array(
"cols" => array(
"id" => "INT NOT NULL AUTO_INCREMENT",
"qid" => "VARCHAR(30) NOT NULL",
@ -189,11 +189,9 @@ function init_db_schema() {
"quota" => "BIGINT(20) NOT NULL DEFAULT '102400'",
"local_part" => "VARCHAR(255) NOT NULL",
"domain" => "VARCHAR(255) NOT NULL",
"tls_enforce_in" => "TINYINT(1) NOT NULL DEFAULT '0'",
"tls_enforce_out" => "TINYINT(1) NOT NULL DEFAULT '0'",
"attributes" => "JSON",
"kind" => "VARCHAR(100) NOT NULL DEFAULT ''",
"multiple_bookings" => "TINYINT(1) NOT NULL DEFAULT '0'",
"wants_tagged_subject" => "TINYINT(1) NOT NULL DEFAULT '0'",
"created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)",
"modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP",
"active" => "TINYINT(1) NOT NULL DEFAULT '1'"
@ -249,9 +247,10 @@ function init_db_schema() {
"syncjobs" => "TINYINT(1) NOT NULL DEFAULT '1'",
"eas_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",
"filters" => "TINYINT(1) NOT NULL DEFAULT '1'",
"quarantaine" => "TINYINT(1) NOT NULL DEFAULT '1'",
"quarantine" => "TINYINT(1) NOT NULL DEFAULT '1'",
"bcc_maps" => "TINYINT(1) NOT NULL DEFAULT '1'",
),
"recipient_maps" => "TINYINT(1) NOT NULL DEFAULT '0'",
),
"keys" => array(
"fkey" => array(
"fk_username" => array(
@ -398,6 +397,25 @@ function init_db_schema() {
),
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
),
"recipient_maps" => array(
"cols" => array(
"id" => "INT NOT NULL AUTO_INCREMENT",
"old_dest" => "VARCHAR(255) NOT NULL",
"new_dest" => "VARCHAR(255) NOT NULL",
"created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)",
"modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP",
"active" => "TINYINT(1) NOT NULL DEFAULT '0'"
),
"keys" => array(
"primary" => array(
"" => array("id")
),
"key" => array(
"local_dest" => array("old_dest"),
)
),
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
),
"tfa" => array(
"cols" => array(
"id" => "INT NOT NULL AUTO_INCREMENT",
@ -606,6 +624,34 @@ function init_db_schema() {
);
foreach ($tables as $table => $properties) {
// Migrate to quarantine
if ($table == 'quarantine') {
$stmt = $pdo->query("SHOW TABLES LIKE 'quarantaine'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
if ($num_results != 0) {
$stmt = $pdo->query("SHOW TABLES LIKE 'quarantine'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
if ($num_results == 0) {
$pdo->query("RENAME TABLE `quarantaine` TO `quarantine`");
}
}
}
// Migrate tls_enforce_* options
if ($table == 'mailbox') {
$stmt = $pdo->query("SHOW TABLES LIKE 'mailbox'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
if ($num_results != 0) {
$stmt = $pdo->query("SHOW COLUMNS FROM `mailbox` LIKE '%tls_enforce%'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
if ($num_results != 0) {
$stmt = $pdo->query("SELECT `username`, `tls_enforce_in`, `tls_enforce_out` FROM `mailbox`");
$tls_options_rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
while ($row = array_shift($tls_options_rows)) {
$tls_options[$row['username']] = array('tls_enforce_in' => $row['tls_enforce_in'], 'tls_enforce_out' => $row['tls_enforce_out']);
}
}
}
}
$stmt = $pdo->query("SHOW TABLES LIKE '" . $table . "'");
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
if ($num_results != 0) {
@ -752,6 +798,7 @@ function init_db_schema() {
}
// Reset table attributes
$pdo->query("ALTER TABLE `" . $table . "` " . $properties['attr'] . ";");
}
// Recreate SQL views
@ -788,6 +835,15 @@ DELIMITER ;';
// Insert new DB schema version
$stmt = $pdo->query("REPLACE INTO `versions` (`application`, `version`) VALUES ('db_schema', '" . $db_version . "');");
// Migrate tls_enforce_* options and add force_pw_update attribute
$stmt = $pdo->query("UPDATE `mailbox` SET `attributes` = '{}' WHERE `attributes` IS NULL;");
$stmt = $pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.force_pw_update', 0) WHERE JSON_EXTRACT(`attributes`, '$.force_pw_update') IS NULL;");
foreach($tls_options as $tls_user => $tls_options) {
$stmt = $pdo->prepare("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.tls_enforce_in', :tls_enforce_in),
`attributes` = JSON_SET(`attributes`, '$.tls_enforce_out', :tls_enforce_out)
WHERE `username` = :username");
$stmt->execute(array(':tls_enforce_in' => $tls_options['tls_enforce_in'], ':tls_enforce_out' => $tls_options['tls_enforce_out'], ':username' => $tls_user));
}
$_SESSION['return'] = array(
'type' => 'success',
'msg' => 'Database initialisation completed'

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -81,9 +81,9 @@ include $_SERVER['DOCUMENT_ROOT'] . '/lang/lang.'.$_SESSION['mailcow_locale'].'.
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.mailbox.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.customize.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.bcc.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.address_rewriting.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.domain_admin.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.quarantaine.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.quarantine.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.policy.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.dkim.inc.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/functions.fwdhost.inc.php';

View File

@ -43,11 +43,12 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) {
if (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == "admin") {
if (isset($_GET["duallogin"])) {
if (filter_var($_GET["duallogin"], FILTER_VALIDATE_EMAIL)) {
if (!empty(mailbox('get', 'mailbox_details', $_GET["duallogin"]))) {
$duallogin = html_entity_decode(rawurldecode($_GET["duallogin"]));
if (filter_var($duallogin, FILTER_VALIDATE_EMAIL)) {
if (!empty(mailbox('get', 'mailbox_details', $duallogin))) {
$_SESSION["dual-login"]["username"] = $_SESSION['mailcow_cc_username'];
$_SESSION["dual-login"]["role"] = $_SESSION['mailcow_cc_role'];
$_SESSION['mailcow_cc_username'] = $_GET["duallogin"];
$_SESSION['mailcow_cc_username'] = $duallogin;
$_SESSION['mailcow_cc_role'] = "user";
header("Location: /user.php");
}

View File

@ -76,7 +76,7 @@ $DETECT_LANGUAGE = true;
$DEFAULT_LANG = 'de';
// Available languages
$AVAILABLE_LANGUAGES = array('de', 'en', 'es', 'fr', 'nl', 'pl', 'pt', 'ru', 'it');
$AVAILABLE_LANGUAGES = array('de', 'en', 'es', 'fr', 'nl', 'pl', 'pt', 'ru', 'it', 'ca');
// Change theme (default: lumen)
// Needs to be one of those: cerulean, cosmo, cyborg, darkly, flatly, journal, lumen, paper, readable, sandstone,

View File

@ -124,6 +124,9 @@ $(document).ready(function() {
}
if (typeof multi_data[id] == "undefined") return;
api_items = multi_data[id];
for (var i in api_items) {
api_items[i] = decodeURIComponent(api_items[i]);
}
// alert(JSON.stringify(api_attr));
if (Object.keys(api_items).length !== 0) {
if (is_active($(this))) { return false; }
@ -251,6 +254,7 @@ $(document).ready(function() {
$(document).on('show.bs.modal', '#ConfirmDeleteModal', function() {
$("#ItemsToDelete").empty();
for (var i in data_array) {
data_array[i] = decodeURIComponent(data_array[i]);
$("#ItemsToDelete").append("<li>" + data_array[i] + "</li>");
}
})

View File

@ -31,9 +31,9 @@ jQuery(function($){
e.preventDefault();
draw_acme_logs();
});
$("#refresh_fail2ban_log").on('click', function(e) {
$("#refresh_netfilter_log").on('click', function(e) {
e.preventDefault();
draw_fail2ban_logs();
draw_netfilter_logs();
});
$("#refresh_rspamd_history").on('click', function(e) {
e.preventDefault();
@ -206,8 +206,8 @@ jQuery(function($){
}
});
}
function draw_fail2ban_logs() {
ft_fail2ban_logs = FooTable.init('#fail2ban_log', {
function draw_netfilter_logs() {
ft_netfilter_logs = FooTable.init('#netfilter_log', {
"columns": [
{"name":"time","formatter":function unix_time_format(tm) { var date = new Date(tm ? tm * 1000 : 0); return date.toLocaleString();},"title":lang.time,"style":{"width":"170px"}},
{"name":"priority","title":lang.priority,"style":{"width":"80px"}},
@ -215,10 +215,10 @@ jQuery(function($){
],
"rows": $.ajax({
dataType: 'json',
url: '/api/v1/get/logs/fail2ban',
url: '/api/v1/get/logs/netfilter',
jsonp: false,
error: function () {
console.log('Cannot draw fail2ban log table');
console.log('Cannot draw netfilter log table');
},
success: function (data) {
return process_table_data(data, 'general_syslog');
@ -497,7 +497,7 @@ jQuery(function($){
draw_watchdog_logs();
draw_acme_logs();
draw_api_logs();
draw_fail2ban_logs();
draw_netfilter_logs();
draw_rspamd_history();
});
});

View File

@ -165,7 +165,7 @@ jQuery(function($){
},
"sortValue": function(value){
res = value.split("/");
return res[0];
return Number(res[0]);
},
},
{"name":"max_quota_for_mbox","title":lang.mailbox_quota,"breakpoints":"xs sm"},
@ -186,16 +186,16 @@ jQuery(function($){
item.mailboxes = item.mboxes_in_domain + " / " + item.max_num_mboxes_for_domain;
item.quota = item.quota_used_in_domain + "/" + item.max_quota_for_domain;
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
item.chkbox = '<input type="checkbox" data-id="domain" name="multi_select" value="' + item.domain_name + '" />';
item.chkbox = '<input type="checkbox" data-id="domain" name="multi_select" value="' + encodeURIComponent(item.domain_name) + '" />';
item.action = '<div class="btn-group">';
if (role == "admin") {
item.action += '<a href="/edit.php?domain=' + encodeURI(item.domain_name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-domain" data-api-url="delete/domain" data-item="' + encodeURI(item.domain_name) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>';
item.action += '<a href="/edit.php?domain=' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-domain" data-api-url="delete/domain" data-item="' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>';
}
else {
item.action += '<a href="/edit.php?domain=' + encodeURI(item.domain_name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>';
item.action += '<a href="/edit.php?domain=' + encodeURIComponent(item.domain_name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>';
}
item.action += '<a href="#dnsInfoModal" class="btn btn-xs btn-info" data-toggle="modal" data-domain="' + encodeURI(item.domain_name) + '"><span class="glyphicon glyphicon-question-sign"></span> DNS</a></div>';
item.action += '<a href="#dnsInfoModal" class="btn btn-xs btn-info" data-toggle="modal" data-domain="' + encodeURIComponent(item.domain_name) + '"><span class="glyphicon glyphicon-question-sign"></span> DNS</a></div>';
});
}
}),
@ -229,7 +229,7 @@ jQuery(function($){
},
"sortValue": function(value){
res = value.split("/");
return res[0];
return Number(res[0]);
},
},
{"name":"spam_aliases","filterable": false,"title":lang.spam_aliases,"breakpoints":"xs sm md"},
@ -250,24 +250,24 @@ jQuery(function($){
$.each(data, function (i, item) {
item.quota = item.quota_used + "/" + item.quota;
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
item.chkbox = '<input type="checkbox" data-id="mailbox" name="multi_select" value="' + item.username + '" />';
item.chkbox = '<input type="checkbox" data-id="mailbox" name="multi_select" value="' + encodeURIComponent(item.username) + '" />';
if (role == "admin") {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?mailbox=' + encodeURI(item.username) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-mailbox" data-api-url="delete/mailbox" data-item="' + encodeURI(item.username) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="/index.php?duallogin=' + encodeURI(item.username) + '" class="btn btn-xs btn-success"><span class="glyphicon glyphicon-user"></span> Login</a>' +
'<a href="/edit.php?mailbox=' + encodeURIComponent(item.username) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-mailbox" data-api-url="delete/mailbox" data-item="' + encodeURIComponent(item.username) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="/index.php?duallogin=' + encodeURIComponent(item.username) + '" class="btn btn-xs btn-success"><span class="glyphicon glyphicon-user"></span> Login</a>' +
'</div>';
}
else {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?mailbox=' + encodeURI(item.username) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-mailbox" data-api-url="delete/mailbox" data-item="' + encodeURI(item.username) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="/edit.php?mailbox=' + encodeURIComponent(item.username) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-mailbox" data-api-url="delete/mailbox" data-item="' + encodeURIComponent(item.username) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
}
item.in_use = '<div class="progress">' +
'<div class="progress-bar progress-bar-' + item.percent_class + ' role="progressbar" aria-valuenow="' + item.percent_in_use + '" aria-valuemin="0" aria-valuemax="100" ' +
'style="min-width:2em;width:' + item.percent_in_use + '%">' + item.percent_in_use + '%' + '</div></div>';
item.username = escapeHtml(item.username);
});
}
}),
@ -309,10 +309,11 @@ jQuery(function($){
success: function (data) {
$.each(data, function (i, item) {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?resource=' + encodeURI(item.name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-resource" data-api-url="delete/resource" data-item="' + encodeURI(item.name) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="/edit.php?resource=' + encodeURIComponent(item.name) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-resource" data-api-url="delete/resource" data-item="' + encodeURIComponent(item.name) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="resource" name="multi_select" value="' + item.name + '" />';
item.chkbox = '<input type="checkbox" data-id="resource" name="multi_select" value="' + encodeURIComponent(item.name) + '" />';
item.name = escapeHtml(item.name);
});
}
}),
@ -359,6 +360,8 @@ jQuery(function($){
'<a href="#" id="delete_selected" data-id="single-bcc" data-api-url="delete/bcc" data-item="' + item.id + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="bcc" name="multi_select" value="' + item.id + '" />';
item.local_dest = escapeHtml(item.local_dest);
item.bcc_dest = escapeHtml(item.bcc_dest);
if (item.type == 'sender') {
item.type = '<span id="active-script" class="label label-success">Sender</span>';
} else {
@ -383,6 +386,54 @@ jQuery(function($){
}
});
}
function draw_recipient_map_table() {
ft_recipient_map_table = FooTable.init('#recipient_map_table', {
"columns": [
{"name":"chkbox","title":"","style":{"maxWidth":"60px","width":"60px"},"filterable": false,"sortable": false,"type":"html"},
{"sorted": true,"name":"id","title":"ID","style":{"maxWidth":"60px","width":"60px","text-align":"center"}},
{"name":"recipient_map_old","title":lang.recipient_map_old},
{"name":"recipient_map_new","title":lang.recipient_map_new},
{"name":"active","filterable": false,"style":{"maxWidth":"80px","width":"80px"},"title":lang.active},
{"name":"action","filterable": false,"sortable": false,"style":{"text-align":"right","maxWidth":"180px","width":"180px"},"type":"html","title":(role == "admin" ? lang.action : ""),"breakpoints":"xs sm"}
],
"empty": lang.empty,
"rows": $.ajax({
dataType: 'json',
url: '/api/v1/get/recipient_map/all',
jsonp: false,
error: function () {
console.log('Cannot draw recipient map table');
},
success: function (data) {
if (role == "admin") {
$.each(data, function (i, item) {
item.recipient_map_old = escapeHtml(item.recipient_map_old);
item.recipient_map_new = escapeHtml(item.recipient_map_new);
item.action = '<div class="btn-group">' +
'<a href="/edit.php?recipient_map=' + item.id + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-recipient_map" data-api-url="delete/recipient_map" data-item="' + item.id + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="recipient_map" name="multi_select" value="' + item.id + '" />';
});
}
}
}),
"paging": {
"enabled": true,
"limit": 5,
"size": pagination_size
},
"filtering": {
"enabled": true,
"position": "left",
"connectors": false,
"placeholder": lang.filter_table
},
"sorting": {
"enabled": true
}
});
}
function draw_alias_table() {
ft_alias_table = FooTable.init('#alias_table', {
"columns": [
@ -404,12 +455,16 @@ jQuery(function($){
success: function (data) {
$.each(data, function (i, item) {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?alias=' + encodeURI(item.address) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-alias" data-api-url="delete/alias" data-item="' + encodeURI(item.address) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="/edit.php?alias=' + encodeURIComponent(item.address) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-alias" data-api-url="delete/alias" data-item="' + encodeURIComponent(item.address) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="alias" name="multi_select" value="' + item.address + '" />';
item.chkbox = '<input type="checkbox" data-id="alias" name="multi_select" value="' + encodeURIComponent(item.address) + '" />';
item.goto = escapeHtml(item.goto);
if (item.is_catch_all == 1) {
item.address = '<div class="label label-default">Catch-All</div> ' + item.address;
item.address = '<div class="label label-default">Catch-All</div> ' + escapeHtml(item.address);
}
else {
item.address = escapeHtml(item.address);
}
if (item.goto == "null@localhost") {
item.goto = '⤷ <span style="font-size:12px" class="glyphicon glyphicon-trash" aria-hidden="true"></span>';
@ -457,11 +512,11 @@ jQuery(function($){
success: function (data) {
$.each(data, function (i, item) {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?aliasdomain=' + encodeURI(item.alias_domain) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-alias-domain" data-api-url="delete/alias-domain" data-item="' + encodeURI(item.alias_domain) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="#dnsInfoModal" class="btn btn-xs btn-info" data-toggle="modal" data-domain="' + encodeURI(item.alias_domain) + '"><span class="glyphicon glyphicon-question-sign"></span> DNS</a></div>' +
'<a href="/edit.php?aliasdomain=' + encodeURIComponent(item.alias_domain) + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-alias-domain" data-api-url="delete/alias-domain" data-item="' + encodeURIComponent(item.alias_domain) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="#dnsInfoModal" class="btn btn-xs btn-info" data-toggle="modal" data-domain="' + encodeURIComponent(item.alias_domain) + '"><span class="glyphicon glyphicon-question-sign"></span> DNS</a></div>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="alias-domain" name="multi_select" value="' + item.alias_domain + '" />';
item.chkbox = '<input type="checkbox" data-id="alias-domain" name="multi_select" value="' + encodeURIComponent(item.alias_domain) + '" />';
});
}
}),
@ -507,16 +562,17 @@ jQuery(function($){
},
success: function (data) {
$.each(data, function (i, item) {
item.log = '<a href="#syncjobLogModal" data-toggle="modal" data-syncjob-id="' + encodeURI(item.id) + '">Open logs</a>'
item.log = '<a href="#syncjobLogModal" data-toggle="modal" data-syncjob-id="' + encodeURIComponent(item.id) + '">Open logs</a>'
item.user2 = escapeHtml(item.user2);
if (!item.exclude > 0) {
item.exclude = '-';
} else {
item.exclude = '<code>' + item.exclude + '</code>';
}
item.server_w_port = item.user1 + '@' + item.host1 + ':' + item.port1;
item.server_w_port = escapeHtml(item.user1) + '@' + item.host1 + ':' + item.port1;
item.action = '<div class="btn-group">' +
'<a href="/edit.php?syncjob=' + item.id + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + encodeURI(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="#" id="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + item.id + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="syncjob" name="multi_select" value="' + item.id + '" />';
if (item.is_running == 1) {
@ -578,7 +634,7 @@ jQuery(function($){
item.filter_type = '<div class="label label-default">' + item.filter_type.charAt(0).toUpperCase() + item.filter_type.slice(1).toLowerCase() + '</div>'
item.action = '<div class="btn-group">' +
'<a href="/edit.php?filter=' + item.id + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-filter" data-api-url="delete/filter" data-item="' + encodeURI(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="#" id="delete_selected" data-id="single-filter" data-api-url="delete/filter" data-item="' + encodeURIComponent(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="filter_item" name="multi_select" value="' + item.id + '" />'
});
@ -609,5 +665,6 @@ jQuery(function($){
draw_sync_job_table();
draw_filter_table();
draw_bcc_table();
draw_recipient_map_table();
});

View File

@ -6,8 +6,8 @@ jQuery(function($){
function escapeHtml(n){return String(n).replace(/[&<>"'`=\/]/g,function(n){return entityMap[n]})}
function humanFileSize(i){if(Math.abs(i)<1024)return i+" B";var B=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],e=-1;do{i/=1024,++e}while(Math.abs(i)>=1024&&e<B.length-1);return i.toFixed(1)+" "+B[e]}
function draw_quarantaine_table() {
ft_quarantainetable = FooTable.init('#quarantainetable', {
function draw_quarantine_table() {
ft_quarantinetable = FooTable.init('#quarantinetable', {
"columns": [
{"name":"chkbox","title":"","style":{"maxWidth":"40px","width":"40px"},"filterable": false,"sortable": false,"type":"html"},
{"name":"id","type":"ID","filterable": false,"sorted": true,"direction":"DESC","title":"ID","style":{"width":"50px"}},
@ -19,10 +19,10 @@ jQuery(function($){
],
"rows": $.ajax({
dataType: 'json',
url: '/api/v1/get/quarantaine/all',
url: '/api/v1/get/quarantine/all',
jsonp: false,
error: function () {
console.log('Cannot draw quarantaine table');
console.log('Cannot draw quarantine table');
},
success: function (data) {
$.each(data, function (i, item) {
@ -38,14 +38,14 @@ jQuery(function($){
"paging": {"enabled": true,"limit": 5,"size": pagination_size},
"sorting": {"enabled": true},
"on": {
"ready.ft.table": btn_group_quarantaine,
"after.ft.paging": btn_group_quarantaine
"ready.ft.table": btn_group_quarantine,
"after.ft.paging": btn_group_quarantine
},
"filtering": {"enabled": true,"position": "left","connectors": false,"placeholder": lang.filter_table},
});
}
btn_group_quarantaine = function(ev, ft){
btn_group_quarantine = function(ev, ft){
$('.show_qid_info').on('click', function (e) {
e.preventDefault();
var qitem = $(this).data('item');
@ -80,5 +80,5 @@ jQuery(function($){
})
}
// Initial table drawings
draw_quarantaine_table();
draw_quarantine_table();
});

View File

@ -62,9 +62,10 @@ jQuery(function($){
$.each(data, function (i, item) {
if (acl_data.spam_alias === 1) {
item.action = '<div class="btn-group">' +
'<a href="#" id="delete_selected" data-id="single-tla" data-api-url="delete/time_limited_alias" data-item="' + encodeURI(item.address) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="#" id="delete_selected" data-id="single-tla" data-api-url="delete/time_limited_alias" data-item="' + encodeURIComponent(item.address) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="tla" name="multi_select" value="' + item.address + '" />';
item.chkbox = '<input type="checkbox" data-id="tla" name="multi_select" value="' + encodeURIComponent(item.address) + '" />';
item.address = escapeHtml(item.address);
}
else {
item.chkbox = '<input type="checkbox" disabled />';
@ -102,24 +103,25 @@ jQuery(function($){
"empty": lang.empty,
"rows": $.ajax({
dataType: 'json',
url: '/api/v1/get/syncjobs/' + mailcow_cc_username + '/no_log',
url: '/api/v1/get/syncjobs/' + encodeURIComponent(mailcow_cc_username) + '/no_log',
jsonp: false,
error: function () {
console.log('Cannot draw sync job table');
},
success: function (data) {
$.each(data, function (i, item) {
item.log = '<a href="#syncjobLogModal" data-toggle="modal" data-syncjob-id="' + encodeURI(item.id) + '">Open logs</a>'
item.user1 = escapeHtml(item.user1);
item.log = '<a href="#syncjobLogModal" data-toggle="modal" data-syncjob-id="' + item.id + '">Open logs</a>'
if (!item.exclude > 0) {
item.exclude = '-';
} else {
item.exclude = '<code>' + item.exclude + '</code>';
item.exclude = '<code>' + escapeHtml(item.exclude) + '</code>';
}
item.server_w_port = item.user1 + '@' + item.host1 + ':' + item.port1;
item.server_w_port = escapeHtml(item.user1 + '@' + item.host1 + ':' + item.port1);
if (acl_data.syncjobs === 1) {
item.action = '<div class="btn-group">' +
'<a href="/edit.php?syncjob=' + item.id + '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> ' + lang.edit + '</a>' +
'<a href="#" id="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + encodeURI(item.id) + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'<a href="#" id="delete_selected" data-id="single-syncjob" data-api-url="delete/syncjob" data-item="' + item.id + '" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> ' + lang.remove + '</a>' +
'</div>';
item.chkbox = '<input type="checkbox" data-id="syncjob" name="multi_select" value="' + item.id + '" />';
}
@ -238,7 +240,7 @@ jQuery(function($){
$('#user_sieve_filter').text(lang.loading);
$.ajax({
dataType: 'json',
url: '/api/v1/get/active-user-sieve/' + mailcow_cc_username,
url: '/api/v1/get/active-user-sieve/' + encodeURIComponent(mailcow_cc_username),
jsonp: false,
error: function () {
console.log('Cannot get active sieve script');

View File

@ -595,6 +595,39 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
));
}
break;
case "recipient_map":
if (isset($_POST['attr'])) {
$attr = (array)json_decode($_POST['attr'], true);
if (recipient_map('add', $attr) === false) {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Cannot add item'
));
}
}
else {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
else {
echo json_encode(array(
'type' => 'success',
'msg' => 'Task completed'
));
}
}
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Cannot find attributes in post data'
));
}
break;
}
break;
case "get":
@ -847,14 +880,14 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
echo '{}';
}
break;
case "fail2ban":
case "netfilter":
// 0 is first record, so empty is fine
if (isset($extra)) {
$extra = preg_replace('/[^\d\-]/i', '', $extra);
$logs = get_logs('fail2ban-mailcow', $extra);
$logs = get_logs('netfilter-mailcow', $extra);
}
else {
$logs = get_logs('fail2ban-mailcow');
$logs = get_logs('netfilter-mailcow');
}
if (isset($logs) && !empty($logs)) {
echo json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
@ -1191,6 +1224,41 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
break;
}
break;
case "recipient_map":
switch ($object) {
case "all":
$recipient_map_items = recipient_map('get');
if (!empty($recipient_map_items)) {
foreach ($recipient_map_items as $recipient_map_item) {
if ($details = recipient_map('details', $recipient_map_item)) {
$data[] = $details;
}
else {
continue;
}
}
}
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
break;
default:
$data = recipient_map('details', $object);
if (!empty($data)) {
$data[] = $details;
}
if (!isset($data) || empty($data)) {
echo '{}';
}
else {
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
break;
}
break;
case "policy_wl_mailbox":
switch ($object) {
default:
@ -1318,11 +1386,11 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
break;
}
break;
case "quarantaine":
case "quarantine":
// "all" will not print details
switch ($object) {
case "all":
$data = quarantaine('get');
$data = quarantine('get');
if (!isset($data) || empty($data)) {
echo '{}';
}
@ -1331,7 +1399,7 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
}
break;
default:
$data = quarantaine('details', $object);
$data = quarantine('details', $object);
if (!isset($data) || empty($data)) {
echo '{}';
}
@ -1661,7 +1729,7 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
if (isset($_POST['items'])) {
$items = (array)json_decode($_POST['items'], true);
if (is_array($items)) {
if (quarantaine('delete', array('id' => $items)) === false) {
if (quarantine('delete', array('id' => $items)) === false) {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
@ -1739,6 +1807,47 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
));
}
break;
case "recipient_map":
if (isset($_POST['items'])) {
$items = (array)json_decode($_POST['items'], true);
if (is_array($items)) {
if (recipient_map('delete', array('id' => $items)) === false) {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Deletion of items/s failed'
));
}
}
else {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
else {
echo json_encode(array(
'type' => 'success',
'msg' => 'Task completed'
));
}
}
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Cannot find id array in post data'
));
}
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Cannot find items in post data'
));
}
break;
case "fwdhost":
if (isset($_POST['items'])) {
$items = (array)json_decode($_POST['items'], true);
@ -2238,6 +2347,50 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
));
}
break;
case "recipient_map":
if (isset($_POST['items']) && isset($_POST['attr'])) {
$items = (array)json_decode($_POST['items'], true);
$attr = (array)json_decode($_POST['attr'], true);
$postarray = array_merge(array('id' => $items), $attr);
if (is_array($postarray['id'])) {
if (recipient_map('edit', $postarray) === false) {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Edit failed'
));
}
exit();
}
else {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
else {
echo json_encode(array(
'type' => 'success',
'msg' => 'Task completed'
));
}
}
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Incomplete post data'
));
}
}
else {
echo json_encode(array(
'type' => 'error',
'msg' => 'Incomplete post data'
));
}
break;
case "alias":
if (isset($_POST['items']) && isset($_POST['attr'])) {
$items = (array)json_decode($_POST['items'], true);
@ -2462,7 +2615,7 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
$attr = (array)json_decode($_POST['attr'], true);
$postarray = array_merge(array('id' => $items), $attr);
if (is_array($postarray['id'])) {
if (quarantaine('edit', $postarray) === false) {
if (quarantine('edit', $postarray) === false) {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}
@ -2500,11 +2653,11 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
));
}
break;
case "quarantaine":
case "quarantine":
// Edit settings, does not need IDs
if (isset($_POST['attr'])) {
$postarray = json_decode($_POST['attr'], true);
if (quarantaine('edit', $postarray) === false) {
if (quarantine('edit', $postarray) === false) {
if (isset($_SESSION['return'])) {
echo json_encode($_SESSION['return']);
}

View File

@ -0,0 +1,536 @@
<?php
/*
* Catalan language file
*/
$lang['footer']['loading'] = "Si et plau espera ...";
$lang['header']['restart_sogo'] = 'Reiniciar SOGo';
$lang['footer']['restart_sogo'] = 'Reiniciar SOGo';
$lang['footer']['restart_now'] = 'Reiniciar ara';
$lang['footer']['restart_container_info'] = '<b>Important:</b> Un reinici pot trigar una estona, si et plau espera a que acabi.';
$lang['footer']['confirm_delete'] = "Confirma l'esborrat ";
$lang['footer']['delete_these_items'] = 'Si et plau confirma els canvis al objecte amb id:';
$lang['footer']['delete_now'] = 'Esborrar ara';
$lang['footer']['cancel'] = 'Cancel·lar';
$lang['danger']['dkim_domain_or_sel_invalid'] = "Domini DKIM o selector incorrecte";
$lang['success']['dkim_removed'] = "La clau DKIM %s s'ha esborrat";
$lang['success']['dkim_added'] = "La clau DKIM s'ha desat";
$lang['danger']['access_denied'] = "Accés denegat o dades incorrectes";
$lang['danger']['domain_invalid'] = "Nom de domini incorrecte";
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "La quota màxima sobrepassa el límit del domini";
$lang['danger']['object_is_not_numeric'] = "El valor %s no és numèric";
$lang['success']['domain_added'] = "S'ha afegit el domini %s";
$lang['success']['items_deleted'] = "S'ha esborrat %s";
$lang['danger']['alias_empty'] = "L'adreça de l'àlias no es pot deixar buida";
$lang['danger']['last_key'] = 'No es pot esborrar la úlitma clau';
$lang['danger']['goto_empty'] = "L'adreça \"goto\" no es pot deixar buida";
$lang['danger']['policy_list_from_exists'] = "Ja existeix un registre amb aquest nom";
$lang['danger']['policy_list_from_invalid'] = "El registre no té un format vàlid";
$lang['danger']['alias_invalid'] = "L'adreça de l'alias és incorrecta";
$lang['danger']['goto_invalid'] = "L'adreça del \"goto\" és incorrecta";
$lang['danger']['alias_domain_invalid'] = "L'àlies del domini no és vàlid";
$lang['danger']['target_domain_invalid'] = "El domini \"goto\" no és vàlid";
$lang['danger']['object_exists'] = "L' objecte %s ja existeix";
$lang['danger']['domain_exists'] = "El domini %s ja existeix";
$lang['danger']['alias_goto_identical'] = "Les adreces d'àlies i 'goto' no poden ser iguals";
$lang['danger']['aliasd_targetd_identical'] = "El domini àlies no pot ser igual al de destí";
$lang['danger']['maxquota_empty'] = 'La quota màxima no pot ser 0.';
$lang['success']['alias_added'] = "S'ha afegit el/s àlies";
$lang['success']['alias_modified'] = "S'han desat els canvis fets al àlies";
$lang['success']['mailbox_modified'] = "S'han desat els canvis fets a la bústia %s";
$lang['success']['resource_modified'] = "S'han desat els canvis fets al recurs %s";
$lang['success']['object_modified'] = "S'han desat els canvis fets a l'objecte %s";
$lang['success']['f2b_modified'] = "S'han desat els canvis fets als parametres del Fail2ban";
$lang['danger']['targetd_not_found'] = "No s'ha trobat el domini destí";
$lang['success']['aliasd_added'] = "S'ha afegit l'àlies de domini %s";
$lang['success']['aliasd_modified'] = "S'han desat els canvis fets a l'àlies de domini %s";
$lang['success']['domain_modified'] = "S'han desat els canvis fets al domini %s";
$lang['success']['domain_admin_modified'] = "S'ha modificat l'administrador de dominis %s";
$lang['success']['domain_admin_added'] = "S'ha afegit l'administrador de dominis %s";
$lang['success']['admin_modified'] = "Els canvis fets a l'administrador s'han desat";
$lang['danger']['username_invalid'] = "El nom d'usuari no es pot fer servir";
$lang['danger']['password_mismatch'] = "La confirmació de contrasenya no encaixa";
$lang['danger']['password_complexity'] = "La contrasenya no compleix els requisits";
$lang['danger']['password_empty'] = "La contrasenya no es pot deixar en blanc";
$lang['danger']['login_failed'] = "L'inici de sessió ha fallat";
$lang['danger']['mailbox_invalid'] = "El nom de la bústia no és vàlid";
$lang['danger']['description_invalid'] = "La descripció del recurs no és vàlida";
$lang['danger']['resource_invalid'] = "El nom del recurs no és vàlid";
$lang['danger']['is_alias'] = "%s ja està definida com una direcció àlies";
$lang['danger']['is_alias_or_mailbox'] = "%s ja està definit como un àlies o una bústia";
$lang['danger']['is_spam_alias'] = "%s ja està definida com una adreça àlies de spam";
$lang['danger']['quota_not_0_not_numeric'] = "La quaota ha de ser numèrica i >= 0";
$lang['danger']['domain_not_found'] = "No s'ha trobat el domini";
$lang['danger']['max_mailbox_exceeded'] = "S'ha arribat al màxim de bústies (%d de %d)";
$lang['danger']['max_alias_exceeded'] = "S'ha arribat al màxim d'àlies";
$lang['danger']['mailbox_quota_exceeded'] = "La quota exedeix el límit del domini (màx. %d MiB)";
$lang['danger']['mailbox_quota_left_exceeded'] = "No queda espai suficient (espai lliure: %d MiB)";
$lang['success']['mailbox_added'] = "S'ha afegit la bústia %s";
$lang['success']['resource_added'] = "S'ha afegit el recurs %s";
$lang['success']['domain_removed'] = "S'ha elminat el domini %s";
$lang['success']['alias_removed'] = "S'ha esborrat l'àlies %s";
$lang['success']['alias_domain_removed'] = "S'ha esborrat l'àlies de domini %s";
$lang['success']['domain_admin_removed'] = "S'ha esborrat l'administrador de dominis %s";
$lang['success']['mailbox_removed'] = "S'ha esborrat la bústia %s";
$lang['success']['eas_reset'] = "S'ha fet un reset als dispositius ActiveSync de l'usuari %s";
$lang['success']['resource_removed'] = "S'ha esborrat el recurs %s";
$lang['danger']['max_quota_in_use'] = "La quota de la bústia ha de ser meś gran o igual a %d MiB";
$lang['danger']['domain_quota_m_in_use'] = "La quota del domini ha de ser més gran o igual a %d MiB";
$lang['danger']['mailboxes_in_use'] = "El número màxim de bústies ha de ser més gran o igual a %d";
$lang['danger']['aliases_in_use'] = "El número màxim d'àlies ha de ser més gran o igual a %d";
$lang['danger']['sender_acl_invalid'] = "L'ACL d'emissor no és vàlid";
$lang['danger']['domain_not_empty'] = "No es pot esborrar un domini que no està buit";
$lang['danger']['validity_missing'] = 'Si et plau posa un període de validesa';
$lang['user']['loading'] = "Carregant...";
$lang['user']['force_pw_update'] = "<b>Has d'</b>establir una nova contrassenya per poder accedir.";
$lang['user']['active_sieve'] = "Filtre actiu";
$lang['user']['show_sieve_filters'] = "Mostra el filtre 'sieve' de l'usuari";
$lang['user']['no_active_filter'] = "Actualment no hi ha cap filtre";
$lang['user']['messages'] = "missatges"; // "123 messages"
$lang['user']['in_use'] = "Usat";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = "Configuració de l'usuari";
$lang['user']['mailbox_details'] = 'Detalls de la bústia';
$lang['user']['change_password'] = 'Canviar la contrasenya';
$lang['user']['client_configuration'] = 'Guies de configuració per als clients de correu més habituals';
$lang['user']['new_password'] = 'Contrasenya nova:';
$lang['user']['save_changes'] = 'Desar els canvis';
$lang['user']['password_now'] = 'Contrasenya actual (per validar els canvis):';
$lang['user']['new_password_repeat'] = 'Confirmació de la contrasenya nova:';
$lang['user']['new_password_description'] = 'Requisits: 6 caracters, lletres i números.';
$lang['user']['spam_aliases'] = "Àlies d'email temporals";
$lang['user']['alias'] = 'Àlies';
$lang['user']['shared_aliases'] = 'Adreces àlies compartides';
$lang['user']['shared_aliases_desc'] = "Un àlies compartit no es veu afectat per la configuració de l'usuari. L'administrador pot configurar un filtre de spam a nivell de domini.";
$lang['user']['direct_aliases'] = 'Adreces àlies directes';
$lang['user']['direct_aliases_desc'] = "Els àlies directes sí que es veuen afectat per la configuració de l'usuari";
$lang['user']['is_catch_all'] = 'Adreça atrapa-ho-tot';
$lang['user']['aliases_also_send_as'] = 'Pot enviar com a aquests remitents';
$lang['user']['aliases_send_as_all'] = "Al enviar no es verificarà l'adreça remitent per aquests dominis:";
$lang['user']['alias_create_random'] = 'Generar àlies aleatori';
$lang['user']['alias_extend_all'] = 'Afegir 1 hora als àlies';
$lang['user']['alias_valid_until'] = 'Vàlid fins';
$lang['user']['alias_remove_all'] = 'Esborrar tots els àlies';
$lang['user']['alias_time_left'] = 'Temps restant';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Període de validesa';
$lang['user']['sync_jobs'] = 'Feines de sincronització';
$lang['user']['hour'] = 'Hora';
$lang['user']['hours'] = 'Hores';
$lang['user']['day'] = 'Dia';
$lang['user']['week'] = 'Setmana';
$lang['user']['weeks'] = 'Setmanes';
$lang['user']['spamfilter'] = 'Filtre de spam';
$lang['admin']['spamfilter'] = 'Filtre de spam';
$lang['user']['spamfilter_wl'] = 'Llista blanca';
$lang['user']['spamfilter_wl_desc'] = 'Les adreces de la lista blanca <b>mai</b> es clasificaran como a spam. Es pot fer serivir *@exemple.org.';
$lang['user']['spamfilter_bl'] = 'Llista negra';
$lang['user']['spamfilter_bl_desc'] = 'Les adreces de la lista negra <b>sempre</b> es clasificaran como a spam. Es pot fer servir *@exemple.org';
$lang['user']['spamfilter_behavior'] = 'Classificació';
$lang['user']['spamfilter_table_rule'] = 'Regla';
$lang['user']['spamfilter_table_action'] = 'Acció';
$lang['user']['spamfilter_table_empty'] = 'No hay datos para mostrar';
$lang['user']['spamfilter_table_remove'] = 'Esborrar';
$lang['user']['spamfilter_table_add'] = 'Afegir element';
$lang['user']['spamfilter_green'] = 'Verd: el missatge no és spam';
$lang['user']['spamfilter_yellow'] = "Groc: el missatge pot ser spam, s'etiquetarà com a spam i es mourà a la carpeta de correu brossa";
$lang['user']['spamfilter_red'] = 'Vermell: El missatge és spam i, per tant, el servidor el refusarà';
$lang['user']['spamfilter_default_score'] = 'Valors per defecte:';
$lang['user']['spamfilter_hint'] = 'El primer valor representa el "llindar inferior de la qualificació de spam", el segon representa el "llindar superior de la qualificació de spam".';
$lang['user']['spamfilter_table_domain_policy'] = "n/a (política del domini)";
$lang['user']['waiting'] = "Esperant";
$lang['user']['status'] = "Estat";
$lang['user']['running'] = "En marxa";
$lang['user']['tls_policy_warning'] = "<strong>Avís:</strong> Al forçar el xifrat en les comunicacions es poden perdre missatges.<br> Els missatges que no es puguin rebre o enviar xifrats, rebotaran. <br>Aquesta opció s'aplica a l'adreça principal (nom d'usuari) i totes les adreces derivades d'àlies <b>que només tinguin aquesta bústia</b> com a destí";
$lang['user']['tls_policy'] = "Política d'encriptació";
$lang['user']['tls_enforce_in'] = 'Forçar TLS al rebre';
$lang['user']['tls_enforce_out'] = 'Forçar TLS al enviar';
$lang['user']['no_record'] = 'Sense registre';
$lang['user']['tag_handling'] = 'Al rebre un missatge etiquetat';
$lang['user']['tag_in_subfolder'] = 'Moure a subcarpeta';
$lang['user']['tag_in_subject'] = 'Marcar al assumpte';
$lang['user']['tag_in_none'] = 'No fer res';
$lang['user']['tag_help_explain'] = 'Moure a subcarpeta: es crearà una subcarpeta anomenada com la etiqueta a INBOX ("INBOX/Facebook") i es mourà el correu allà.<br>
Marcar al assumpte: s\'afegirà el nom de la etiqueta al assumpte del missatge, per exemple: "[Facebook] Les meves notícies".';
$lang['user']['tag_help_example'] = 'Ejemplo de una dirección email etiquetada: mi<b>+Facebook</b>@ejemplo.org';
$lang['user']['eas_reset'] = "Fer un reset de la cache d'ActiveSync del dispositiu";
$lang['user']['eas_reset_now'] = "Resetejar cache d'ActiveSync";
$lang['user']['eas_reset_help'] = 'El reset serveix per recuperar perfils ActiveSync trencats.<br><b>Atenció:</b> Tots els elements es tornaran a descarregar!';
$lang['user']['encryption'] = 'Xifrat';
$lang['user']['username'] = 'Usuari';
$lang['user']['last_run'] = 'Última execució';
$lang['user']['excludes'] = 'Exclosos';
$lang['user']['interval'] = 'Intèrval';
$lang['user']['active'] = 'Actiu';
$lang['user']['action'] = 'Acció';
$lang['user']['edit'] = 'Editar';
$lang['user']['remove'] = 'Esborrar';
$lang['user']['create_syncjob'] = 'Afegir treball de sincronitzaió';
$lang['start']['mailcow_apps_detail'] = 'Tria una aplicació (de moment només SOGo) per a accedir als teus correus, calendari, contactes i més.';
$lang['start']['mailcow_panel_detail'] = "Els <b>administradors del domini</b> poden crear, modificar o esborrar bústies i àlies, configurar i obtenir informació detallada sobre els seus dominis<br>
Els <b>usuaris d'e-mail</b> poden crear àlies temporals (spam àlies), canviar la seva contrasenya i la configuració del seu filtre anti-spam.";
$lang['start']['help'] = "Mostrar/Ocultar panell d'ajuda";
$lang['header']['mailcow_settings'] = 'Configuració';
$lang['header']['administration'] = 'Administració';
$lang['header']['mailboxes'] = 'Bústies';
$lang['header']['user_settings'] = "Preferències d'usuari";
$lang['mailbox']['domain'] = 'Domini';
$lang['mailbox']['spam_aliases'] = 'Temp. àlies';
$lang['mailbox']['multiple_bookings'] = 'Múltiples reserves';
$lang['mailbox']['kind'] = 'Tipus';
$lang['mailbox']['description'] = 'Descripció';
$lang['mailbox']['alias'] = 'Àlies';
$lang['mailbox']['aliases'] = 'Àlies';
$lang['mailbox']['domains'] = 'Dominis';
$lang['mailbox']['mailboxes'] = 'Bústies';
$lang['mailbox']['resources'] = 'Recursos';
$lang['mailbox']['mailbox_quota'] = 'Mida màx. de quota';
$lang['mailbox']['domain_quota'] = 'Quota';
$lang['mailbox']['active'] = 'Actiu';
$lang['mailbox']['action'] = 'Acció';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Àlies de domini';
$lang['mailbox']['target_domain'] = 'Domini destí';
$lang['mailbox']['target_address'] = 'Direcció Goto';
$lang['mailbox']['username'] = "Nom d'usuari";
$lang['mailbox']['fname'] = 'Nom complert';
$lang['mailbox']['filter_table'] = 'Filtrar taula';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['in_use'] = 'En ús (%)';
$lang['mailbox']['msg_num'] = 'Missatge #';
$lang['mailbox']['remove'] = 'Esborrar';
$lang['mailbox']['edit'] = 'Editar';
$lang['mailbox']['no_record'] = "No hi ha cap registre per l'objecte %s";
$lang['mailbox']['no_record_single'] = "No hi ha cap registre";
$lang['mailbox']['add_domain'] = 'Afegir domini';
$lang['mailbox']['add_domain_alias'] = 'Afegir àlies de domini';
$lang['mailbox']['add_mailbox'] = 'Afegir bústia';
$lang['mailbox']['add_resource'] = 'Afegir recurs';
$lang['mailbox']['add_alias'] = 'Afegir àlies';
$lang['mailbox']['add_domain_record_first'] = 'Primer afegeix un domini';
$lang['mailbox']['empty'] = 'Cap resultat';
$lang['mailbox']['toggle_all'] = "Tots";
$lang['mailbox']['quick_actions'] = 'Accions';
$lang['mailbox']['activate'] = 'Activar';
$lang['mailbox']['deactivate'] = 'Desactivar';
$lang['mailbox']['owner'] = 'Propietari';
$lang['mailbox']['mins_interval'] = 'Intèrval (min)';
$lang['mailbox']['last_run'] = 'Última execució';
$lang['mailbox']['excludes'] = 'Exclou';
$lang['mailbox']['last_run_reset'] = 'Executar a continuació';
$lang['mailbox']['sieve_info'] = 'Podeu emmagatzemar diversos filtres per usuari, però només un filtre previ i un filtre posterior poden estar actius al mateix temps.<br>
Cada filtre es processarà en l\'ordre descrit. Ni un script que falli, ni un "keep" emès farà que es deixin de processar els altres scripts.<br>
Filtre previ Filtre d\'usuari → Filtre posterior → <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/sieve_after" target="_blank">Filtre global</a>';
$lang['info']['no_action'] = 'No hi ha cap acció aplicable';
$lang['edit']['syncjob'] = 'Sync job';
$lang['edit']['username'] = 'Usuari';
$lang['edit']['hostname'] = 'Host';
$lang['edit']['encryption'] = 'Xifrat';
$lang['edit']['maxage'] = 'Salta missatges més vells del número de dies<br><small>(0 = no salta res)</small>';
$lang['edit']['maxbytespersecond'] = 'Màx. bytes per segon<br><small>(0 = il.limitat)</small>';
$lang['edit']['automap'] = 'Provar de mapejar automàticament ("Sent items", "Sent" => "Sent" etc.)';
$lang['edit']['skipcrossduplicates'] = 'Saltar missatges duplicats entre carpetes (només es desa el primer)';
$lang['add']['automap'] = $lang['edit']['automap'];
$lang['add']['skipcrossduplicates'] = $lang['edit']['skipcrossduplicates'];
$lang['edit']['subfolder2'] = 'Sincronitza a la subcarpeta destí<br><small>(buit = no usar subcarpeta)</small>';
$lang['edit']['mins_interval'] = 'Intèrval (min)';
$lang['edit']['exclude'] = 'Excloure els objectes (regex)';
$lang['edit']['save'] = 'Desar els canvis';
$lang['edit']['max_mailboxes'] = 'Màx. bústies possibles:';
$lang['edit']['title'] = "Editar l'objecte";
$lang['edit']['target_address'] = 'Direcció/ns goto <small>(separades per coma)</small>:';
$lang['edit']['active'] = 'Actiu';
$lang['edit']['force_pw_update'] = "Forçar l'actualització de la contrassenya al proper login";
$lang['edit']['force_pw_update_info'] = 'Aquest usuari només podrà accedir a la interfície de gestió.';
$lang['edit']['target_domain'] = 'Domini destí:';
$lang['edit']['password'] = 'Contrasenya:';
$lang['edit']['password_repeat'] = 'Confirmació de contrasenya (repetir):';
$lang['edit']['domain_admin'] = 'Editar administrador del domini';
$lang['edit']['domain'] = 'Editar domini';
$lang['edit']['edit_alias_domain'] = 'Editar àlies de domini';
$lang['edit']['domains'] = 'Dominis';
$lang['edit']['alias'] = 'Editar àlies';
$lang['edit']['mailbox'] = 'Editar bustia';
$lang['edit']['description'] = 'Descripció:';
$lang['edit']['max_aliases'] = 'Màx. àlies:';
$lang['edit']['max_quota'] = 'Màx. quota per bústia (MiB):';
$lang['edit']['domain_quota'] = 'Quota de domini:';
$lang['edit']['backup_mx_options'] = 'Opcions backup MX:';
$lang['edit']['relay_domain'] = 'Domini de retransmisió (relay)';
$lang['edit']['relay_all'] = 'Retransmetre tods els recipients';
$lang['edit']['relay_all_info'] = "<small>Si tries <b>no</b> retransmetre a tods els recipients, necessitàs afegir una bústia \"blind\"(\"cega\") per cada recipient que s'hagi de retransmetre.</small>";
$lang['edit']['full_name'] = 'Nom complet';
$lang['edit']['quota_mb'] = 'Quota (MiB)';
$lang['edit']['sender_acl'] = 'Permetre enviar com a';
$lang['edit']['previous'] = 'Pàgina anterior';
$lang['edit']['unchanged_if_empty'] = 'Si no hay cambios dejalo en blanco';
$lang['edit']['dont_check_sender_acl'] = 'No verifiques remitente para el dominio %s';
$lang['edit']['multiple_bookings'] = 'Reserves múltiples';
$lang['edit']['kind'] = 'Tipus';
$lang['edit']['resource'] = 'Recurs';
$lang['add']['syncjob'] = 'Afegir sync job';
$lang['add']['syncjob_hint'] = 'Tingues en compte que les contrasenyes es desen sense xifrar!';
$lang['add']['hostname'] = 'Hostname';
$lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Username';
$lang['add']['enc_method'] = 'Mètode de xifrat';
$lang['add']['mins_interval'] = 'Intèrval (minuts)';
$lang['add']['exclude'] = $lang['edit']['exclude'];
$lang['add']['delete2duplicates'] = 'Eliminar els duplicats al destí';
$lang['add']['delete1'] = "Esborrar de l'origen un cop s'han copiat";
$lang['add']['delete2'] = "Esborrar els missatges a destí que no son al origen";
$lang['edit']['delete2duplicates'] = $lang['add']['delete2duplicates'];
$lang['edit']['delete1'] = $lang['add']['delete1'];
$lang['edit']['delete2'] = $lang['add']['delete2'];
$lang['add']['domain'] = 'Domini';
$lang['add']['active'] = 'Actiu';
$lang['add']['multiple_bookings'] = 'Reserves múltiples';
$lang['add']['description'] = 'Descripció:';
$lang['add']['max_aliases'] = 'Màx. àlies possibles:';
$lang['add']['max_mailboxes'] = 'Màx. bústies possibles:';
$lang['add']['mailbox_quota_m'] = 'Màx. quota per bústia (MiB):';
$lang['add']['domain_quota_m'] = 'Quota total del domini (MiB):';
$lang['add']['backup_mx_options'] = $lang['edit']['backup_mx_options'];
$lang['add']['relay_all'] = $lang['edit']['relay_all'];
$lang['add']['relay_domain'] = $lang['edit']['relay_domain'];
$lang['add']['relay_all_info'] = $lang['edit']['relay_all_info'];
$lang['add']['alias_address'] = 'Dirección/es àlies:';
$lang['add']['alias_address_info'] = '<small>Adreces de correu completes, o @exemple.com per a atrapar tots els missatges per a un domini (separats per coma). <b>Només dominis interns</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Només noms de domini vàlids (separats per coma).</small>';
$lang['add']['target_address'] = 'Adreces goto:';
$lang['add']['target_address_info'] = '<small>Adreces de corru completes (separades per coma).</small>';
$lang['add']['alias_domain'] = 'Domini àlies';
$lang['add']['select'] = 'Si et plau selecciona...';
$lang['add']['target_domain'] = 'Domini destí:';
$lang['add']['kind'] = 'Kind';
$lang['add']['mailbox_username'] = "Nom d'usuari (part de l'esquerra de l'adreça @):";
$lang['add']['full_name'] = 'Nom complet:';
$lang['add']['quota_mb'] = 'Quota (MiB):';
$lang['add']['select_domain'] = 'Si et plau, primer selecciona un domini';
$lang['add']['password'] = 'Constrasenya:';
$lang['add']['password_repeat'] = 'Confirmació de contrasenya (repetir):';
$lang['add']['restart_sogo_hint'] = "Necessites reiniciar el contenidor del servei SOGo després d'afegir un nou domini";
$lang['add']['goto_null'] = 'Descartar mail silenciosament';
$lang['add']['validation_success'] = 'Validated successfully';
$lang['add']['activate_filter_warn'] = 'All other filters will be deactivated, when active is checked.';
$lang['add']['validate'] = 'Validar';
$lang['mailbox']['add_filter'] = 'Afegir filter';
$lang['add']['sieve_desc'] = 'Short description';
$lang['edit']['sieve_desc'] = 'Short description';
$lang['add']['sieve_type'] = 'Filter type';
$lang['edit']['sieve_type'] = 'Filter type';
$lang['mailbox']['set_prefilter'] = 'Mark as prefilter';
$lang['mailbox']['set_postfilter'] = 'Mark as postfilter';
$lang['mailbox']['filters'] = 'Filtres';
$lang['mailbox']['sync_jobs'] = 'Sync jobs';
$lang['mailbox']['inactive'] = 'Inactiu';
$lang['edit']['validate_save'] = 'Validar i desar';
$lang['login']['username'] = "Nom d'usuari";
$lang['login']['password'] = 'Contrasenya';
$lang['login']['login'] = 'Inici de sessió';
$lang['login']['delayed'] = "Pots iniciar de sessió passats %s segons.";
$lang['tfa']['tfa'] = "Autenticació de dos factors";
$lang['tfa']['set_tfa'] = "Definir el mètode d'autenticació de dos factors";
$lang['tfa']['yubi_otp'] = "Autenticació OTP de Yubico";
$lang['tfa']['key_id'] = "Un identificador per la teva YubiKey";
$lang['tfa']['key_id_totp'] = "Un identificador per la teva clau";
$lang['tfa']['api_register'] = 'mailcow fa servir la Yubico Cloud API. Obté una API key per la teva clau <a href="https://upgrade.yubico.com/getapikey/" target="_blank">aquí</a>';
$lang['tfa']['u2f'] = "Autenticació U2F";
$lang['tfa']['none'] = "Desactivar";
$lang['tfa']['delete_tfa'] = "Desactivar TFA";
$lang['tfa']['disable_tfa'] = "Desactivar TFA fins al següent login";
$lang['tfa']['confirm'] = "Confirma";
$lang['tfa']['totp'] = "OTP basat en temps (Google Authenticator etc.)";
$lang['tfa']['select'] = "Si et plau, selecciona";
$lang['tfa']['waiting_usb_auth'] = "<i>Esperant el dispositiu USB...</i><br><br>Apreta el botó del teu dispositiu USB U2F ara.";
$lang['tfa']['waiting_usb_register'] = "<i>Esperant el dispositiu USB...</i><br><br>Posa el teu password i confirma el registre del teu U2F apretant el botó del teu dispositiiu USB U2F.";
$lang['tfa']['scan_qr_code'] = "Escaneja el codi següent amb la teva app d'autenticació o entra'l manualment.";
$lang['tfa']['enter_qr_code'] = "El teu codi TOTP, si el teu dispositiu no pot escanejar codis QR";
$lang['tfa']['confirm_totp_token'] = "Confirma els canvis introduint el codi generat";
$lang['admin']['no_new_rows'] = 'No hi ha més files';
$lang['admin']['additional_rows'] = ' files addicionals afegides'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Clau privada';
$lang['admin']['import'] = 'Importar';
$lang['admin']['import_private_key'] = 'Importar clau privada';
$lang['admin']['f2b_parameters'] = 'Fail2ban';
$lang['admin']['f2b_ban_time'] = 'Temsp de bloqueig (s)';
$lang['admin']['f2b_max_attempts'] = 'Intents màx.';
$lang['admin']['f2b_retry_window'] = 'Finestra de reintent (s) per intents màx.';
$lang['admin']['f2b_netban_ipv4'] = 'Suxarxa IPv4 on aplicar el bloqueig (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'Suxarxa IPv6 on aplicar el bloqueig (8-128)';
$lang['admin']['f2b_whitelist'] = 'Llista blanca de xarxes/hosts';
$lang['admin']['search_domain_da'] = 'Buscar dominis';
$lang['admin']['dkim_key_length'] = 'Mida de la clau DKIM (bits)';
$lang['admin']['dkim_key_valid'] = 'Vàlida';
$lang['admin']['dkim_key_unused'] = 'No es fa servir';
$lang['admin']['dkim_key_missing'] = 'No té clau';
$lang['admin']['dkim_add_key'] = 'Afegir registre ARC/DKIM';
$lang['admin']['dkim_keys'] = 'Registres ARC/DKIM';
$lang['admin']['add'] = 'Afegir';
$lang['add']['add_domain_restart'] = 'Afegir el domini i reiniciar SOGo';
$lang['add']['add_domain_only'] = 'Afegir el domini';
$lang['admin']['configuration'] = 'Configuració';
$lang['admin']['password'] = 'Contrasenya';
$lang['admin']['password_repeat'] = 'Confirmació de la contrasenya (repetir)';
$lang['admin']['active'] = 'Actiu';
$lang['admin']['inactive'] = 'Inactiu';
$lang['admin']['action'] = 'Acció';
$lang['admin']['add_domain_admin'] = 'Afegir Administrador del dominio';
$lang['admin']['admin_domains'] = 'Asignaciones de dominio';
$lang['admin']['domain_admins'] = 'Administradores de dominio';
$lang['admin']['username'] = "Nom d'usuari";
$lang['admin']['edit'] = 'Editar';
$lang['admin']['remove'] = 'Esborrar';
$lang['admin']['save'] = 'Desar els canvis';
$lang['admin']['admin'] = 'Administrador';
$lang['admin']['admin_details'] = "Editar detalls de l'administrador";
$lang['admin']['unchanged_if_empty'] = "Si no hi ha canvis, deixa'l en blanc";
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Accés';
$lang['admin']['no_record'] = 'Cap registre';
$lang['admin']['filter_table'] = 'Filtrar taula';
$lang['admin']['empty'] = 'Sense resultats';
$lang['admin']['refresh'] = 'Refrescar';
$lang['admin']['to_top'] = 'Tornar a dalt';
$lang['admin']['in_use_by'] = 'En ús per';
$lang['admin']['refresh'] = 'Refrescar';
$lang['admin']['to_top'] = 'Tornar a dalt';
$lang['admin']['in_use_by'] = 'En ús per';
$lang['admin']['forwarding_hosts'] = 'Forwarding Hosts';
$lang['admin']['forwarding_hosts_hint'] = "Els missatges entrants s'accepten de forma incondicional a qualsevol host que apareix aquí. Aquests hosts no es comproven a cap DNSBL ni estan sotmesos a greylisting. El spam rebut mai no es rebutja, però opcionalment es pot arxivar a la carpeta Junk. L'ús més comú d'això és especificar altres servidors de correu en els quals s'ha configurat una regla que reenvia correus electrònics entrants a aquest servidor";
$lang['admin']['forwarding_hosts_add_hint'] = "Podeu especificar adreces IPv4/IPv6, xarxes en notació CIDR, noms de host (que es resoldran a adreces IP) o noms de domini (que es resoldran a les adreces IP consultant els registres SPF o, si no n'hi ha, registres MX ).";
$lang['admin']['relayhosts_hint'] = 'Defineix aquí els relayhosts per després poder-los seleccionar als dominis.';
$lang['admin']['add_relayhost_add_hint'] = "Tingues en compte que les dades d'autenticació al relayhost es desaran sense xifrar.";
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Origen';
$lang['admin']['add_forwarding_host'] = 'Afegir Forwarding Host';
$lang['admin']['add_relayhost'] = 'Afegir Relayhost';
$lang['success']['forwarding_host_removed'] = "Forwarding host %s esborrat";
$lang['success']['forwarding_host_added'] = "Forwarding host %s afegit";
$lang['success']['relayhost_removed'] = "Relayhost %s esborrat";
$lang['success']['relayhost_added'] = "Relayhost %s afegit";
$lang['diagnostics']['dns_records'] = 'Registres DNS';
$lang['diagnostics']['dns_records_24hours'] = "Tingues en compte que els canvis realitzats als DNS poden trigar fins a 24 hores a reflectir correctament el seu estat actual en aquesta pàgina. Es tracta d'una manera de veure fàcilment com configurar els registres DNS i comprovar si tots els registres DNS son correctes.";
$lang['diagnostics']['dns_records_name'] = 'Nom';
$lang['diagnostics']['dns_records_type'] = 'Tipus';
$lang['diagnostics']['dns_records_data'] = 'Valor correcte';
$lang['diagnostics']['dns_records_status'] = 'Valor actual';
$lang['diagnostics']['optional'] = 'Aquest registre és opcional.';
$lang['diagnostics']['cname_from_a'] = 'Valor derivat de registre A/AAAA. Això és compatible sempre que el registre assenyali el recurs correcte.';
$lang['admin']['relay_from'] = '"From:" adreça';
$lang['admin']['api_allow_from'] = "Permetre l'accés a la API des d'aquestes IPs";
$lang['admin']['api_key'] = "API key";
$lang['admin']['activate_api'] = "Activar API";
$lang['admin']['regen_api_key'] = "Regenerar API key";
$lang['admin']['quarantaine'] = "Quarantena";
$lang['admin']['quarantaine_retention_size'] = "Retentions per mailbox:";
$lang['admin']['quarantaine_max_size'] = "Mida màxima en MiB (més grans es descarten):";
$lang['admin']['quarantaine_exclude_domains'] = "Excloure els dominis i àlies de domini:";
$lang['admin']['ui_texts'] = "Etiquetes i textos de la UI";
$lang['admin']['help_text'] = "Text alternatiu per a l'ajuda de sota la casella de login (es permet HTML)";
$lang['admin']['title_name'] = 'Nom del lloc "mailcow UI"';
$lang['admin']['main_name'] = 'Nom de "mailcow UI"';
$lang['admin']['apps_name'] = 'Nom de "mailcow Apps"';
$lang['admin']['customize'] = "Personalitzar";
$lang['admin']['change_logo'] = "Canviar el logo";
$lang['admin']['logo_info'] = "La vostra imatge es reduirà a una alçada de 40 píxels per a la barra de navegació superior i un màx. ample de 250 px per a la pàgina d'inici. És molt recomanable un gràfic escalable";
$lang['admin']['upload'] = "Pujar";
$lang['admin']['app_links'] = "Enllaços a App";
$lang['admin']['app_name'] = "Nom de la App";
$lang['admin']['link'] = "Enllaç";
$lang['admin']['remove_row'] = "Eliminar fila";
$lang['admin']['add_row'] = "Afegir fila";
$lang['admin']['reset_default'] = "Restablir";
$lang['admin']['merged_vars_hint'] = 'Les files en gris venen de <code>vars.(local.)inc.php</code> i no es poden modificar.';
$lang['mailbox']['waiting'] = "Esperant";
$lang['mailbox']['status'] = "Estat";
$lang['mailbox']['running'] = "Executant-se";
$lang['edit']['spam_score'] = "Especifica una puntuació de spam";
$lang['edit']['spam_policy'] = "Afegeix o treu elementes a la white-/blacklist";
$lang['edit']['spam_alias'] = "Crear o canviar alies temporals limitats per temps";
$lang['danger']['img_tmp_missing'] = "No s'ha validat el fitxer de la imatge: el fitxer temporal no s'ha trobat";
$lang['danger']['img_invalid'] = "No s'ha validat el fitxer de la imatge";
$lang['danger']['invalid_mime_type'] = "Mime type invàlid";
$lang['success']['upload_success'] = "El fitxer s'ha pujat";
$lang['success']['app_links'] = "S'han desat els canvis als enallaços a App";
$lang['success']['ui_texts'] = "S'han desat els canvis als noms de App";
$lang['success']['reset_main_logo'] = "Restablir el logo per defecte";
$lang['success']['items_released'] = "S'han alliberat els elements seleccionats";
$lang['danger']['imagick_exception'] = "Error: exepció de Imagick mentre es llegia la imatge";
$lang['quarantine']['quarantine'] = "Quarantena";
$lang['quarantine']['qinfo'] = "El sistema de quarantena desa a la base de dades els missatges que han estat refusats. El missatge, al emissor, li consta com a <em>no</em> lliurat.";
$lang['quarantine']['release'] = "Alliberar";
$lang['quarantine']['empty'] = 'No hi ha elements';
$lang['quarantine']['toggle_all'] = 'Marcar tots';
$lang['quarantine']['quick_actions'] = 'Accions';
$lang['quarantine']['remove'] = 'Esborrar';
$lang['quarantine']['received'] = "Rebut";
$lang['quarantine']['action'] = "Acció";
$lang['quarantine']['rcpt'] = "Receptor";
$lang['quarantine']['rcpt'] = "Recipient";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Emissor";
$lang['quarantine']['show_item'] = "Mostrar";
$lang['quarantine']['check_hash'] = "Comprovar el hash del fitxer a VT";
$lang['quarantine']['qitem'] = "Element en quarantena";
$lang['quarantine']['subj'] = "Assumpte";
$lang['quarantine']['text_plain_content'] = "Contingut (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Contingut (a partir del HTML)";
$lang['quarantine']['atts'] = "Adjunts";
$lang['header']['quarantine'] = "Quarantena";
$lang['header']['debug'] = "Debug";
$lang['quarantine']['release_body'] = "Hem adjuntat el teu missatge com a eml en aquest missatge.";
$lang['danger']['release_send_failed'] = "No s'ha pogut alliberar el missatge: %s";
$lang['quarantine']['release_subject'] = "Element potencialment perillós %s en quarantena";
$lang['mailbox']['bcc_map_type'] = "BCC type";
$lang['mailbox']['bcc_type'] = "BCC type";
$lang['mailbox']['bcc_sender_map'] = "Sender map";
$lang['mailbox']['bcc_rcpt_map'] = "Recipient map";
$lang['mailbox']['bcc_local_dest'] = "Destinació local";
$lang['mailbox']['bcc_destinations'] = "Destí/ns BCC";
$lang['mailbox']['bcc'] = "BCC";
$lang['mailbox']['bcc_maps'] = "BCC maps";
$lang['mailbox']['bcc_to_sender'] = "Canviar a 'Sender map'";
$lang['mailbox']['bcc_to_rcpt'] = "Canviar a 'Recipient map'";
$lang['mailbox']['add_bcc_entry'] = "Afegir BCC map";
$lang['mailbox']['bcc_info'] = "Els 'BCC maps' s'utilitzen per enviar còpies silencioses de tots els missatges a una altra adreça. S'utilitza una entrada del tipus 'Recipient map' quan la destinació local actua com a destinatari d'un correu. Els 'Sender map' segueixen el mateix principi.<br/>
La destinació local no serà informada sobre un lliurament fallit.";
$lang['mailbox']['address_rewriting'] = "Re-escriptura d'adreces";
$lang['mailbox']['recipient_maps'] = 'Recipient maps';
$lang['mailbox']['recipient_map_info'] = "Els 'Recipient maps' es fan servir per canviar l'adreça del destinatari abans de lliurar el missatge";
$lang['mailbox']['recipient_map_old'] = 'Destinatari original';
$lang['mailbox']['recipient_map_new'] = 'Nou destinatari';
$lang['mailbox']['add_recipient_map_entry'] = "Afegir 'Recipient map'";
$lang['mailbox']['add_sender_map_entry'] = "Afegir 'Sender map'";

View File

@ -14,16 +14,10 @@ $lang['footer']['delete_these_items'] = 'Sind Sie sicher, dass die Änderungen a
$lang['footer']['delete_now'] = 'Jetzt löschen';
$lang['footer']['cancel'] = 'Abbrechen';
$lang['dkim']['confirm'] = 'Sind Sie sicher?';
$lang['danger']['dkim_not_found'] = 'DKIM-Key nicht gefunden';
$lang['danger']['dkim_remove_failed'] = 'Kann DKIM-Key nicht entfernen';
$lang['danger']['dkim_add_failed'] = 'Kann DKIM-Key nicht hinzufügen';
$lang['danger']['dkim_domain_or_sel_invalid'] = 'DKIM-Domain oder -Selector nicht korrekt';
$lang['danger']['dkim_key_length_invalid'] = 'DKIM Schlüssellänge ungültig';
$lang['success']['dkim_removed'] = 'DKIM-Key wurde entfernt';
$lang['success']['dkim_added'] = 'DKIM-Key wurde hinzugefügt';
$lang['danger']['access_denied'] = 'Zugriff verweigert oder unvollständige/ungültige Daten';
$lang['danger']['whitelist_from_invalid'] = 'Whitelist-Eintrag ist ungültig';
$lang['danger']['domain_invalid'] = 'Domainname ist ungültig';
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = 'Maximale Größe für Mailboxen überschreitet das Domain Speicherlimit';
$lang['danger']['object_is_not_numeric'] = 'Wert %s ist nicht numerisch';
@ -50,19 +44,13 @@ $lang['success']['mailbox_modified'] = 'Änderungen an Mailbox %s wurden gespeic
$lang['success']['resource_modified'] = "Änderungen an Ressource %s wurden gespeichert";
$lang['success']['object_modified'] = "Änderungen an Objekt %s wurden gespeichert";
$lang['success']['f2b_modified'] = "Änderungen an Fail2ban Parametern wurden gespeichert";
$lang['success']['msg_size_saved'] = 'Limit wurde gesetzt';
$lang['danger']['aliasd_not_found'] = 'Alias-Domain nicht gefunden';
$lang['danger']['targetd_not_found'] = 'Ziel-Domain nicht gefunden';
$lang['danger']['aliasd_exists'] = 'Alias-Domain existiert bereits';
$lang['success']['aliasd_added'] = 'Alias-Domain %s wurde angelegt';
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
$lang['success']['domain_modified'] = 'Änderungen an Domain %s wurden gespeichert';
$lang['success']['domain_admin_modified'] = 'Änderungen an Domain-Administrator %s wurden gespeichert';
$lang['success']['domain_admin_added'] = 'Domain-Administrator %s wurde angelegt';
$lang['success']['changes_general'] = 'Änderungen wurden gespeichert';
$lang['success']['admin_modified'] = 'Änderungen am Administrator wurden gespeichert';
$lang['danger']['exit_code_not_null'] = 'Fehler: Exit-Code ist %d';
$lang['danger']['mailbox_not_available'] = 'Mailbox nicht verfügbar';
$lang['danger']['username_invalid'] = 'Benutzername kann nicht verwendet werden';
$lang['danger']['password_mismatch'] = 'Passwort-Wiederholung stimmt nicht überein';
$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Richtlinien';
@ -71,7 +59,6 @@ $lang['danger']['login_failed'] = 'Anmeldung fehlgeschlagen';
$lang['danger']['mailbox_invalid'] = 'Mailboxname ist ungültig';
$lang['danger']['resource_invalid'] = 'Ressourcenname ist ungültig';
$lang['danger']['description_invalid'] = 'Ressourcenbeschreibung ist ungültig';
$lang['danger']['mailbox_invalid_suggest'] = 'Mailboxname ist ungültig, meinten Sie vielleicht %s?';
$lang['danger']['is_alias'] = '%s lautet bereits eine Alias-Adresse';
$lang['danger']['is_alias_or_mailbox'] = "Eine Mailbox, ein Alias oder eine sich aus einer Alias-Domain ergebende Adresse mit dem Namen %s ist bereits vorhanden";
$lang['danger']['is_spam_alias'] = '%s lautet bereits eine Spam-Alias-Adresse';
@ -96,20 +83,16 @@ $lang['danger']['mailboxes_in_use'] = 'Maximale Anzahl an Mailboxen muss größe
$lang['danger']['aliases_in_use'] = 'Maximale Anzahl an Aliassen muss größer oder gleich %d sein';
$lang['danger']['sender_acl_invalid'] = 'Sender ACL Wert muss eine Adresse oder Domain sein';
$lang['danger']['domain_not_empty'] = 'Kann nur leere Domains entfernen';
$lang['warning']['spam_alias_temp_error'] = 'Kann zur Zeit keinen Spam-Alias erstellen, bitte versuchen Sie es später noch einmal.';
$lang['danger']['spam_alias_max_exceeded'] = 'Maximale Anzahl an Spam-Alias-Adressen erreicht';
$lang['danger']['validity_missing'] = 'Bitte geben Sie eine Gültigkeitsdauer an';
$lang['user']['loading'] = "Lade...";
$lang['user']['force_pw_update'] = 'Das Passwort für diesen Benutzer <b>muss</b> geändert werden, damit die Zugriffssperre auf die Groupwarekomponenten wieder freigeschaltet wird.';
$lang['user']['active_sieve'] = "Aktiver Filter";
$lang['user']['show_sieve_filters'] = "Zeige aktiven Filter des Benutzers";
$lang['user']['no_active_filter'] = "Kein aktiver Filter vorhanden";
$lang['user']['on'] = 'Ein';
$lang['user']['off'] = 'Aus';
$lang['user']['messages'] = "Nachrichten";
$lang['user']['in_use'] = "Verwendet";
$lang['user']['user_change_fn'] = '';
$lang['user']['user_settings'] = 'Benutzereinstellungen';
$lang['user']['mailbox_settings'] = 'Mailbox-Einstellungen';
$lang['user']['mailbox_details'] = 'Mailbox-Details';
$lang['user']['change_password'] = 'Passwort ändern';
$lang['user']['client_configuration'] = 'Konfigurationsanleitungen für E-Mail-Programme und Smartphones anzeigen';
@ -118,15 +101,12 @@ $lang['user']['save_changes'] = 'Änderungen speichern';
$lang['user']['password_now'] = 'Aktuelles Passwort (Änderungen bestätigen)';
$lang['user']['new_password_repeat'] = 'Neues Passwort (Wiederholung)';
$lang['user']['new_password_description'] = 'Mindestanforderung: 6 Zeichen lang, Buchstaben und Zahlen.';
$lang['user']['did_you_know'] = '<b>Wussten Sie schon?</b> Sie können Ihre E-Mail-Adresse mit Tags versehen, etwa "ich+<b>Privat</b>@example.com", um Nachrichten automatisch in einem Unterordner (Beispiel: "Privat") abzulegen.';
$lang['user']['spam_aliases'] = 'Temporäre E-Mail Aliasse';
$lang['user']['alias'] = 'Alias';
$lang['user']['aliases'] = 'Aliasse';
$lang['user']['shared_aliases'] = 'Geteilte Alias-Adressen';
$lang['user']['shared_aliases_desc'] = 'Geteilte Alias-Adressen werden nicht bei benutzerdefinierten Einstellungen wie die des Spam-Filters oder der Verschlüsselungsrichtlinie berücksichtigt. Entsprechende Spam-Filter können lediglich von einem Administrator vorgenommen werden.';
$lang['user']['direct_aliases'] = 'Direkte Alias-Adressen';
$lang['user']['direct_aliases_desc'] = 'Nur direkte Alias-Adressen werden für benutzerdefinierte Einstellungen berücksichtigt.';
$lang['user']['domain_aliases'] = 'Domain-Alias Adressen';
$lang['user']['is_catch_all'] = 'Ist Catch-All Adresse für Domain(s)';
$lang['user']['aliases_also_send_as'] = 'Darf außerdem versenden als Benutzer';
$lang['user']['aliases_send_as_all'] = 'Absender für folgende Domains und zugehörige Alias-Domains nicht prüfen';
@ -136,7 +116,6 @@ $lang['user']['alias_valid_until'] = 'Gültig bis';
$lang['user']['alias_remove_all'] = 'Alle entfernen';
$lang['user']['alias_time_left'] = 'Zeit verbleibend';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Bitte Gültigkeit auswählen';
$lang['user']['sync_jobs'] = 'Sync Jobs';
$lang['user']['hour'] = 'Stunde';
@ -173,8 +152,6 @@ $lang['user']['tls_enforce_in'] = 'TLS eingehend erzwingen';
$lang['user']['tls_enforce_out'] = 'TLS ausgehend erzwingen';
$lang['user']['no_record'] = 'Kein Eintrag';
$lang['user']['misc_settings'] = 'Sonstige Kontoeinstellungen';
$lang['user']['misc_delete_profile'] = 'Sonstige Kontoeinstellungen';
$lang['user']['tag_handling'] = 'Umgang mit getaggten E-Mails steuern';
$lang['user']['tag_in_subfolder'] = 'In Unterordner';
@ -189,7 +166,6 @@ $lang['user']['eas_reset_help'] = 'In vielen Fällen kann ein ActiveSync Profil
$lang['user']['encryption'] = 'Verschlüsselung';
$lang['user']['username'] = 'Benutzername';
$lang['user']['password'] = 'Password';
$lang['user']['last_run'] = 'Letzte Ausführung';
$lang['user']['excludes'] = 'Ausschlüsse';
$lang['user']['interval'] = 'Intervall';
@ -197,41 +173,19 @@ $lang['user']['active'] = 'Aktiv';
$lang['user']['action'] = 'Aktion';
$lang['user']['edit'] = 'Bearbeiten';
$lang['user']['remove'] = 'Entfernen';
$lang['user']['delete_now'] = 'Sofort löschen';
$lang['user']['create_syncjob'] = 'Neuen Sync-Job erstellen';
$lang['start']['dashboard'] = '%s - Dashboard';
$lang['start']['start_rc'] = 'Roundcube öffnen';
$lang['start']['start_sogo'] = 'SOGo öffnen';
$lang['start']['mailcow_apps_detail'] = 'Verwenden Sie mailcow Apps, um E-Mails abzurufen, Kalender- und Kontakte zu verwalten und vieles mehr.';
$lang['start']['mailcow_panel'] = 'mailcow UI starten';
$lang['start']['mailcow_panel_description'] = 'Die mailcow Steuerung steht sowohl für Administratoren als auch Mailbox-Benutzer zur Verfügung.';
$lang['start']['mailcow_panel_detail'] = '<b>Domain-Administratoren</b> erstellen, verändern oder löschen Mailboxen, verwalten die Domäne und sehen sonstige Einstellungen ein.<br>
Als <b>Mailbox-Benutzer</b> erstellen Sie hier zeitlich limitierte Aliasse, ändern das Verhalten des Spamfilters, setzen ein neues Passwort und vieles mehr.';
$lang['start']['recommended_config'] = 'Empfohlene Software-Konfiguration (ohne ActiveSync)';
$lang['start']['imap_smtp_server'] = 'IMAP- und SMTP-Server';
$lang['start']['imap_smtp_server_description'] = 'Für eine optimale Verbindung empfehlen wir die Verwendung des <a href="%s" target="_blank"><b>Mozilla Thunderbirds</b></a>.';
$lang['start']['imap_smtp_server_badge'] = 'E-Mail lesen und schreiben';
$lang['start']['imap_smtp_server_auth_info'] = 'Bitte verwenden Sie Ihre vollständige E-Mail-Adresse sowie das PLAIN-Authentifizierungsverfahren.<br>
Ihre Anmeldedaten werden durch die obligatorische Verschlüsselung entgegen des Begriffes "PLAIN" nicht unverschlüsselt übertragen.';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'E-Mail-Filter';
$lang['start']['managesieve_description'] = 'Bitte verwenden Sie <b>Mozilla Thunderbirds</b> zusammen mit der <a style="text-decoration:none" target="_blank" href="%s"><b>Sieve Erweiterung</b></a>.<br>Nach dem Herunterladen der Erweiterung starten Sie Thunderbird, öffnen das Fenster für Erweiterungen und ziehen die heruntergeladene Datei in das offene Fenster.<br>Der Servername lautet <b>%s</b>, als Port konfigurieren Sie bitte <b>4190</b>. Die Anmeldedaten entsprechen dem E-Mail Login.';
$lang['start']['service'] = 'Dienstname';
$lang['start']['encryption'] = 'Verschlüsselungstyp';
$lang['start']['help'] = 'Hilfe ein-/ausblenden';
$lang['start']['hostname'] = 'Hostname';
$lang['start']['port'] = 'Port';
$lang['start']['footer'] = '';
$lang['header']['mailcow_settings'] = 'Konfiguration';
$lang['header']['administration'] = 'Administration';
$lang['header']['mailboxes'] = 'Mailboxen';
$lang['header']['user_settings'] = 'Benutzereinstellungen';
$lang['header']['diagnostics'] = 'Diagnose';
$lang['header']['login'] = 'Anmeldung';
$lang['header']['logged_in_as_logout'] = 'Eingeloggt als <b>%s</b> (abmelden)';
$lang['header']['logged_in_as_logout_dual'] = 'Eingeloggt als <b>%s <span class="text-info">[%s]</span></b>';
$lang['header']['locale'] = 'Sprache';
$lang['mailbox']['domain'] = 'Domain';
$lang['mailbox']['spam_aliases'] = 'Temp. Alias';
$lang['mailbox']['alias'] = 'Alias';
@ -240,12 +194,10 @@ $lang['mailbox']['multiple_bookings'] = 'Mehrfachbuchen';
$lang['mailbox']['kind'] = 'Art';
$lang['mailbox']['description'] = 'Beschreibung';
$lang['mailbox']['resources'] = 'Ressourcen';
$lang['mailbox']['resource_name'] = 'Ressourcenname';
$lang['mailbox']['domains'] = 'Domains';
$lang['mailbox']['mailboxes'] = 'Mailboxen';
$lang['mailbox']['mailbox_quota'] = 'Max. Größe einer Mailbox';
$lang['mailbox']['domain_quota'] = 'Gesamtspeicher';
$lang['mailbox']['ratelimit'] = 'Limit ausgehend/Stunde';
$lang['mailbox']['active'] = 'Aktiv';
$lang['mailbox']['action'] = 'Aktion';
$lang['mailbox']['backup_mx'] = 'Backup MX';
@ -257,14 +209,10 @@ $lang['mailbox']['fname'] = 'Name';
$lang['mailbox']['filter_table'] = 'Filtern';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Speicherplatz';
$lang['mailbox']['in_use'] = 'Prozentualer Gebrauch';
$lang['mailbox']['msg_num'] = 'Anzahl Nachrichten';
$lang['mailbox']['remove'] = 'Entfernen';
$lang['mailbox']['edit'] = 'Bearbeiten';
$lang['mailbox']['archive'] = 'Archiv-Zugriff';
$lang['mailbox']['no_record'] = 'Kein Eintrag für Objekt %s';
$lang['mailbox']['no_record_single'] = 'Kein Eintrag';
$lang['mailbox']['add_domain'] = 'Domain hinzufügen';
$lang['mailbox']['add_domain_alias'] = 'Domain-Alias hinzufügen';
$lang['mailbox']['add_mailbox'] = 'Mailbox hinzufügen';
@ -284,21 +232,6 @@ Die Ausführung erfolgt in nachstehender Reihenfolge. Ein fehlgeschlagenes Scrip
Prefilter User scripts Postfilter <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/sieve_after" target="_blank">global sieve postfilter</a>';
$lang['info']['no_action'] = 'Keine Aktion anwendbar';
$lang['delete']['title'] = 'Objekt entfernen';
$lang['delete']['remove_domain_warning'] = '<b>Warnung:</b> Sie entfernen die Domain <b>%s</b>!';
$lang['delete']['remove_domainalias_warning'] = '<b>Warnung:</b> Sie entfernen die Alias-Domain <b>%s</b>!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Warnung:</b> Sie entfernen den Domain-Administrator <b>%s</b>!';
$lang['delete']['remove_alias_warning'] = '<b>Warnung:</b> Sie entfernen die Alias-Adresse <b>%s</b>!';
$lang['delete']['remove_syncjob_warning'] = '<b>Warnung:</b> Sie entfernen einen Sync-Job des Benutzers <b>%s</b>!';
$lang['delete']['remove_mailbox_warning'] = '<b>Warnung:</b> Sie entfernen die Mailbox <b>%s</b>!';
$lang['delete']['remove_mailbox_details'] = 'Die Mailbox wird <b>vollständig und permanent</b> entfernt!';
$lang['delete']['remove_resource_warning'] = '<b>Warnung:</b> Sie entfernen die Ressource <b>%s</b>!';
$lang['delete']['remove_resource_details'] = 'Die Ressource wird <b>vollständig und permanent</b> entfernt!';
$lang['delete']['remove_domain_details'] = 'Diese Aktion entfernt ebenfalls Domain-Aliasse.<br><br><b>Eine Domain muss leer sein, um entfernt zu werden.</b>';
$lang['delete']['remove_syncjob_details'] = 'Objekte dieses Sync-Jobs werden nicht mehr vom entfernten Server abgeholt.';
$lang['delete']['remove_alias_details'] = 'Benutzer werden keine Nachrichten mehr von dieser Adresse erhalten und versenden koennen!</b>';
$lang['delete']['remove_button'] = 'Entfernen';
$lang['delete']['previous'] = 'Vorherige Seite';
$lang['edit']['syncjob'] = 'Sync-Job bearbeiten';
$lang['edit']['save'] = 'Änderungen speichern';
@ -311,26 +244,22 @@ $lang['edit']['mins_interval'] = 'Intervall (min)';
$lang['edit']['maxbytespersecond'] = 'Max. Übertragungsrate in Bytes/s (0 für unlimitiert)';
$lang['edit']['automap'] = 'Ordner automatisch mappen ("Sent items", "Sent" => "Sent" etc.)';
$lang['edit']['skipcrossduplicates'] = 'Duplikate auch über Ordner hinweg überspringen ("first come, first serve")';
$lang['add']['maxbytespersecond'] = 'Max. Übertragungsrate in Bytes/s (0 für unlimitiert)';
$lang['add']['automap'] = 'Ordner automatisch mappen ("Sent items", "Sent" => "Sent" etc.)';
$lang['add']['skipcrossduplicates'] = 'Duplikate auch über Ordner hinweg überspringen ("first come, first serve")';
$lang['edit']['exclude'] = 'Elemente ausschließen (Regex)';
$lang['edit']['archive'] = 'Archiv-Zugriff';
$lang['edit']['max_mailboxes'] = 'Max. Mailboxanzahl:';
$lang['edit']['title'] = 'Objekt bearbeiten';
$lang['edit']['target_address'] = 'Ziel-Adresse(n) <small>(getrennt durch Komma)</small>:';
$lang['edit']['active'] = 'Aktiv';
$lang['edit']['force_pw_update'] = 'Erzwinge Passwortänderung bei nächstem Login';
$lang['edit']['force_pw_update_info'] = 'Dem Benutzer wird lediglich der Zugang zur mailcow UI ermöglicht.';
$lang['edit']['target_domain'] = 'Ziel-Domain:';
$lang['edit']['password'] = 'Passwort:';
$lang['edit']['ratelimit'] = 'Limit ausgehender Nachrichten/Stunde:';
$lang['danger']['ratelimt_less_one'] = 'Limit ausgehender Nachrichten/Stunde darf nicht kleiner als 1 sein';
$lang['edit']['password_repeat'] = 'Passwort (Wiederholung):';
$lang['edit']['domain_admin'] = 'Domain-Administrator bearbeiten';
$lang['edit']['domain'] = 'Domain bearbeiten';
$lang['edit']['edit_alias_domain'] = 'Alias-Domain bearbeiten';
$lang['edit']['alias_domain'] = 'Alias-Domain';
$lang['edit']['domains'] = 'Domains';
$lang['edit']['destroy'] = 'Manuelle Eingabe des Wertes';
$lang['edit']['alias'] = 'Alias bearbeiten';
$lang['edit']['mailbox'] = 'Mailbox bearbeiten';
$lang['edit']['description'] = 'Beschreibung:';
@ -340,22 +269,16 @@ $lang['edit']['domain_quota'] = 'Domain Speicherplatz gesamt (MiB):';
$lang['edit']['backup_mx_options'] = 'Backup MX Optionen:';
$lang['edit']['relay_domain'] = 'Relay Domain';
$lang['edit']['relay_all'] = 'Alle Empfänger-Adressen relayen';
$lang['edit']['dkim_signature'] = 'ARC + DKIM-Signatur:';
$lang['edit']['dkim_record_info'] = '<small>Bitte hinterlegen Sie einen TXT-Record mit obigem Wert in den DNS-Einstellungen Ihrer Domainverwaltung.</small>';
$lang['edit']['relay_all_info'] = '<small>Wenn Sie <b>nicht</b> alle Empfänger-Adressen relayen möchten, müssen Sie eine ("blinde") Mailbox für jede Adresse, die relayt werden soll, erstellen.</small>';
$lang['edit']['full_name'] = 'Voller Name';
$lang['edit']['quota_mb'] = 'Speicherplatz (MiB)';
$lang['edit']['sender_acl'] = 'Darf Nachrichten versenden als';
$lang['edit']['sender_acl_info'] = 'Aliasse sind nicht abwählbar und vorausgewählt.';
$lang['edit']['dkim_txt_name'] = 'TXT-Record Name:';
$lang['edit']['dkim_txt_value'] = 'TXT-Record Wert:';
$lang['edit']['previous'] = 'Vorherige Seite';
$lang['edit']['unchanged_if_empty'] = 'Unverändert, wenn leer';
$lang['edit']['dont_check_sender_acl'] = 'Absender für Domain %s u. Alias-Dom. nicht prüfen';
$lang['edit']['multiple_bookings'] = 'Mehrfaches Buchen';
$lang['edit']['kind'] = 'Art';
$lang['edit']['resource'] = 'Ressource';
$lang['edit']['goto_null'] = 'Nachrichten sofort verwerfen';
$lang['add']['syncjob'] = 'Sync-Job erstellen';
$lang['add']['syncjob_hint'] = 'Passwörter werden unverschlüsselt abgelegt!';
@ -363,8 +286,6 @@ $lang['add']['hostname'] = 'Servername';
$lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Benutzername';
$lang['add']['enc_method'] = 'Verschlüsselung';
$lang['add']['maxage'] = 'Maximales Alter von Nachrichten, welche vom Remote abgefragt werden (0 = Alter ignorieren)';
$lang['add']['subfolder2'] = 'Synchronisation in Unterordner am Ziel';
$lang['add']['mins_interval'] = 'Abrufintervall (Minuten)';
$lang['add']['exclude'] = 'Elemente ausschließen (Regex)';
$lang['add']['delete2duplicates'] = 'Lösche Duplikate im Ziel';
@ -374,11 +295,9 @@ $lang['edit']['delete2duplicates'] = 'Lösche Duplikate im Ziel';
$lang['edit']['delete1'] = 'Lösche Nachricht nach Übertragung vom Quell-Server';
$lang['edit']['delete2'] = 'Lösche Nachrichten von Ziel-Server, die nicht auf Quell-Server vorhanden sind';
$lang['add']['title'] = 'Objekt anlegen';
$lang['add']['domain'] = 'Domain';
$lang['add']['active'] = 'Aktiv';
$lang['add']['multiple_bookings'] = 'Mehrfaches Buchen möglich';
$lang['add']['save'] = 'Änderungen speichern';
$lang['add']['description'] = 'Beschreibung';
$lang['add']['max_aliases'] = 'Max. mögliche Aliasse';
$lang['add']['max_mailboxes'] = 'Max. mögliche Mailboxen';
@ -388,8 +307,6 @@ $lang['add']['backup_mx_options'] = 'Backup MX Optionen';
$lang['add']['relay_all'] = 'Alle Empfänger-Adressen relayen';
$lang['add']['relay_domain'] = 'Relay Domain';
$lang['add']['relay_all_info'] = '<small>Wenn Sie <b>nicht</b> alle Empfänger-Adressen relayen möchten, müssen Sie eine Mailbox für jede Adresse, die relayt werden soll, erstellen.</small>';
$lang['add']['alias'] = 'Alias(se)';
$lang['add']['alias_spf_fail'] = '<b>Hinweis:</b> Wählen Sie ein externes Postfach als Ziel-Adresse, kann es unter Umständen zu fehlerhaften Spam-Erkennungen <b>beim Empfänger</b> kommen. Weitere Informationen zu diesem Thema finden Sie <a href="https://www.heinlein-support.de/blog/news/gmx-de-und-web-de-haben-mail-rejects-durch-spf/" target="_blank">hier.</a>';
$lang['add']['alias_address'] = 'Alias-Adresse(n)';
$lang['add']['alias_address_info'] = '<small>Vollständige E-Mail-Adresse(n) oder @example.com, um alle Nachrichten einer Domain weiterzuleiten. Getrennt durch Komma. <b>Nur eigene Domains</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Nur gültige Domains. Getrennt durch Komma.</small>';
@ -398,17 +315,13 @@ $lang['add']['target_address_info'] = '<small>Vollständige E-Mail-Adresse(n). G
$lang['add']['alias_domain'] = 'Alias-Domain';
$lang['add']['select'] = 'Bitte auswählen';
$lang['add']['target_domain'] = 'Ziel-Domain';
$lang['add']['mailbox'] = 'Mailbox';
$lang['add']['resource'] = 'Ressource';
$lang['add']['kind'] = 'Art';
$lang['add']['mailbox_username'] = 'Benutzername (linker Teil der E-Mail-Adresse)';
$lang['add']['resource_name'] = 'Ressourcenname';
$lang['add']['full_name'] = 'Vor- und Zuname';
$lang['add']['quota_mb'] = 'Speicherplatz (MiB)';
$lang['add']['select_domain'] = 'Bitte zuerst eine Domain auswählen';
$lang['add']['password'] = 'Passwort';
$lang['add']['password_repeat'] = 'Passwort (Wiederholung)';
$lang['add']['previous'] = 'Vorherige Seite';
$lang['add']['restart_sogo_hint'] = 'Der SOGo Container muss nach dem Hinzufügen einer neuen Domain neugestartet werden!';
$lang['add']['goto_null'] = 'Nachrichten sofort verwerfen';
$lang['add']['validation_success'] = 'Erfolgreich validiert';
@ -427,16 +340,9 @@ $lang['mailbox']['inactive'] = 'Inaktiv';
$lang['edit']['validate_save'] = 'Validieren und speichern';
$lang['login']['title'] = 'Anmeldung';
$lang['login']['administration'] = 'Administration';
$lang['login']['administration_details'] = 'Bitte verwenden Sie Ihre Administrator Anmeldedaten, um administrative Aufgaben wie das Anlegen einer Mailbox zu starten.';
$lang['login']['user_settings'] = 'Benutzereinstellungen';
$lang['login']['user_settings_details'] = 'Als E-Mail Benutzer vewenden Sie bitte Ihre E-Mail Anmeldedaten, um Passwörter zu verändern, temporäre (Spam-)Aliasse zu erstellen, den Spamfilter einzustellen oder auch um E-Mails zu importieren.';
$lang['login']['username'] = 'Benutzername';
$lang['login']['password'] = 'Passwort';
$lang['login']['reset_password'] = 'Mein Passwort zurücksetzen';
$lang['login']['login'] = 'Anmelden';
$lang['login']['previous'] = 'Vorherige Seite';
$lang['login']['delayed'] = 'Login wurde zur Sicherheit um %s Sekunde/n verzögert.';
$lang['tfa']['tfa'] = "Zwei-Faktor-Authentifizierung";
@ -446,16 +352,12 @@ $lang['tfa']['key_id'] = "Ein Name für diesen YubiKey";
$lang['tfa']['key_id_totp'] = "Ein eindeutiger Name";
$lang['tfa']['api_register'] = 'mailcow verwendet die Yubico Cloud API. Ein API-Key für den Yubico Stick kann <a href="https://upgrade.yubico.com/getapikey/" target="_blank">hier</a> bezogen werden.';
$lang['tfa']['u2f'] = "U2F Authentifizierung";
$lang['tfa']['hotp'] = "HOTP Authentifizierung";
$lang['tfa']['totp'] = "TOTP Authentifizierung";
$lang['tfa']['none'] = "Deaktiviert";
$lang['tfa']['delete_tfa'] = "Deaktiviere 2FA";
$lang['tfa']['disable_tfa'] = "Deaktiviere 2FA bis zur nächsten erfolgreichen Anmeldung";
$lang['tfa']['confirm_tfa'] = "Bitte bestätigen Sie Ihr Einmal-Passwort im unteren Feld";
$lang['tfa']['confirm'] = "Bestätigen";
$lang['tfa']['otp'] = "Einmalpasswort";
$lang['tfa']['totp'] = "Time-based OTP (Google Authenticator etc.)";
$lang['tfa']['trash_login'] = "Login verwerfen";
$lang['tfa']['select'] = "Bitte auswählen";
$lang['tfa']['waiting_usb_auth'] = "<i>Warte auf USB-Gerät...</i><br><br>Bitte jetzt den vorgesehenen Taster des U2F USB-Gerätes berühren.";
$lang['tfa']['waiting_usb_register'] = "<i>Warte auf USB-Gerät...</i><br><br>Bitte zuerst das obere Passwortfeld ausfüllen und erst dann den vorgesehenen Taster des U2F USB-Gerätes berühren.";
@ -464,7 +366,6 @@ $lang['tfa']['enter_qr_code'] = "Falls Sie den angezeigten QR-Code nicht scannen
$lang['tfa']['confirm_totp_token'] = "Bitte bestätigen Sie die Änderung durch Eingabe eines generierten Tokens";
$lang['admin']['no_new_rows'] = 'Keine weiteren Zeilen vorhanden';
$lang['admin']['additional_rows'] = ' zusätzliche Zeilen geladen'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Private Key';
$lang['admin']['import'] = 'Importieren';
$lang['admin']['import_private_key'] = 'Private Key importieren';
@ -475,35 +376,15 @@ $lang['admin']['f2b_retry_window'] = 'Wiederholungen im Zeitraum von (s)';
$lang['admin']['f2b_netban_ipv4'] = 'Netzbereich für IPv4 Bans (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'Netzbereich für IPv6 Bans (8-128)';
$lang['admin']['f2b_whitelist'] = 'Whitelist für Netzwerke und Hosts';
$lang['admin']['restrictions'] = 'Postfix Restriktionen';
$lang['admin']['rr'] = 'Postfix Empfänger Restriktionen';
$lang['admin']['sr'] = 'Postfix Sender Restriktionen';
$lang['admin']['reset_defaults'] = 'Standard wiederherstellen';
$lang['admin']['r_inactive'] = 'Inaktive Restriktionen';
$lang['admin']['r_active'] = 'Aktive Restriktionen';
$lang['admin']['r_info'] = 'Ausgegraute/deaktivierte Elemente sind mailcow nicht bekannt und können nicht in die Liste inaktiver Elemente verschoben werden. Unbekannte Restriktionen werden trotzdem in Reihenfolge der Erscheinung gesetzt.<br>Sie können ein Element in der Datei <code>inc/vars.local.inc.php</code> als bekannt hinzufügen, um es zu bewegen.';
$lang['admin']['public_folders'] = 'Öffentliche Ordner';
$lang['admin']['public_folders_text'] = 'Ein Namespace "Public" wird erstellt. Der untenstehende Ordnername betrifft den Namen der automatisch erstellten Mailbox in diesem Namespace.';
$lang['admin']['public_folder_name'] = 'Ordnername <small>(alphanumerisch)</small>';
$lang['admin']['public_folder_enable'] = 'Öffentliche Ordner aktivieren';
$lang['admin']['public_folder_enable_text'] = 'Das Umschalten dieser Option entfernt keine Nachrichten aus den öffentlichen Ordnern.';
$lang['admin']['public_folder_pusf'] = 'Aktiviere "per-user seen flag"';
$lang['admin']['public_folder_pusf_text'] = 'Ein "per-user seen flag"-aktiviertes System markiert Nachrichten nicht als gelesen, wenn nur ein Benutzer sie gelesen hat. Jeder Benutzer verwaltet seine eigenen "seen flags".';
$lang['admin']['privacy'] = 'Datenschutz';
$lang['admin']['privacy_text'] = 'Diese Option aktiviert eine PCRE-Prüfung, die die Werte der Kopfzeilen "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" sowie "Received: from" durch "localhost" bzw. "127.0.0.1" ersetzt.';
$lang['admin']['privacy_anon_mail'] = 'Anonymisiere ausgehende Kopfzeilen';
$lang['admin']['msg_size'] = 'Aktuelles Limit der Nachrichtengröße';
$lang['admin']['msg_size_limit'] = 'Aktuelles Limit der Nachrichtengröße';
$lang['admin']['msg_size_limit_details'] = 'Diese Einstellung wird Postfix und den Webserver neuladen.';
$lang['admin']['save'] = 'Änderungen speichern';
$lang['admin']['maintenance'] = 'Wartung und Information';
$lang['admin']['sys_info'] = 'Systeminformation';
$lang['admin']['dkim_add_key'] = 'ARC/DKIM-Key hinzufügen';
$lang['admin']['dkim_keys'] = 'ARC/DKIM-Keys';
$lang['admin']['dkim_key_valid'] = 'Key gültig';
$lang['admin']['dkim_key_unused'] = 'Key ohne Zuweisung';
$lang['admin']['dkim_key_missing'] = 'Key fehlt';
$lang['admin']['dkim_key_hint'] = 'Der Selector für DKIM-Keys lautet immer <code>dkim</code>.';
$lang['admin']['add'] = 'Hinzufügen';
$lang['add']['add_domain_restart'] = 'Domain hinzufügen und SOGo neustarten';
$lang['add']['add_domain_only'] = 'Nur Domain hinzufügen';
@ -526,20 +407,12 @@ $lang['admin']['unchanged_if_empty'] = 'Unverändert, wenn leer';
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Zugang';
$lang['admin']['invalid_max_msg_size'] = 'Maximale Nachrichtengröße ungültig';
$lang['admin']['site_not_found'] = 'Kann mailcow Seitenkonfiguration nicht finden';
$lang['admin']['public_folder_empty'] = 'Öffentlicher Ordner-Name darf nicht leer sein';
$lang['admin']['set_rr_failed'] = 'Kann Postfix Restriktionen nicht setzen';
$lang['admin']['no_record'] = 'Kein Eintrag';
$lang['admin']['filter_table'] = 'Tabelle Filtern';
$lang['admin']['empty'] = 'Keine Einträge vorhanden';
$lang['admin']['time'] = 'Zeit';
$lang['admin']['priority'] = 'Gewichtung';
$lang['admin']['refresh'] = 'Neu laden';
$lang['admin']['logs'] = 'Logs';
$lang['admin']['to_top'] = 'Nach oben';
$lang['admin']['in_use_by'] = 'Verwendet von';
$lang['admin']['message'] = 'Nachricht';
$lang['admin']['forwarding_hosts'] = 'Weiterleitungs-Hosts';
$lang['admin']['forwarding_hosts_hint'] = 'Eingehende Nachrichten werden von den hier gelisteten Hosts bedingungslos akzeptiert. Diese Hosts werden dann nicht mit DNSBLs abgeglichen oder Greylisting unterworfen. Von ihnen empfangener Spam wird nie abgelehnt, optional kann er aber in den Spam-Ordner einsortiert werden. Die übliche Verwendung für diese Funktion ist, um Mailserver anzugeben, auf denen eine Weiterleitung zu Ihrem mailcow-Server eingerichtet wurde.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Sie können entweder IPv4/IPv6-Adressen, Netzwerke in CIDR-Notation, Hostnamen (die zu IP-Adressen aufgelöst werden), oder Domainnamen (die zu IP-Adressen aufgelöst werden, indem ihr SPF-Record abgefragt wird oder, in dessen Abwesenheit, ihre MX-Records) angeben.';
@ -559,7 +432,6 @@ $lang['admin']['quarantine_retention_size'] = "Rückhaltungen pro Mailbox:";
$lang['admin']['quarantine_max_size'] = "Maximale Größe in MiB (größere Elemente werden verworfen):";
$lang['admin']['quarantine_exclude_domains'] = "Domains und Alias-Domains ausschließen:";
$lang['delete']['remove_forwardinghost_warning'] = '<b>Warnung:</b> Sie entfernen den Weiterleitungs-Host <b>%s</b>!';
$lang['success']['forwarding_host_removed'] = "Weiterleitungs-Host %s wurde entfernt";
$lang['success']['forwarding_host_added'] = "Weiterleitungs-Host %s wurde hinzugefügt";
$lang['success']['relayhost_removed'] = "Relayhost %s wurde entfernt";
@ -596,12 +468,8 @@ $lang['admin']['add_row'] = "Reihe hinzufügen";
$lang['admin']['reset_default'] = "Zurücksetzen auf Standard";
$lang['admin']['merged_vars_hint'] = 'Ausgegraute Reihen wurden aus der Datei <code>vars.(local.)inc.php</code> gelesen und können hier nicht verändert werden.';
$lang['edit']['tls_policy'] = "TLS Policy ändern";
$lang['edit']['spam_score'] = "Einen benutzerdefiniterten Spam-Score festlegen";
$lang['edit']['spam_policy'] = "Hinzufügen und Entfernen von Einträgen in White- und Blacklists";
$lang['edit']['delimiter_action'] = "Delimiter Aktion verändern";
$lang['edit']['syncjobs'] = "Sync job hinzufügen oder anpassen";
$lang['edit']['eas_reset'] = "ActiveSync Geräte-Cache zurücksetzen";
$lang['edit']['spam_alias'] = "Anpassen temporärer Alias-Adressen";
$lang['danger']['img_tmp_missing'] = "Grafik konnte nicht validiert werden: Erstellung temporärer Datei fehlgeschlagen";
@ -614,32 +482,32 @@ $lang['success']['reset_main_logo'] = "Standardgrafik wurde wiederhergestellt";
$lang['success']['items_released'] = "Ausgewählte Objekte wurden an Mailbox versendet";
$lang['danger']['imagick_exception'] = "Fataler Bildverarbeitungsfehler";
$lang['quarantaine']['quarantaine'] = "Quarantäne";
$lang['quarantaine']['qinfo'] = "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank. Dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde.";
$lang['quarantaine']['release'] = "Freigeben";
$lang['quarantaine']['empty'] = 'Keine Einträge';
$lang['quarantaine']['toggle_all'] = 'Alle auswählen';
$lang['quarantaine']['quick_actions'] = 'Aktionen';
$lang['quarantaine']['remove'] = 'Entfernen';
$lang['quarantaine']['received'] = "Empfangen";
$lang['quarantaine']['action'] = "Aktion";
$lang['quarantaine']['rcpt'] = "Empfänger";
$lang['quarantaine']['qid'] = "Rspamd QID";
$lang['quarantaine']['sender'] = "Sender";
$lang['quarantaine']['show_item'] = "Details";
$lang['quarantaine']['check_hash'] = "Checksumme auf VirusTotal suchen";
$lang['quarantaine']['qitem'] = "Quarantäneeintrag";
$lang['quarantaine']['subj'] = "Betreff";
$lang['quarantaine']['text_plain_content'] = "Inhalt (text/plain)";
$lang['quarantaine']['text_from_html_content'] = "Inhalt (html, konvertiert)";
$lang['quarantaine']['atts'] = "Anhänge";
$lang['quarantine']['quarantine'] = "Quarantäne";
$lang['quarantine']['qinfo'] = "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank. Dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde.";
$lang['quarantine']['release'] = "Freigeben";
$lang['quarantine']['empty'] = 'Keine Einträge';
$lang['quarantine']['toggle_all'] = 'Alle auswählen';
$lang['quarantine']['quick_actions'] = 'Aktionen';
$lang['quarantine']['remove'] = 'Entfernen';
$lang['quarantine']['received'] = "Empfangen";
$lang['quarantine']['action'] = "Aktion";
$lang['quarantine']['rcpt'] = "Empfänger";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Sender";
$lang['quarantine']['show_item'] = "Details";
$lang['quarantine']['check_hash'] = "Checksumme auf VirusTotal suchen";
$lang['quarantine']['qitem'] = "Quarantäneeintrag";
$lang['quarantine']['subj'] = "Betreff";
$lang['quarantine']['text_plain_content'] = "Inhalt (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Inhalt (html, konvertiert)";
$lang['quarantine']['atts'] = "Anhänge";
$lang['header']['quarantaine'] = "Quarantäne";
$lang['header']['quarantine'] = "Quarantäne";
$lang['header']['debug'] = "Debugging";
$lang['quarantaine']['release_body'] = "Die ursprüngliche Nachricht wurde als EML-Datei im Anhang hinterlegt.";
$lang['quarantine']['release_body'] = "Die ursprüngliche Nachricht wurde als EML-Datei im Anhang hinterlegt.";
$lang['danger']['release_send_failed'] = "Die Nachricht konnte nicht versendet werden: %s";
$lang['quarantaine']['release_subject'] = "Potentiell schädliche Nachricht aus Quarantäne: %s";
$lang['quarantine']['release_subject'] = "Potentiell schädliche Nachricht aus Quarantäne: %s";
$lang['mailbox']['bcc_map_type'] = "BCC Typ";
$lang['mailbox']['bcc_type'] = "BCC Typ";
@ -655,3 +523,9 @@ $lang['mailbox']['bcc_to_rcpt'] = "Map empfängerabhängig verwenden";
$lang['mailbox']['add_bcc_entry'] = "BCC-Eintrag hinzufügen";
$lang['mailbox']['bcc_info'] = "Eine empfängerabhängige Map wird verwendet, wenn die BCC-Map Eintragung auf den Eingang einer E-Mail auf das lokale Ziel reagieren soll. Senderabhängige Maps verfahren nach dem gleichen Prinzip.<br/>
Das lokale Ziel wird bei Fehlzustellungen an ein BCC-Ziel nicht informiert.";
$lang['mailbox']['address_rewriting'] = 'Adressumschreibung';
$lang['mailbox']['recipient_maps'] = 'Empfängerumschreibungen';
$lang['mailbox']['recipient_map_info'] = 'Empfängerumschreibung ersetzen den Empfänger einer E-Mail vor dem Versand.';
$lang['mailbox']['recipient_map_old'] = 'Original Empfänger';
$lang['mailbox']['recipient_map_new'] = 'Neuer Empfänger';
$lang['mailbox']['add_recipient_map_entry'] = 'Empfängerumschreibung hinzufügen';

View File

@ -14,12 +14,7 @@ $lang['footer']['delete_these_items'] = 'Please confirm your changes to the foll
$lang['footer']['delete_now'] = 'Delete now';
$lang['footer']['cancel'] = 'Cancel';
$lang['dkim']['confirm'] = "Are you sure?";
$lang['danger']['dkim_not_found'] = "DKIM key not found";
$lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM key";
$lang['danger']['dkim_add_failed'] = "Cannot add given DKIM key";
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domain or selector invalid";
$lang['danger']['dkim_key_length_invalid'] = "DKIM key length invalid";
$lang['success']['dkim_removed'] = "DKIM key %s has been removed";
$lang['success']['dkim_added'] = "DKIM key has been saved";
$lang['danger']['access_denied'] = "Access denied or invalid form data";
@ -33,8 +28,6 @@ $lang['danger']['last_key'] = 'Last key cannot be deleted';
$lang['danger']['goto_empty'] = "Goto address must not be empty";
$lang['danger']['policy_list_from_exists'] = "A record with given name exists";
$lang['danger']['policy_list_from_invalid'] = "Record has invalid format";
$lang['danger']['whitelist_exists'] = "A whitelist record with that name exists";
$lang['danger']['whitelist_from_invalid'] = "Whitelist record has invalid format";
$lang['danger']['alias_invalid'] = "Alias address is invalid";
$lang['danger']['goto_invalid'] = "Goto address is invalid";
$lang['danger']['alias_domain_invalid'] = "Alias domain is invalid";
@ -50,19 +43,13 @@ $lang['success']['mailbox_modified'] = "Changes to mailbox %s have been saved";
$lang['success']['resource_modified'] = "Changes to mailbox %s have been saved";
$lang['success']['object_modified'] = "Changes to object %s have been saved";
$lang['success']['f2b_modified'] = "Changes to Fail2ban parameters have been saved";
$lang['success']['msg_size_saved'] = "Message size limit has been set";
$lang['danger']['aliasd_not_found'] = "Alias domain not found";
$lang['danger']['targetd_not_found'] = "Target domain not found";
$lang['danger']['aliasd_exists'] = "Alias domain already exists";
$lang['success']['aliasd_added'] = "Added alias domain %s";
$lang['success']['aliasd_modified'] = "Changes to alias domain %s have been saved";
$lang['success']['domain_modified'] = "Changes to domain %s have been saved";
$lang['success']['domain_admin_modified'] = "Changes to domain administrator %s have been saved";
$lang['success']['domain_admin_added'] = "Domain administrator %s has been added";
$lang['success']['changes_general'] = 'Changes have been saved';
$lang['success']['admin_modified'] = "Changes to administrator have been saved";
$lang['danger']['exit_code_not_null'] = "Error: Exit code was %d";
$lang['danger']['mailbox_not_available'] = "Mailbox not available";
$lang['danger']['username_invalid'] = "Username cannot be used";
$lang['danger']['password_mismatch'] = "Confirmation password is not identical";
$lang['danger']['password_complexity'] = "Password does not meet the policy";
@ -71,7 +58,6 @@ $lang['danger']['login_failed'] = "Login failed";
$lang['danger']['mailbox_invalid'] = "Mailbox name is invalid";
$lang['danger']['description_invalid'] = 'Resource description is invalid';
$lang['danger']['resource_invalid'] = "Resource name is invalid";
$lang['danger']['mailbox_invalid_suggest'] = 'Mailbox name is invalid, did you mean to type "%s"?';
$lang['danger']['is_alias'] = "%s is already known as an alias address";
$lang['danger']['is_alias_or_mailbox'] = "%s is already known as an alias, a mailbox or an alias address expanded from an alias domain.";
$lang['danger']['is_spam_alias'] = "%s is already known as a spam alias address";
@ -96,20 +82,16 @@ $lang['danger']['mailboxes_in_use'] = "Max. mailboxes must be greater or equal t
$lang['danger']['aliases_in_use'] = "Max. aliases must be greater or equal to %d";
$lang['danger']['sender_acl_invalid'] = "Sender ACL value is invalid";
$lang['danger']['domain_not_empty'] = "Cannot remove non-empty domain";
$lang['warning']['spam_alias_temp_error'] = "Temporary error: Cannot add spam alias, please try again later.";
$lang['danger']['spam_alias_max_exceeded'] = "Max. allowed spam alias addresses exceeded";
$lang['danger']['validity_missing'] = 'Please assign a period of validity';
$lang['user']['loading'] = "Loading...";
$lang['user']['force_pw_update'] = 'You <b>must</b> set a new password to be able to access groupware related services.';
$lang['user']['active_sieve'] = "Active filter";
$lang['user']['show_sieve_filters'] = "Show active user sieve filter";
$lang['user']['no_active_filter'] = "No active filter available";
$lang['user']['on'] = "On";
$lang['user']['off'] = "Off";
$lang['user']['messages'] = "messages"; // "123 messages"
$lang['user']['in_use'] = "Used";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'User settings';
$lang['user']['mailbox_settings'] = 'Mailbox settings';
$lang['user']['mailbox_details'] = 'Mailbox details';
$lang['user']['change_password'] = 'Change password';
$lang['user']['client_configuration'] = 'Show configuration guides for email clients and smartphones';
@ -118,15 +100,12 @@ $lang['user']['save_changes'] = 'Save changes';
$lang['user']['password_now'] = 'Current password (confirm changes)';
$lang['user']['new_password_repeat'] = 'Confirmation password (repeat)';
$lang['user']['new_password_description'] = 'Requirement: 6 characters long, letters and numbers.';
$lang['user']['did_you_know'] = '<b>Did you know?</b> You can use tags in your email address ("me+<b>privat</b>@example.com") to move messages to a folder automatically (example: "privat").';
$lang['user']['spam_aliases'] = 'Temporary email aliases';
$lang['user']['alias'] = 'Alias';
$lang['user']['aliases'] = 'Aliases';
$lang['user']['shared_aliases'] = 'Shared alias addresses';
$lang['user']['shared_aliases_desc'] = 'A shared alias address is not affected by any user specific settings. A custom spam filter setting can be archived by a domain-wide policy set by an administrator..';
$lang['user']['direct_aliases'] = 'Direct alias addresses';
$lang['user']['direct_aliases_desc'] = 'Direct alias addresses are affected by spam filter and TLS policy settings.';
$lang['user']['domain_aliases'] = 'Domain alias addresses';
$lang['user']['is_catch_all'] = 'Catch-all for domain/s';
$lang['user']['aliases_also_send_as'] = 'Also allowed to send as user';
$lang['user']['aliases_send_as_all'] = 'Do not check sender access for the following domain(s) and its alias domains';
@ -136,7 +115,6 @@ $lang['user']['alias_valid_until'] = 'Valid until';
$lang['user']['alias_remove_all'] = 'Remove all aliases';
$lang['user']['alias_time_left'] = 'Time left';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Period of validity';
$lang['user']['sync_jobs'] = 'Sync jobs';
$lang['user']['hour'] = 'Hour';
@ -172,8 +150,6 @@ $lang['user']['tls_enforce_in'] = 'Enforce TLS incoming';
$lang['user']['tls_enforce_out'] = 'Enforce TLS outgoing';
$lang['user']['no_record'] = 'No record';
$lang['user']['misc_settings'] = 'Other profile settings';
$lang['user']['misc_delete_profile'] = 'Other profile settings';
$lang['user']['tag_handling'] = 'Set handling for tagged mail';
$lang['user']['tag_in_subfolder'] = 'In subfolder';
@ -188,7 +164,6 @@ $lang['user']['eas_reset_help'] = 'In many cases a device cache reset will help
$lang['user']['encryption'] = 'Encryption';
$lang['user']['username'] = 'Username';
$lang['user']['password'] = 'Password';
$lang['user']['last_run'] = 'Last run';
$lang['user']['excludes'] = 'Excludes';
$lang['user']['interval'] = 'Interval';
@ -196,48 +171,25 @@ $lang['user']['active'] = 'Active';
$lang['user']['action'] = 'Action';
$lang['user']['edit'] = 'Edit';
$lang['user']['remove'] = 'Remove';
$lang['user']['delete_now'] = 'Remove now';
$lang['user']['create_syncjob'] = 'Create new sync job';
$lang['start']['dashboard'] = '%s - dashboard';
$lang['start']['start_rc'] = 'Open Roundcube';
$lang['start']['start_sogo'] = 'Open SOGo';
$lang['start']['mailcow_apps_detail'] = 'Use a mailcow app to access your mails, calendar, contacts and more.';
$lang['start']['mailcow_panel'] = 'Start mailcow UI';
$lang['start']['mailcow_panel_description'] = 'The mailcow UI is available for administrators and mailbox users.';
$lang['start']['mailcow_panel_detail'] = '<b>Domain administrators</b> create, modify or delete mailboxes and aliases, change domains and read further information about their assigned domains.<br>
<b>Mailbox users</b> are able to create time-limited aliases (spam aliases), change their password and spam filter settings.';
$lang['start']['recommended_config'] = 'Recommended configuration (without ActiveSync)';
$lang['start']['imap_smtp_server'] = 'IMAP- and SMTP server data';
$lang['start']['imap_smtp_server_description'] = 'For the best experience we recommend to use <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
$lang['start']['imap_smtp_server_badge'] = 'Read/Write emails';
$lang['start']['imap_smtp_server_auth_info'] = 'Please use your full email address and the PLAIN authentication mechanism.<br>
Your login data will be encrypted by the server-side mandatory encryption.';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'Email filter';
$lang['start']['managesieve_description'] = 'Please use <b>Mozilla Thunderbird</b> with the <a style="text-decoration:none" target="_blank" href="%s"><b>nightly sieve extension</b></a>.<br>Start Thunderbird, open the add-on settings and drop the newly downloaded xpi file into the opened window.<br>The server name is <b>%s</b>, use port <b>4190</b> if you are asked for. The login data match your email login.';
$lang['start']['service'] = 'Service';
$lang['start']['encryption'] = 'Encryption method';
$lang['start']['help'] = 'Show/Hide help panel';
$lang['start']['hostname'] = 'Hostname';
$lang['start']['port'] = 'Port';
$lang['start']['footer'] = '';
$lang['header']['mailcow_settings'] = 'Configuration';
$lang['header']['administration'] = 'Administration';
$lang['header']['mailboxes'] = 'Mailboxes';
$lang['header']['user_settings'] = 'User settings';
$lang['header']['diagnostics'] = 'Diagnostics';
$lang['header']['login'] = 'Login';
$lang['header']['logged_in_as_logout'] = 'Logged in as <b>%s</b> (logout)';
$lang['header']['logged_in_as_logout_dual'] = 'Logged in as <b>%s <span class="text-info">[%s]</span></b>';
$lang['header']['locale'] = 'Language';
$lang['mailbox']['domain'] = 'Domain';
$lang['mailbox']['spam_aliases'] = 'Temp. alias';
$lang['mailbox']['multiple_bookings'] = 'Multiple bookings';
$lang['mailbox']['kind'] = 'Kind';
$lang['mailbox']['description'] = 'Description';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['resource_name'] = 'Resource name';
$lang['mailbox']['aliases'] = 'Aliases';
$lang['mailbox']['domains'] = 'Domains';
$lang['mailbox']['mailboxes'] = 'Mailboxes';
@ -246,7 +198,6 @@ $lang['mailbox']['mailbox_quota'] = 'Max. size of a mailbox';
$lang['mailbox']['domain_quota'] = 'Quota';
$lang['mailbox']['active'] = 'Active';
$lang['mailbox']['action'] = 'Action';
$lang['mailbox']['ratelimit'] = 'Outgoing rate limit/h';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Domain aliases';
$lang['mailbox']['target_domain'] = 'Target domain';
@ -256,20 +207,15 @@ $lang['mailbox']['fname'] = 'Full name';
$lang['mailbox']['filter_table'] = 'Filter table';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Quota';
$lang['mailbox']['in_use'] = 'In use (%)';
$lang['mailbox']['msg_num'] = 'Message #';
$lang['mailbox']['remove'] = 'Remove';
$lang['mailbox']['edit'] = 'Edit';
$lang['mailbox']['archive'] = 'Archive';
$lang['mailbox']['no_record'] = 'No record for object %s';
$lang['mailbox']['no_record_single'] = 'No record';
$lang['mailbox']['add_domain'] = 'Add domain';
$lang['mailbox']['add_domain_alias'] = 'Add domain alias';
$lang['mailbox']['add_mailbox'] = 'Add mailbox';
$lang['mailbox']['add_resource'] = 'Add resource';
$lang['mailbox']['add_alias'] = 'Add alias';
$lang['mailbox']['add_domain_record_first'] = 'Please add a domain first';
$lang['mailbox']['empty'] = 'No results';
$lang['mailbox']['toggle_all'] = 'Toggle all';
$lang['mailbox']['quick_actions'] = 'Actions';
@ -285,21 +231,6 @@ Each filter will be processed in the described order. Neither a failed script no
Prefilter User scripts Postfilter <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/sieve_after" target="_blank">global sieve postfilter</a>';
$lang['info']['no_action'] = 'No action applicable';
$lang['delete']['title'] = 'Remove object';
$lang['delete']['remove_domain_warning'] = '<b>Warning:</b> You are about to remove the domain <b>%s</b>!';
$lang['delete']['remove_syncjob_warning'] = '<b>Warning:</b> You are about to remove a sync job for user <b>%s</b>!';
$lang['delete']['remove_domainalias_warning'] = '<b>Warning:</b> You are about to remove the domain alias <b>%s</b>!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Warning:</b> You are about to remove the domain administrator <b>%s</b>!';
$lang['delete']['remove_alias_warning'] = '<b>Warning:</b> You are about to remove the alias address <b>%s</b>!';
$lang['delete']['remove_mailbox_warning'] = '<b>Warning:</b> You are about to remove the mailbox <b>%s</b>!';
$lang['delete']['remove_mailbox_details'] = 'The mailbox will be <b>purged permanently</b>!';
$lang['delete']['remove_resource_warning'] = '<b>Warning:</b> You are about to remove the resource <b>%s</b>!';
$lang['delete']['remove_resource_details'] = 'The resource will be <b>purged permanently</b>!';
$lang['delete']['remove_domain_details'] = 'This also removes domain aliases.<br><br><b>A domain must be empty to be removed.</b>';
$lang['delete']['remove_syncjob_details'] = 'Objects from this sync job will not be pulled from the remote server anymore.';
$lang['delete']['remove_alias_details'] = 'Users will no longer be able to receive mail for or send mail from this address.</b>';
$lang['delete']['remove_button'] = 'Remove';
$lang['delete']['previous'] = 'Previous page';
$lang['edit']['syncjob'] = 'Edit sync job';
$lang['edit']['username'] = 'Username';
@ -309,29 +240,25 @@ $lang['edit']['maxage'] = 'Maximum age of messages in days that will be polled f
$lang['edit']['maxbytespersecond'] = 'Max. bytes per second (0 equals to unlimited)';
$lang['edit']['automap'] = 'Try to automap folders ("Sent items", "Sent" => "Sent" etc.)';
$lang['edit']['skipcrossduplicates'] = 'Skip duplicate messages across folders (first come, first serve)';
$lang['add']['maxbytespersecond'] = 'Max. bytes per second (0 equals to unlimited)';
$lang['add']['automap'] = 'Try to automap folders ("Sent items", "Sent" => "Sent" etc.)';
$lang['add']['skipcrossduplicates'] = 'Skip duplicate messages across folders (first come, first serve)';
$lang['edit']['subfolder2'] = 'Sync into subfolder on destination<br><small>(empty = do not use subfolder)</small>';
$lang['edit']['mins_interval'] = 'Interval (min)';
$lang['edit']['exclude'] = 'Exclude objects (regex)';
$lang['edit']['save'] = 'Save changes';
$lang['edit']['archive'] = 'Archive access';
$lang['edit']['max_mailboxes'] = 'Max. possible mailboxes';
$lang['edit']['title'] = 'Edit object';
$lang['edit']['target_address'] = 'Goto address/es <small>(comma-separated)</small>';
$lang['edit']['active'] = 'Active';
$lang['edit']['force_pw_update'] = 'Force password update at next login';
$lang['edit']['force_pw_update_info'] = 'This user will only be able to login to mailcow UI.';
$lang['edit']['target_domain'] = 'Target domain';
$lang['edit']['password'] = 'Password';
$lang['edit']['ratelimit'] = 'Outgoing rate limit/h';
$lang['danger']['ratelimt_less_one'] = 'Outgoing rate limit/h must not be less than 1';
$lang['edit']['password_repeat'] = 'Confirmation password (repeat)';
$lang['edit']['domain_admin'] = 'Edit domain administrator';
$lang['edit']['domain'] = 'Edit domain';
$lang['edit']['alias_domain'] = 'Alias domain';
$lang['edit']['edit_alias_domain'] = 'Edit Alias domain';
$lang['edit']['domains'] = 'Domains';
$lang['edit']['destroy'] = 'Manual data input';
$lang['edit']['alias'] = 'Edit alias';
$lang['edit']['mailbox'] = 'Edit mailbox';
$lang['edit']['description'] = 'Description';
@ -341,22 +268,16 @@ $lang['edit']['domain_quota'] = 'Domain quota';
$lang['edit']['backup_mx_options'] = 'Backup MX options';
$lang['edit']['relay_domain'] = 'Relay domain';
$lang['edit']['relay_all'] = 'Relay all recipients';
$lang['edit']['dkim_signature'] = 'ARC + DKIM signature';
$lang['edit']['dkim_record_info'] = '<small>Please add a TXT record with the given value to your DNS settings.</small>';
$lang['edit']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
$lang['edit']['full_name'] = 'Full name';
$lang['edit']['quota_mb'] = 'Quota (MiB)';
$lang['edit']['sender_acl'] = 'Allow to send as';
$lang['edit']['sender_acl_info'] = 'Aliases cannot be deselected.';
$lang['edit']['dkim_txt_name'] = 'TXT record name:';
$lang['edit']['dkim_txt_value'] = 'TXT record value:';
$lang['edit']['previous'] = 'Previous page';
$lang['edit']['unchanged_if_empty'] = 'If unchanged leave blank';
$lang['edit']['dont_check_sender_acl'] = "Disable sender check for domain %s + alias domains";
$lang['edit']['multiple_bookings'] = 'Multiple bookings';
$lang['edit']['kind'] = 'Kind';
$lang['edit']['resource'] = 'Resource';
$lang['edit']['goto_null'] = 'Silently discard mail';
$lang['add']['syncjob'] = 'Add sync job';
$lang['add']['syncjob_hint'] = 'Be aware that passwords need to be saved plain-text!';
@ -365,8 +286,6 @@ $lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Username';
$lang['add']['enc_method'] = 'Encryption method';
$lang['add']['mins_interval'] = 'Polling interval (minutes)';
$lang['add']['maxage'] = 'Maximum age of messages that will be polled from remote (0 = ignore age)';
$lang['add']['subfolder2'] = 'Sync into subfolder on destination';
$lang['add']['exclude'] = 'Exclude objects (regex)';
$lang['add']['delete2duplicates'] = 'Delete duplicates on destination';
$lang['add']['delete1'] = 'Delete from source when completed';
@ -375,14 +294,11 @@ $lang['edit']['delete2duplicates'] = 'Delete duplicates on destination';
$lang['edit']['delete1'] = 'Delete from source when completed';
$lang['edit']['delete2'] = 'Delete messages on destination that are not on source';
$lang['add']['title'] = 'Add object';
$lang['add']['domain'] = 'Domain';
$lang['add']['active'] = 'Active';
$lang['add']['multiple_bookings'] = 'Multiple bookings';
$lang['add']['save'] = 'Save changes';
$lang['add']['description'] = 'Description';
$lang['add']['max_aliases'] = 'Max. possible aliases';
$lang['add']['resource_name'] = 'Resource name';
$lang['add']['max_mailboxes'] = 'Max. possible mailboxes';
$lang['add']['mailbox_quota_m'] = 'Max. quota per mailbox (MiB)';
$lang['add']['domain_quota_m'] = 'Total domain quota (MiB)';
@ -390,8 +306,6 @@ $lang['add']['backup_mx_options'] = 'Backup MX options';
$lang['add']['relay_all'] = 'Relay all recipients';
$lang['add']['relay_domain'] = 'Relay this domain';
$lang['add']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
$lang['add']['alias'] = 'Alias(es)';
$lang['add']['alias_spf_fail'] = '<b>Note:</b> If your chosen destination address is an external mailbox, the <b>receiving mailserver</b> may reject your message due to an SPF failure.</a>';
$lang['add']['alias_address'] = 'Alias address/es';
$lang['add']['alias_address_info'] = '<small>Full email address/es or @example.com, to catch all messages for a domain (comma-separated). <b>mailcow domains only</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Valid domain names only (comma-separated).</small>';
@ -400,8 +314,6 @@ $lang['add']['target_address_info'] = '<small>Full email address/es (comma-separ
$lang['add']['alias_domain'] = 'Alias domain';
$lang['add']['select'] = 'Please select...';
$lang['add']['target_domain'] = 'Target domain';
$lang['add']['mailbox'] = 'Mailbox';
$lang['add']['resource'] = 'Resource';
$lang['add']['kind'] = 'Kind';
$lang['add']['mailbox_username'] = 'Username (left part of an email address)';
$lang['add']['full_name'] = 'Full name';
@ -409,7 +321,6 @@ $lang['add']['quota_mb'] = 'Quota (MiB)';
$lang['add']['select_domain'] = 'Please select a domain first';
$lang['add']['password'] = 'Password';
$lang['add']['password_repeat'] = 'Confirmation password (repeat)';
$lang['add']['previous'] = 'Previous page';
$lang['add']['restart_sogo_hint'] = 'You will need to restart the SOGo service container after adding a new domain!';
$lang['add']['goto_null'] = 'Silently discard mail';
$lang['add']['validation_success'] = 'Validated successfully';
@ -428,16 +339,9 @@ $lang['mailbox']['inactive'] = 'Inactive';
$lang['edit']['validate_save'] = 'Validate and save';
$lang['login']['title'] = 'Login';
$lang['login']['administration'] = 'Administration';
$lang['login']['administration_details'] = 'Please use your Administrator login to perform administrative tasks.';
$lang['login']['user_settings'] = 'User settings';
$lang['login']['user_settings_details'] = 'Mailbox users can use mailcow UI to change their passwords, create temporary aliases (spam aliases), adjust the spam filter behaviour or import messages from a remote IMAP server.';
$lang['login']['username'] = 'Username';
$lang['login']['password'] = 'Password';
$lang['login']['reset_password'] = 'Reset my password';
$lang['login']['login'] = 'Login';
$lang['login']['previous'] = "Previous page";
$lang['login']['delayed'] = 'Login was delayed by %s seconds.';
$lang['tfa']['tfa'] = "Two-factor authentication";
@ -447,15 +351,11 @@ $lang['tfa']['key_id'] = "An identifier for your YubiKey";
$lang['tfa']['key_id_totp'] = "An identifier for your key";
$lang['tfa']['api_register'] = 'mailcow uses the Yubico Cloud API. Please get an API key for your key <a href="https://upgrade.yubico.com/getapikey/" target="_blank">here</a>';
$lang['tfa']['u2f'] = "U2F authentication";
$lang['tfa']['hotp'] = "HOTP authentication";
$lang['tfa']['none'] = "Deactivate";
$lang['tfa']['delete_tfa'] = "Disable TFA";
$lang['tfa']['disable_tfa'] = "Disable TFA until next successful login";
$lang['tfa']['confirm_tfa'] = "Please confirm your one-time password in the below field";
$lang['tfa']['confirm'] = "Confirm";
$lang['tfa']['otp'] = "One-time password";
$lang['tfa']['totp'] = "Time-based OTP (Google Authenticator etc.)";
$lang['tfa']['trash_login'] = "Trash login";
$lang['tfa']['select'] = "Please select";
$lang['tfa']['waiting_usb_auth'] = "<i>Waiting for USB device...</i><br><br>Please tap the button on your U2F USB device now.";
$lang['tfa']['waiting_usb_register'] = "<i>Waiting for USB device...</i><br><br>Please enter your password above and confirm your U2F registration by tapping the button on your U2F USB device.";
@ -464,7 +364,6 @@ $lang['tfa']['enter_qr_code'] = "Your TOTP code if your device cannot scan QR co
$lang['tfa']['confirm_totp_token'] = "Please confirm your changes by entering the generated token";
$lang['admin']['no_new_rows'] = 'No further rows available';
$lang['admin']['additional_rows'] = ' additional rows were added'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Private key';
$lang['admin']['import'] = 'Import';
$lang['admin']['import_private_key'] = 'Import private key';
@ -476,38 +375,13 @@ $lang['admin']['f2b_netban_ipv4'] = 'IPv4 subnet size to apply ban on (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'IPv6 subnet size to apply ban on (8-128)';
$lang['admin']['f2b_whitelist'] = 'Whitelisted networks/hosts';
$lang['admin']['search_domain_da'] = 'Search domains';
$lang['admin']['restrictions'] = 'Postfix Restrictions';
$lang['admin']['rr'] = 'Postfix Recipient Restrictions';
$lang['admin']['reset_defaults'] = 'Reset to defaults';
$lang['admin']['sr'] = 'Postfix Sender Restrictions';
$lang['admin']['r_inactive'] = 'Inactive restrictions';
$lang['admin']['r_active'] = 'Active restrictions';
$lang['admin']['r_info'] = 'Greyed out/disabled elements on the list of active restrictions are not known as valid restrictions to mailcow and cannot be moved. Unknown restrictions will be set in order of appearance anyway. <br>You can add new elements in <code>inc/vars.local.inc.php</code> to be able to toggle them.';
$lang['admin']['public_folders'] = 'Public Folders';
$lang['admin']['public_folders_text'] = 'A namespace "Public" is created. Below\'s public folder name indicates the name of the first auto-created mailbox within this namespace.';
$lang['admin']['public_folder_name'] = 'Folder name <small>(alphanumeric)</small>';
$lang['admin']['public_folder_enable'] = 'Enable public folder';
$lang['admin']['public_folder_enable_text'] = 'Toggling this option does not delete mail in any public folder.';
$lang['admin']['public_folder_pusf'] = 'Enable per-user seen flag';
$lang['admin']['public_folder_pusf_text'] = 'A "per-user seen flag"-enabled system will not mark a mail as read for User B, when User A has seen it, but User B did not.';
$lang['admin']['privacy'] = 'Privacy';
$lang['admin']['privacy_text'] = 'This option enables a PCRE table to remove "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" and replaces "Received: from" headers with localhost/127.0.0.1.';
$lang['admin']['privacy_anon_mail'] = 'Anonymize outgoing mail';
$lang['admin']['dkim_txt_name'] = 'TXT record name:';
$lang['admin']['dkim_txt_value'] = 'TXT record value:';
$lang['admin']['dkim_key_length'] = 'DKIM key length (bits)';
$lang['admin']['dkim_key_valid'] = 'Key valid';
$lang['admin']['dkim_key_unused'] = 'Key unused';
$lang['admin']['dkim_key_missing'] = 'Key missing';
$lang['admin']['dkim_key_hint'] = 'Selector for DKIM keys is always <code>dkim</code>.';
$lang['admin']['previous'] = 'Previous page';
$lang['admin']['quota_mb'] = 'Quota (MiB):';
$lang['admin']['sender_acl'] = 'Allow to send as:';
$lang['admin']['msg_size'] = 'Message size';
$lang['admin']['msg_size_limit'] = 'Message size limit now';
$lang['admin']['msg_size_limit_details'] = 'Applying a new limit will reload Postfix and the webserver.';
$lang['admin']['maintenance'] = 'Maintenance and Information';
$lang['admin']['sys_info'] = 'System information';
$lang['admin']['dkim_add_key'] = 'Add ARC/DKIM key';
$lang['admin']['dkim_keys'] = 'ARC/DKIM keys';
$lang['admin']['add'] = 'Add';
@ -532,20 +406,12 @@ $lang['admin']['unchanged_if_empty'] = 'If unchanged leave blank';
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Access';
$lang['admin']['invalid_max_msg_size'] = 'Invalid max. message size';
$lang['admin']['site_not_found'] = 'Cannot locate mailcow site configuration';
$lang['admin']['public_folder_empty'] = 'Public folder name must not be empty';
$lang['admin']['set_rr_failed'] = 'Cannot set Postfix restrictions';
$lang['admin']['no_record'] = 'No record';
$lang['admin']['filter_table'] = 'Filter table';
$lang['admin']['empty'] = 'No results';
$lang['admin']['time'] = 'Time';
$lang['admin']['priority'] = 'Priority';
$lang['admin']['message'] = 'Message';
$lang['admin']['refresh'] = 'Refresh';
$lang['admin']['to_top'] = 'Back to top';
$lang['admin']['in_use_by'] = 'In use by';
$lang['admin']['logs'] = 'Logs';
$lang['admin']['forwarding_hosts'] = 'Forwarding Hosts';
$lang['admin']['forwarding_hosts_hint'] = 'Incoming messages are unconditionally accepted from any hosts listed here. These hosts are then not checked against DNSBLs or subjected to greylisting. Spam received from them is never rejected, but optionally it can be filed into the Junk folder. The most common use for this is to specify mail servers on which you have set up a rule that forwards incoming emails to your mailcow server.';
$lang['admin']['forwarding_hosts_add_hint'] = 'You can either specify IPv4/IPv6 addresses, networks in CIDR notation, host names (which will be resolved to IP addresses), or domain names (which will be resolved to IP addresses by querying SPF records or, in their absence, MX records).';
@ -555,7 +421,6 @@ $lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Source';
$lang['admin']['add_forwarding_host'] = 'Add Forwarding Host';
$lang['admin']['add_relayhost'] = 'Add Relayhost';
$lang['delete']['remove_forwardinghost_warning'] = '<b>Warning:</b> You are about to remove the forwarding host <b>%s</b>!';
$lang['success']['forwarding_host_removed'] = "Forwarding host %s has been removed";
$lang['success']['forwarding_host_added'] = "Forwarding host %s has been added";
$lang['success']['relayhost_removed'] = "Relayhost %s has been removed";
@ -568,18 +433,18 @@ $lang['diagnostics']['dns_records_data'] = 'Correct Data';
$lang['diagnostics']['dns_records_status'] = 'Current State';
$lang['diagnostics']['optional'] = 'This record is optional.';
$lang['diagnostics']['cname_from_a'] = 'Value derived from A/AAAA record. This is supported as long as the record points to the correct resource.';
$lang['diagnostics']['allow'] = 'Allow %s';
$lang['admin']['relay_from'] = '"From:" address';
$lang['admin']['relay_run'] = "Run test";
$lang['admin']['api_allow_from'] = "Allow API access from these IPs";
$lang['admin']['api_key'] = "API key";
$lang['admin']['activate_api'] = "Activate API";
$lang['admin']['regen_api_key'] = "Regenerate API key";
$lang['admin']['quarantaine'] = "Quarantine";
$lang['admin']['quarantaine_retention_size'] = "Retentions per mailbox:";
$lang['admin']['quarantaine_max_size'] = "Maximum size in MiB (larger elements are discarded):";
$lang['admin']['quarantaine_exclude_domains'] = "Exclude domains and alias-domains:";
$lang['admin']['quarantine'] = "Quarantine";
$lang['admin']['quarantine_retention_size'] = "Retentions per mailbox:";
$lang['admin']['quarantine_max_size'] = "Maximum size in MiB (larger elements are discarded):";
$lang['admin']['quarantine_exclude_domains'] = "Exclude domains and alias-domains:";
$lang['admin']['ui_texts'] = "UI labels and texts";
$lang['admin']['help_text'] = "Override help text below login mask (HTML allowed)";
@ -602,12 +467,8 @@ $lang['mailbox']['waiting'] = "Waiting";
$lang['mailbox']['status'] = "Status";
$lang['mailbox']['running'] = "Running";
$lang['edit']['tls_policy'] = "Change TLS policy";
$lang['edit']['spam_score'] = "Set a custom spam score";
$lang['edit']['spam_policy'] = "Add or remove items to white-/blacklist";
$lang['edit']['delimiter_action'] = "Change delimiter action";
$lang['edit']['syncjobs'] = "Add or change sync jobs";
$lang['edit']['eas_reset'] = "Reset EAS devices";
$lang['edit']['spam_alias'] = "Create or change time limited alias addresses";
$lang['danger']['img_tmp_missing'] = "Cannot validate image file: Temporary file not found";
@ -620,32 +481,32 @@ $lang['success']['reset_main_logo'] = "Reset to default logo";
$lang['success']['items_released'] = "Selected items were released";
$lang['danger']['imagick_exception'] = "Error: Imagick exception while reading image";
$lang['quarantaine']['quarantaine'] = "Quarantine";
$lang['quarantaine']['qinfo'] = "The quarantine system will save rejected mail to the database, while the sender will <em>not</em> be given the impression of a delivered mail.";
$lang['quarantaine']['release'] = "Release";
$lang['quarantaine']['empty'] = 'No results';
$lang['quarantaine']['toggle_all'] = 'Toggle all';
$lang['quarantaine']['quick_actions'] = 'Actions';
$lang['quarantaine']['remove'] = 'Remove';
$lang['quarantaine']['received'] = "Received";
$lang['quarantaine']['action'] = "Action";
$lang['quarantaine']['rcpt'] = "Recipient";
$lang['quarantaine']['qid'] = "Rspamd QID";
$lang['quarantaine']['sender'] = "Sender";
$lang['quarantaine']['show_item'] = "Show item";
$lang['quarantaine']['check_hash'] = "Search file hash @ VT";
$lang['quarantaine']['qitem'] = "Quarantine item";
$lang['quarantaine']['subj'] = "Subject";
$lang['quarantaine']['text_plain_content'] = "Content (text/plain)";
$lang['quarantaine']['text_from_html_content'] = "Content (converted html)";
$lang['quarantaine']['atts'] = "Attachments";
$lang['quarantine']['quarantine'] = "Quarantine";
$lang['quarantine']['qinfo'] = "The quarantine system will save rejected mail to the database, while the sender will <em>not</em> be given the impression of a delivered mail.";
$lang['quarantine']['release'] = "Release";
$lang['quarantine']['empty'] = 'No results';
$lang['quarantine']['toggle_all'] = 'Toggle all';
$lang['quarantine']['quick_actions'] = 'Actions';
$lang['quarantine']['remove'] = 'Remove';
$lang['quarantine']['received'] = "Received";
$lang['quarantine']['action'] = "Action";
$lang['quarantine']['rcpt'] = "Recipient";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Sender";
$lang['quarantine']['show_item'] = "Show item";
$lang['quarantine']['check_hash'] = "Search file hash @ VT";
$lang['quarantine']['qitem'] = "Quarantine item";
$lang['quarantine']['subj'] = "Subject";
$lang['quarantine']['text_plain_content'] = "Content (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Content (converted html)";
$lang['quarantine']['atts'] = "Attachments";
$lang['header']['quarantaine'] = "Quarantine";
$lang['header']['quarantine'] = "Quarantine";
$lang['header']['debug'] = "Debug";
$lang['quarantaine']['release_body'] = "We have attached your message as eml file to this message.";
$lang['quarantine']['release_body'] = "We have attached your message as eml file to this message.";
$lang['danger']['release_send_failed'] = "Message could not be released: %s";
$lang['quarantaine']['release_subject'] = "Potentially damaging quarantine item %s";
$lang['quarantine']['release_subject'] = "Potentially damaging quarantine item %s";
$lang['mailbox']['bcc_map_type'] = "BCC type";
$lang['mailbox']['bcc_type'] = "BCC type";
@ -659,5 +520,11 @@ $lang['mailbox']['bcc_maps'] = "BCC maps";
$lang['mailbox']['bcc_to_sender'] = "Switch to sender map type";
$lang['mailbox']['bcc_to_rcpt'] = "Switch to recipient map type";
$lang['mailbox']['add_bcc_entry'] = "Add BCC map";
$lang['mailbox']['bcc_info'] = "A recipient map type entry is used, when the local destination acts as recipient of a mail. Sender maps conform to the same principle.<br/>
$lang['mailbox']['bcc_info'] = "BCC maps are used to silently forward copies of all messages to another address. A recipient map type entry is used, when the local destination acts as recipient of a mail. Sender maps conform to the same principle.<br/>
The local destination will not be informed about a failed delivery.";
$lang['mailbox']['address_rewriting'] = 'Address rewriting';
$lang['mailbox']['recipient_maps'] = 'Recipient maps';
$lang['mailbox']['recipient_map_info'] = 'Recipient maps are used to replace the destination address on a message before it is delivered.';
$lang['mailbox']['recipient_map_old'] = 'Original recipient';
$lang['mailbox']['recipient_map_new'] = 'New recipient';
$lang['mailbox']['add_recipient_map_entry'] = 'Add recipient map';

View File

@ -8,12 +8,7 @@ $lang['header']['restart_sogo'] = 'Reiniciar SOGo';
$lang['footer']['restart_sogo'] = 'Reiniciar SOGo';
$lang['footer']['restart_now'] = 'Reiniciar ahora';
$lang['footer']['restart_sogo_info'] = 'Algunas tareas, por ejemplo agregar un dominio, requieren que reinicies SOGo para detectar cambios hechos en la UI de mailcow.<br><br><b>Importante:</b> Un reinicio sencillo puede tardar un poco en completarse, por favor espere a que termine.';
$lang['dkim']['confirm'] = "¿Estás Seguro?";
$lang['danger']['dkim_not_found'] = "Registro DKIM no encontrado";
$lang['danger']['dkim_remove_failed'] = "No se puede eliminar el registro DKIM seleccionado";
$lang['danger']['dkim_add_failed'] = "No se puede agregar el registro DKIM dado";
$lang['danger']['dkim_domain_or_sel_invalid'] = "Dominio DKIM ó selector inválido";
$lang['danger']['dkim_key_length_invalid'] = "Longitud de la llave DKIM inválida";
$lang['success']['dkim_removed'] = "Registro DKIM removido";
$lang['success']['dkim_added'] = "Registro DKIM guardado";
$lang['danger']['access_denied'] = "Acceso denegado o datos del formulario inválidos";
@ -25,8 +20,6 @@ $lang['danger']['alias_empty'] = "Dirección alias no debe estar vacía";
$lang['danger']['goto_empty'] = "Dirección \"goto\" no debe estar vacía";
$lang['danger']['policy_list_from_exists'] = "Un registro con ese nombre ya existe";
$lang['danger']['policy_list_from_invalid'] = "El registro tiene formato inválido";
$lang['danger']['whitelist_exists'] = "Ya existe un registro con ese nombre en la lista blanca";
$lang['danger']['whitelist_from_invalid'] = "Formato inválido para el registro de lista blanca";
$lang['danger']['alias_invalid'] = "Dirección alias inválida";
$lang['danger']['goto_invalid'] = "Dirección \"goto\" inválida";
$lang['danger']['alias_domain_invalid'] = "El dominio alias es inválido";
@ -38,26 +31,19 @@ $lang['danger']['aliasd_targetd_identical'] = "El dominio alias no debe ser igua
$lang['success']['alias_added'] = "Dirección/es alias ha/han sidgo agregada";
$lang['success']['alias_modified'] = "Cambios al alias guardados";
$lang['success']['mailbox_modified'] = "Cambios al buzón %s guardados";
$lang['success']['msg_size_saved'] = "Limite del mensaje establecido";
$lang['danger']['aliasd_not_found'] = "Dominio alias no encontrado";
$lang['danger']['targetd_not_found'] = "Dominio destino no encontrado";
$lang['danger']['aliasd_exists'] = "Dominio alias ya existe";
$lang['success']['aliasd_added'] = "Agregado dominio alias %s";
$lang['success']['aliasd_modified'] = "Cambios al dominio alias %s guardados";
$lang['success']['domain_modified'] = "Cambios al dominio %s guardados";
$lang['success']['domain_admin_modified'] = "Cambios al administrador del dominio %s guardados";
$lang['success']['domain_admin_added'] = "Administrador del dominio %s agregado";
$lang['success']['changes_general'] = 'Cambios guardados';
$lang['success']['admin_modified'] = "Cambios al administrador guardados";
$lang['danger']['exit_code_not_null'] = "Error: Código de salida es %d";
$lang['danger']['mailbox_not_available'] = "Buzón no disponible";
$lang['danger']['username_invalid'] = "Nombre de usuario no se puede utilizar";
$lang['danger']['password_mismatch'] = "Confirmación de contraseña no es identica";
$lang['danger']['password_complexity'] = "La contraseña no cumple con los requisitos";
$lang['danger']['password_empty'] = "El campo de la contraseña no debe estar vacío";
$lang['danger']['login_failed'] = "Inicio de sesión fallido";
$lang['danger']['mailbox_invalid'] = "Nombre de buzón inválido";
$lang['danger']['mailbox_invalid_suggest'] = 'El nombre del buzón es inválido, ¿pretendías escribir "%s"?';
$lang['info']['fetchmail_planned'] = "La tarea para buscar correos se ha planeado. Por favor verifica el proceso más tarde.";
$lang['danger']['fetchmail_source_empty'] = "Por favor define una carpeta fuente";
$lang['danger']['fetchmail_dest_empty'] = "Por favor define una carpeta destino";
@ -81,14 +67,10 @@ $lang['danger']['mailboxes_in_use'] = "Máx. de buzones debe ser mayor o igual a
$lang['danger']['aliases_in_use'] = "Máx. de alias debe ser mayor o igual a %d";
$lang['danger']['sender_acl_invalid'] = "Valor del remitente ACL inválido";
$lang['danger']['domain_not_empty'] = "No se puede eliminar un dominio que no esté vacío";
$lang['warning']['spam_alias_temp_error'] = "Error temporal: No se puede agregar ese \"spam alias\", inténtelo más tarde.";
$lang['danger']['spam_alias_max_exceeded'] = "Máx. direcciones \"spam alias\" permitidas excedido";
$lang['danger']['fetchmail_active'] = "Un proceso ya se está ejecutando, por favor espera a que termine.";
$lang['danger']['validity_missing'] = 'Por favor asigna un periodo de validez';
$lang['user']['off'] = "Apagado";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Configuración del usuario';
$lang['user']['mailbox_settings'] = 'Configuración del buzón';
$lang['user']['mailbox_details'] = 'Detalles del buzón';
$lang['user']['change_password'] = 'Cambiar contraseña';
$lang['user']['new_password'] = 'Nueva contraseña:';
@ -96,10 +78,8 @@ $lang['user']['save_changes'] = 'Guardar cambios';
$lang['user']['password_now'] = 'Contraseña actual (confirmar cambios):';
$lang['user']['new_password_repeat'] = 'Confirmación de contraseña (repetir):';
$lang['user']['new_password_description'] = 'Requisitos: longitud de 6 caracteres, letras y números.';
$lang['user']['did_you_know'] = '<b>¿Sabías qué?</b> Puedes utilizar etiquetas en tu dirección email ("me+<b>privat</b>@example.com") para mover mensajes a una carpeta automáticamente (ejemplo: "privat").';
$lang['user']['spam_aliases'] = 'Alias de email temporales';
$lang['user']['alias'] = 'Alias';
$lang['user']['aliases'] = 'Alias';
$lang['user']['is_catch_all'] = 'Atrapa-Todo para el/los dominio/s';
$lang['user']['aliases_also_send_as'] = 'También permitido para mandarse como';
$lang['user']['aliases_send_as_all'] = 'No verifiques el acceso del remitente para los siguientes dominios';
@ -138,8 +118,6 @@ $lang['user']['tls_enforce_in'] = 'Aplicar TLS entrante';
$lang['user']['tls_enforce_out'] = 'Aplicar TLS saliente';
$lang['user']['no_record'] = 'Sin registro';
$lang['user']['misc_settings'] = 'Otras configuraciones de usuario';
$lang['user']['misc_delete_profile'] = 'Otras configuraciones de usuario';
$lang['user']['tag_handling'] = 'Establecer manejo para el correo etiquetado';
$lang['user']['tag_in_subfolder'] = 'En subcarpeta';
@ -149,36 +127,16 @@ $lang['user']['tag_help_explain'] = 'En subcarpeta: una nueva subcarpeta llamada
En asunto: los nombres de las etiquetas serán añadidos al asunto de los correos, ejemplo: "[Facebook] Mis Noticias".';
$lang['user']['tag_help_example'] = 'Ejemplo de una dirección email etiquetada: mi<b>+Facebook</b>@ejemplo.org';
$lang['start']['dashboard'] = '%s - panel';
$lang['start']['start_rc'] = 'Abrir Roundcube';
$lang['start']['start_sogo'] = 'Abrir SOGo';
$lang['start']['mailcow_apps_detail'] = 'Utiliza una aplicación de mailcow para acceder a tus correos, calendario, contactos y más.';
$lang['start']['mailcow_panel'] = 'Iniciar mailcow UI';
$lang['start']['mailcow_panel_description'] = 'mailcow UI está disponible para administradores y usuarios de buzón.';
$lang['start']['mailcow_panel_detail'] = '<b>Administradores del dominio</b> crean, modifican o eliminan buzones y alias, cambia dominios y lee información más detallada sobre sus dominios asignados<br>
<b>Usuarios de buzón</b> son capaces de crear alias de tiempo limitado (spam alias), cambiar su contraseña y la configuración del filtro de spam.';
$lang['start']['recommended_config'] = 'Configuración recomendada (sin ActiveSync)';
$lang['start']['imap_smtp_server'] = 'IMAP- y SMTP datos del servidor';
$lang['start']['imap_smtp_server_description'] = 'Para la mejor experiencia recomendamos utilizar <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
$lang['start']['imap_smtp_server_badge'] = 'Leer/Escribir correos';
$lang['start']['imap_smtp_server_auth_info'] = 'Por favor utiliza tu dirección de correo completa y el mecanismo de autenticación PLANO.<br>
Tus datos para iniciar sesión serán encriptados por la encriptación obligatoria del servidor';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'Filtro de correos';
$lang['start']['managesieve_description'] = 'Por favor utiliza <b>Mozilla Thunderbird</b> con la <a style="text-decoration:none" target="_blank" href="%s"><b>extensión nightly sieve</b></a>.<br>Inicia Thunderbird, abre la configuración de complementos y suelta el archivo xpi descargado en la ventana abierta.<br>El servidor es <b>%s</b>, utiliza el puerto <b>4190</b> si se te pregunta. Los datos para iniciar sesión coinciden con los datos de tu correo.';
$lang['start']['service'] = 'Servicio';
$lang['start']['encryption'] = 'Método de encriptación';
$lang['start']['help'] = 'Mostrar/Ocultar panel de ayuda';
$lang['start']['hostname'] = 'Hostname';
$lang['start']['port'] = 'Port';
$lang['start']['footer'] = '';
$lang['header']['mailcow_settings'] = 'Configuracion';
$lang['header']['administration'] = 'Administración';
$lang['header']['mailboxes'] = 'Buzones';
$lang['header']['user_settings'] = 'Configuraciones de usuario';
$lang['header']['login'] = 'Inicio de sesión';
$lang['header']['logged_in_as_logout'] = 'Sesión iniciada como <b>%s</b> (cerrar sesión)';
$lang['header']['locale'] = 'Idioma';
$lang['mailbox']['domain'] = 'Dominio';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['aliases'] = 'Alias';
@ -188,7 +146,6 @@ $lang['mailbox']['mailbox_quota'] = 'Tamaño máx. de cuota';
$lang['mailbox']['domain_quota'] = 'Cuota';
$lang['mailbox']['active'] = 'Activo';
$lang['mailbox']['action'] = 'Acción';
$lang['mailbox']['ratelimit'] = 'Límite de la tarifa saliente/h';
$lang['mailbox']['backup_mx'] = 'Respaldar MX';
$lang['mailbox']['domain_aliases'] = 'Alias de dominio';
$lang['mailbox']['target_domain'] = 'Dominio destino';
@ -198,13 +155,10 @@ $lang['mailbox']['fname'] = 'Nombre completo';
$lang['mailbox']['filter_table'] = 'Filtrar tabla';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Cuota';
$lang['mailbox']['in_use'] = 'En uso (%)';
$lang['mailbox']['msg_num'] = 'Mensaje #';
$lang['mailbox']['remove'] = 'Eliminar';
$lang['mailbox']['edit'] = 'Editar';
$lang['mailbox']['archive'] = 'Archivar';
$lang['mailbox']['no_record'] = 'Sin registro';
$lang['mailbox']['add_domain'] = 'Agregar dominio';
$lang['mailbox']['add_domain_alias'] = 'Agregar alias de dominio';
$lang['mailbox']['add_mailbox'] = 'Agregar buzón';
@ -212,35 +166,19 @@ $lang['mailbox']['add_alias'] = 'Agregar alias';
$lang['info']['no_action'] = 'No hay acción aplicable';
$lang['delete']['title'] = 'Eliminar objeto';
$lang['delete']['remove_domain_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el dominio <b>%s</b>!';
$lang['delete']['remove_domainalias_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el alias de dominio <b>%s</b>!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el administrador de dominio <b>%s</b>!';
$lang['delete']['remove_alias_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar la dirección alias <b>%s</b>!';
$lang['delete']['remove_mailbox_warning'] = '<b>Advertencia:</b> ¡Estás a punto de eliminar el buzón <b>%s</b>!';
$lang['delete']['remove_mailbox_details'] = 'El buzón será <b>purgado permanentemente</b>!';
$lang['delete']['remove_domain_details'] = 'Esto también eliminará alias de dominio.<br><br><b>Un dominio debe estar vacío para poder ser eliminado.</b>';
$lang['delete']['remove_alias_details'] = 'Los usuarios ya no serán capaces de recibir correos o enviar correos desde esta dirección.</b>';
$lang['delete']['remove_button'] = 'Eliminar';
$lang['delete']['previous'] = 'Página anterior';
$lang['edit']['save'] = 'Guardar cambios';
$lang['edit']['archive'] = 'Acceso a archivos';
$lang['edit']['max_mailboxes'] = 'Máx. buzones posibles:';
$lang['edit']['title'] = 'Editas objeto';
$lang['edit']['target_address'] = 'Dirección/es goto <small>(separadas por coma)</small>:';
$lang['edit']['active'] = 'Activo';
$lang['edit']['target_domain'] = 'Dominio destino:';
$lang['edit']['password'] = 'Contraseña:';
$lang['edit']['ratelimit'] = 'Límite de la tarifa saliente/h:';
$lang['danger']['ratelimt_less_one'] = 'El límite de la tarifa saliente/h no puede ser menos que 1';
$lang['edit']['password_repeat'] = 'Confirmación de contraseña (repetir):';
$lang['edit']['domain_admin'] = 'Editar administrador del dominio';
$lang['edit']['domain'] = 'Editar dominio';
$lang['edit']['alias_domain'] = 'Alias de dominio';
$lang['edit']['edit_alias_domain'] = 'Editar alias de dominio';
$lang['edit']['domains'] = 'Dominios';
$lang['edit']['destroy'] = 'Entrada manual de datos';
$lang['edit']['alias'] = 'Editar alias';
$lang['edit']['mailbox'] = 'Editar buzón';
$lang['edit']['description'] = 'Descripción:';
@ -250,24 +188,17 @@ $lang['edit']['domain_quota'] = 'Cuota de dominio:';
$lang['edit']['backup_mx_options'] = 'Opciones del respaldo MX:';
$lang['edit']['relay_domain'] = 'Dominio de retransmisión';
$lang['edit']['relay_all'] = 'Retransmitir todos los recipientes';
$lang['edit']['dkim_signature'] = 'Firma ARC + DKIM:';
$lang['edit']['dkim_record_info'] = '<small>Por favor agrega un registro TXT con el siguiente valor a tu configuración DNS.</small>';
$lang['edit']['relay_all_info'] = '<small>Si eliges <b>no</b> retransmitir a todos los recipientes, necesitas agregar un buzón "blind"("ciego") por cada recipiente que debe ser retransmitido.</small>';
$lang['edit']['full_name'] = 'Nombre completo';
$lang['edit']['full_name'] = 'Nombre completo';
$lang['edit']['quota_mb'] = 'Cuota (MiB)';
$lang['edit']['sender_acl'] = 'Permitir envío como:';
$lang['edit']['sender_acl_info'] = 'Los alias no pueden deseleccionarse.';
$lang['edit']['dkim_txt_name'] = 'Nombre del registro TXT:';
$lang['edit']['dkim_txt_value'] = 'Valor del registro TXT:';
$lang['edit']['previous'] = 'Página anterior';
$lang['edit']['unchanged_if_empty'] = 'Si no hay cambios dejalo en blanco';
$lang['edit']['dont_check_sender_acl'] = 'No verifiques remitente para el dominio %s';
$lang['add']['title'] = 'Agregar objeto';
$lang['add']['domain'] = 'Dominio';
$lang['add']['active'] = 'Activo';
$lang['add']['save'] = 'Guardar cambios';
$lang['add']['description'] = 'Descripción:';
$lang['add']['max_aliases'] = 'Máx. alias posibles:';
$lang['add']['max_mailboxes'] = 'Máx. buzones posibles:';
@ -277,8 +208,6 @@ $lang['add']['backup_mx_options'] = 'Opciones del respaldo MX:';
$lang['add']['relay_all'] = 'Retransmitir todos los recipientes';
$lang['add']['relay_domain'] = 'Retransmitir este dominio';
$lang['add']['relay_all_info'] = '<small>Si eliges <b>no</b> retransmitir a todos los recipientes, necesitas agregar un buzón "blind"("ciego") por cada recipiente que debe ser retransmitido.</small>';
$lang['add']['alias'] = 'Alias';
$lang['add']['alias_spf_fail'] = '<b>Nota:</b> Si tu dirección destino está en un buzón externo, el <b>servidor de correo que recibe</b> puede rechazar tu mensaje por una falla SPF.</a>';
$lang['add']['alias_address'] = 'Dirección/es alias:';
$lang['add']['alias_address_info'] = '<small>Dirección/es de correo completa/s ó @ejemplo.com, para atrapar todos los mensajes para un dominio (separado por coma). <b>Dominios mailcow solamente</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Nombres de dominio válidos solamente (separado por coma).</small>';
@ -287,26 +216,17 @@ $lang['add']['target_address_info'] = '<small>Dirección/es de correo completa/s
$lang['add']['alias_domain'] = 'Dominio alias';
$lang['add']['select'] = 'Por favor selecciona...';
$lang['add']['target_domain'] = 'Dominio destino:';
$lang['add']['mailbox'] = 'Buzón';
$lang['add']['mailbox_username'] = 'Nombre de usuario (parte izquierda de una dirección de correo):';
$lang['add']['full_name'] = 'Nombre completo:';
$lang['add']['quota_mb'] = 'Cuota (MiB):';
$lang['add']['select_domain'] = 'Por favor elige un dominio primero';
$lang['add']['password'] = 'Constraseña:';
$lang['add']['password_repeat'] = 'Confirmación de contraseña (repetir):';
$lang['add']['previous'] = 'Página anterior';
$lang['add']['restart_sogo_hint'] = '¡Necesitas reiniciar el contenedor del servicio SOGo antes de agregar un nuevo dominio!';
$lang['add']['port'] = 'Port';
$lang['login']['title'] = 'Inicio de sesión';
$lang['login']['administration'] = 'Administración';
$lang['login']['administration_details'] = 'Por favor utiliza tu inicio de sesión de Administrador para realizar tareas administrativas.';
$lang['login']['user_settings'] = 'Configuración de usuario';
$lang['login']['user_settings_details'] = 'Usuarios de buzón pueden utilizar mailcow UI para cambiar sus contraseñas, crear alias temporales (alias de spam), ajustar el comportamiento del filtro de spam ó importar mensajes desde un servidor IMAP remoto.';
$lang['login']['username'] = 'Nombre de usuario';
$lang['login']['password'] = 'Contraseña';
$lang['login']['reset_password'] = 'Reiniciar mi contraseña';
$lang['login']['login'] = 'Inicio de sesión';
$lang['login']['previous'] = "Página anterior";
$lang['login']['delayed'] = 'El inicio de sesión ha sido retrasado %s segundos.';
$lang['login']['tfa'] = "Autenticación de dos factores";
@ -316,34 +236,10 @@ $lang['login']['otp'] = "Contraseña de un solo uso";
$lang['login']['trash_login'] = "Inicio de sesión basura";
$lang['admin']['search_domain_da'] = 'Buscar dominios';
$lang['admin']['restrictions'] = 'Restricciones Postfix';
$lang['admin']['rr'] = 'Restricciones Postfix para recipientes';
$lang['admin']['reset_defaults'] = 'Restablecer los valores predeterminados';
$lang['admin']['sr'] = 'Restricciones Postfix para remitentes';
$lang['admin']['r_inactive'] = 'Restricciones inactivas';
$lang['admin']['r_active'] = 'Restricciones activas';
$lang['admin']['r_info'] = 'Elementos en gris/deshabilitados en la lista de restricciones activas no son reconocidas como restricciones válidas para mailcow y no pueden ser movidas. Restricciones desconocidas serán establecidas en el orden de aparicion de todas maneras. <br>Puedes agregar nuevos elementos en <code>inc/vars.local.inc.php</code> para ser capaz de habilitarlas.';
$lang['admin']['public_folders'] = 'Carpetas Públicas';
$lang['admin']['public_folders_text'] = 'Un espacio de nombres "Public" (Público) será creado. Debajo del nombre de la carpeta pública se indica el nombre del primer buzón creado automáticamente dentro de este espacio de nombres';
$lang['admin']['public_folder_name'] = 'Nombre de la carpeta <small>(alfanumérico)</small>';
$lang['admin']['public_folder_enable'] = 'Habilitar carpeta pública';
$lang['admin']['public_folder_enable_text'] = 'Activar ésta opción no elimina correos en cualquier otra carpeta pública.';
$lang['admin']['public_folder_pusf'] = 'Habilitar el indicador visto por usuario';
$lang['admin']['public_folder_pusf_text'] = 'Un sistema habilitado por indicador "por usuario visto" no marcará un correo como leído para el Usuario B, cuando el Usuario A lo haya visto, pero el Usuario B no.';
$lang['admin']['privacy'] = 'Privacidad';
$lang['admin']['privacy_text'] = 'Ésta opción activa una tabla PCRE para remover "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" y remplaza las cabezeras "Received: from" con localhost/127.0.0.1.';
$lang['admin']['privacy_anon_mail'] = 'Anonimizar correo saliente';
$lang['admin']['dkim_txt_name'] = 'Nombre del registro TXT:';
$lang['admin']['dkim_txt_value'] = 'Valor del registro TXT:';
$lang['admin']['dkim_key_length'] = 'Longitud de la llave DKIM (bits)';
$lang['admin']['previous'] = 'Página anterior';
$lang['admin']['quota_mb'] = 'Cuota (MiB):';
$lang['admin']['sender_acl'] = 'Permitir envío como:';
$lang['admin']['msg_size'] = 'Tamaño del mensaje';
$lang['admin']['msg_size_limit'] = 'Límite del tamaño del mensaje ahora';
$lang['admin']['msg_size_limit_details'] = 'Aplicando un nuebo límite reiniciará Postfix y el servidor web.';
$lang['admin']['maintenance'] = 'Mantenimiento e Información';
$lang['admin']['sys_info'] = 'información del sistema';
$lang['admin']['dkim_add_key'] = 'Agregar registro ARC/DKIM';
$lang['admin']['dkim_keys'] = 'Registros ARC/DKIM';
$lang['admin']['add'] = 'Agregar';
@ -365,8 +261,4 @@ $lang['admin']['unchanged_if_empty'] = 'Si no hay cambios dejalo en blanco';
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Acceso';
$lang['admin']['invalid_max_msg_size'] = 'Tamaño máx. del mensaje no válido';
$lang['admin']['site_not_found'] = 'No se puede localizar la configuración del sitio de mailcow';
$lang['admin']['public_folder_empty'] = 'El nombre de la carpeta pública no debe estar vacío';
$lang['admin']['set_rr_failed'] = 'No se pueden establecer las restricciones de Postfix';
$lang['admin']['no_record'] = 'Sin registro';

View File

@ -14,16 +14,10 @@ $lang['footer']['delete_these_items'] = "Merci de confirmer les changements sur
$lang['footer']['delete_now'] = "Effacer maintenant";
$lang['footer']['cancel'] = "Annuler";
$lang['dkim']['confirm'] = "Êtes-vous sûr ?";
$lang['danger']['dkim_not_found'] = "Clé DKIM non trouvée";
$lang['danger']['dkim_remove_failed'] = "Impossible de retirer la clé DKIM sélectionnée";
$lang['danger']['dkim_add_failed'] = "Impossible d'ajouter la clé DKIM donnée";
$lang['danger']['dkim_domain_or_sel_invalid'] = "Domaine ou sélecteur DKIM invalide";
$lang['danger']['dkim_key_length_invalid'] = "Longueur de clé DKIM invalide";
$lang['success']['dkim_removed'] = "La clé DKIM %s a été retirée";
$lang['success']['dkim_added'] = "La clé DKIM a été enregistrée";
$lang['danger']['access_denied'] = "Accès refusé ou données de formulaire invalide";
$lang['danger']['whitelist_from_invalid'] = "L'enregistrement liste blanche a un format non valide";
$lang['danger']['domain_invalid'] = "Le nom de domaine n'est pas valide";
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Le quota max. dépasse la limite de quota du domaine";
$lang['danger']['object_is_not_numeric'] = "La valeur %s n'est pas numérique";
@ -34,7 +28,6 @@ $lang['danger']['last_key'] = "La dernière clé ne peut pas être effacée";
$lang['danger']['goto_empty'] = "L'adresse de destination ne peut pas être vide";
$lang['danger']['policy_list_from_exists'] = "Une entrée avec ce nom existe";
$lang['danger']['policy_list_from_invalid'] = "L'entrée a un format non valide";
$lang['danger']['whitelist_exists'] = "Une entrée liste-blanche existe avec ce nom";
$lang['danger']['alias_invalid'] = "L'adresse alias est non valide";
$lang['danger']['goto_invalid'] = "L'adresse de destination est non valide";
$lang['danger']['alias_domain_invalid'] = "Le domaine alias est non valide";
@ -51,18 +44,12 @@ $lang['success']['mailbox_modified'] = "Les changement sur la boîte %s ont ét
$lang['success']['resource_modified'] = "Les changement sur la boîte %s ont été enregistrés";
$lang['success']['object_modified'] = "Les changement sur l'objet %s ont été enregistrés";
$lang['success']['f2b_modified'] = "Les changement sur les paramètres Fail2ban ont été enregistrés";
$lang['success']['msg_size_saved'] = "La limite de taille de message a été définie";
$lang['danger']['aliasd_not_found'] = "Domaine alias non trouvé";
$lang['danger']['targetd_not_found'] = "Domaine cible non trouvé";
$lang['danger']['aliasd_exists'] = "Le domaine alias existe déjà";
$lang['success']['aliasd_added'] = "Domaine alias %s ajouté";
$lang['success']['domain_modified'] = "Les changement sur le domaine %s ont été enregistrés";
$lang['success']['domain_admin_modified'] = "Les changement sur l'administrateur de domaine %s ont été enregistrés";
$lang['success']['domain_admin_added'] = "L'administrateur de domaine %s a été ajouté";
$lang['success']['changes_general'] = "Les changements ont été enregistrés";
$lang['success']['admin_modified'] = "Les changements sur l'administrateur ont été enregistrés";
$lang['danger']['exit_code_not_null'] = "Erreur : Le code de sortie était %d";
$lang['danger']['mailbox_not_available'] = "Boîte non disponible";
$lang['danger']['username_invalid'] = "L'identifiant ne peut pas être utilisé";
$lang['danger']['password_mismatch'] = "La confirmation du mot de passe n'est pas identique";
$lang['danger']['password_complexity'] = "Le mot de passe ne respecte pas les règles";
@ -71,7 +58,6 @@ $lang['danger']['login_failed'] = "La connexion a échoué";
$lang['danger']['mailbox_invalid'] = "Le nom de la boîte n'est pas valide";
$lang['danger']['description_invalid'] = "La description de la ressource n'est pas valide";
$lang['danger']['resource_invalid'] = "Le nom de la ressource n'est pas valide";
$lang['danger']['mailbox_invalid_suggest'] = "Le nom de la boîte n'est pas valide. Vouliez-vous taper \"%s\" ?";
$lang['danger']['is_alias'] = "%s est déjà enregistré comme adresse alias";
$lang['danger']['is_alias_or_mailbox'] = "%s est déjà enregistré comme un alias ou une boîte";
$lang['danger']['is_spam_alias'] = "%s est déjà enregistré comme une adresse alias de pourriel";
@ -96,16 +82,11 @@ $lang['danger']['mailboxes_in_use'] = "Boîtes max. doit être doit être supér
$lang['danger']['aliases_in_use'] = "Alias max. doit être supérieur ou égal à %d";
$lang['danger']['sender_acl_invalid'] = "La valeur ACL de l'expéditeur n'est pas valide";
$lang['danger']['domain_not_empty'] = "Impossible de retiré un domaine non-vide";
$lang['warning']['spam_alias_temp_error'] = "Erreur temporaire : impossible d'ajouter des alias de spam, merci d'essayer plus tard.";
$lang['danger']['spam_alias_max_exceeded'] = "Nombre max d'adresses pour les alias de spam dépassé";
$lang['danger']['validity_missing'] = "Merci d'attribuer une période de validité";
$lang['user']['on'] = "On";
$lang['user']['off'] = "Off";
$lang['user']['messages'] = "messages"; // "123 messages"
$lang['user']['in_use'] = "Utilisé";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = "Paramètres utilisateur";
$lang['user']['mailbox_settings'] = "Paramètres des boîtes";
$lang['user']['mailbox_details'] = "Détails des boîtes";
$lang['user']['change_password'] = "Changement de mot de passe";
$lang['user']['client_configuration'] = "Montrer les guides de configuration pour les programmes de courriels et les smartphones";
@ -114,11 +95,8 @@ $lang['user']['save_changes'] = "Sauvegarder les changements";
$lang['user']['password_now'] = "Mot de passe actuel (confirmation des changements)";
$lang['user']['new_password_repeat'] = "Confirmation du mot de passe (répéter)";
$lang['user']['new_password_description'] = "Critère : 6 caractères de long, lettres et nombres.";
$lang['user']['did_you_know'] = "<b>Le saviez-vous ?</b> Vous pouvez utiliser des étiquettes dans vos adresses de courriel (\"moi+<b>prive</b>@exemple.com\") afin de déplacer les messages automatiquement vers un dossier (exemple: \"prive\").";
$lang['user']['spam_aliases'] = "Alias de courriel temporaires";
$lang['user']['alias'] = "Alias";
$lang['user']['aliases'] = "Alias";
$lang['user']['domain_aliases'] = "Adresses d'alias de domaine";
$lang['user']['is_catch_all'] = "Attrape-tout pour domaine(s)";
$lang['user']['aliases_also_send_as'] = "Peut également envoyer en tant qu'utilisateur";
$lang['user']['aliases_send_as_all'] = "Ne pas vérifier les accès d'expéditeur pour le(s) domaine(s) suivant(s) et leurs alias de domaine";
@ -128,7 +106,6 @@ $lang['user']['alias_valid_until'] = "Valide jusqu'à";
$lang['user']['alias_remove_all'] = "Retirer tous les alias";
$lang['user']['alias_time_left'] = "Temps restant";
$lang['user']['alias_full_date'] = "d/m/Y, H:i:s T";
$lang['user']['syncjob_full_date'] = "d/m/Y, H:i:s T";
$lang['user']['alias_select_validity'] = "Période de validité";
$lang['user']['sync_jobs'] = "Travaux de synchronisation";
$lang['user']['hour'] = "Heure";
@ -161,8 +138,6 @@ $lang['user']['tls_enforce_in'] = "Imposer le TLS entrant";
$lang['user']['tls_enforce_out'] = "Imposer le TLS sortant";
$lang['user']['no_record'] = "Aucun enregistrement";
$lang['user']['misc_settings'] = "Autre paramètres de profil";
$lang['user']['misc_delete_profile'] = "Autre paramètres de profil";
$lang['user']['tag_handling'] = "Définir la gestion des courriel étiquetés";
$lang['user']['tag_in_subfolder'] = "Dans un sous-dossier";
@ -176,7 +151,6 @@ $lang['user']['eas_reset_help'] = "Dans beaucoup de cas, une réinitialisation d
$lang['user']['encryption'] = "Chiffrement";
$lang['user']['username'] = "Nom d'utilisateur";
$lang['user']['password'] = "Mot de passe";
$lang['user']['last_run'] = "Dernière exécution";
$lang['user']['excludes'] = "Exclu";
$lang['user']['interval'] = "Intervalle";
@ -184,45 +158,22 @@ $lang['user']['active'] = "Actif";
$lang['user']['action'] = "Action";
$lang['user']['edit'] = "Éditer";
$lang['user']['remove'] = "Retirer";
$lang['user']['delete_now'] = "Retirer maintenant";
$lang['user']['create_syncjob'] = "Création d'une nouvelle tache de synchronisation";
$lang['start']['dashboard'] = "%s - tableau de bord";
$lang['start']['start_rc'] = "Ouvrir Roundcube";
$lang['start']['start_sogo'] = "Ouvrir SOGo";
$lang['start']['mailcow_apps_detail'] = "Utiliser l'application mailcow pour accéder à vos courriels, calendriers, contacts et bien plus.";
$lang['start']['mailcow_panel'] = "Démarrer l'interface mailcow";
$lang['start']['mailcow_panel_description'] = "L'interface mailcow est disponible pour les administrateurs et les utilisateurs de boîtes de courriels.";
$lang['start']['mailcow_panel_detail'] = "Les <b>administrateurs de domaine</b> créent, modifient ou effacent les boîtes de courriel et les alias. Ils modifient les domaines et ont accès aux informations à propos des domaines qui leur sont assignés.<br>Les <b>utilisateurs de boîtes</b> peuvent créer des alias limités dans le temps (alias de pourriel), changer leur mot de passe et leurs préférences de filtre à pourriel.";
$lang['start']['recommended_config'] = "Configuration recommandée (sans ActiveSync)";
$lang['start']['imap_smtp_server'] = "Donnée des serveurs IMAP et SMTP";
$lang['start']['imap_smtp_server_description'] = "Pour une expérience optimale, nous vous recommandons d'utiliser <a href=\"%s\" target=\"_blank\"><b>Mozilla Thunderbird</b></a>.";
$lang['start']['imap_smtp_server_badge'] = "Lecture/Écriture des courriels";
$lang['start']['imap_smtp_server_auth_info'] = "Merci d'utiliser votre adresse de courriel complète couplée au mécanisme dauthentification \"PLAIN\".<br>Vos données de connexion seront chiffrées par le chiffrement imposé coté serveur.";
$lang['start']['managesieve'] = "ManageSieve";
$lang['start']['managesieve_badge'] = "Filtre de courriel";
$lang['start']['managesieve_description'] = "Merci d'utiliser <b>Mozilla Thunderbird</b> avec l'extension <a style=\"text-decoration:none\" target=\"_blank\" href=\"%s\"><b>nightly sieve</b></a>.<br>Démarrez Thunderbird, ouvrez les paramètres des extensions et déposez le fichier xpi fraîchement téléchargé dans la fenêtre ouverte.<br>Le nom du serveur est <b>%s</b>, utilisez le port <b>4190</b> si on vous le demande. Les données de connexion correspondent à celles de votre courriel.";
$lang['start']['service'] = "Service";
$lang['start']['encryption'] = "Méthode de chiffrement";
$lang['start']['help'] = "Montrer/Cacher le panneau d'aide";
$lang['start']['hostname'] = "Nom d'hôte";
$lang['start']['port'] = "Port";
$lang['start']['footer'] = "";
$lang['header']['mailcow_settings'] = "Configuration";
$lang['header']['administration'] = "Administration";
$lang['header']['mailboxes'] = "Boîtes de courriel";
$lang['header']['user_settings'] = "Paramètres utilisateur";
$lang['header']['login'] = "Identifiant";
$lang['header']['logged_in_as_logout'] = "Connecté en tant que <b>%s</b> (déconnexion)";
$lang['header']['logged_in_as_logout_dual'] = "Connecté en tant que <b>%s <span class=\"text-info\">[%s]</span></b>";
$lang['header']['locale'] = "Langue";
$lang['mailbox']['domain'] = "Domaine";
$lang['mailbox']['spam_aliases'] = "Alias temp.";
$lang['mailbox']['multiple_bookings'] = "Réservations multiples";
$lang['mailbox']['kind'] = "Type";
$lang['mailbox']['description'] = "Description";
$lang['mailbox']['alias'] = "Alias";
$lang['mailbox']['resource_name'] = "Nom des ressources";
$lang['mailbox']['aliases'] = "Alias";
$lang['mailbox']['domains'] = "Domaines";
$lang['mailbox']['mailboxes'] = "Boîtes";
@ -231,7 +182,6 @@ $lang['mailbox']['mailbox_quota'] = "Taille max. d'une boîte";
$lang['mailbox']['domain_quota'] = "Quota";
$lang['mailbox']['active'] = "Actif";
$lang['mailbox']['action'] = "Action";
$lang['mailbox']['ratelimit'] = "Limite de vitesse en sortie/h";
$lang['mailbox']['backup_mx'] = "MX de secours";
$lang['mailbox']['domain_aliases'] = "Alias de domaine";
$lang['mailbox']['target_domain'] = "Domaine cible";
@ -241,20 +191,15 @@ $lang['mailbox']['fname'] = "Nom complet";
$lang['mailbox']['filter_table'] = "Table de filtrage";
$lang['mailbox']['yes'] = "&#10004;";
$lang['mailbox']['no'] = "&#10008;";
$lang['mailbox']['quota'] = "Quota";
$lang['mailbox']['in_use'] = "Utilisation (%)";
$lang['mailbox']['msg_num'] = "Message";
$lang['mailbox']['remove'] = "Retirer";
$lang['mailbox']['edit'] = "Éditer";
$lang['mailbox']['archive'] = "Archiver";
$lang['mailbox']['no_record'] = "Aucun enregistrement pour l'objet %s";
$lang['mailbox']['no_record_single'] = "Aucun enregistrement";
$lang['mailbox']['add_domain'] = "Ajouter un domaine";
$lang['mailbox']['add_domain_alias'] = "Ajouter un alias de domaine";
$lang['mailbox']['add_mailbox'] = "Ajouter une boîte de courriel";
$lang['mailbox']['add_resource'] = "Ajouter une ressource";
$lang['mailbox']['add_alias'] = "Ajouter un alias";
$lang['mailbox']['add_domain_record_first'] = "Merci de d'abord ajouter un domaine";
$lang['mailbox']['empty'] = "Aucun résultat";
$lang['mailbox']['toggle_all'] = "Basculer tout";
$lang['mailbox']['quick_actions'] = "Actions";
@ -266,21 +211,6 @@ $lang['mailbox']['last_run'] = "Dernière exécution";
$lang['info']['no_action'] = "Aucune action applicable";
$lang['delete']['title'] = "Retirer un objet";
$lang['delete']['remove_domain_warning'] = "<b>Attention :</b> vous êtes sur le point de retirer le domaine <b>%s</b> !";
$lang['delete']['remove_syncjob_warning'] = "<b>Attention :</b> vous êtes sur le point de retirer une tâche de synchronisation pour l'utilisateur <b>%s</b> !";
$lang['delete']['remove_domainalias_warning'] = "<b>Attention :</b> vous êtes sur le point de retirer l'alias de domaine <b>%s</b> !";
$lang['delete']['remove_domainadmin_warning'] = "<b>Attention :</b> vous êtes sur le point de retirer l'administrateur de domaine <b>%s</b> !";
$lang['delete']['remove_alias_warning'] = "<b>Attention :</b> vous êtes sur le point de retirer l'alias d'adresse <b>%s</b> !";
$lang['delete']['remove_mailbox_warning'] = "<b>Attention :</b> vous êtes sur le point de retirer la boîte de courriel <b>%s</b> !";
$lang['delete']['remove_mailbox_details'] = "La boîte de courriel sera <b>supprimée définitivement</b> !";
$lang['delete']['remove_resource_warning'] = "<b>Attention :</b> vous êtes sur le point de retirer la ressource <b>%s</b> !";
$lang['delete']['remove_resource_details'] = "La ressource sera <b>supprimée définitivement</b> !";
$lang['delete']['remove_domain_details'] = "Cela retire également les alias de domaine.<br><br><b>Un domaine doit être vide pour être retiré.</b>";
$lang['delete']['remove_syncjob_details'] = "Les objets de cette tâche de synchronisation ne seront plus récupérés depuis le serveur distant.";
$lang['delete']['remove_alias_details'] = "Les utilisateurs ne pourront plus recevoir ni envoyer de courriels depuis cette adresse.</b>";
$lang['delete']['remove_button'] = "Retirer";
$lang['delete']['previous'] = "Page précédente";
$lang['edit']['syncjob'] = "Éditer la tâche de synchronisation";
$lang['edit']['save'] = "Enregistrer les changements";
@ -291,22 +221,17 @@ $lang['edit']['maxage'] = "Age maximum en jours des messages qui seront récupé
$lang['edit']['subfolder2'] = "Sous-dossier où synchroniser à destination<br><small>(vide = ne pas utiliser de sous-dossier)</small>";
$lang['edit']['mins_interval'] = "Intervalle (min)";
$lang['edit']['exclude'] = "Objets à exclure (expression régulière)";
$lang['edit']['archive'] = "Accès aux archives";
$lang['edit']['max_mailboxes'] = "Nombre max. de boîtes";
$lang['edit']['title'] = "Éditer l'objet";
$lang['edit']['target_address'] = "Adresse(s) de destination <small>(séparés par des virgules)</small>";
$lang['edit']['active'] = "Activer";
$lang['edit']['target_domain'] = "Domaine cible";
$lang['edit']['password'] = "Mot de passe";
$lang['edit']['ratelimit'] = "Limite de vitesse sortante/h";
$lang['danger']['ratelimt_less_one'] = "La limite de vitesse sortante/h ne peut pas être inférieure à 1";
$lang['edit']['password_repeat'] = "Confirmation du mot de passe (répéter)";
$lang['edit']['domain_admin'] = "Éditer l'administrateur de domaine";
$lang['edit']['domain'] = "Éditer le domaine";
$lang['edit']['alias_domain'] = "Alias de domaine";
$lang['edit']['edit_alias_domain'] = "Éditer l'alias de domaine";
$lang['edit']['domains'] = "Domaines";
$lang['edit']['destroy'] = "Entrée des donnés manuelle";
$lang['edit']['alias'] = "Éditer l'alias";
$lang['edit']['mailbox'] = "Éditer la boîte";
$lang['edit']['description'] = "Description";
@ -316,22 +241,16 @@ $lang['edit']['domain_quota'] = "Quota de domaine";
$lang['edit']['backup_mx_options'] = "Option de MX secondaire";
$lang['edit']['relay_domain'] = "Domaine de relais";
$lang['edit']['relay_all'] = "Relayer tous les destinataires";
$lang['edit']['dkim_signature'] = "Signature ARC + DKIM";
$lang['edit']['dkim_record_info'] = "<small>Merci d'ajouter une entrée TXT avec la valeur donnée à votre configuration DNS.</small>";
$lang['edit']['relay_all_info'] = "<small>Si vous choisissez de ne <b>pas</b> relayer tous les destinataires, vous devrez ajouter une boîte \"aveugle\" pour chaque destinataire qui doit être relayé.</small>";
$lang['edit']['full_name'] = "Nom complet";
$lang['edit']['quota_mb'] = "Quota (Mo)";
$lang['edit']['sender_acl'] = "Autorisé à envoyé en tant que";
$lang['edit']['sender_acl_info'] = "Les alias ne peuvent pas être désélectionnés.";
$lang['edit']['dkim_txt_name'] = "Nom de l'enregistrement TXT :";
$lang['edit']['dkim_txt_value'] = "Valeur de l'enregistrement TXT :";
$lang['edit']['previous'] = "Page précédente";
$lang['edit']['unchanged_if_empty'] = "Si aucun changement, laisser vide";
$lang['edit']['dont_check_sender_acl'] = "Désactiver la vérification de l'émetteur pour le domaine %s + les domaines alias";
$lang['edit']['multiple_bookings'] = "Inscriptions multiples";
$lang['edit']['kind'] = "Type";
$lang['edit']['resource'] = "Resource";
$lang['edit']['goto_null'] = "Ignorer silencieusement le courriel";
$lang['add']['syncjob'] = "Ajouter une tâche de synchronisation";
$lang['add']['syncjob_hint'] = "Soyez prévenus que les mots de passe doivent être sauvés en clair !";
@ -340,8 +259,6 @@ $lang['add']['port'] = "Port";
$lang['add']['username'] = "Identifiant";
$lang['add']['enc_method'] = "Méthode de chiffrement";
$lang['add']['mins_interval'] = "Période de relève (minutes)";
$lang['add']['maxage'] = "Age maximum des messages qui seront relevés depuis le distant (0 = ignorer l'age)";
$lang['add']['subfolder2'] = "Synchronisation dans un sous-dossier à destination";
$lang['add']['exclude'] = "Exclure des objets (expression régulière)";
$lang['add']['delete2duplicates'] = "Supprimer les doubles à destination";
$lang['add']['delete1'] = "Supprimer à la source une fois terminé";
@ -350,14 +267,11 @@ $lang['edit']['delete2duplicates'] = "Supprimer les doubles à destination";
$lang['edit']['delete1'] = "Supprimer à la source une fois terminé";
$lang['edit']['delete2'] = "Supprimer les messages à destination qui ne sont pas présent à la source";
$lang['add']['title'] = "Ajouter un objet";
$lang['add']['domain'] = "Domaine";
$lang['add']['active'] = "Actif";
$lang['add']['multiple_bookings'] = "Inscriptions multiples";
$lang['add']['save'] = "Sauvegarder les changements";
$lang['add']['description'] = "Description";
$lang['add']['max_aliases'] = "Nombre max. des alias";
$lang['add']['resource_name'] = "Nom de la ressource";
$lang['add']['max_mailboxes'] = "Nombre max. de boîtes";
$lang['add']['mailbox_quota_m'] = "Quota max par boîte (Mo)";
$lang['add']['domain_quota_m'] = "Quota total du domaine (Mo)";
@ -365,8 +279,6 @@ $lang['add']['backup_mx_options'] = "Options de MX secondaire";
$lang['add']['relay_all'] = "Relayer tous les destinataires";
$lang['add']['relay_domain'] = "Relayer ce domaine";
$lang['add']['relay_all_info'] = "<small>Si vous choisissez de ne <b>pas</b> relayer tous les destinataires, vous devrez ajouter une boîte \"aveugle\" pour chaque destinataire qui doit être relayé.</small>";
$lang['add']['alias'] = "Alias";
$lang['add']['alias_spf_fail'] = "<b>Note :</b> Si l'adresse de destination choisie est une boîte externe, la <b>serveur de réception</b> peut rejeter votre message pour cause d'échec SPF.</a>";
$lang['add']['alias_address'] = "Adresse(s) alias";
$lang['add']['alias_address_info'] = "<small>Adresse de courriel complète ou @exemple.com pour recevoir tous les messages d'un domaine (séparés par de virgules). <b>Domaines mailcow seulement</b></small>";
$lang['add']['alias_domain_info'] = "<small>Nom de domaine valide seulement (séparés par des virgules).</small>";
@ -375,8 +287,6 @@ $lang['add']['target_address_info'] = "<small>Adresse(s) de courriel complète(s
$lang['add']['alias_domain'] = "Alias de domaine";
$lang['add']['select'] = "Merci de sélectionner...";
$lang['add']['target_domain'] = "Domaine cible";
$lang['add']['mailbox'] = "Boîte de courriel";
$lang['add']['resource'] = "Ressource";
$lang['add']['kind'] = "Type";
$lang['add']['mailbox_username'] = "Identifiant (côté gauche d'une adresse de courriel)";
$lang['add']['full_name'] = "Nom complet";
@ -384,20 +294,12 @@ $lang['add']['quota_mb'] = "Quota (Mo)";
$lang['add']['select_domain'] = "Merci de d'abord sélectionner un domaine";
$lang['add']['password'] = "Mot de passe";
$lang['add']['password_repeat'] = "Confirmation du mot de passe (répéter)";
$lang['add']['previous'] = "Page précédente";
$lang['add']['restart_sogo_hint'] = "Vous devrez redémarrer le container du service SOGo après l'ajout d'un nouveau domaine !";
$lang['add']['goto_null'] = "Ignorer silencieusement le courriel";
$lang['login']['title'] = "Connexion";
$lang['login']['administration'] = "Administration";
$lang['login']['administration_details'] = "Merci d'utiliser votre identifiant d'administrateur pour effectuer les taches administratives.";
$lang['login']['user_settings'] = "Paramètres utilisateur";
$lang['login']['user_settings_details'] = "Les propriétaires de boîte de courriel peuvent utiliser l'interface mailcow pour changer leur mot de passe, créer des alias temporaires (alias de pourriel), ajuster le comportement du filtre à pourriel ou importer des messages depuis un serveur IMAP distant.";
$lang['login']['username'] = "Identifiant";
$lang['login']['password'] = "Mot de passe";
$lang['login']['reset_password'] = "Réinitialiser mon mot de passe";
$lang['login']['login'] = "Connexion";
$lang['login']['previous'] = "Page précédente";
$lang['login']['delayed'] = "La connexion a été différée de %s seconds.";
$lang['tfa']['tfa'] = "Authentification à double facteur";
@ -407,15 +309,11 @@ $lang['tfa']['key_id'] = "Un identifiant pour votre YubiKey";
$lang['tfa']['key_id_totp'] = "Un identifiant pour votre clé";
$lang['tfa']['api_register'] = "mailcow utilise Yubico Cloud API. Merci d'obtenir un clé API pour votre clé <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">ici</a>";
$lang['tfa']['u2f'] = "Authentification U2F";
$lang['tfa']['hotp'] = "Authentification HOTP";
$lang['tfa']['totp'] = "Mot de passe à usage unique basé sur le temps (Google Authenticator etc.)";
$lang['tfa']['none'] = "Désactivé";
$lang['tfa']['delete_tfa'] = "Invalider TFA";
$lang['tfa']['disable_tfa'] = "Désactiver TFA jusqu'à la prochaine connexion réussie";
$lang['tfa']['confirm_tfa'] = "Merci de confirmer votre mot de passe à usage unique dans le champ ci-dessous";
$lang['tfa']['confirm'] = "Confirmer";
$lang['tfa']['otp'] = "Mot de passe à usage unique";
$lang['tfa']['trash_login'] = "Trash login";
$lang['tfa']['select'] = "Merci de sélectionner";
$lang['tfa']['waiting_usb_auth'] = "<i>En attente du périphérique USB...</i><br><br>Merci de presser le bouton de votre périphérique U2F USB maintenant.";
$lang['tfa']['waiting_usb_register'] = "<i>En attente du périphérique USB...</i><br><br>Merci de confirmer votre mot de passe au dessus et de valider votre enregistrement U2F en appuyant sur le bouton de votre périphérique U2F USB.";
@ -432,39 +330,14 @@ $lang['admin']['f2b_max_attempts'] = "Nb max de tentatives";
$lang['admin']['f2b_retry_window'] = "Fenêtre de nouvel essai (s) pour le nb max de tentatives";
$lang['admin']['f2b_whitelist'] = "Réseau/hôtes en liste blanche";
$lang['admin']['search_domain_da'] = "Chercher des domaines";
$lang['admin']['restrictions'] = "Restrictions Postfix";
$lang['admin']['rr'] = "Restrictions Postfix sur les destinataires";
$lang['admin']['sr'] = "Restriction Postfix sur les expéditeurs";
$lang['admin']['reset_defaults'] = "Réinitialiser aux valeurs par défaut";
$lang['admin']['r_inactive'] = "Restrictions inactives";
$lang['admin']['r_active'] = "Restrictions actives";
$lang['admin']['r_info'] = "Les éléments grisé/invalidés dans la liste des restrictions active ne sont pas reconnus comme des restrictions valide par mailcow et ne peuvent pas être déplacés. Les restriction inconnues seront enregistrées dans leur ordre d'apparence.<br>Vous pouvez ajouter de nouveaux élément dans <code>inc/vars.local.inc.php</code> pour pouvoir les sélectionner.";
$lang['admin']['public_folders'] = "Dossiers publiques";
$lang['admin']['public_folders_text'] = "Un espace de nommage \"Public\" a été crée. Le nom du dossier publique ci-dessous indique le nom de la première boîte crée automatiquement à l'intérieur de cet espace de nommage.";
$lang['admin']['public_folder_name'] = "Nom de dossier <small>(alphanumérique)</small>";
$lang['admin']['public_folder_enable'] = "Activer le dossier publique";
$lang['admin']['public_folder_enable_text'] = "Changer cette option ne supprime aucun courriel dans les dossiers publiques.";
$lang['admin']['public_folder_pusf'] = "Activer le statut vu par utilisateur";
$lang['admin']['public_folder_pusf_text'] = "Lorsque le \"statut vu par utilisateur\" est activé, le système ne marquera pas un courriel comme lu pour l'utilisateur B si l'utilisateur l'a lu mais pas B.";
$lang['admin']['privacy'] = "Vie privée";
$lang['admin']['privacy_text'] = "Cette option active une table PCRE pour retirer \"User-Agent\", \"X-Enigmail\", \"X-Mailer\", \"X-Originating-IP\" et remplace les en-têtes \"Received: from\" avec localhost/127.0.0.1.";
$lang['admin']['privacy_anon_mail'] = "Anonymiser les courriels sortants";
$lang['admin']['dkim_txt_name'] = "Nom de l'enregistrement TXT :";
$lang['admin']['dkim_txt_value'] = "Valeur de l'enregistrement TXT :";
$lang['admin']['dkim_key_length'] = "Longueur de la clé DKIM (bits)";
$lang['admin']['dkim_key_valid'] = "Clé valide";
$lang['admin']['dkim_key_unused'] = "Clé non utilisée";
$lang['admin']['dkim_key_missing'] = "Clé manquante";
$lang['admin']['dkim_key_hint'] = "Le sélecteur des clés DKIM est toujours <code>dkim</code>.";
$lang['admin']['previous'] = "Page précédente";
$lang['admin']['quota_mb'] = "Quota (Mo) :";
$lang['admin']['sender_acl'] = "Autoriser à envoyer en tant que :";
$lang['admin']['msg_size'] = "Taille du message";
$lang['admin']['msg_size_limit'] = "Taille de message limite actuelle";
$lang['admin']['msg_size_limit_details'] = "Appliquer une nouvelle limite rechargera Postfix et le serveur web.";
$lang['admin']['save'] = "Enregistrer les changements";
$lang['admin']['maintenance'] = "Maintenance et Information";
$lang['admin']['sys_info'] = "Information système";
$lang['admin']['dkim_add_key'] = "Ajouter un clé ARC/DKIM";
$lang['admin']['dkim_keys'] = "Clés ARC/DKIM";
$lang['admin']['add'] = "Ajouter";
@ -486,20 +359,12 @@ $lang['admin']['unchanged_if_empty'] = "Si aucun changement, laisser vide";
$lang['admin']['yes'] = "&#10004;";
$lang['admin']['no'] = "&#10008;";
$lang['admin']['access'] = "Accès";
$lang['admin']['invalid_max_msg_size'] = "Mauvaise taille de message max.";
$lang['admin']['site_not_found'] = "Impossible de trouver la configuration du site mailcow";
$lang['admin']['public_folder_empty'] = "Le nom du dossier publique ne peut pas être vide";
$lang['admin']['set_rr_failed'] = "Impossible de définir les restrictions Postfix";
$lang['admin']['no_record'] = "Aucun enregistrement";
$lang['admin']['filter_table'] = "Table de filtrage";
$lang['admin']['empty'] = "Aucun résultat";
$lang['admin']['time'] = "Temps";
$lang['admin']['priority'] = "Priorité";
$lang['admin']['message'] = "Message";
$lang['admin']['refresh'] = "Rafraîchir";
$lang['admin']['to_top'] = "Retour en haut";
$lang['admin']['in_use_by'] = "Utilisé par";
$lang['admin']['logs'] = "Journaux";
$lang['admin']['forwarding_hosts'] = "Hôtes de réexpédition";
$lang['admin']['forwarding_hosts_hint'] = "Tous les messages entrant sont acceptés sans condition depuis les hôtes listés ici. Ces hôtes ne sont pas validés par DNSBLs ou sujets à un greylisting. Les pourriels reçus de ces hôtes ne sont jamais rejetés, mais occasionnellement, ils peuvent se retrouver dans le dossier Junk. L'usage le plus courant est pour les serveurs de courriels qui ont été configurés pour réexpédier leurs courriels entrant vers votre serveur mailcow.";
$lang['admin']['forwarding_hosts_add_hint'] = "Vous pouvez aussi bien indiquer des adresses IPv4/IPv6, des réseaux en notation CIDR, des noms d'hôtes (qui se seront convertit en adresses IP), ou des noms de domaine (qui seront convertit en adresses IP par une requête SPF ou, en son absence, l'enregistrement MX).";
@ -509,7 +374,6 @@ $lang['admin']['host'] = "Hôte";
$lang['admin']['source'] = "Source";
$lang['admin']['add_forwarding_host'] = "Ajouter un hôte de réexpédition";
$lang['admin']['add_relayhost'] = "Ajouter un hôte de relai";
$lang['delete']['remove_forwardinghost_warning'] = "<b>Attention :</b>vous êtes sur le point de retirer l'hôte de réexpédition <b>%s</b> !";
$lang['success']['forwarding_host_removed'] = "L'hôte de réexpédition %s a été retiré";
$lang['success']['forwarding_host_added'] = "L'hôte de réexpédition %s a été ajouté";
$lang['success']['relayhost_removed'] = "L'hôte de relai %s a été retiré";
@ -529,10 +393,6 @@ $lang['admin']['add_row'] = "Ajouter une ligne";
$lang['admin']['reset_default'] = "Remise à zéro par défaut";
$lang['admin']['merged_vars_hint'] = "Les lignes grisées ont été importées depuis <code>vars.(local.)inc.php</code> et ne peuvent pas être modifiées.";
$lang['edit']['tls_policy'] = "Changer la politique TLS";
$lang['edit']['spam_score'] = "Définir un score personnalisé de pourriel";
$lang['edit']['spam_policy'] = "Ajouter ou retirer des éléments des listes blanches/noires";
$lang['edit']['delimiter_action'] = "Modifier l'action des séparateurs";
$lang['edit']['syncjobs'] = "Ajouter ou modifier des tâches de synchronisation";
$lang['edit']['eas_reset'] = "Ré-initialisation des appareils EAS";
$lang['edit']['spam_alias'] = "Créer ou changer les adresses alias à temps limité";

View File

@ -15,16 +15,10 @@ $lang['footer']['delete_these_items'] = 'Sicuro di voler eliminare gli oggetti s
$lang['footer']['delete_now'] = 'Elimina ora';
$lang['footer']['cancel'] = 'Annulla';
$lang['dkim']['confirm'] = "Sicuro?";
$lang['danger']['dkim_not_found'] = "Chiave DKIM non trovata";
$lang['danger']['dkim_remove_failed'] = "Impossibile rimuovere la chiave DKIM selezionata";
$lang['danger']['dkim_add_failed'] = "Impossibile aggiungere la chiave DKIM selezionata";
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domain or selector invalid";
$lang['danger']['dkim_key_length_invalid'] = "Lunghezza della chiave DKIM non valida";
$lang['success']['dkim_removed'] = "La chiave DKIM è stata rimossa";
$lang['success']['dkim_added'] = "La chiave DKIM è stata salvata";
$lang['danger']['access_denied'] = "Accesso negato o form di login non corretto";
$lang['danger']['whitelist_from_invalid'] = "Elemento Whitelist non valido";
$lang['danger']['domain_invalid'] = "Il nome di dominio non è valido";
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "La quota massima eccede la quota di dominio";
$lang['danger']['object_is_not_numeric'] = "Il valore %s non è numerico";
@ -34,8 +28,6 @@ $lang['danger']['last_key'] = "L'ultima chiave non può essere rimossa";
$lang['danger']['goto_empty'] = "L'indirizzo di destinazione non può restare vuoto";
$lang['danger']['policy_list_from_exists'] = "Un elemento con lo stesso nome è già presente";
$lang['danger']['policy_list_from_invalid'] = "L'elemento ha un formato non valido";
$lang['danger']['whitelist_exists'] = "Un elemento è già presente con lo stesso nome tra i whitelist";
$lang['danger']['whitelist_from_invalid'] = "L'elemento Whitelist ha un formato non valido";
$lang['danger']['alias_invalid'] = "L'indirizzo alias non è valido";
$lang['danger']['goto_invalid'] = "Goto address non è valido";
$lang['danger']['alias_domain_invalid'] = "Alias domain non è valido";
@ -51,19 +43,13 @@ $lang['success']['aliasd_modified'] = "I cambiamenti all'alias domain è stato s
$lang['success']['mailbox_modified'] = "I cambiamenti alla mailbox %s è stato salvato";
$lang['success']['resource_modified'] = "I cambiamenti alla mailbox %s è stato salvato";
$lang['success']['object_modified'] = "I cambiamenti all'oggetto %s è stato salvato";
$lang['success']['msg_size_saved'] = "Il limite di dimensione messaggio è stato impostato";
$lang['danger']['aliasd_not_found'] = "l'alias del dominio non è stato trovato";
$lang['danger']['targetd_not_found'] = "Il target del dominio non è stato trovato";
$lang['danger']['aliasd_exists'] = "L'Alias di dominio esiste già";
$lang['success']['aliasd_added'] = 'Aggiunto l\'alias per il dominio %s';
$lang['success']['aliasd_modified'] = "I cambiamenti a alias domain %s è stato salvato";
$lang['success']['domain_modified'] = "I cambiamenti a domain %s è stato salvato";
$lang['success']['domain_admin_modified'] = "I cambiamenti a domain administrator %s è stato salvato";
$lang['success']['domain_admin_added'] = "L'amministratore di dominio %s è stato aggiunto";
$lang['success']['changes_general'] = 'I cambiamenti sono stati salvati';
$lang['success']['admin_modified'] = "I cambiamenti a administrator è stato salvato";
$lang['danger']['exit_code_not_null'] = 'Errore: Il codice di uscita è %d';
$lang['danger']['mailbox_not_available'] = "Casella non disponibile";
$lang['danger']['username_invalid'] = "Username non può essere utilizzato";
$lang['danger']['password_mismatch'] = "La password di conferma non corrisponde";
$lang['danger']['password_complexity'] = "La password non soddisfa le regole di sicurezza";
@ -72,7 +58,6 @@ $lang['danger']['login_failed'] = "Login fallito";
$lang['danger']['mailbox_invalid'] = "Il nome della casella non è valido";
$lang['danger']['description_invalid'] = 'La descrizione della risorsa non è valido';
$lang['danger']['resource_invalid'] = "Il nome della risorsa non è valido";
$lang['danger']['mailbox_invalid_suggest'] = 'Il nome della casella non è valido, avevi in mente "%s"?';
$lang['danger']['is_alias'] = "%s è già presente come alias";
$lang['danger']['is_alias_or_mailbox'] = "%s è già presente come alias o casella";
$lang['danger']['is_spam_alias'] = "%s è già presente come indirizzo spam alias";
@ -97,16 +82,11 @@ $lang['danger']['mailboxes_in_use'] = "La quota della casella massima deve esser
$lang['danger']['aliases_in_use'] = "Il numero massimo di alias must deve essere maggiore o uguale a %d";
$lang['danger']['sender_acl_invalid'] = "Il valore di Sender ACL non è valido";
$lang['danger']['domain_not_empty'] = "Non posso rimuovere domini in non vuoti";
$lang['warning']['spam_alias_temp_error'] = "Errore temporaneo: Impossibile aggiungere alias di spam, provare più tardi.";
$lang['danger']['spam_alias_max_exceeded'] = "Il numero massimo di indirizzi come spam alias superato";
$lang['danger']['validity_missing'] = 'Assegnare un periodo di validità';
$lang['user']['on'] = "On";
$lang['user']['off'] = "Off";
$lang['user']['messages'] = "messaggi"; // "123 messages"
$lang['user']['in_use'] = "Utilizzati";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Impostazioni utente';
$lang['user']['mailbox_settings'] = 'Impostazioni casella';
$lang['user']['mailbox_details'] = 'Dettagli casella';
$lang['user']['change_password'] = 'Cambia password';
$lang['user']['new_password'] = 'Nuova password';
@ -114,11 +94,8 @@ $lang['user']['save_changes'] = 'Salva modifiche';
$lang['user']['password_now'] = 'Password attuale (conferma modifiche)';
$lang['user']['new_password_repeat'] = 'Conferma password (ripeti)';
$lang['user']['new_password_description'] = 'Requisiti: Lunghezza di 6 caratteri, lettere e numeri.';
$lang['user']['did_you_know'] = '<b>Lo sapevi?</b> Puoi usare i tags nell\'indirizzo di posta ("me+<b>privat</b>@example.com") per muovere i messaggi automaticamente nelle cartelle (esempio: "privat").';
$lang['user']['spam_aliases'] = 'Indirizzi mail temporanei';
$lang['user']['alias'] = 'Alias';
$lang['user']['aliases'] = 'Aliases';
$lang['user']['domain_aliases'] = 'Indirizzi alias del dominio';
$lang['user']['is_catch_all'] = 'Catch-all per il dominio/i';
$lang['user']['aliases_also_send_as'] = 'Può inviare come utente';
$lang['user']['aliases_send_as_all'] = 'Do not check sender access for the following domain(s) and its alias domains';
@ -128,7 +105,6 @@ $lang['user']['alias_valid_until'] = 'Valido fino a';
$lang['user']['alias_remove_all'] = 'Rimuovi tutti gli alias';
$lang['user']['alias_time_left'] = 'Tempo rimanente';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Periodo di validità';
$lang['user']['sync_jobs'] = 'Processi di sync';
$lang['user']['hour'] = 'Ora';
@ -161,8 +137,6 @@ $lang['user']['tls_enforce_in'] = 'Imponi TLS in ingresso';
$lang['user']['tls_enforce_out'] = 'Imponi TLS in uscita';
$lang['user']['no_record'] = 'Nessun elemento';
$lang['user']['misc_settings'] = 'Impostazioni di altri profili';
$lang['user']['misc_delete_profile'] = 'Impostazioni di altri profili';
$lang['user']['tag_handling'] = 'Imposta le gestione della mail evidenziate';
$lang['user']['tag_in_subfolder'] = 'Nella sotto cartella';
@ -177,7 +151,6 @@ $lang['user']['eas_reset_help'] = 'In molti casi un ripristino risolve i problem
$lang['user']['encryption'] = 'Crittografia';
$lang['user']['username'] = 'Nome utente';
$lang['user']['password'] = 'Password';
$lang['user']['last_run'] = 'Ultima esecuzione';
$lang['user']['excludes'] = 'Esclude';
$lang['user']['interval'] = 'Intervallo';
@ -185,47 +158,25 @@ $lang['user']['active'] = 'Attiva';
$lang['user']['action'] = 'Azione';
$lang['user']['edit'] = 'Modifica';
$lang['user']['remove'] = 'Elimina';
$lang['user']['delete_now'] = 'Elimina ora';
$lang['user']['create_syncjob'] = 'Crea un azione di sync';
$lang['start']['dashboard'] = '%s - dashboard';
$lang['start']['start_rc'] = 'Apri Roundcube';
$lang['start']['start_sogo'] = 'Apri SOGo';
$lang['start']['mailcow_apps_detail'] = 'Usa l\'app mailcow per accedere alla posta, calendari, contatti ed altro.';
$lang['start']['mailcow_panel'] = 'Avvia UI mailcow';
$lang['start']['mailcow_panel_description'] = 'L\'UI di mailcow per gli amministratori e gli utenti di caselle.';
$lang['start']['mailcow_panel_detail'] = '<b>Amministratori di dominio</b> crea, modifica o cancella caselle e alias, cambia i domini e informazioni relative ai domini associati.<br />
<b>Utenti di caselle</b> possono creare degli alias temporanei (spam aliases), cambiare la loro password e le impostazioni relative ai filtri spam.';
$lang['start']['recommended_config'] = 'Configurazioni consigliate (senza ActiveSync)';
$lang['start']['imap_smtp_server'] = 'Dati server IMAP e SMTP';
$lang['start']['imap_smtp_server_description'] = 'Per l\'esperienza migliore utilizzare <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
$lang['start']['imap_smtp_server_badge'] = 'Leggi e scrivi le email';
$lang['start']['imap_smtp_server_auth_info'] = 'Please use your full email address and the PLAIN authentication mechanism.<br />
Your login data will be encrypted by the server-side mandatory encryption.';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'Filtri email';
$lang['start']['managesieve_description'] = 'Please use <b>Mozilla Thunderbird</b> with the <a style="text-decoration:none" target="_blank" href="%s"><b>nightly sieve extension</b></a>.<br />Start Thunderbird, open the add-on settings and drop the newly downloaded xpi file into the opened window.<br />The server name is <b>%s</b>, use port <b>4190</b> if you are asked for. The login data match your email login.';
$lang['start']['service'] = 'Servizio';
$lang['start']['encryption'] = 'Metodo di criptazione';
$lang['start']['help'] = 'Mostra/Nascondi pannello di aiuto';
$lang['start']['hostname'] = 'Hostname';
$lang['start']['port'] = 'Porta';
$lang['start']['footer'] = '';
$lang['header']['mailcow_settings'] = 'Configurazione';
$lang['header']['administration'] = 'Amministrazione';
$lang['header']['mailboxes'] = 'Caselle';
$lang['header']['user_settings'] = 'Impostazioni utente';
$lang['header']['login'] = 'Accedi';
$lang['header']['logged_in_as_logout'] = 'Accesso come <b>%s</b> (esci)';
$lang['header']['logged_in_as_logout_dual'] = 'Accesso come <b>%s <span class="text-info">[%s]</span></b>';
$lang['header']['locale'] = 'Lingua';
$lang['mailbox']['domain'] = 'Dominio';
$lang['mailbox']['spam_aliases'] = 'Alias temporanei';
$lang['mailbox']['multiple_bookings'] = 'Multiple bookings';
$lang['mailbox']['kind'] = 'Tipo';
$lang['mailbox']['description'] = 'Descrizione';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['resource_name'] = 'Nome risorsa';
$lang['mailbox']['aliases'] = 'Aliases';
$lang['mailbox']['domains'] = 'Domini';
$lang['mailbox']['mailboxes'] = 'Caselle';
@ -234,7 +185,6 @@ $lang['mailbox']['mailbox_quota'] = 'Massima dimensione della casella';
$lang['mailbox']['domain_quota'] = 'Quota';
$lang['mailbox']['active'] = 'Attiva';
$lang['mailbox']['action'] = 'Azione';
$lang['mailbox']['ratelimit'] = 'limite invio msg/h';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Alias di domini';
$lang['mailbox']['target_domain'] = 'Target domain';
@ -244,20 +194,15 @@ $lang['mailbox']['fname'] = 'Nome completo';
$lang['mailbox']['filter_table'] = 'Filra tabella';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Quota';
$lang['mailbox']['in_use'] = 'In uso (%)';
$lang['mailbox']['msg_num'] = 'Messaggio #';
$lang['mailbox']['remove'] = 'Rimuovi';
$lang['mailbox']['edit'] = 'Modifica';
$lang['mailbox']['archive'] = 'Archivio';
$lang['mailbox']['no_record'] = 'Nessun record per l\' oggetto %s';
$lang['mailbox']['no_record_single'] = 'Nessun record';
$lang['mailbox']['add_domain'] = 'Aggiungi Dominio';
$lang['mailbox']['add_domain_alias'] = 'Aggiungi alias Dominio';
$lang['mailbox']['add_mailbox'] = 'Aggiungi casella mail';
$lang['mailbox']['add_resource'] = 'Aggiungi risorsa';
$lang['mailbox']['add_alias'] = 'Aggiungi alias';
$lang['mailbox']['add_domain_record_first'] = 'Perfavore aggiungi il dominio prima';
$lang['mailbox']['empty'] = 'Nessun risultato';
$lang['mailbox']['toggle_all'] = 'Inverti tutti';
$lang['mailbox']['quick_actions'] = 'Azione veloce';
@ -266,21 +211,6 @@ $lang['mailbox']['deactivate'] = 'Disattiva';
$lang['info']['no_action'] = 'Azione non applicabile';
$lang['delete']['title'] = 'Rimuovi oggetti';
$lang['delete']['remove_domain_warning'] = '<b>Attenzione:</b> Sei sicuro di voler rimuovere il dominio <b>%s</b>!';
$lang['delete']['remove_syncjob_warning'] = '<b>Attenzione:</b> Sei sicuro di voler rimuovere la sincronizzazione per l\'utente <b>%s</b>!';
$lang['delete']['remove_domainalias_warning'] = '<b>Attenzione:</b> Sei sicuro di voler rimuovere l\' alias di dominio <b>%s</b>!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Attenzione:</b> Sei sicuro di voler rimuovere l\' amministratore di dominio <b>%s</b>!';
$lang['delete']['remove_alias_warning'] = '<b>Attenzione:</b> Sei sicuro di voler rimuovere l\' alias <b>%s</b>!';
$lang['delete']['remove_mailbox_warning'] = '<b>Attenzione:</b> Sei sicuro di voler rimuovere la casella di posta <b>%s</b>!';
$lang['delete']['remove_mailbox_details'] = 'La casella di posta sarà <b>eliminata definitivamente</b>!';
$lang['delete']['remove_resource_warning'] = '<b>Attenzione:</b> Stai per rimuovere la risorsa <b>%s</b>!';
$lang['delete']['remove_resource_details'] = 'La risorsa sarà <b>eliminata definitivamente</b>!';
$lang['delete']['remove_domain_details'] = 'Questo rimuoverà anche gli alias di dominio.<br /><br /><b>Un dominio deve essere vuoto per essere rinmosso.</b>';
$lang['delete']['remove_syncjob_details'] = 'Gli oggetti provenienti da questa sincronizzazione non verranno più estratti dal server remoto.';
$lang['delete']['remove_alias_details'] = 'Gli utenti non potranno più ricevere posta per o inviare posta da questo indirizzo.</b>';
$lang['delete']['remove_button'] = 'Rimuovi';
$lang['delete']['previous'] = 'Pagina precedente';
$lang['edit']['syncjob'] = 'Modifica sincronizzazione';
$lang['edit']['save'] = 'Salva modifiche';
@ -292,22 +222,17 @@ $lang['edit']['subfolder2'] = 'Sincronizza in una sottocartella<br /><small>(vuo
$lang['edit']['mins_interval'] = 'Intervallo (min)';
$lang['edit']['exclude'] = 'Escludi oggetti (regex)';
$lang['edit']['save'] = 'Salva modifiche';
$lang['edit']['archive'] = 'Archivia accesso';
$lang['edit']['max_mailboxes'] = 'Caselle di posta massime';
$lang['edit']['title'] = 'Modifica oggetto';
$lang['edit']['target_address'] = 'Vai all\'indirizzo/es <small>(comma-separated)</small>';
$lang['edit']['active'] = 'Attivo';
$lang['edit']['target_domain'] = 'Target dominio';
$lang['edit']['password'] = 'Password';
$lang['edit']['ratelimit'] = 'Traffico uscita limite/ora';
$lang['danger']['ratelimt_less_one'] = 'Traffico uscita limite/ora non deve essere inferiore a 1';
$lang['edit']['password_repeat'] = 'Conferma password (riscrivila)';
$lang['edit']['domain_admin'] = 'Modifica amministratore dominio';
$lang['edit']['domain'] = 'Modifica dominio';
$lang['edit']['alias_domain'] = 'Alias dominio';
$lang['edit']['edit_alias_domain'] = 'Modifica Alias dominio';
$lang['edit']['domains'] = 'Dominio';
$lang['edit']['destroy'] = 'inserimento manuale dati';
$lang['edit']['alias'] = 'Modifica alias';
$lang['edit']['mailbox'] = 'Modifica casella di posta';
$lang['edit']['description'] = 'Descrizione';
@ -317,15 +242,10 @@ $lang['edit']['domain_quota'] = 'Spazio Dominio';
$lang['edit']['backup_mx_options'] = 'Backup MX options';
$lang['edit']['relay_domain'] = 'Relay dominio';
$lang['edit']['relay_all'] = 'Relay tutti i destinatari';
$lang['edit']['dkim_signature'] = 'Firma ARC + DKIM';
$lang['edit']['dkim_record_info'] = '<small>Aggiungere un record TXT con il valore specificato nell\' pannello DNS.</small>';
$lang['edit']['relay_all_info'] = '<small>Se si sceglie di <b>non</b> inviare tutti i destinatari, è necessario aggiungere una cassetta postale ("blind") per ogni singolo destinatario a cui deve essere inoltrato.</small>';
$lang['edit']['full_name'] = 'Nome completo';
$lang['edit']['quota_mb'] = 'Spazio (MiB)';
$lang['edit']['sender_acl'] = 'Consenti di inviare come';
$lang['edit']['sender_acl_info'] = 'Gli alias non possono essere deselezionati';
$lang['edit']['dkim_txt_name'] = 'TXT record name:';
$lang['edit']['dkim_txt_value'] = 'TXT record value:';
$lang['edit']['previous'] = 'Pagina precedente';
$lang['edit']['unchanged_if_empty'] = 'Se immutato lasciare vuoto';
$lang['edit']['dont_check_sender_acl'] = "Disattiva il controllo del mittente per il dominio %s + alias domains";
@ -340,22 +260,17 @@ $lang['add']['port'] = 'Porta';
$lang['add']['username'] = 'Username';
$lang['add']['enc_method'] = 'Metodo di criptazione';
$lang['add']['mins_interval'] = 'intervallo di Pooling (minuti)';
$lang['add']['maxage'] = 'Età massima dei messaggi che verranno interrogati dal server remoto (0 = ignora l\'età)';
$lang['add']['subfolder2'] = 'Sincronizza in una sottocartella nella destinazione';
$lang['add']['exclude'] = 'Escludi oggetti (regex)';
$lang['add']['delete2duplicates'] = 'Elimina duplicati nella destinazione';
$lang['add']['delete1'] = 'Elimina dalla sorgente al termine';
$lang['edit']['delete2duplicates'] = 'Elimina duplicati nella destinazione';
$lang['edit']['delete1'] = 'Elimina dalla sorgente al termine';
$lang['add']['title'] = 'Aggiungi oggetti';
$lang['add']['domain'] = 'Dominio';
$lang['add']['active'] = 'Attiva';
$lang['add']['multiple_bookings'] = 'Prenotazioni multiple';
$lang['add']['save'] = 'Salva modifiche';
$lang['add']['description'] = 'Descrizione:';
$lang['add']['max_aliases'] = 'Numero massimo alias:';
$lang['add']['resource_name'] = 'Nome della risorsa';
$lang['add']['max_mailboxes'] = 'Numero massimo caselle di posta:';
$lang['add']['mailbox_quota_m'] = 'Spazio massimo per casella di posta (MiB):';
$lang['add']['domain_quota_m'] = 'Spazio totale dominio (MiB):';
@ -363,8 +278,6 @@ $lang['add']['backup_mx_options'] = 'Backup MX options:';
$lang['add']['relay_all'] = 'Trasmettere a tutti i destinatari';
$lang['add']['relay_domain'] = 'Trasmetti questo dominio';
$lang['add']['relay_all_info'] = '<small>Se si sceglie di <b>non</b> inviare tutti i destinatari, è necessario aggiungere una cassetta postale ("blind") per ogni singolo destinatario a cui deve essere inoltrato.</small>';
$lang['add']['alias'] = 'Alias(es)';
$lang['add']['alias_spf_fail'] = '<b>Nota:</b> Se l\'indirizzo di destinazione scelto è una casella mail esterna, il <b>server mail ricevente</b> potrebbe rifiutare il messaggio a causa dell\' SPF.</a>';
$lang['add']['alias_address'] = 'Indirizzo alias/es:';
$lang['add']['alias_address_info'] = '<small>Indirizzo e-mail completo/es @example.com, per catturare tutti i messaggi di un dominio (separati da virgola). <b>solo domini mailcow</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Solo nomi di dominio validi (cseparati da virgola).</small>';
@ -373,8 +286,6 @@ $lang['add']['target_address_info'] = '<small>Indirizzo e-mail completo/es (sepa
$lang['add']['alias_domain'] = 'Dominio alias';
$lang['add']['select'] = 'Perfavore seleziona...';
$lang['add']['target_domain'] = 'Target dominio:';
$lang['add']['mailbox'] = 'Casella di posta';
$lang['add']['resource'] = 'Risorsa';
$lang['add']['kind'] = 'Genere';
$lang['add']['mailbox_username'] = 'Username (parte a sinistra della @):';
$lang['add']['full_name'] = 'Nome completo:';
@ -382,19 +293,11 @@ $lang['add']['quota_mb'] = 'Spazio (MiB):';
$lang['add']['select_domain'] = 'Perfavore seleziona il dominio prima';
$lang['add']['password'] = 'Password:';
$lang['add']['password_repeat'] = 'Conferma password (riscrivi):';
$lang['add']['previous'] = 'Pagina precedente';
$lang['add']['restart_sogo_hint'] = 'Dovrai riavviare il servizio SOGo dopo aver aggiunto un nuovo dominio!';
$lang['login']['title'] = 'Accedi';
$lang['login']['administration'] = 'Amministrazione';
$lang['login']['administration_details'] = 'Utilizza il login di amministratore per eseguire attività amministrative.';
$lang['login']['user_settings'] = 'Settaggi utente';
$lang['login']['user_settings_details'] = 'Gli utenti delle caselle mail possono utilizzare l\'interfaccia utente di mailcow per modificare le password, creare alias temporanei e regolare il comportamento del filtro anti-spam o importare messaggi da un server IMAP remoto.';
$lang['login']['username'] = 'Username';
$lang['login']['password'] = 'Password';
$lang['login']['reset_password'] = 'Reset password';
$lang['login']['login'] = 'Login';
$lang['login']['previous'] = "Pagina precendente";
$lang['login']['delayed'] = 'L\'accesso è stato ritardato di %s secondi.';
$lang['tfa']['tfa'] = "Autenticazione a due fattori";
$lang['tfa']['set_tfa'] = "Imposta il metodo di autenticazione a due fattori";
@ -403,16 +306,12 @@ $lang['tfa']['key_id'] = "Identificatore per il tuo YubiKey";
$lang['tfa']['key_id_totp'] = "Identificatore per la tua chiave";
$lang['tfa']['api_register'] = 'mailcow usa le Api Yubico Cloud. Richiedi una Chiave API <a href="https://upgrade.yubico.com/getapikey/" target="_blank">qui</a>';
$lang['tfa']['u2f'] = "Autenticazione U2F";
$lang['tfa']['hotp'] = "Autenticazione HOTP";
$lang['tfa']['totp'] = "Autenticazione TOTP";
$lang['tfa']['none'] = "Disattiva";
$lang['tfa']['delete_tfa'] = "Disabilita TFA";
$lang['tfa']['disable_tfa'] = "Disabilita TFA fino al prossimo accesso";
$lang['tfa']['confirm_tfa'] = "Conferma la password nel capo sottostante";
$lang['tfa']['confirm'] = "Conferma";
$lang['tfa']['otp'] = "Password provvisoria";
$lang['tfa']['totp'] = "Time-based OTP (Google Authenticator etc.)";
$lang['tfa']['trash_login'] = "Trash login";
$lang['tfa']['select'] = "Seleziona";
$lang['tfa']['waiting_usb_auth'] = "<i>Attendo il device USB...</i><br /><br />Tocca ora il pulsante sul dispositivo U2F USB.";
$lang['tfa']['waiting_usb_register'] = "<i>Attendo il device USB...</i><br /><br />Inserisci la tua password sopra e conferma la tua registrazione U2F toccando il pulsante del dispositivo U2F USB.";
@ -421,40 +320,14 @@ $lang['tfa']['enter_qr_code'] = "Il codice TOTP se il tuo dispositivo non è in
$lang['tfa']['confirm_totp_token'] = "Conferma le modifiche inserendo il token generato";
$lang['admin']['search_domain_da'] = 'Ricerca domini';
$lang['admin']['restrictions'] = 'Restrizioni Postfix';
$lang['admin']['rr'] = 'Restrizioni del destinatario di Postfix';
$lang['admin']['sr'] = 'Restrizioni del mittente di Postfix';
$lang['admin']['reset_defaults'] = 'Ripristina i valori di default';
$lang['admin']['sr'] = 'Restrizioni del mittente di Postfix';
$lang['admin']['r_inactive'] = 'Restrizioni inattive';
$lang['admin']['r_active'] = 'Restrizioni attive';
$lang['admin']['r_info'] = 'Gli elementi disabilitati nell\'elenco delle restrizioni attive non sono conosciute come restrizioni valide per la posta e non possono essere spostate. Le restrizioni sconosciute verranno comunque impostate in ordine di aspetto. <br />Puoi aggiungere nuovi elementi in <code>inc/vars.local.inc.php</code> per poterli attivare.';
$lang['admin']['public_folders'] = 'Cartelle pubbliche';
$lang['admin']['public_folders_text'] = 'Verrà creato uno spazio "Public". Di seguito il nome della cartella pubblica indica il nome della prima casella di posta automaticamente creata all\'interno di questo spazio.';
$lang['admin']['public_folder_name'] = 'Nome cartella <small>(alfanumerico)</small>';
$lang['admin']['public_folder_enable'] = 'Abilita cartella public';
$lang['admin']['public_folder_enable_text'] = 'Procedere con questa operazione, non eliminerà nessuna cartella pubblica.';
$lang['admin']['public_folder_pusf'] = 'Abilita flag per utente';
$lang['admin']['public_folder_pusf_text'] = 'Quando è abilitato il flag per utente, un messaggio non verrà contrassegnato come letto per l\'utente B, quando l\'utente A lo ha visto, ma l\'utente B non lo ha fatto.';
$lang['admin']['privacy'] = 'Privacy';
$lang['admin']['privacy_text'] = 'Questa opzione abilita una tabella per rimuovere "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" e sostituisce "Ricevuta: da" con intestazione localhost/127.0.0.1.';
$lang['admin']['privacy_anon_mail'] = 'Rende anonima la posta in uscita';
$lang['admin']['dkim_txt_name'] = 'Nome TXT record:';
$lang['admin']['dkim_txt_value'] = 'Valore TXT record:';
$lang['admin']['dkim_key_length'] = 'DKIM key length (bits)';
$lang['admin']['dkim_key_valid'] = 'Key valida';
$lang['admin']['dkim_key_unused'] = 'Key non usata';
$lang['admin']['dkim_key_missing'] = 'Key mancante';
$lang['admin']['dkim_key_hint'] = 'Il selettore per chiave DKIM è sempre <code>dkim</code>.';
$lang['admin']['previous'] = 'Pagina precedente';
$lang['admin']['quota_mb'] = 'Spazio (MiB):';
$lang['admin']['sender_acl'] = 'Consenti di inviare come:';
$lang['admin']['msg_size'] = 'Dimensione del messaggio';
$lang['admin']['msg_size_limit'] = 'Limita la dimensione del messaggio';
$lang['admin']['msg_size_limit_details'] = 'Applicare un nuovo limite richiede il riavvio di Postfix e del webserver.';
$lang['admin']['save'] = 'Salva modifiche';
$lang['admin']['maintenance'] = 'Manutenzione e informazione';
$lang['admin']['sys_info'] = 'Informazioni di sistema';
$lang['admin']['dkim_add_key'] = 'Aggiungi chiave ARC/DKIM';
$lang['admin']['dkim_keys'] = 'chiave ARC/DKIM';
$lang['admin']['add'] = 'Aggiungi';
@ -476,10 +349,6 @@ $lang['admin']['unchanged_if_empty'] = 'Se immutato lasciare vuoto';
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Accedi';
$lang['admin']['invalid_max_msg_size'] = 'Valore non valido della massima dimensione del messaggio';
$lang['admin']['site_not_found'] = 'Impossibile torvare la configurazione di mailcow';
$lang['admin']['public_folder_empty'] = 'Il nome della cartella pubblica non può essere vuoto';
$lang['admin']['set_rr_failed'] = 'Impossibile impostare restrizioni Postfix';
$lang['admin']['no_record'] = 'Nessun risultato';
$lang['admin']['filter_table'] = 'Tabella filtro';
$lang['admin']['empty'] = 'Nessun risultato';
@ -489,7 +358,6 @@ $lang['admin']['forwarding_hosts_add_hint'] = 'È possibile specificare indirizz
$lang['edit']['host'] = 'Host';
$lang['edit']['source'] = 'Sorgente';
$lang['admin']['add_forwarding_host'] = 'Aggiungi host inoltro';
$lang['delete']['remove_forwardinghost_warning'] = '<b>Attenzione:</b> Stai per rimuovere l\'host di inoltro <b>%s</b>!';
$lang['success']['forwarding_host_removed'] = "Inoltro dell' host %s è stato rimosso";
$lang['success']['forwarding_host_added'] = "Inoltro dell' host %s è stato aggiunto";
?>

View File

@ -8,12 +8,7 @@ $lang['header']['restart_sogo'] = 'SOGo herstarten';
$lang['footer']['restart_sogo'] = 'SOGo herstarten';
$lang['footer']['restart_now'] = 'Nu opnieuw starten';
$lang['footer']['restart_sogo_info'] = 'Sommige taken, zoals het toevoegen van een domein, vereisen een herstart van SOGo om de veranderingen door te voeren.<br><br><b>Belangrijk:</b> Het opnieuw opstarten kan een poos duren, wacht a.u.b. totdat dit volledig voltooid is.';
$lang['dkim']['confirm'] = "Weet u het zeker?";
$lang['danger']['dkim_not_found'] = "DKIM record niet gevonden.";
$lang['danger']['dkim_remove_failed'] = "Kan geselecteerde DKIM record niet verwijderen.";
$lang['danger']['dkim_add_failed'] = "Kan DKIM record niet toevoegen.";
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domein of selector zijn ongeldig.";
$lang['danger']['dkim_key_length_invalid'] = "Lengte DKIM sleutel ongeldig.";
$lang['success']['dkim_removed'] = "DKIM record is verwijderd.";
$lang['success']['dkim_added'] = "DKIM record is opgeslagen.";
$lang['danger']['access_denied'] = "Toegang geweigerd of ongeldige gegevens.";
@ -25,8 +20,6 @@ $lang['danger']['alias_empty'] = "Aliasadres mag niet leeg blijven.";
$lang['danger']['goto_empty'] = "Doeladres mag niet leeg blijven.";
$lang['danger']['policy_list_from_exists'] = "Deze invoer bestaat al.";
$lang['danger']['policy_list_from_invalid'] = "Deze invoer heeft een ongeldig format.";
$lang['danger']['whitelist_exists'] = "Deze invoer staat op de witte lijst.";
$lang['danger']['whitelist_from_invalid'] = "Witte lijst invoer heeft een ongeldig format.";
$lang['danger']['alias_invalid'] = "Aliasadres is ongeldig.";
$lang['danger']['goto_invalid'] = "Doeladres is ongeldig.";
$lang['danger']['alias_domain_invalid'] = "Aliasdomein is ongeldig.";
@ -38,26 +31,19 @@ $lang['danger']['aliasd_targetd_identical'] = "Het Aliasdomein kan niet gelijk z
$lang['success']['alias_added'] = "Aliasadres(sen) toegevoegd.";
$lang['success']['alias_modified'] = "Wijzigingen aan Alias zijn opgeslagen.";
$lang['success']['mailbox_modified'] = "Wijzigingen aan postvak %s zijn opgeslagen.";
$lang['success']['msg_size_saved'] = "Maximale berichtgrootte opgeslagen.";
$lang['danger']['aliasd_not_found'] = "Aliasdomein werd niet gevonden.";
$lang['danger']['targetd_not_found'] = "Doeldomein werd niet gevonden.";
$lang['danger']['aliasd_exists'] = "Aliasdomein bestaat al.";
$lang['success']['aliasd_added'] = "Aliasdomein %s toegevoegd.";
$lang['success']['aliasd_modified'] = "Wijzigingen aan aliasdomein %s zijn opgeslagen.";
$lang['success']['domain_modified'] = "Wijzigingen aan domein %s zijn opgeslagen.";
$lang['success']['domain_admin_modified'] = "Wijzigingen aan domeinbeheerder %s zijn opgeslagen.";
$lang['success']['domain_admin_added'] = "Domeinbeheerder %s is toegevoegd.";
$lang['success']['changes_general'] = 'Wijzigingen zijn opgeslagen.';
$lang['success']['admin_modified'] = "Wijzigingen aan de beheerder zijn opgeslagen.";
$lang['danger']['exit_code_not_null'] = "Fout: Exitcode was %d.";
$lang['danger']['mailbox_not_available'] = "Postvak niet beschikbaar.";
$lang['danger']['username_invalid'] = "Gebruikersnaam kan niet worden gebruikt.";
$lang['danger']['password_mismatch'] = "Bevestigingswachtwoord verschilt.";
$lang['danger']['password_complexity'] = "Het wachtwoord voldoet niet aan de vereisten.";
$lang['danger']['password_empty'] = "Er moet een wachtwoord worden ingesteld.";
$lang['danger']['login_failed'] = "Aanmelding mislukt.";
$lang['danger']['mailbox_invalid'] = "De naam van het postvak is ongeldig.";
$lang['danger']['mailbox_invalid_suggest'] = "De naam van het postvak is ongeldig, bedoelde u \"%s\"?";
$lang['info']['fetchmail_planned'] = "Taak voor het ophalen van e-mails is gepland. Controleer dit proces later.";
$lang['danger']['fetchmail_source_empty'] = "Geef een bron-map op.";
$lang['danger']['fetchmail_dest_empty'] = "Geef een doel-map op.";
@ -81,15 +67,10 @@ $lang['danger']['mailboxes_in_use'] = "Maximaal aantal postvakken moet >= %d.";
$lang['danger']['aliases_in_use'] = "Maximaal aantal aliassen moet >= %d.";
$lang['danger']['sender_acl_invalid'] = "Verzender ACL-waarde is ongeldig.";
$lang['danger']['domain_not_empty'] = "Kan domein in gebruik niet verwijderen.";
$lang['warning']['spam_alias_temp_error'] = "Tijdelijke fout: Kan geen spam-alias toevoegen. Probeer het later nogmaals.";
$lang['danger']['spam_alias_max_exceeded'] = "Maximaal aantal spam-aliassen bereikt.";
$lang['danger']['fetchmail_active'] = "Er draait reeds een proces, wacht tot deze klaar is.";
$lang['danger']['validity_missing'] = 'Voer een geldigheidstermijn in.';
$lang['user']['on'] = "Aan";
$lang['user']['off'] = "Uit";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Gebruikersinstellingen';
$lang['user']['mailbox_settings'] = 'Postvakinstellingen';
$lang['user']['mailbox_details'] = 'Postvakdetails';
$lang['user']['change_password'] = 'Verander wachtwoord';
$lang['user']['new_password'] = 'Nieuw wachtwoord';
@ -97,7 +78,6 @@ $lang['user']['save_changes'] = 'Wijzigingen opslaan';
$lang['user']['password_now'] = 'Huidig wachtwoord (bevestig wijzigingen)';
$lang['user']['new_password_repeat'] = 'Bevestig wachtwoord (herhalen)';
$lang['user']['new_password_description'] = 'Vereisten: 6 karakters lang, letters en nummers.';
$lang['user']['did_you_know'] = '<b>Wist u dat?</b> U kunt tags in het e-mailadres gebruiken ("me+<b>prive</b>@voorbeeld.nl") om berichten automatisch naar een bijbehorende map te sturen (voorbeeld: "prive").';
$lang['user']['spam_aliases'] = 'Tijdelijk e-mailadres';
$lang['user']['alias'] = 'Alias';
$lang['user']['alias_create_random'] = 'Creëer willekeurige alias';
@ -135,8 +115,6 @@ $lang['user']['tls_enforce_in'] = 'Forceer TLS-gebruik inkomend';
$lang['user']['tls_enforce_out'] = 'Forceer TLS-gebruik uitgaand';
$lang['user']['no_record'] = 'Geen vermelding.';
$lang['user']['misc_settings'] = 'Andere profielinstellingen';
$lang['user']['misc_delete_profile'] = 'Andere profielinstellingen';
$lang['user']['tag_handling'] = 'Omgaan met e-mail tags';
$lang['user']['tag_in_subfolder'] = 'In onderliggende map';
$lang['user']['tag_in_subject'] = 'In onderwerp';
@ -144,36 +122,16 @@ $lang['user']['tag_in_none'] = 'Niets doen';
$lang['user']['tag_help_explain'] = 'In onderliggende map: maakt onder INBOX een nieuwe map aan met de naam van de tag (bijv.: "INBOX/Facebook").<br>
In onderwerp: de tag wordt vóór het oorspronkelijke e-mail onderwerp geplaatst (bijv.: "[Facebook] Mijn nieuws").';
$lang['user']['tag_help_example'] = 'Voorbeeld van een e-mailadres met tag: ik<b>+Facebook</b>@voorbeeld.org';
$lang['start']['dashboard'] = '%s - startpagina';
$lang['start']['start_rc'] = 'Open Roundcube';
$lang['start']['start_sogo'] = 'Open SOGo';
$lang['start']['mailcow_apps_detail'] = 'Gebruik een mailcow app om toegang te hebben tot uw e-mails, kalender, contactpersonen en meer.';
$lang['start']['mailcow_panel'] = 'Start mailcow UI';
$lang['start']['mailcow_panel_description'] = 'De mailcow UI is beschikbaar voor zowel beheerders als gebruikers.';
$lang['start']['mailcow_panel_detail'] = '<b>Domeinbeheerders</b> kunnen postvakken en aliassen aanmaken, wijzigen of verwijderen, domeinen veranderen of informatie krijgen over hun domein.<br>
<b>Gebruikers</b> kunnen tijdsgelimiteerde aliassen (spam-aliasses) aanmaken, hun wachtwoord wijzigen en spamfilterinstellingen wijzigen.';
$lang['start']['recommended_config'] = 'Aanbevoen instellingen (zonder ActiveSync)';
$lang['start']['imap_smtp_server'] = 'IMAP- en SMTP-server gegevens';
$lang['start']['imap_smtp_server_description'] = 'Voor de best mogelijke ervaring bevelen wij <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a> aan.';
$lang['start']['imap_smtp_server_badge'] = 'Lees/schrijf e-mails';
$lang['start']['imap_smtp_server_auth_info'] = 'Gebruik uw volledige e-mailadres en de onversleutelde (PLAIN) verificatiemechanisme.<br>
De aanmeldgegevens zullen door de server worden versleuteld.';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'Emailfilter';
$lang['start']['managesieve_description'] = 'Gebruik <b>Mozilla Thunderbird</b> met een <a style="text-decoration:none" target="_blank" href="%s"><b>nightly sieve addon</b></a>.<br>Start Thunderbird, open de add-on instellingen en sleep het gedownloadde xpi-bestand naar dit venster.<br>Servernaam <b>%s</b>, Poort <b>4190</b>. De aanmeldgegevens zijn gelijk aan de gegevens voor uw e-mail.';
$lang['start']['service'] = 'Service';
$lang['start']['encryption'] = 'Versleutelmethode';
$lang['start']['help'] = 'Toon/Verberg Hulppaneel';
$lang['start']['hostname'] = 'Hostname';
$lang['start']['port'] = 'Poort';
$lang['start']['footer'] = '';
$lang['header']['mailcow_settings'] = 'Instellingen';
$lang['header']['administration'] = 'Beheer';
$lang['header']['mailboxes'] = 'Postvakken';
$lang['header']['user_settings'] = 'Gebruikersinstellingen';
$lang['header']['login'] = 'Aanmelden';
$lang['header']['logged_in_as_logout'] = 'Aangemeld als <b>%s</b> (Afmelden)';
$lang['header']['locale'] = 'Taal';
$lang['mailbox']['domain'] = 'Domein';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['aliases'] = 'Aliassen';
@ -183,7 +141,6 @@ $lang['mailbox']['mailbox_quota'] = 'Max. grootte van een postvak';
$lang['mailbox']['domain_quota'] = 'Quotum';
$lang['mailbox']['active'] = 'Actief';
$lang['mailbox']['action'] = 'Handeling';
$lang['mailbox']['ratelimit'] = 'Maximale snelheid uitgaand/uur';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Domein-aliassen';
$lang['mailbox']['target_domain'] = 'Doeldomein';
@ -193,13 +150,10 @@ $lang['mailbox']['fname'] = 'Volledige naam';
$lang['mailbox']['filter_table'] = 'Filter tabel';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Quotum';
$lang['mailbox']['in_use'] = 'In gebruik (%)';
$lang['mailbox']['msg_num'] = 'Berichten #';
$lang['mailbox']['remove'] = 'Verwijder';
$lang['mailbox']['edit'] = 'Wijzig';
$lang['mailbox']['archive'] = 'Archief';
$lang['mailbox']['no_record'] = 'Geen vermelding';
$lang['mailbox']['add_domain'] = 'Toevoegen domein';
$lang['mailbox']['add_domain_alias'] = 'Toevoegen domein-alias';
$lang['mailbox']['add_mailbox'] = 'Toevoegen postvak';
@ -207,35 +161,19 @@ $lang['mailbox']['add_alias'] = 'Toevoegen alias';
$lang['info']['no_action'] = 'Geen handelingen uitvoerbaar';
$lang['delete']['title'] = 'Verwijder object';
$lang['delete']['remove_domain_warning'] = '<b>Let op:</b> U staat op het punt domein <b>%s</b> te verwijderen!';
$lang['delete']['remove_domainalias_warning'] = '<b>Let op:</b> U staat op het punt domeinalias <b>%s</b> te verwijderen!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Let op:</b> U staat op het punt domeinbeheerder <b>%s</b> te verwijderen!';
$lang['delete']['remove_alias_warning'] = '<b>Let op:</b> U staat op het punt alias <b>%s</b> te verwijderen!';
$lang['delete']['remove_mailbox_warning'] = '<b>Let op::</b> U staat op het punt postvak <b>%s</b> te verwijderen!';
$lang['delete']['remove_mailbox_details'] = 'Het postvak zal <b>permanent</b> worden verwijderd!';
$lang['delete']['remove_domain_details'] = 'Dit verwijdert ook de domeinaliassen. <br><br><b>Een domein moet leeg zijn alvorens deze verwijderd kan worden.</b>';
$lang['delete']['remove_alias_details'] = '<b>Gebruikers zullen niet meer in staat zijn e-mails te ontvangen op -of te versturen vanaf- dit adres.</b>';
$lang['delete']['remove_button'] = 'Verwijder';
$lang['delete']['previous'] = 'Vorige pagina';
$lang['edit']['save'] = 'Wijzigingen opslaan';
$lang['edit']['archive'] = 'Toegang tot archief';
$lang['edit']['max_mailboxes'] = 'Max. aantal postvakken:';
$lang['edit']['title'] = 'Wijzig object';
$lang['edit']['target_address'] = 'Doeladres(sen) <small>(scheiden met komma)</small>:';
$lang['edit']['active'] = 'Actief';
$lang['edit']['target_domain'] = 'Doeldomein:';
$lang['edit']['password'] = 'Wachtwoord:';
$lang['edit']['ratelimit'] = 'Uitgaande e-mail beperking (aantal/uur):';
$lang['danger']['ratelimt_less_one'] = 'De uitgaande e-mail beperking moet >= 1';
$lang['edit']['password_repeat'] = 'Bevestig wachtwoord (herhalen):';
$lang['edit']['domain_admin'] = 'Wijzig domeinbeheerder';
$lang['edit']['domain'] = 'Wijzig domein';
$lang['edit']['alias_domain'] = 'Aliasdomein';
$lang['edit']['edit_alias_domain'] = 'Wijzig aliasdomein';
$lang['edit']['domains'] = 'Domeinen';
$lang['edit']['destroy'] = 'Handmatige invoer';
$lang['edit']['alias'] = 'Wijzig alias';
$lang['edit']['mailbox'] = 'Wijzig postvak';
$lang['edit']['description'] = 'Beschrijving:';
@ -245,24 +183,17 @@ $lang['edit']['domain_quota'] = 'Domeinquotum';
$lang['edit']['backup_mx_options'] = 'Backup MX opties:';
$lang['edit']['relay_domain'] = 'Doorschakeldomein';
$lang['edit']['relay_all'] = 'Schakel alle ontvangers door';
$lang['edit']['dkim_signature'] = 'ARC + DKIM handtekening:';
$lang['edit']['dkim_record_info'] = '<small>Voeg de volgende TXT-record toe aan de DNS-instellingen van uw domein.</small>';
$lang['edit']['relay_all_info'] = '<small>Indien u ervoor kiest om <b>niet</b> alle ontvangers door te schakelen, dient u per ontvanger die u wenst door te schakelen een (lege) postvak aan te maken.</small>';
$lang['edit']['full_name'] = 'Volledige naam';
$lang['edit']['quota_mb'] = 'Quotum (MiB)';
$lang['edit']['sender_acl'] = 'Toestaan te verzenden als:';
$lang['edit']['sender_acl_info'] = 'Aliassen kunnen niet worden deselecteerd.';
$lang['edit']['dkim_txt_name'] = 'Naam TXT-record:';
$lang['edit']['dkim_txt_value'] = 'Waarde TXT-record:';
$lang['edit']['previous'] = 'Vorige pagina';
$lang['edit']['unchanged_if_empty'] = 'Leeg laten indien niet veranderd.';
$lang['edit']['dont_check_sender_acl'] = 'Geen zenderverificatie uitvoeren voor domein %s.';
$lang['add']['port'] = 'Port';
$lang['add']['title'] = 'Object toevoegen';
$lang['add']['domain'] = 'Domein';
$lang['add']['active'] = 'Actief';
$lang['add']['save'] = 'Wijzigingen opslaan';
$lang['add']['description'] = 'Beschrijving:';
$lang['add']['max_aliases'] = 'Max. aantal aliassen:';
$lang['add']['max_mailboxes'] = 'Max. aantal postvakken:';
@ -272,8 +203,6 @@ $lang['add']['backup_mx_options'] = 'Backup MX opties:';
$lang['add']['relay_all'] = 'Doorschakelen van alle ontvangers';
$lang['add']['relay_domain'] = 'Schakel dit domein door';
$lang['add']['relay_all_info'] = '<small>Indien u ervoor kiest om <b>niet</b> alle ontvangers door te schakelen, moet u voor iedere ontvanger die u wenst door te schakelen een een (lege) mailbox aanmaken.</small>';
$lang['add']['alias'] = 'Alias(sen)';
$lang['add']['alias_spf_fail'] = '<b>Opmerking:</b> Als het gekozen doeladres een extern postvak is, kan de <b>ontvangende mailservver</b> mogelijk het bericht weigeren vanwege niet kloppende SPF-gegevens.</a>';
$lang['add']['alias_address'] = 'Aliasadres(sen):';
$lang['add']['alias_address_info'] = '<small>Volledig(e) emailadres(sen) of @voorbeeld.nl om alle berichten op te vangen van een domein (scheiden met komma). <b>Alleen mailcow-domeinen!</b></small>';
$lang['add']['alias_domain_info'] = '<small>Alleen geldige domeinen (scheiden met komma).</small>';
@ -282,26 +211,17 @@ $lang['add']['target_address_info'] = '<small>Volledig(e) e-mailadres(sen) (sche
$lang['add']['alias_domain'] = 'Aliasdomein';
$lang['add']['select'] = 'Kies uit...';
$lang['add']['target_domain'] = 'Doeldomein:';
$lang['add']['mailbox'] = 'Postvak';
$lang['add']['mailbox_username'] = 'Gebruikersnaam (linker deel van het e-mailadres):';
$lang['add']['full_name'] = 'Volledige naam:';
$lang['add']['quota_mb'] = 'Quotum (MiB):';
$lang['add']['select_domain'] = 'Selecteer eerst een domein';
$lang['add']['password'] = 'Wachtwoord:';
$lang['add']['password_repeat'] = 'Bevestig wachtwoord (herhalen):';
$lang['add']['previous'] = 'Vorige pagina';
$lang['add']['restart_sogo_hint'] = 'SOGo dient opnieuw te worden gestart nadat een domein is toegevoegd!';
$lang['login']['title'] = 'Aanmelden';
$lang['login']['administration'] = 'Beheer';
$lang['login']['administration_details'] = 'Gebruik uw beheerders-login om administratieve taken uit te voeren.';
$lang['login']['user_settings'] = 'Gebruikersinstellingen';
$lang['login']['user_settings_details'] = 'Mailbox-gebruikers kunnen in het mailcow-gebruikersbeheer hun wachtwoorden wijzigen, tijdelijke aliassen aanmaken (tegengaan van spam), de spamfilter aanpassen of berichten van externe IMAP-servers importeren.';
$lang['login']['username'] = 'Gebruikersnaam';
$lang['login']['password'] = 'Wachtwoord';
$lang['login']['reset_password'] = 'Wijzig mijn wachtwoord';
$lang['login']['login'] = 'Aanmelden';
$lang['login']['previous'] = "Vorige pagina";
$lang['login']['delayed'] = 'Aanmelding met %s sec. vertraagd.';
$lang['login']['tfa'] = "Two-factor authentication";
@ -311,34 +231,10 @@ $lang['login']['otp'] = "Eenmalig wachtwoord";
$lang['login']['trash_login'] = "Verwijder login";
$lang['admin']['search_domain_da'] = 'Doorzoek domeinen';
$lang['admin']['restrictions'] = 'Postfix beperkingen';
$lang['admin']['rr'] = 'Postfix ontvangersbeperkingen';
$lang['admin']['sr'] = 'Postifx verzendersbeperkingen';
$lang['admin']['reset_defaults'] = 'Herstel standaardwaarden';
$lang['admin']['r_inactive'] = 'Inactieve beperkingen';
$lang['admin']['r_active'] = 'Actieve beperkignen';
$lang['admin']['r_info'] = 'Grijze, uitgeschakelde, elementen in de lijst met actieve beperkingen zijn voor mailcow niet bekend als valide en kunnen daarom niet verplaatst worden.<br>U kunt nieuwe elementen toevoegen in <code>inc/vars.inc.php</code> om ze te (de)activeren.';
$lang['admin']['public_folders'] = 'Gemeenschappelijke mappen';
$lang['admin']['public_folders_text'] = 'Een namespace "Public" wordt aangemaakt. Onder deze map worden de automatisch aangemaakte postvakken in deze namespace weergegeven.';
$lang['admin']['public_folder_name'] = 'Mapnaam <small>(alphanumeriek)</small>';
$lang['admin']['public_folder_enable'] = 'Inschakelen gemeenschappelijke map';
$lang['admin']['public_folder_enable_text'] = 'Deze optie uitschakelen verwijderd géén e-mails uit de gemeenschappelijke mappen.';
$lang['admin']['public_folder_pusf'] = 'De \'gelezen\'-markering per gebruiker';
$lang['admin']['public_folder_pusf_text'] = 'Deze "\'gelezen\'-markering per gebruiker"-optie zorgt ervoor dat er per gebruiker afzonderlijk wordt bepaald of deze het bericht heeft gelezen.';
$lang['admin']['privacy'] = 'Privacy';
$lang['admin']['privacy_text'] = 'Deze optie activeert een PCRE-tabel die de "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP"-headers verwijderd en de "Received: from"-headers vervangt met localhost/127.0.0.1.';
$lang['admin']['privacy_anon_mail'] = 'Anonimiseer uitgaande e-mails';
$lang['admin']['dkim_txt_name'] = 'Naam TXT-record:';
$lang['admin']['dkim_txt_value'] = 'Waarde TXT-record:';
$lang['admin']['dkim_key_length'] = 'DKIM sleutel lengte (bits)';
$lang['admin']['previous'] = 'Vorige pagina';
$lang['admin']['quota_mb'] = 'Quotum (MiB):';
$lang['admin']['sender_acl'] = 'Toestaan te verzenden als:';
$lang['admin']['msg_size'] = 'Berichtgrootte';
$lang['admin']['msg_size_limit'] = 'Huidige limiet berichtgroote';
$lang['admin']['msg_size_limit_details'] = 'Een nieuw limiet doorvoeren zal Postfix en de webserver herladen.';
$lang['admin']['maintenance'] = 'Onderhoud en informatie';
$lang['admin']['sys_info'] = 'Systeeminformatie';
$lang['admin']['dkim_add_key'] = 'ARC/DKIM-record toevoegen';
$lang['admin']['dkim_keys'] = 'ARC/DKIM records';
$lang['admin']['add'] = 'Toevoegen';
@ -360,8 +256,4 @@ $lang['admin']['unchanged_if_empty'] = 'Leeg laten indien onveranderd';
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Toegang';
$lang['admin']['invalid_max_msg_size'] = 'Ongeldige max. berichtgrootte';
$lang['admin']['site_not_found'] = 'Kan mailcow instellingenbeheer niet vinden';
$lang['admin']['public_folder_empty'] = 'Namen van gemeenschappelijke mappen mogen niet leeg blijven.';
$lang['admin']['set_rr_failed'] = 'Kan Postfix beperkingen niet opleggen.';
$lang['admin']['no_record'] = 'Geen vermelding';

View File

@ -14,16 +14,10 @@ $lang['footer']['delete_these_items'] = 'Czy jesteś pewien, że chcesz usunąć
$lang['footer']['delete_now'] = 'Usuń teraz';
$lang['footer']['cancel'] = 'Anuluj';
$lang['dkim']['confirm'] = 'Na pewno?';
$lang['danger']['dkim_not_found'] = 'Nie znaleziono klucza DKIM';
$lang['danger']['dkim_remove_failed'] = 'Nie można usunšć wybranego klucza DKIM';
$lang['danger']['dkim_add_failed'] = 'Nie można dodać danego klucza DKIM';
$lang['danger']['dkim_domain_or_sel_invalid'] = 'Nieprawidłowa domena lub selektor DKIM';
$lang['danger']['dkim_key_length_invalid'] = 'Nieprawidłowa długość klucza DKIM';
$lang['success']['dkim_removed'] = 'Klucz DKIM %s został usunięty';
$lang['success']['dkim_added'] = 'Klucz DKIM został zapisany';
$lang['danger']['access_denied'] = 'Odmowa dostępu lub nieprawidłowe dane w formularzu';
$lang['danger']['whitelist_from_invalid'] = 'Nieprawidłowy wpis na białą listę';
$lang['danger']['domain_invalid'] = 'Błędna nazwa domeny';
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = 'Maksymalna wartość przekracza limit domeny';
$lang['danger']['object_is_not_numeric'] = 'Wartość %s nie jest liczbą';
@ -34,8 +28,6 @@ $lang['danger']['last_key'] = 'Nie można usunšć ostatniego klucza';
$lang['danger']['goto_empty'] = "Adres Idź do nie może być pusty";
$lang['danger']['policy_list_from_exists'] = "Rekord o danej nazwie już istnieje";
$lang['danger']['policy_list_from_invalid'] = "Rekord posiada nieprawidłowy format";
$lang['danger']['whitelist_exists'] = "Wpis na białej liście o danej nazwie już istnieje";
$lang['danger']['whitelist_from_invalid'] = "Rekord na białej liście posiada nieprawidłowy format";
$lang['danger']['alias_invalid'] = "Alias nieprawidłowy";
$lang['danger']['goto_invalid'] = "Adres Idź do jest nieprawidłowy";
$lang['danger']['alias_domain_invalid'] = "Alias domeny nieprawidłowy";
@ -52,19 +44,13 @@ $lang['success']['mailbox_modified'] = "Zapisano zmiany w skrzynce %s";
$lang['success']['resource_modified'] = "Zapisano zmiany w skrzynce %s";
$lang['success']['object_modified'] = "Zapisano zmiany w obiekcie %s";
$lang['success']['f2b_modified'] = "Zmiany w Fail2ban zostały zapisane";
$lang['success']['msg_size_saved'] = "Ustawiono limit rozmiaru wiadomości";
$lang['danger']['aliasd_not_found'] = "Nie znaleziono aliasu domeny";
$lang['danger']['targetd_not_found'] = "Nie znaleziono domeny docelowej";
$lang['danger']['aliasd_exists'] = "Alias domeny już istnieje";
$lang['success']['aliasd_added'] = "Dodano alias domeny %s";
$lang['success']['aliasd_modified'] = "Zapisano zmiany w aliasie domeny %s";
$lang['success']['domain_modified'] = "Zapisano zmiany w domenie %s";
$lang['success']['domain_admin_modified'] = "Zapisano zmiany w administratorze domeny %s";
$lang['success']['domain_admin_added'] = "Dodano administratora domeny %s";
$lang['success']['changes_general'] = 'Zapisano zmiany';
$lang['success']['admin_modified'] = "Zapisano zmiany w administratorze";
$lang['danger']['exit_code_not_null'] = "Błšd: kod zakończenia wyniósł %d";
$lang['danger']['mailbox_not_available'] = "Skrzynka niedostępna";
$lang['danger']['username_invalid'] = "Nie można użyć nazwy użytkownika";
$lang['danger']['password_mismatch'] = "Powtórzone hasło jest niezgodne";
$lang['danger']['password_complexity'] = "Hasło niezgodne z polityką";
@ -73,7 +59,6 @@ $lang['danger']['login_failed'] = "Niepowodzenie logowania";
$lang['danger']['mailbox_invalid'] = "Nieprawidłowa nazwa skrzynki";
$lang['danger']['description_invalid'] = 'Nieprawidłowy opis źródła';
$lang['danger']['resource_invalid'] = "Nieprawidłowa nazwa zasobu";
$lang['danger']['mailbox_invalid_suggest'] = 'Nazwa skrzynki jest nieprawidłowa, czy chciałeś wpisać "%s"?';
$lang['danger']['is_alias'] = "%s został już podany jako alias";
$lang['danger']['is_alias_or_mailbox'] = "%s podano wcześniej jako alias lub skrzynkę";
$lang['danger']['is_spam_alias'] = "%s podano wcześniej jako alias dla spam";
@ -98,16 +83,11 @@ $lang['danger']['mailboxes_in_use'] = "Maks. liczba skrzynek musi być większa
$lang['danger']['aliases_in_use'] = "Maks. liczba aliasów musi być większa od lub równa %d";
$lang['danger']['sender_acl_invalid'] = "ACL Nadawcy jest nieprawidłowy";
$lang['danger']['domain_not_empty'] = "Nie można usunšć niepustej domeny";
$lang['warning']['spam_alias_temp_error'] = "Tymczasowy błąd: nie można dodać spam aliasu, proszę spróbować później.";
$lang['danger']['spam_alias_max_exceeded'] = "Przekroczono maks. dopuszczalną liczbę spam aliasów";
$lang['danger']['validity_missing'] = 'Proszę wyznaczyć termin ważności';
$lang['user']['on'] = "Aktywny";
$lang['user']['off'] = "Nieaktywny";
$lang['user']['messages'] = "wiadomości"; // "123 wiadomości"
$lang['user']['in_use'] = "Użyte";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Ustawienia użytkownika';
$lang['user']['mailbox_settings'] = ' Ustawienia skrzynki';
$lang['user']['mailbox_details'] = ' Szczegóły skrzynki';
$lang['user']['change_password'] = 'Zmień hasło';
$lang['user']['new_password'] = 'Nowe hasło';
@ -115,11 +95,8 @@ $lang['user']['save_changes'] = 'Zapisz zmiany';
$lang['user']['password_now'] = 'Bieżące hasło(potwierdź zmiany)';
$lang['user']['new_password_repeat'] = 'Potwierdź hasło(powtórz)';
$lang['user']['new_password_description'] = 'Wymagania: 6 znaków, litery i liczby.';
$lang['user']['did_you_know'] = '<b>Czy wiedziałeś?</b> Możesz używać oznakowań w Twoim adresie email ("ja+<b>prywatny</b>@example.com"), żeby automatycznie umieszczać wiadomości w folderach (na przykład: "prywatny").';
$lang['user']['spam_aliases'] = 'Tymczasowy alias email';
$lang['user']['alias'] = 'Alias';
$lang['user']['aliases'] = 'Aliasy';
$lang['user']['domain_aliases'] = 'Aliasy domeny';
$lang['user']['is_catch_all'] = 'Funkcja catch-all dla domen/y';
$lang['user']['aliases_also_send_as'] = 'Możliwe również wysłanie jako użytkownik';
$lang['user']['aliases_send_as_all'] = 'Nie sprawdzaj dostępu nadawcy dla następujących domen(y) i ich/jej aliasów';
@ -129,7 +106,6 @@ $lang['user']['alias_valid_until'] = 'Ważny do';
$lang['user']['alias_remove_all'] = 'Usuń wszystkie aliasy';
$lang['user']['alias_time_left'] = 'Pozostało';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Okres ważności';
$lang['user']['sync_jobs'] = 'Polecenie synchronizacji';
$lang['user']['hour'] = 'Godzina';
@ -163,8 +139,6 @@ $lang['user']['tls_enforce_in'] = 'Uruchom TLS przychodzące';
$lang['user']['tls_enforce_out'] = 'Uruchom TLS wychodzące';
$lang['user']['no_record'] = 'Brak rekordu';
$lang['user']['misc_settings'] = 'Ustawienia innego profilu';
$lang['user']['misc_delete_profile'] = 'Ustawienia innego profilu';
$lang['user']['tag_handling'] = 'Ustaw obsługę znaczników pocztowych';
$lang['user']['tag_in_subfolder'] = 'W podfolderze';
@ -179,7 +153,6 @@ $lang['user']['eas_reset_help'] = 'W wielu przypadkach zresetowanie pamięci pod
$lang['user']['encryption'] = 'Szyfrowanie';
$lang['user']['username'] = 'Nazwa użytkownika';
$lang['user']['password'] = 'Hasło';
$lang['user']['last_run'] = 'Ostatnie uruchomienie';
$lang['user']['excludes'] = 'Wyłączenia';
$lang['user']['interval'] = 'Zakres';
@ -187,47 +160,25 @@ $lang['user']['active'] = 'Aktywny';
$lang['user']['action'] = 'Działanie';
$lang['user']['edit'] = 'Edytuj';
$lang['user']['remove'] = 'Usuń';
$lang['user']['delete_now'] = 'Usuń teraz';
$lang['user']['create_syncjob'] = 'Utwórz nowe polecenie synchronizacji';
$lang['start']['dashboard'] = '%s - panel';
$lang['start']['start_rc'] = 'Otwórz Roundcube';
$lang['start']['start_sogo'] = 'Otwórz SOGo';
$lang['start']['mailcow_apps_detail'] = 'Użyj aplikacji mailcow, aby mieć dostęp do wiadomości, kalendarza, kontaktów i innych.';
$lang['start']['mailcow_panel'] = 'Włącz mailcow UI';
$lang['start']['mailcow_panel_description'] = 'Mailcow UI jest dostępny dla administratorów i użytkowników skrzynek.';
$lang['start']['mailcow_panel_detail'] = '<b>Administratorzy domeny</b> tworzą, modyfikują lub usuwają skrzynki i aliasy, zmieniają domeny i czytają dalsze informacje o przypisanych im domenach.<br>
<b>Użytkownicy skrzynek</b> mogą tworzyć ograniczone czasowo aliasy (aliasy spam), zmieniać swoje hasła i ustawienia filtru spam.';
$lang['start']['recommended_config'] = 'Zalecana konfiguracja (bez ActiveSync)';
$lang['start']['imap_smtp_server'] = 'IMAP- i dane serwera SMTP';
$lang['start']['imap_smtp_server_description'] = 'Zalecamy używanie <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
$lang['start']['imap_smtp_server_badge'] = 'Przeczytaj/Napisz wiadomość';
$lang['start']['imap_smtp_server_auth_info'] = 'Proszę korzystać z pełnego adresu email i mechanizmu uwierzytelniania PLAIN.<br>
Twoje dane logowania zostaną zaszyfrowane przez obowiązkowe szyfrowanie po stronie serwera.';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'Filtruj wiadomości';
$lang['start']['managesieve_description'] = 'Proszę używać <b>Mozilla Thunderbird</b> z <a style="text-decoration:none" target="_blank" href="%s"><b>rozszerzeniem nightly sieve </b></a>.<br>Uruchom Thunderbird, otwórz ustawienia rozszerzenia i przenieś nowo pobrany plik xpi do otwartego okna.<br>Nazwa serwera to <b>%s</b>, użyj portu <b>4190</b>, jeśli zostaniesz o to poproszony. Dane logowanie są takie same jak Twój email logowania.';
$lang['start']['service'] = 'Usługa';
$lang['start']['encryption'] = 'Metoda szyfrowania';
$lang['start']['help'] = 'Pokaż/Ukryj panel pomocy';
$lang['start']['hostname'] = 'Nazwa hosta';
$lang['start']['port'] = 'Port';
$lang['start']['footer'] = '';
$lang['header']['mailcow_settings'] = 'Konfiguracja';
$lang['header']['administration'] = 'Administrowanie';
$lang['header']['mailboxes'] = 'Skrzynki';
$lang['header']['user_settings'] = 'Ustawienia użytkownika';
$lang['header']['login'] = 'Zaloguj się';
$lang['header']['logged_in_as_logout'] = 'Zalogowano jako <b>%s</b> (wyloguj)';
$lang['header']['logged_in_as_logout_dual'] = 'Zalogowano jako <b>%s <span class="text-info">[%s]</span></b>';
$lang['header']['locale'] = 'Język';
$lang['mailbox']['domain'] = 'Domena';
$lang['mailbox']['spam_aliases'] = 'Alias tymczasowy';
$lang['mailbox']['multiple_bookings'] = 'Wielokrotne rejestracje';
$lang['mailbox']['kind'] = 'Rodzaj';
$lang['mailbox']['description'] = 'Opis';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['resource_name'] = 'Nazwa zasobu';
$lang['mailbox']['aliases'] = 'Aliasy';
$lang['mailbox']['domains'] = 'Domeny';
$lang['mailbox']['mailboxes'] = 'Skrzynki';
@ -236,7 +187,6 @@ $lang['mailbox']['mailbox_quota'] = 'Maks. wielkość skrzynki';
$lang['mailbox']['domain_quota'] = 'Wartość';
$lang['mailbox']['active'] = 'Aktywny';
$lang['mailbox']['action'] = 'Działanie';
$lang['mailbox']['ratelimit'] = ' Maksymalna prędkość wychodząca/h';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Aliasy domeny';
$lang['mailbox']['target_domain'] = 'Domena docelowa';
@ -246,20 +196,15 @@ $lang['mailbox']['fname'] = 'Pełna nazwa';
$lang['mailbox']['filter_table'] = 'Tabela filtru';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Wielkość';
$lang['mailbox']['in_use'] = 'W użyciu (%)';
$lang['mailbox']['msg_num'] = 'Wiadomość #';
$lang['mailbox']['remove'] = 'Usuń';
$lang['mailbox']['edit'] = 'Edytuj';
$lang['mailbox']['archive'] = 'Archiwizuj';
$lang['mailbox']['no_record'] = 'Brak rekordu dla obiektu %s';
$lang['mailbox']['no_record_single'] = 'Brak rekordu';
$lang['mailbox']['add_domain'] = 'Dodaj domenę';
$lang['mailbox']['add_domain_alias'] = 'Dodaj alias domeny';
$lang['mailbox']['add_mailbox'] = 'Dodaj skrzynkę';
$lang['mailbox']['add_resource'] = 'Dodaj zasób';
$lang['mailbox']['add_alias'] = 'Dodaj alias';
$lang['mailbox']['add_domain_record_first'] = 'Proszę najpierw dodać domenę';
$lang['mailbox']['empty'] = 'Brak wyników';
$lang['mailbox']['toggle_all'] = 'Włącz wszystkie';
$lang['mailbox']['quick_actions'] = 'Szybkie działania';
@ -268,21 +213,6 @@ $lang['mailbox']['deactivate'] = 'Wyłącz';
$lang['info']['no_action'] = 'Żadne działanie nie ma zastosowania';
$lang['delete']['title'] = 'Usuń obiekt';
$lang['delete']['remove_domain_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć domenę <b>%s</b>!';
$lang['delete']['remove_syncjob_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć polecenie synchronizacji dla użytkownika <b>%s</b>!';
$lang['delete']['remove_domainalias_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć alias domeny <b>%s</b>!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć administratora domeny <b>%s</b>!';
$lang['delete']['remove_alias_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć alias <b>%s</b>!';
$lang['delete']['remove_mailbox_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć skrzynkę <b>%s</b>!';
$lang['delete']['remove_mailbox_details'] = 'Skrzynka zostanie <b>trwale opróżniona</b>!';
$lang['delete']['remove_resource_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć zasób <b>%s</b>!';
$lang['delete']['remove_resource_details'] = 'zasób zostanie <b trwale usunięte</b>!';
$lang['delete']['remove_domain_details'] = 'Usuwasz również aliasy domeny.<br><br><b>Domena musi być pusta, aby móc ją usunąć.</b>';
$lang['delete']['remove_syncjob_details'] = 'Obiekty z danego polecenia synchronizacji nie będą więcej pobierane ze zdalnego serwera.';
$lang['delete']['remove_alias_details'] = 'Użytkownicy nie będą już mogli otrzymywać poczty na ten adres ani jej z niego wysyłać.</b>';
$lang['delete']['remove_button'] = 'Usuń';
$lang['delete']['previous'] = 'Poprzednia strona';
$lang['edit']['syncjob'] = 'Edytuj polecenie synchronizacji';
$lang['edit']['save'] = 'Zapisz zmiany';
@ -294,22 +224,17 @@ $lang['edit']['subfolder2'] = 'Synchronizuj do podfolderu w skrzynce<br><small>(
$lang['edit']['mins_interval'] = 'Zakres (min)';
$lang['edit']['exclude'] = 'Wyklucz obiekty (regex)';
$lang['edit']['save'] = 'Zapisz zmiany';
$lang['edit']['archive'] = 'Dostęp do archiwum';
$lang['edit']['max_mailboxes'] = 'Maks. liczba skrzynek';
$lang['edit']['title'] = 'Edytuj obiekt';
$lang['edit']['target_address'] = 'Adres/y Idź do <small>(rozdzielone przecinkiem)</small>';
$lang['edit']['active'] = 'Aktywny';
$lang['edit']['target_domain'] = 'Domena docelowa';
$lang['edit']['password'] = 'Hasło';
$lang['edit']['ratelimit'] = 'Maksymalna prędkość wychodząca/h';
$lang['danger']['ratelimt_less_one'] = 'Maksymalna prędkość wychodząca/h nie może być mniejsza niż 1';
$lang['edit']['password_repeat'] = 'Potwierdź hasło(powtórz)';
$lang['edit']['domain_admin'] = 'Edytuj administratora domeny';
$lang['edit']['domain'] = 'Edytuj domenę';
$lang['edit']['alias_domain'] = 'Alias domeny';
$lang['edit']['edit_alias_domain'] = 'Edytuj alias domeny';
$lang['edit']['domains'] = 'Domeny';
$lang['edit']['destroy'] = 'Ręczne wprowadzanie danych';
$lang['edit']['alias'] = 'Edytuj alias';
$lang['edit']['mailbox'] = 'Edytuj skrzynkę';
$lang['edit']['description'] = 'Opis';
@ -319,15 +244,10 @@ $lang['edit']['domain_quota'] = 'Wartość domeny';
$lang['edit']['backup_mx_options'] = 'Opcje backup MX';
$lang['edit']['relay_domain'] = 'Domena przekaźnikowa';
$lang['edit']['relay_all'] = 'Przekaż wszystkim odbiorcom';
$lang['edit']['dkim_signature'] = 'Sygnatura DKIM';
$lang['edit']['dkim_record_info'] = '<small>Proszę dodać rekord TXT o podanej wartości do swoich ustawień DNS.</small>';
$lang['edit']['relay_all_info'] = '<small>Jeśli decydujesz się <b>nie</b> przekazywać wszystkim odbiorcom, musisz dodać ("ślepą")skrzynkę dla każdego poszczególnego odbiorcy, któremu należy przekazać.</small>';
$lang['edit']['full_name'] = 'Pełna nazwa';
$lang['edit']['quota_mb'] = 'Wartość (MiB)';
$lang['edit']['sender_acl'] = 'Zezwalaj na wysłanie jako';
$lang['edit']['sender_acl_info'] = 'Nie można cofnąć wyboru aliasów.';
$lang['edit']['dkim_txt_name'] = 'Nazwa rekordu TXT:';
$lang['edit']['dkim_txt_value'] = 'Wartość rekordu TXT:';
$lang['edit']['previous'] = 'Poprzednia strona';
$lang['edit']['unchanged_if_empty'] = 'Jeżli bez zmian, nie wypełniaj';
$lang['edit']['dont_check_sender_acl'] = "Wyłącz sprawdzanie nadawcy dla domeny %s + aliasów domeny";
@ -342,22 +262,17 @@ $lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Nazwa użytkownika';
$lang['add']['enc_method'] = 'Metoda szyfrowania';
$lang['add']['mins_interval'] = 'Zakres pobierania (minuty)';
$lang['add']['maxage'] = 'Maksymalny wiek wiadomości, które będą pobierane ze zdalnego (0 = pomiń wiek)';
$lang['add']['subfolder2'] = 'Synchronizuj do podfolderu w miejscu docelowym';
$lang['add']['exclude'] = 'Wyklucz obiekty (regex)';
$lang['add']['delete2duplicates'] = 'Usuń duplikaty w miejscu docelowym';
$lang['add']['delete1'] = 'Usuń ze źródła po zakończeniu';
$lang['edit']['delete2duplicates'] = 'Usuń duplikaty w miejscu docelowym';
$lang['edit']['delete1'] = 'Usuń ze źródła po zakończeniu';
$lang['add']['title'] = 'Dodaj obiekt';
$lang['add']['domain'] = 'Domena';
$lang['add']['active'] = 'Aktywny';
$lang['add']['multiple_bookings'] = 'Wielokrotne rejestracje';
$lang['add']['save'] = 'Zapisz zmiany';
$lang['add']['description'] = 'Opis:';
$lang['add']['max_aliases'] = 'Maks. liczba aliasów:';
$lang['add']['resource_name'] = 'Nazwa zasobu';
$lang['add']['max_mailboxes'] = 'Maks. liczba skrzynek:';
$lang['add']['mailbox_quota_m'] = 'Maks. wartość na skrzynkę (MiB):';
$lang['add']['domain_quota_m'] = 'Łączna wartość domeny (MiB):';
@ -365,8 +280,6 @@ $lang['add']['backup_mx_options'] = 'Opcje Backup MX:';
$lang['add']['relay_all'] = 'Przekaż wszystkim odbiorcom';
$lang['add']['relay_domain'] = 'Domena przekaźnikowa';
$lang['add']['relay_all_info'] = '<small>Jeśli decydujesz się <b>nie</b> przekazywać wszystkim odbiorcom, musisz dodać ("ślepą")skrzynkę dla każdego poszczególnego odbiorcy, któremu należy przekazać.</small>';
$lang['add']['alias'] = 'Alias(y)';
$lang['add']['alias_spf_fail'] = '<b>Uwaga:</b> Jeśli Twój wybrany adres docelowy jest skrzynką zewnętrzną, <b>odbierający serwer pocztowy</b> może odrzucić wiadomość z powodu błędu SPF.</a>';
$lang['add']['alias_address'] = 'Alias/y:';
$lang['add']['alias_address_info'] = '<small>Pełny/e adres/y email lub @example.com, aby przejąć wszystkie wiadomości dla domeny (oddzielone przecinkami). <b>tylko domeny mailcow</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Tylko prawidłowe nazwy domen (oddzielone przecinkami).</small>';
@ -375,8 +288,6 @@ $lang['add']['target_address_info'] = '<small> Pełny/e adres/y email (oddzielon
$lang['add']['alias_domain'] = 'Alias domeny';
$lang['add']['select'] = 'Proszę wybrać...';
$lang['add']['target_domain'] = 'Domena docelowa:';
$lang['add']['mailbox'] = 'Skrzynka';
$lang['add']['resource'] = 'Zasób';
$lang['add']['kind'] = 'Rodzaj';
$lang['add']['mailbox_username'] = 'Nazwa użytkownika (lewa strona adresu email):';
$lang['add']['full_name'] = 'Pełna nazwa:';
@ -384,19 +295,11 @@ $lang['add']['quota_mb'] = 'Wartość (MiB):';
$lang['add']['select_domain'] = 'Proszę najpierw wybrać domenę';
$lang['add']['password'] = 'Hasło:';
$lang['add']['password_repeat'] = 'Potwierdź hasło(powtórz):';
$lang['add']['previous'] = 'Poprzednia strona';
$lang['add']['restart_sogo_hint'] = 'Po dodaniu nowej domeny będziesz musiał ponownie uruchomić kontener serwisowy SOGo!';
$lang['login']['title'] = 'Zaloguj się';
$lang['login']['administration'] = 'Administrowanie';
$lang['login']['administration_details'] = 'Proszę używać loginu Administratora do wykonywania zadań administracyjnych.';
$lang['login']['user_settings'] = 'Ustawienia użytkownika';
$lang['login']['user_settings_details'] = 'Użytkownicy skrzynek mogą używać mailcow UI do zmiany ich haseł, tworzenia tymczasowych aliasów (spam aliasów), dostosowania filtru spam lub importowania wiadomości z zdalnego serweru IMAP.';
$lang['login']['username'] = 'Nazwa użytkownika';
$lang['login']['password'] = 'Hasło';
$lang['login']['reset_password'] = 'Resetuj hasło';
$lang['login']['login'] = 'Zaloguj się';
$lang['login']['previous'] = "Poprzednia strona";
$lang['login']['delayed'] = 'Logowanie zostało opóźnione o %s sekund.';
$lang['tfa']['tfa'] = "Uwierzytelnianie dwuetapowe";
@ -406,16 +309,12 @@ $lang['tfa']['key_id'] = "Identyfikator dla Twojego YubiKey";
$lang['tfa']['key_id_totp'] = "Identyfikator dla Twojego klucza";
$lang['tfa']['api_register'] = 'mailcow używa Yubico Cloud API. Proszę pobrać klucz API dla Twojego klucza <a href="https://upgrade.yubico.com/getapikey/" target="_blank">here</a>';
$lang['tfa']['u2f'] = "Uwierzytelnianie U2F";
$lang['tfa']['hotp'] = "Uwierzytelnianie HOTP";
$lang['tfa']['totp'] = "Uwierzytelnianie TOTP";
$lang['tfa']['none'] = "Deaktywuj";
$lang['tfa']['delete_tfa'] = "Wyłącz TFA";
$lang['tfa']['disable_tfa'] = "Wyłącz TFA do kolejnego udanego logowania";
$lang['tfa']['confirm_tfa'] = "Potwierdź jednorazowe hasło w polu poniżej";
$lang['tfa']['confirm'] = "Potwierdź";
$lang['tfa']['otp'] = "Jednorazowe hasło";
$lang['tfa']['totp'] = "Time-based OTP (Google Authenticator itd.)";
$lang['tfa']['trash_login'] = "Login Trash";
$lang['tfa']['select'] = "Proszę wybrać";
$lang['tfa']['waiting_usb_auth'] = "<i>Czekam na urządzenie USB...</i><br><br>Wciśnij teraz przycisk na urządzeniu U2F USB.";
$lang['tfa']['waiting_usb_register'] = "<i> Czekam na urządzenie USB...</i><br><br>Wprowadź swoje hasło powyżej i potwierdź rejestrację U2F przez naciśnięcie przycisku na urządzeniu U2F USB.";
@ -432,40 +331,14 @@ $lang['admin']['f2b_max_attempts'] = 'Max. ilość prób';
$lang['admin']['f2b_retry_window'] = 'Spróbuj ponownie (s) dla max. ilości prób'; // do spr
$lang['admin']['f2b_whitelist'] = 'Biała lista sieci/hosty';
$lang['admin']['search_domain_da'] = 'Szukaj domen';
$lang['admin']['restrictions'] = 'Ograniczenia Postfix ';
$lang['admin']['rr'] = 'Ograniczenia Postfix po stronie odbiorcy';
$lang['admin']['sr'] = 'Ograniczenia Postfix po stronie nadawcy';
$lang['admin']['reset_defaults'] = 'Przywróć domyślne';
$lang['admin']['sr'] = 'Ograniczenia Postfix po stronie nadawcy';
$lang['admin']['r_inactive'] = 'Nieaktywne ograniczenia';
$lang['admin']['r_active'] = 'Aktywne ograniczenia';
$lang['admin']['r_info'] = 'Zablokowane/Wyłączone elementy na liście aktywnych ograniczeń nie są rozpoznawane przez mailcow jako prawidłowe ograniczenia i nie można ich przesunąć. Niemniej jednak nierozpoznane ograniczenia zostaną wyświetlone w kolejności pojawiania się. <br>Nowe elementy można dodać w <code>inc/vars.local.inc.php</code>, aby móc je przełączać.';
$lang['admin']['public_folders'] = 'Foldery publiczne';
$lang['admin']['public_folders_text'] = 'Przestrzeń nazw "Publiczny" zostanie utworzona. Poniższa nazwa folderu publicznego wskazuje na nazwę pierwszej automatycznie utworzonej skrzynki w ramach danej przestrzeni nazw.';
$lang['admin']['public_folder_name'] = 'Nazwa folderu <small>(alfanumeryczna)</small>';
$lang['admin']['public_folder_enable'] = 'Włącz folder publiczny';
$lang['admin']['public_folder_enable_text'] = 'Przełączenie tej opcji nie usunie wiadomości w żadnym folderze publicznym.';
$lang['admin']['public_folder_pusf'] = 'Włącz flagę widoczną dla danego użytkownika';
$lang['admin']['public_folder_pusf_text'] = 'System włączający "flagę widoczną dla danego użytkownika" nie oznaczy wiadomości jako przeczytaną dla Użytkownika B, jeśli Użytkownik A ją widział, a Użytkownik B nie.';
$lang['admin']['privacy'] = 'Bezpieczeństwo';
$lang['admin']['privacy_text'] = 'Ta opjca pozwala tabeli PCRE usunąć "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" i zastąpić "Otrzymano: od" nagłówkami z hosta lokalnego/127.0.0.1.';
$lang['admin']['privacy_anon_mail'] = 'Utajnij pocztę wychodzącą';
$lang['admin']['dkim_txt_name'] = 'Nazwa rekordu TXT:';
$lang['admin']['dkim_txt_value'] = 'Wartość rekordu TXT:';
$lang['admin']['dkim_key_length'] = 'Długość klucza DKIM (bity)';
$lang['admin']['dkim_key_valid'] = 'Prawidłowy klucz';
$lang['admin']['dkim_key_unused'] = 'Nieużywany klucz';
$lang['admin']['dkim_key_missing'] = 'Brak klucza';
$lang['admin']['dkim_key_hint'] = 'Selektor dla kluczy DKIM to zawsze <code>dkim</code>.';
$lang['admin']['previous'] = 'Poprzednia strona';
$lang['admin']['quota_mb'] = 'Wartość (MiB):';
$lang['admin']['sender_acl'] = 'Zezwalaj na wysłanie jako:';
$lang['admin']['msg_size'] = 'Rozmiar wiadomości';
$lang['admin']['msg_size_limit'] = 'Aktualny limit rozmiaru wiadomości';
$lang['admin']['msg_size_limit_details'] = 'Zastosowania nowego limitu przeładuje Postfix i serwer www.';
$lang['admin']['save'] = 'Zapisz zmiany';
$lang['admin']['maintenance'] = 'Konserwacja i Informacje';
$lang['admin']['sys_info'] = 'Informacje systemowe';
$lang['admin']['dkim_add_key'] = 'Dodaj klucz ARC/DKIM';
$lang['admin']['dkim_keys'] = 'Klucze ARC/DKIM';
$lang['admin']['add'] = 'Dodaj';
@ -488,24 +361,15 @@ $lang['admin']['unchanged_if_empty'] = 'W przypadku braku zmian, nie wypełniaj'
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Dostęp';
$lang['admin']['invalid_max_msg_size'] = 'Nieprawidłowy maks. rozmiar wiadomości';
$lang['admin']['site_not_found'] = 'Nie można zlokalizować konfiguracji witryny mailcow';
$lang['admin']['public_folder_empty'] = 'Nazwa folderu publicznego nie może pozostać pusta';
$lang['admin']['set_rr_failed'] = 'Nie można ustawić ograniczeń Postfix';
$lang['admin']['no_record'] = 'Brak rekordu';
$lang['admin']['filter_table'] = 'Tabela filtru';
$lang['admin']['empty'] = 'Brak wyników';
$lang['admin']['time'] = 'Czas';
$lang['admin']['priority'] = 'Priorytet';
$lang['admin']['message'] = 'Wiadomość';
$lang['admin']['refresh'] = 'Odśwież';
$lang['admin']['logs'] = 'Logi';
$lang['admin']['forwarding_hosts'] = 'Hosty przekazujące';
$lang['admin']['forwarding_hosts_hint'] = 'Wiadomości przychodzące od hostów wyszczególnionych tutaj są akceptowane bezwarunkowo. Dane hosty nie są następnie sprawdzane względem list DNSBL lub poddawane metodzie szarych list. Otrzymany od nich spam nie jest nigdy odrzucany, ale opcjonalnie może zostać umieszczony w folderze spam. Najpopularniejsze zastosowanie dla takiego rozwiązania to wyszczególnienie serwerów poczty, na których ustawiono przekierowanie poczty przychodzącej na Twój serwer Mailcow.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Możesz albo wyszczególnić adresy IPv4/IPv6, sieci w notacji CIDR, nazwy hostów (które zostaną rozłożone na adresy IP), albo nazwy domen (które zostaną rozłożone na adresy IP poprzez sprawdzanie rekordów SPF lub, w razie ich braku, rekordów MX).';
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'źródło';
$lang['admin']['add_forwarding_host'] = 'Dodaj hosta przekazującego';
$lang['delete']['remove_forwardinghost_warning'] = '<b>Ostrzeżenie:</b> Zamierzasz usunąć hosta przekazującego <b>%s</b>!';
$lang['success']['forwarding_host_removed'] = "Usunięto hosta przekazującego %s";
$lang['success']['forwarding_host_added'] = "Dodano hosta przekazującego %s";

View File

@ -5,12 +5,7 @@
$lang['footer']['loading'] = "Aguarde...";
$lang['getmail']['no_status'] = "Nenhum registro anterior encontrado";
$lang['dkim']['confirm'] = "Tem certeza?";
$lang['danger']['dkim_not_found'] = "Registro DKIM não encontrado";
$lang['danger']['dkim_remove_failed'] = "Não foi possível remover o registro DKIM selecionado";
$lang['danger']['dkim_add_failed'] = "Não foi possível adicionar o registro DKIM fornecido";
$lang['danger']['dkim_domain_or_sel_invalid'] = " Registro DKIM inválido";
$lang['danger']['dkim_key_length_invalid'] = "Registro DKIM com tamanho inválido";
$lang['success']['dkim_removed'] = " Registro DKIM removido com sucesso";
$lang['success']['dkim_added'] = "Registro DKIM salvo com sucesso";
$lang['danger']['access_denied'] = "Acesso negado ou dados inválidos";
@ -22,8 +17,6 @@ $lang['danger']['alias_empty'] = "Você deve preencher o campo do Apelido";
$lang['danger']['goto_empty'] = "Você deve preencher o campo Encaminhar para";
$lang['danger']['blacklist_exists'] = "O registro já existe na BlackList";
$lang['danger']['blacklist_from_invalid'] = "O registro Blacklist possui formato inválido";
$lang['danger']['whitelist_exists'] = "O registro já existe na WhiteList";
$lang['danger']['whitelist_from_invalid'] = "O registro Whitelist possui formato inválido";
$lang['danger']['alias_invalid'] = "O endereço digitado como Apelido é inválido";
$lang['danger']['goto_invalid'] = "O endereço digitado como Encaminhar para é inválido";
$lang['danger']['alias_domain_invalid'] = "O endereço do Encaminhamento de Domínio é inválido";
@ -36,26 +29,19 @@ $lang['success']['alias_added'] = "Apelido(s) adicionado(s) com sucesso";
$lang['success']['alias_modified'] = "Apelido(s) alterados(s) com sucesso";
$lang['success']['aliasd_modified'] = "Direcionamento de Domínio(s) alterados(s) com sucesso";
$lang['success']['mailbox_modified'] = "A conta %s foi alterada com sucesso";
$lang['success']['msg_size_saved'] = "Limite do tamanho de mensagem ajustado com sucesso";
$lang['danger']['aliasd_not_found'] = "Encaminhamento de Domínio não encontrado";
$lang['danger']['targetd_not_found'] = "Domínio de Destino não encontrado";
$lang['danger']['aliasd_exists'] = "Encaminhamento de Domínio já existe";
$lang['success']['aliasd_added'] = "Adicionado Encaminhamento de Domínio %s";
$lang['success']['aliasd_modified'] = "Encaminhamento de Domínio %s alterado com sucesso";
$lang['success']['domain_modified'] = "Domínio %s alterado com sucesso";
$lang['success']['domain_admin_modified'] = "Changes to domain administrator %s have been saved";
$lang['success']['domain_admin_added'] = "Domínio administrator %s has been added";
$lang['success']['changes_general'] = 'Alteração efetuada com sucesso';
$lang['success']['admin_modified'] = "Administrador alterado com sucesso";
$lang['danger']['exit_code_not_null'] = "Falha: código de erro %d";
$lang['danger']['mailbox_not_available'] = "Conta não disponível";
$lang['danger']['username_invalid'] = "Nome de usuário inválido";
$lang['danger']['password_mismatch'] = "As senhas não estão iguais";
$lang['danger']['password_complexity'] = "A senha não atende aos parâmetros de segurança";
$lang['danger']['password_empty'] = "A senha não pode ser vazia ou em branco";
$lang['danger']['login_failed'] = "Login falhou";
$lang['danger']['mailbox_invalid'] = "Conta inválida";
$lang['danger']['mailbox_invalid_suggest'] = 'Conta inválida, sugestão: "%s"?';
$lang['info']['fetchmail_planned'] = "Procedimento de retirada de emails foi agendado. Verifique o processo mais tarde.";
$lang['danger']['fetchmail_source_empty'] = "Definir a pasta de origem";
$lang['danger']['fetchmail_dest_empty'] = "Definir a pasta de destino";
@ -79,15 +65,10 @@ $lang['danger']['mailboxes_in_use'] = "O máximo de Contas deve ser maior ou igu
$lang['danger']['aliases_in_use'] = "O máximo de Apelidos deve ser maior ou igual a %d";
$lang['danger']['sender_acl_invalid'] = "Campo Sender ACL é inválido";
$lang['danger']['domain_not_empty'] = "Não é possível remover um domínio com Contas/Apelidos/Direcionamentos";
$lang['warning']['spam_alias_temp_error'] = "Falha Temporária: Não foi possível adicionar Apelido para Spam.";
$lang['danger']['spam_alias_max_exceeded'] = "O número máximo de Apelidos para Spam foi excedido";
$lang['danger']['fetchmail_active'] = "O processo esta em andamento, aguarde o seu término.";
$lang['danger']['validity_missing'] = 'Você deve definir um período de validade';
$lang['user']['on'] = "On";
$lang['user']['off'] = "Off";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Configurações do usuário';
$lang['user']['mailbox_settings'] = 'Configrações da conta';
$lang['user']['mailbox_details'] = 'Detalhes da conta';
$lang['user']['change_password'] = 'Alterar senha';
$lang['user']['new_password'] = 'Nova senha';
@ -95,10 +76,8 @@ $lang['user']['save_changes'] = 'Salvar';
$lang['user']['password_now'] = 'Senha atual (confirme a alteração)';
$lang['user']['new_password_repeat'] = 'Confirmar senha (repetir)';
$lang['user']['new_password_description'] = 'Requerido: mínimo de 6 characteres com letras e números.';
$lang['user']['did_you_know'] = '<b>Você sabia?</b> Você pode usar tags no endereço de email ("conta+<b>privado</b>@example.com") para classificar as mensagens automaticamente para uma determinada pasta (exemplo: "privado").';
$lang['user']['spam_aliases'] = 'Apelidos temporários';
$lang['user']['alias'] = 'Apelido';
$lang['user']['aliases'] = 'Apelidos';
$lang['user']['aliases_send_as_all'] = 'Não verificar remetente para os domínios';
$lang['user']['alias_create_random'] = 'Gerar um apelido automaticamente';
$lang['user']['alias_extend_all'] = 'Extender apelido por 1 hora';
@ -134,39 +113,17 @@ $lang['user']['tls_policy_warning'] = '<strong>Aviso:</strong> Se você selecion
$lang['user']['tls_policy'] = 'Regras de Encryptação';
$lang['user']['tls_enforce_in'] = 'Forçar TLS na entrada';
$lang['user']['tls_enforce_out'] = 'Forçar TLS na saída';
$lang['user']['misc_settings'] = 'Outras configurações';
$lang['user']['misc_delete_profile'] = 'Outras configurações';
$lang['user']['no_record'] = 'Nenhum registro';
$lang['start']['dashboard'] = '%s - Painel';
$lang['start']['start_rc'] = 'Webmail Roundcube';
$lang['start']['start_sogo'] = 'Abrir SOGo';
$lang['start']['mailcow_apps_detail'] = 'Use um mailcow app para acessar seus emails, calendário, contatos e outras informações.';
$lang['start']['mailcow_panel'] = 'Iniciar mailcow UI';
$lang['start']['mailcow_panel_description'] = 'O mailcow UI está disponível para Administradores e Usuários.';
$lang['start']['mailcow_panel_detail'] = '<b>Administradores:</b> podem criar, alterar ou apagar contas e apelidos , alterar domínios e outras informações de seus domínios atribuídos.<br>
<b>Usuários:</b> podem criar apelidos por tempo determinado , alterar senha e configuração do nível do filtro de spam.';
$lang['start']['recommended_config'] = 'Configuração recomendada (sem o ActiveSync)';
$lang['start']['imap_smtp_server'] = 'IMAP e SMTP server data';
$lang['start']['imap_smtp_server_description'] = 'Para uma melhor utilização use o <a href="%s" target="_blank"><b>Mozilla Thunderbird</b></a>.';
$lang['start']['imap_smtp_server_badge'] = 'Ler/Criar emails';
$lang['start']['imap_smtp_server_auth_info'] = 'Utilize o endereço de email completo com o método de autentucação PLAIN.<br>
Os dados de login serão encryptados pelo servidor.';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'Filtro de email';
$lang['start']['managesieve_description'] = 'Utilize o <b>Mozilla Thunderbird</b> com a <a style="text-decoration:none" target="_blank" href="%s"><b>extensão para sieve</b></a>.<br>Inicie o Thunderbird, acesse os Complementos e solte o arquivo xpi que foi baixado, na janela aberta.<br>Preencha com o servidor <b>%s</b>, porta <b>4190</b> se for solicitado. Os dados de acesso são os mesmos da sua conta de email.';
$lang['start']['service'] = 'Serviço';
$lang['start']['encryption'] = 'Método de criptografia';
$lang['start']['help'] = 'Mostrar/Ocultar painel de ajuda';
$lang['start']['hostname'] = 'Hostname';
$lang['start']['port'] = 'Porta';
$lang['start']['footer'] = 'Rodapé';
$lang['header']['mailcow_settings'] = 'Configuração';
$lang['header']['administration'] = 'Administração';
$lang['header']['mailboxes'] = 'Contas';
$lang['header']['user_settings'] = 'Configurações do usuário';
$lang['header']['login'] = 'Entrar';
$lang['header']['logged_in_as_logout'] = 'Olá <b>%s</b> (Clique para Sair)';
$lang['header']['locale'] = 'Idioma';
$lang['mailbox']['domain'] = 'Domínio';
$lang['mailbox']['alias'] = 'Apelido';
$lang['mailbox']['aliases'] = 'Apelidos';
@ -176,7 +133,6 @@ $lang['mailbox']['mailbox_quota'] = 'Espaço máximo da Conta';
$lang['mailbox']['domain_quota'] = 'Espaço';
$lang['mailbox']['active'] = 'Ativo';
$lang['mailbox']['action'] = 'Ação';
$lang['mailbox']['ratelimit'] = 'Limite de envios por hora';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Encaminhamento de Domínio';
$lang['mailbox']['target_domain'] = 'Domínio Destino';
@ -186,46 +142,27 @@ $lang['mailbox']['fname'] = 'Nome';
$lang['mailbox']['filter_table'] = 'Procurar';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Espaço';
$lang['mailbox']['in_use'] = 'Em uso (%)';
$lang['mailbox']['msg_num'] = 'Mensagens';
$lang['mailbox']['remove'] = 'Remover';
$lang['mailbox']['edit'] = 'Alterar';
$lang['mailbox']['archive'] = 'Arquivo';
$lang['mailbox']['no_record'] = 'Nenhum registro';
$lang['mailbox']['add_domain'] = 'Adicionar Domínio';
$lang['mailbox']['add_domain_alias'] = 'Adicionar Apelido de Domínio';
$lang['mailbox']['add_mailbox'] = 'Adicionar Conta de Email';
$lang['mailbox']['add_alias'] = 'Adicionar Apelido';
$lang['info']['no_action'] = 'Nenhuma ação foi definida';
$lang['delete']['title'] = 'Remover objeto';
$lang['delete']['remove_domain_warning'] = '<b>Aviso:</b> Você está prestes a remover o Domínio <b>%s</b>!';
$lang['delete']['remove_domainalias_warning'] = '<b>Aviso:</b> Você está prestes a remover o Encaminhamento de Domínio <b>%s</b>!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Aviso:</b> Você está prestes a remover o Administrador <b>%s</b>!';
$lang['delete']['remove_alias_warning'] = '<b>Aviso:</b> Você está prestes a remover o Apelido <b>%s</b>!';
$lang['delete']['remove_mailbox_warning'] = '<b>Aviso:</b> Você está prestes a remover a Conta <b>%s</b>!';
$lang['delete']['remove_mailbox_details'] = 'A Conta será <b>excluída permanentemente</b>!';
$lang['delete']['remove_domain_details'] = 'Esse procedimento removerá o Encaminhamento de Domínio.<br><br><b>O Domínio deve estar sem nenhuma configuração para ser removido.</b>';
$lang['delete']['remove_alias_details'] = 'Os usuários não poderão mais enviar ou receber emails através deste endereço.</b>';
$lang['delete']['remove_button'] = 'Remover';
$lang['delete']['previous'] = 'Voltar';
$lang['edit']['save'] = 'Salvar';
$lang['edit']['archive'] = 'Acesso ao arquivo';
$lang['edit']['max_mailboxes'] = 'Máximo de contas:';
$lang['edit']['title'] = 'Editar dos Objetos';
$lang['edit']['target_address'] = 'Enviar para os emails <small>(separar por vírgula)</small>:';
$lang['edit']['active'] = 'Ativo';
$lang['edit']['target_domain'] = 'Domínio de Destino:';
$lang['edit']['password'] = 'Senha:';
$lang['edit']['ratelimit'] = 'Volume de envios por hora:';
$lang['danger']['ratelimt_less_one'] = 'Limite da taxa de saída por hora não pode ser inferior a 1';
$lang['edit']['password_repeat'] = 'Confirmar senha (repetir):';
$lang['edit']['domain_admin'] = 'Editar administrador de domínio';
$lang['edit']['domain'] = 'Editar domínio';
$lang['edit']['alias_domain'] = 'Encaminhar domínio';
$lang['edit']['edit_alias_domain'] = 'Editar encaminhamento de domínio';
$lang['edit']['domains'] = 'Domínios';
$lang['edit']['destroy'] = 'Inserir manualmente';
$lang['edit']['alias'] = 'Editar apelido';
$lang['edit']['mailbox'] = 'Editar conta';
$lang['edit']['description'] = 'Descrição:';
@ -235,22 +172,15 @@ $lang['edit']['domain_quota'] = 'Espaço do domínio:';
$lang['edit']['backup_mx_options'] = 'Opções de Backup MX:';
$lang['edit']['relay_domain'] = 'Relay de domínio';
$lang['edit']['relay_all'] = 'Relay para todas as contas';
$lang['edit']['dkim_signature'] = 'Assinatura ARC + DKIM:';
$lang['edit']['dkim_record_info'] = '<small>Adicione um registro TXT com o mesmo a mesma configuração dos registros DNS.</small>';
$lang['edit']['relay_all_info'] = '<small>Se você escolher <b>não</b> direcionar todas as contas de email, você deve adicionar um ("blind") para cada uma das contas.</small>';
$lang['edit']['full_name'] = 'Nome completo';
$lang['edit']['quota_mb'] = 'Espaço (MiB)';
$lang['edit']['sender_acl'] = 'Permitir Enviar como';
$lang['edit']['sender_acl_info'] = 'Apelidos não podem ser removidos.';
$lang['edit']['dkim_txt_name'] = 'Nome do registro TXT:';
$lang['edit']['dkim_txt_value'] = 'Valor do registro TXT:';
$lang['edit']['previous'] = 'Voltar';
$lang['edit']['unchanged_if_empty'] = 'Deixar em branco para não modificar';
$lang['edit']['dont_check_sender_acl'] = 'Não verificar o remetente para o domínio %s';
$lang['add']['title'] = 'Adicionar objeto';
$lang['add']['domain'] = 'Domínio';
$lang['add']['active'] = 'Ativo';
$lang['add']['save'] = 'Salvar';
$lang['add']['description'] = 'Descrição:';
$lang['add']['max_aliases'] = 'Máximo de apelidos:';
$lang['add']['max_mailboxes'] = 'Máximo de contas:';
@ -260,8 +190,6 @@ $lang['add']['backup_mx_options'] = 'Opções Backup MX:';
$lang['add']['relay_all'] = 'Relay para todas as contas';
$lang['add']['relay_domain'] = 'Relay para todo domínio';
$lang['add']['relay_all_info'] = '<small>Se <b>não</b> selecionar para retransmitir todas as contas, você deve adicionar uma ("blind") para cada conta que será direcionada.</small>';
$lang['add']['alias'] = 'Apelido(s)';
$lang['add']['alias_spf_fail'] = '<b>Aviso:</b> Se você escolher uma conta externa, o <b>servidor externo</b> poderá rejeitar algumas mensagens por erro de SPF.</a>';
$lang['add']['alias_address'] = 'Apelidos:';
$lang['add']['alias_address_info'] = '<small>Endereço de email completo ou @example.com, para uma conta coringa -catch all. (separado por vírgula). <b>apenas domínios cadastrados</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Domínios válidos apenas (separado por vírgulas).</small>';
@ -270,25 +198,16 @@ $lang['add']['target_address_info'] = '<small>Endereço de email completo (separ
$lang['add']['alias_domain'] = 'Encaminhamento de Domínio';
$lang['add']['select'] = 'Selecione...';
$lang['add']['target_domain'] = 'Domínio de Destino:';
$lang['add']['mailbox'] = 'Conta';
$lang['add']['mailbox_username'] = 'Usuário (primeira parte do endereço de email):';
$lang['add']['full_name'] = 'Nome:';
$lang['add']['quota_mb'] = 'Espaço (MiB):';
$lang['add']['select_domain'] = 'Selecione um domínio antes';
$lang['add']['password'] = 'Senha:';
$lang['add']['password_repeat'] = 'Confirmar a senha (repetir):';
$lang['add']['previous'] = 'Voltar';
$lang['add']['port'] = 'Port';
$lang['login']['title'] = 'Entrar';
$lang['login']['administration'] = 'Administração';
$lang['login']['administration_details'] = 'Utilize o login de Administrador para efetuar tarefas de administração.';
$lang['login']['user_settings'] = 'Configuração do usuário';
$lang['login']['user_settings_details'] = 'Usuários podem utilizar o mailcow UI para alterar suas senhas, criar apelidos temporários (Apelido Anti-Spam), adjustar a sensibilidade do filtro the spam ou importar mensagens de um servidor IMAP.';
$lang['login']['username'] = 'Usuário';
$lang['login']['password'] = 'Senha';
$lang['login']['reset_password'] = 'Esqueci minha senha';
$lang['login']['login'] = 'Entrar';
$lang['login']['previous'] = "Voltar";
$lang['login']['delayed'] = 'Sua entrada será atrasada por %s segundos.';
$lang['login']['tfa'] = "Autenticação em duas etapas";
$lang['login']['tfa_details'] = "Confirme sua senha no campo abaixo";
@ -296,36 +215,11 @@ $lang['login']['confirm'] = "Confirmar";
$lang['login']['otp'] = "Senha única";
$lang['login']['trash_login'] = "Tentativas de entrada";
$lang['admin']['search_domain_da'] = 'Selecione o(s) domínio(s)';
$lang['admin']['restrictions'] = 'Postfix Restrictions';
$lang['admin']['rr'] = 'Postfix Recipient Restrictions';
$lang['admin']['sr'] = 'Postfix Sender Restrictions';
$lang['admin']['reset_defaults'] = 'Voltar configuração padrão';
$lang['admin']['sr'] = 'Postfix Sender Restrictions';
$lang['admin']['r_inactive'] = 'Restrictions Inativos';
$lang['admin']['r_active'] = 'Restrictions Ativos';
$lang['admin']['r_info'] = 'Greyed out/disabled elements on the list of active restrictions are not known as valid restrictions to mailcow and cannot be moved. Unknown restrictions will be set in order of appearance anyway. <br>You can add new elements in <code>inc/vars.local.inc.php</code> to be able to toggle them.';
$lang['admin']['public_folders'] = 'Pastas públicas';
$lang['admin']['public_folders_text'] = 'A pasta "Public" esta criada. Abaixo a pasta pública indica o nome da primeira pasta criada automaticamente na conta, com este nome.';
$lang['admin']['public_folder_name'] = 'Nome da Pasta <small>(alfa numérico)</small>';
$lang['admin']['public_folder_enable'] = 'Habilitar Pasta Pública';
$lang['admin']['public_folder_enable_text'] = 'Ao alterar esta configuração os emails das pastas públicas não serão apagados.';
$lang['admin']['public_folder_pusf'] = 'Habilitar visualização por usuário';
$lang['admin']['public_folder_pusf_text'] = 'A "per-user seen flag"-enabled system will not mark a mail as read for User B, when User A has seen it, but User B did not.';
$lang['admin']['privacy'] = 'Privacidade';
$lang['admin']['privacy_text'] = 'Esta opção habilita a tabela PCRE para remover "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" e substitui pelo Header "Received: from" localhost/127.0.0.1.';
$lang['admin']['privacy_anon_mail'] = 'Limpar o Cabeçalho dos emails de saída';
$lang['admin']['dkim_txt_name'] = 'Registro TXT:';
$lang['admin']['dkim_txt_value'] = 'Valor do TXT:';
$lang['admin']['dkim_key_length'] = 'Tamanho do registro DKIM (bits)';
$lang['admin']['previous'] = 'Voltar';
$lang['admin']['quota_mb'] = 'Espaço (MiB):';
$lang['admin']['sender_acl'] = 'Permitir Enviar como:';
$lang['admin']['msg_size'] = 'Tamanho da mensagem';
$lang['admin']['msg_size_limit'] = 'Tamanho limite de mensagem atual';
$lang['admin']['msg_size_limit_details'] = 'Ao aplicar um novo limite os Serviços de Email e Web serão reiniciados.';
$lang['admin']['save'] = 'Salvar';
$lang['admin']['maintenance'] = 'Manutenção e Informação';
$lang['admin']['sys_info'] = 'Informações de Sistema';
$lang['admin']['dkim_add_key'] = 'Adicionar registro ARC/DKIM';
$lang['admin']['dkim_keys'] = 'Registro ARC/DKIM';
$lang['admin']['add'] = 'Salvar';
@ -347,8 +241,4 @@ $lang['admin']['unchanged_if_empty'] = 'Deixar em branco para não alterar';
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Acessos';
$lang['admin']['invalid_max_msg_size'] = 'Tamanho máximo da mensagem inválido';
$lang['admin']['site_not_found'] = 'Não foi possível localizar as configuração do painel mailcow';
$lang['admin']['public_folder_empty'] = 'O nome da Pasta Pública deve ser preenchido';
$lang['admin']['set_rr_failed'] = 'Não foi possível alterar Postfix Restrictions';
$lang['admin']['no_record'] = 'Nenhum registro';

View File

@ -14,12 +14,7 @@ $lang['footer']['delete_these_items'] = 'Пожалуйста, подтверд
$lang['footer']['delete_now'] = 'Удалить';
$lang['footer']['cancel'] = 'Отмена';
$lang['dkim']['confirm'] = "Вы уверены?";
$lang['danger']['dkim_not_found'] = "DKIM ключ не найден";
$lang['danger']['dkim_remove_failed'] = "Не удается удалить выбранный DKIM ключ";
$lang['danger']['dkim_add_failed'] = "Невозможно добавить данный DKIM ключ";
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM домен или селектор недопустимы";
$lang['danger']['dkim_key_length_invalid'] = "Недопустимая длина DKIM ключа";
$lang['success']['dkim_removed'] = "DKIM ключ %s удален";
$lang['success']['dkim_added'] = "DKIM ключ сохранен";
$lang['danger']['access_denied'] = "Доступ запрещен или указаны неверные данные";
@ -33,8 +28,6 @@ $lang['danger']['last_key'] = 'Нельзя удалить последний к
$lang['danger']['goto_empty'] = "Основной адрес не может быть пустым";
$lang['danger']['policy_list_from_exists'] = "Запись с указанным именем уже существует";
$lang['danger']['policy_list_from_invalid'] = "Запись имеет недопустимый формат";
$lang['danger']['whitelist_exists'] = "Указанная запись уже существует в белом списке";
$lang['danger']['whitelist_from_invalid'] = "Запись белого списка имеет неверный формат";
$lang['danger']['alias_invalid'] = "Недопустимый псевдоним адрес";
$lang['danger']['goto_invalid'] = "Недопустимый основной адрес";
$lang['danger']['alias_domain_invalid'] = "Недопустимый псевдоним домена";
@ -50,19 +43,13 @@ $lang['success']['mailbox_modified'] = "Изменения почтового я
$lang['success']['resource_modified'] = "Изменения почтового ящика %s сохранены";
$lang['success']['object_modified'] = "Изменения объекта %s сохранены";
$lang['success']['f2b_modified'] = "Изменения параметров Fail2ban сохранены";
$lang['success']['msg_size_saved'] = "Установить ограничение на размер сообщения";
$lang['danger']['aliasd_not_found'] = "Псевдоним домена не найден";
$lang['danger']['targetd_not_found'] = "Основной домен не найден";
$lang['danger']['aliasd_exists'] = "Псевдоним домена уже существует";
$lang['success']['aliasd_added'] = "Добавлен псевдоним домена %s";
$lang['success']['aliasd_modified'] = "Сохранить изменения псевдонима домена %s";
$lang['success']['domain_modified'] = "Сохранить изменения домена %s";
$lang['success']['domain_admin_modified'] = "Сохранить изменения администратора домена %s";
$lang['success']['domain_admin_added'] = "Администратор домена %s добавлен";
$lang['success']['changes_general'] = 'Изменения сохранены';
$lang['success']['admin_modified'] = "Изменения администратора домена сохранены";
$lang['danger']['exit_code_not_null'] = "Ошибка: Код ошибки %d";
$lang['danger']['mailbox_not_available'] = "Почтовый ящик недоступен";
$lang['danger']['username_invalid'] = "Нельзя использовать это имя пользователя";
$lang['danger']['password_mismatch'] = "Введенные пароли не совпадают";
$lang['danger']['password_complexity'] = "Пароль не соответствует требованиям";
@ -71,7 +58,6 @@ $lang['danger']['login_failed'] = "Введен неверный логин ил
$lang['danger']['mailbox_invalid'] = "Недопустимый адрес почтового ящика";
$lang['danger']['description_invalid'] = 'Недопустимое описание ресурса';
$lang['danger']['resource_invalid'] = "Недопустимое имя ресурса";
$lang['danger']['mailbox_invalid_suggest'] = 'Недопустимое имя почтового ящика, возможно вы имели в виду "%s"?';
$lang['danger']['is_alias'] = "%s уже известен как псевдоним адреса";
$lang['danger']['is_alias_or_mailbox'] = "%s уже известен как псевдоним или почтовый ящик";
$lang['danger']['is_spam_alias'] = "%s уже известен как временный адрес псевдонима";
@ -96,16 +82,11 @@ $lang['danger']['mailboxes_in_use'] = "Максимальный лимит по
$lang['danger']['aliases_in_use'] = "Максимальный лимит псевдоним адресов должен быть больше или равен %d";
$lang['danger']['sender_acl_invalid'] = "Недопустимое значение ACL отправителя";
$lang['danger']['domain_not_empty'] = "Нельзя удалить непустой домен";
$lang['warning']['spam_alias_temp_error'] = "Временная ошибка: не удается добавить временный псевдоним адрес, пожалуйста, попробуйте еще раз позже.";
$lang['danger']['spam_alias_max_exceeded'] = "Превышение максимально разрешенных временных псевдоним адресов";
$lang['danger']['validity_missing'] = 'Пожалуйста, назначьте срок действия';
$lang['user']['on'] = "Вкл.";
$lang['user']['off'] = "Выкл.";
$lang['user']['messages'] = "письма"; // "123 messages"
$lang['user']['in_use'] = "Используется";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Настройки пользователя';
$lang['user']['mailbox_settings'] = 'Настройки почтового ящика';
$lang['user']['mailbox_details'] = 'Сведения о почтовом ящике';
$lang['user']['change_password'] = 'Смена пароля';
$lang['user']['client_configuration'] = 'Конфигурации для клиентов электронной почты и смартфонов';
@ -114,11 +95,8 @@ $lang['user']['save_changes'] = 'Сохранить изменения';
$lang['user']['password_now'] = 'Текущий пароль (подтверждение изменения)';
$lang['user']['new_password_repeat'] = 'Подтверждение пароля (повтор)';
$lang['user']['new_password_description'] = 'Требование: 6 символов, букв и цифр.';
$lang['user']['did_you_know'] = '<b>Знаете ли вы?</b> Вы можете использовать теги в вашем адресе электронной почты ("news+<b>my</b>@example.com") для автоматического перемещения сообщений в папку (пример: "news").';
$lang['user']['spam_aliases'] = 'Временные псевдонимы электронной почты';
$lang['user']['alias'] = 'Псевдоним';
$lang['user']['aliases'] = 'Псевдонимы';
$lang['user']['domain_aliases'] = 'Адреса псевдонимов домена';
$lang['user']['is_catch_all'] = 'Catch-all для домена';
$lang['user']['aliases_also_send_as'] = 'Также разрешено отправлять как пользователь';
$lang['user']['aliases_send_as_all'] = 'Не проверять доступ отправителя для следующих доменов и псевдонимов домена';
@ -128,7 +106,6 @@ $lang['user']['alias_valid_until'] = 'Действителен до';
$lang['user']['alias_remove_all'] = 'Удалить все псевдоним адреса';
$lang['user']['alias_time_left'] = 'Осталось времени';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['syncjob_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Период действия';
$lang['user']['sync_jobs'] = 'Задания синхронизации';
$lang['user']['hour'] = 'Час';
@ -161,8 +138,6 @@ $lang['user']['tls_enforce_in'] = 'Принудительное TLS входящ
$lang['user']['tls_enforce_out'] = 'Принудительное TLS исходящих';
$lang['user']['no_record'] = 'Нет записи';
$lang['user']['misc_settings'] = 'Другие настройки профиля';
$lang['user']['misc_delete_profile'] = 'Другие настройки профиля';
$lang['user']['tag_handling'] = 'Set handling for tagged mail';
$lang['user']['tag_in_subfolder'] = 'В подпапку';
@ -177,7 +152,6 @@ $lang['user']['eas_reset_help'] = 'In many cases a device cache reset will help
$lang['user']['encryption'] = 'Шифрование';
$lang['user']['username'] = 'Имя пользователя';
$lang['user']['password'] = 'Пароль';
$lang['user']['last_run'] = 'Последний запуск';
$lang['user']['excludes'] = 'Исключает';
$lang['user']['interval'] = 'Интервал';
@ -185,45 +159,22 @@ $lang['user']['active'] = 'Активный';
$lang['user']['action'] = 'Действия';
$lang['user']['edit'] = 'Изменить';
$lang['user']['remove'] = 'Удалить';
$lang['user']['delete_now'] = 'Удалить сейчас';
$lang['user']['create_syncjob'] = 'Создание нового задания синхронизации';
$lang['start']['dashboard'] = '%s - панель';
$lang['start']['start_rc'] = 'Открыть Roundcube';
$lang['start']['start_sogo'] = 'Открыть SOGo';
$lang['start']['mailcow_apps_detail'] = 'Используйте приложения для доступа к вашей почте, календарю, контактам и многое другое.';
$lang['start']['mailcow_panel'] = 'Открыть пользовательский интерфейс mailcow';
$lang['start']['mailcow_panel_description'] = 'Пользовательский интерфейс mailcow доступен для администраторов и пользователей почтовых ящиков.';
$lang['start']['mailcow_panel_detail'] = '<b>Администраторы домена</b> создавать, изменять или удалять почтовые ящики и псевдонимы, изменение доменов и смотреть информацию о своих назначенных доменов. <br><b>Пользователи почтовых ящиков</b> имеют возможность создавать временные псевдонимы (спам псевдонимы), менять свой пароль и настройки фильтра спама.';
$lang['start']['recommended_config'] = 'Рекомендуемая конфигурация (без ActiveSync)';
$lang['start']['imap_smtp_server'] = 'Данные сервера IMAP и SMTP';
$lang['start']['imap_smtp_server_description'] = 'Для получения наилучших результатов мы рекомендуем использовать <a href="%s" target="_blank"> <b>Mozilla Thunderbird</b></a>.';
$lang['start']['imap_smtp_server_badge'] = 'Read/Write emails';
$lang['start']['imap_smtp_server_auth_info'] = 'Пожалуйста, используйте ваш полный адрес электронной почты и механизма обычной проверки подлинности. <br>Ваши регистрационные данные будут зашифрованы на стороне сервера обязательного шифрования.';
$lang['start']['managesieve'] = 'ManageSieve';
$lang['start']['managesieve_badge'] = 'Фильтр почты';
$lang['start']['managesieve_description'] = 'Please use <b>Mozilla Thunderbird</b> with the <a style="text-decoration:none" target="_blank" href="%s"><b>nightly sieve extension</b></a>.<br>Start Thunderbird, open the add-on settings and drop the newly downloaded xpi file into the opened window.<br>The server name is <b>%s</b>, use port <b>4190</b> if you are asked for. The login data match your email login.';
$lang['start']['service'] = 'Сервисы';
$lang['start']['encryption'] = 'Метод шифрования';
$lang['start']['help'] = 'Справка';
$lang['start']['hostname'] = 'Имя хоста';
$lang['start']['port'] = 'Порт';
$lang['start']['footer'] = '';
$lang['header']['mailcow_settings'] = 'Конфигурация';
$lang['header']['administration'] = 'Администрирование';
$lang['header']['mailboxes'] = 'Почтовые ящики';
$lang['header']['user_settings'] = 'Настройки пользователя';
$lang['header']['login'] = 'Логин';
$lang['header']['logged_in_as_logout'] = 'Вы вошли как <b>%s</b> (выйти)';
$lang['header']['logged_in_as_logout_dual'] = 'Вы вошли как <b>%s <span class="text-info">[%s]</span></b>';
$lang['header']['locale'] = 'Язык';
$lang['mailbox']['domain'] = 'Домен';
$lang['mailbox']['spam_aliases'] = 'Временный псевдоним';
$lang['mailbox']['multiple_bookings'] = 'Multiple bookings';
$lang['mailbox']['kind'] = 'Вид';
$lang['mailbox']['description'] = 'Описание';
$lang['mailbox']['alias'] = 'Псевдоним';
$lang['mailbox']['resource_name'] = 'Название ресурса';
$lang['mailbox']['aliases'] = 'Псевдонимы';
$lang['mailbox']['domains'] = 'Домены';
$lang['mailbox']['mailboxes'] = 'Почтовые ящики';
@ -232,7 +183,6 @@ $lang['mailbox']['mailbox_quota'] = 'Максимальный размер по
$lang['mailbox']['domain_quota'] = 'Квота';
$lang['mailbox']['active'] = 'Активный';
$lang['mailbox']['action'] = 'Действия';
$lang['mailbox']['ratelimit'] = 'Outgoing rate limit/h';
$lang['mailbox']['backup_mx'] = 'Резервное копирование MX';
$lang['mailbox']['domain_aliases'] = 'Псевдонимы доменов';
$lang['mailbox']['target_domain'] = 'Целевой домен';
@ -242,20 +192,15 @@ $lang['mailbox']['fname'] = 'Полное имя';
$lang['mailbox']['filter_table'] = 'Поиск';
$lang['mailbox']['yes'] = '&#10004;';
$lang['mailbox']['no'] = '&#10008;';
$lang['mailbox']['quota'] = 'Квота';
$lang['mailbox']['in_use'] = 'Использовано (%)';
$lang['mailbox']['msg_num'] = 'Письма #';
$lang['mailbox']['remove'] = 'Удалить';
$lang['mailbox']['edit'] = 'Изменить';
$lang['mailbox']['archive'] = 'Архив';
$lang['mailbox']['no_record'] = 'Нет записей для объекта %s';
$lang['mailbox']['no_record_single'] = 'Нет записей';
$lang['mailbox']['add_domain'] = 'Добавить домен';
$lang['mailbox']['add_domain_alias'] = 'Добавить псевдоним домена';
$lang['mailbox']['add_mailbox'] = 'Добавить почтовый ящик';
$lang['mailbox']['add_resource'] = 'Добавить ресурс';
$lang['mailbox']['add_alias'] = 'Добавить псевдоним';
$lang['mailbox']['add_domain_record_first'] = 'Пожалуйста, сначала добавьте домен';
$lang['mailbox']['empty'] = 'Нет результатов';
$lang['mailbox']['toggle_all'] = 'Выбрать все';
$lang['mailbox']['quick_actions'] = 'Действия';
@ -267,21 +212,6 @@ $lang['mailbox']['last_run'] = 'Последний запуск';
$lang['info']['no_action'] = 'Действий не предусмотрено';
$lang['delete']['title'] = 'Удалить объект';
$lang['delete']['remove_domain_warning'] = '<b>Внимание:</b> Вы собираетесь удалить домен <b>%s</b>!';
$lang['delete']['remove_syncjob_warning'] = '<b>Внимание:</b> Вы собираетесь удалить задание синхронизации пользователя <b>%s</b>!';
$lang['delete']['remove_domainalias_warning'] = '<b>Внимание:</b> Вы собираетесь удалить псевдоним домена <b>%s</b>!';
$lang['delete']['remove_domainadmin_warning'] = '<b>Внимание:</b> Вы собираетесь удалить администратора домена <b>%s</b>!';
$lang['delete']['remove_alias_warning'] = '<b>Внимание:</b> Вы собираетесь удалить псевдоним адреса <b>%s</b>!';
$lang['delete']['remove_mailbox_warning'] = '<b>Внимание:</b> Вы собираетесь удалить почтовый ящик <b>%s</b>!';
$lang['delete']['remove_mailbox_details'] = 'Почтовый ящик будет <b>очищен навсегда</b>!';
$lang['delete']['remove_resource_warning'] = '<b>Внимание:</b> Вы собираетесь удалить ресурс <b>%s</b>!';
$lang['delete']['remove_resource_details'] = 'Ресурс будет <b>очищен навсегда</b>!';
$lang['delete']['remove_domain_details'] = 'Это действие также удаляет псевдонимы домена. <br><br><b>Домен должен быть пустым для удаления.</b>';
$lang['delete']['remove_syncjob_details'] = 'Объекты из этого задания синхронизации больше не будут извлекаться с удаленного сервера.';
$lang['delete']['remove_alias_details'] = 'Пользователи больше не смогут получать почту или отправлять почту с этого адреса.</b>';
$lang['delete']['remove_button'] = 'Удалить';
$lang['delete']['previous'] = 'Предыдущая страница';
$lang['edit']['syncjob'] = 'Изменить задание синхронизации';
$lang['edit']['username'] = 'Имя пользователя';
@ -292,22 +222,17 @@ $lang['edit']['subfolder2'] = 'Sync into subfolder on destination<br><small>(emp
$lang['edit']['mins_interval'] = 'Интервал (минуты)';
$lang['edit']['exclude'] = 'Исключить объекты (regex)';
$lang['edit']['save'] = 'Сохранить изменения';
$lang['edit']['archive'] = 'Доступ в архив';
$lang['edit']['max_mailboxes'] = 'Максимум почтовых ящиков';
$lang['edit']['title'] = 'Изменение объекта';
$lang['edit']['target_address'] = 'Goto address/es <small>(comma-separated)</small>';
$lang['edit']['active'] = 'Активный';
$lang['edit']['target_domain'] = 'Целевой домен';
$lang['edit']['password'] = 'Пароль';
$lang['edit']['ratelimit'] = 'Outgoing rate limit/h';
$lang['danger']['ratelimt_less_one'] = 'Outgoing rate limit/h must not be less than 1';
$lang['edit']['password_repeat'] = 'Подтверждение пароля (повтор)';
$lang['edit']['domain_admin'] = 'Изменение администратора домена';
$lang['edit']['domain'] = 'Изменение домена';
$lang['edit']['alias_domain'] = 'Псевдоним домена';
$lang['edit']['edit_alias_domain'] = 'Изменить псевдоним домена';
$lang['edit']['domains'] = 'Домены';
$lang['edit']['destroy'] = 'Ручной ввод данных';
$lang['edit']['alias'] = 'Изменить псевдоним';
$lang['edit']['mailbox'] = 'Изменение почтового ящика';
$lang['edit']['description'] = 'Описание';
@ -317,22 +242,16 @@ $lang['edit']['domain_quota'] = 'Квота домена';
$lang['edit']['backup_mx_options'] = 'Параметры резервного копирования MX';
$lang['edit']['relay_domain'] = 'Домен ретрансляции';
$lang['edit']['relay_all'] = 'Ретрансляция всех получателей';
$lang['edit']['dkim_signature'] = 'ARC + DKIM подпись';
$lang['edit']['dkim_record_info'] = '<small>Please add a TXT record with the given value to your DNS settings.</small>';
$lang['edit']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
$lang['edit']['full_name'] = 'Полное имя';
$lang['edit']['quota_mb'] = 'Квота (MiB)';
$lang['edit']['sender_acl'] = 'Allow to send as';
$lang['edit']['sender_acl_info'] = 'Псевдонимы не могут быть отменены.';
$lang['edit']['dkim_txt_name'] = 'Имя TXT записи:';
$lang['edit']['dkim_txt_value'] = 'Значение TXT записи:';
$lang['edit']['previous'] = 'Предыдущая страница';
$lang['edit']['unchanged_if_empty'] = 'Если без изменений оставьте пустым';
$lang['edit']['dont_check_sender_acl'] = "Отключить проверку отправителя для домена %s + псевдонимов домена";
$lang['edit']['multiple_bookings'] = 'Multiple bookings';
$lang['edit']['kind'] = 'Вид';
$lang['edit']['resource'] = 'Ресурс';
$lang['edit']['goto_null'] = 'Отключить почту';
$lang['add']['syncjob'] = 'Добавить задание синхронизации';
$lang['add']['syncjob_hint'] = 'Имейте в виду, что пароли должны быть сохранены в виде простого текста!';
@ -341,8 +260,6 @@ $lang['add']['port'] = 'Порт';
$lang['add']['username'] = 'Имя пользователя';
$lang['add']['enc_method'] = 'Метод шифрования';
$lang['add']['mins_interval'] = 'Интервал опроса (в минутах)';
$lang['add']['maxage'] = 'Максимальный возраст писем в днях, которые будут опрошены с удаленного хоста (0 = игнорировать возраст)';
$lang['add']['subfolder2'] = 'Синхронизировать в подпапку по назначению';
$lang['add']['exclude'] = 'Исключить объекты (regex)';
$lang['add']['delete2duplicates'] = 'Удаление дубликатов по назначению';
$lang['add']['delete1'] = 'Удаление из источника после завершения';
@ -351,14 +268,11 @@ $lang['edit']['delete2duplicates'] = 'Удаление дубликатов по
$lang['edit']['delete1'] = 'Удаление из источника после завершения';
$lang['edit']['delete2'] = 'Удаление писем по месту назначения, которые не находятся на исходном';
$lang['add']['title'] = 'Добавить объект';
$lang['add']['domain'] = 'Домен';
$lang['add']['active'] = 'Активный';
$lang['add']['multiple_bookings'] = 'Multiple bookings';
$lang['add']['save'] = 'Сохранить изменения';
$lang['add']['description'] = 'Описание';
$lang['add']['max_aliases'] = 'Максимум псевдонимов';
$lang['add']['resource_name'] = 'Название ресурса';
$lang['add']['max_mailboxes'] = 'Максимум почтовых ящиков';
$lang['add']['mailbox_quota_m'] = 'Максимальная квота почтового ящика (MiB)';
$lang['add']['domain_quota_m'] = 'Квота домена (MiB)';
@ -366,8 +280,6 @@ $lang['add']['backup_mx_options'] = 'Параметры резервного к
$lang['add']['relay_all'] = 'Ретрансляция всех получателей';
$lang['add']['relay_domain'] = 'Ретрансляция этого домена';
$lang['add']['relay_all_info'] = '<small>Если вы выбрали <b>не</b> для ретрансляции всех получателей, вам нужно будет добавить ("слепой") почтовый ящик для каждого получателя, который должен быть ретранслирован.</small>';
$lang['add']['alias'] = 'Псевдоним(ы)';
$lang['add']['alias_spf_fail'] = '<b>Note:</b> If your chosen destination address is an external mailbox, the <b>receiving mailserver</b> may reject your message due to an SPF failure.</a>';
$lang['add']['alias_address'] = 'Псевдоним адрес(а)';
$lang['add']['alias_address_info'] = '<small>Полный почтовый адрес(а) или @example.com, чтобы поймать все сообщения для домена (разделенных запятыми). <b>только домены mailcow</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Действительные имена доменов (разделенные запятыми).</small>';
@ -376,8 +288,6 @@ $lang['add']['target_address_info'] = '<small>Адрес(а) почтовых я
$lang['add']['alias_domain'] = 'Псевдоним домена';
$lang['add']['select'] = 'Пожалуйста, выберите...';
$lang['add']['target_domain'] = 'Целевой домен';
$lang['add']['mailbox'] = 'Почтовый ящик';
$lang['add']['resource'] = 'Ресурс';
$lang['add']['kind'] = 'Вид';
$lang['add']['mailbox_username'] = 'Имя пользователя (часть адреса электронной почты слева)';
$lang['add']['full_name'] = 'Полное имя';
@ -385,20 +295,12 @@ $lang['add']['quota_mb'] = 'Квота (MiB)';
$lang['add']['select_domain'] = 'Пожалуйста, сначала выберите домен';
$lang['add']['password'] = 'Пароль';
$lang['add']['password_repeat'] = 'Подтверждение пароля (повтор)';
$lang['add']['previous'] = 'Предыдущая страница';
$lang['add']['restart_sogo_hint'] = 'После добавления нового домена вам необходимо перезагрузить контейнер службы SOGo!';
$lang['add']['goto_null'] = 'Отключить почту';
$lang['login']['title'] = 'Логин';
$lang['login']['administration'] = 'Администрирование';
$lang['login']['administration_details'] = 'Пожалуйста, используйте вашу учетную запись администратора для выполнения административных задач.';
$lang['login']['user_settings'] = 'Настройки пользователя';
$lang['login']['user_settings_details'] = 'Пользователи почтовых ящиков могут использовать пользовательский интерфейс mailcow для изменения пароля, создавать временные псевдонимы (спам псевдонимы), настроить поведение фильтра спама или импортировать сообщения из удаленного сервера IMAP.';
$lang['login']['username'] = 'Имя пользователя';
$lang['login']['password'] = 'Пароль';
$lang['login']['reset_password'] = 'Сбросить мой пароль';
$lang['login']['login'] = 'Логин';
$lang['login']['previous'] = "Предыдущая страница";
$lang['login']['delayed'] = 'Вход был задержан на %s секунд.';
$lang['tfa']['tfa'] = "Двухфакторная проверка подлинности";
@ -408,15 +310,11 @@ $lang['tfa']['key_id'] = "Идентификатор вашего YubiKey";
$lang['tfa']['key_id_totp'] = "Идентификатор для вашего ключа";
$lang['tfa']['api_register'] = 'mailcow uses the Yubico Cloud API. Please get an API key for your key <a href="https://upgrade.yubico.com/getapikey/" target="_blank">here</a>';
$lang['tfa']['u2f'] = "U2F аутентификация";
$lang['tfa']['hotp'] = "HOTP аутентификация";
$lang['tfa']['none'] = "Отключить";
$lang['tfa']['delete_tfa'] = "Отключить TFA";
$lang['tfa']['disable_tfa'] = "Отключить TFA до следующего успешного входа";
$lang['tfa']['confirm_tfa'] = "Пожалуйста, подтвердите ваш одноразовый пароль в поле ниже";
$lang['tfa']['confirm'] = "Подтвердите";
$lang['tfa']['otp'] = "Одноразовый пароль";
$lang['tfa']['totp'] = "На основе времени OTP (Google Authenticator и др.)";
$lang['tfa']['trash_login'] = "Некорректный логин";
$lang['tfa']['select'] = "Пожалуйста, выберите";
$lang['tfa']['waiting_usb_auth'] = "<i>Waiting for USB device...</i><br><br>Please tap the button on your U2F USB device now.";
$lang['tfa']['waiting_usb_register'] = "<i>Waiting for USB device...</i><br><br>Please enter your password above and confirm your U2F registration by tapping the button on your U2F USB device.";
@ -433,38 +331,13 @@ $lang['admin']['f2b_max_attempts'] = 'Max. attempts';
$lang['admin']['f2b_retry_window'] = 'Retry window (s) for max. attempts';
$lang['admin']['f2b_whitelist'] = 'Whitelisted networks/hosts';
$lang['admin']['search_domain_da'] = 'Поиск доменов';
$lang['admin']['restrictions'] = 'Postfix Restrictions';
$lang['admin']['rr'] = 'Postfix Recipient Restrictions';
$lang['admin']['reset_defaults'] = 'Сброс по умолчанию';
$lang['admin']['sr'] = 'Postfix Sender Restrictions';
$lang['admin']['r_inactive'] = 'Inactive restrictions';
$lang['admin']['r_active'] = 'Active restrictions';
$lang['admin']['r_info'] = 'Greyed out/disabled elements on the list of active restrictions are not known as valid restrictions to mailcow and cannot be moved. Unknown restrictions will be set in order of appearance anyway. <br>You can add new elements in <code>inc/vars.local.inc.php</code> to be able to toggle them.';
$lang['admin']['public_folders'] = 'Общие папки';
$lang['admin']['public_folders_text'] = 'A namespace "Public" is created. Below\'s public folder name indicates the name of the first auto-created mailbox within this namespace.';
$lang['admin']['public_folder_name'] = 'Имя папки';
$lang['admin']['public_folder_enable'] = 'Включение общих папок';
$lang['admin']['public_folder_enable_text'] = 'Отключение этой опции не приведет к удалению почты из общих папок.';
$lang['admin']['public_folder_pusf'] = 'Enable per-user seen flag';
$lang['admin']['public_folder_pusf_text'] = 'A "per-user seen flag"-enabled system will not mark a mail as read for User B, when User A has seen it, but User B did not.';
$lang['admin']['privacy'] = 'Конфиденциальность';
$lang['admin']['privacy_text'] = 'This option enables a PCRE table to remove "User-Agent", "X-Enigmail", "X-Mailer", "X-Originating-IP" and replaces "Received: from" headers with localhost/127.0.0.1.';
$lang['admin']['privacy_anon_mail'] = 'Анонимизировать исходящую почту';
$lang['admin']['dkim_txt_name'] = 'Имя TXT записи:';
$lang['admin']['dkim_txt_value'] = 'Значение TXT записи:';
$lang['admin']['dkim_key_length'] = 'Длина DKIM ключа (bits)';
$lang['admin']['dkim_key_valid'] = 'Действительный ключ';
$lang['admin']['dkim_key_unused'] = 'Ключ не используется';
$lang['admin']['dkim_key_missing'] = 'Ключ отсутствует';
$lang['admin']['dkim_key_hint'] = 'Селектор для DKIM ключей всегда является <code>dkim</code>.';
$lang['admin']['previous'] = 'Предыдущая страница';
$lang['admin']['quota_mb'] = 'Квота (MiB):';
$lang['admin']['sender_acl'] = 'Разрешить отправлять письма от:';
$lang['admin']['msg_size'] = 'Максимальный размер писем';
$lang['admin']['msg_size_limit'] = 'Ограничение размера писем теперь';
$lang['admin']['msg_size_limit_details'] = 'Применяя новый лимит будет перезагружен Postfix и веб-сервер.';
$lang['admin']['maintenance'] = 'Техническое обслуживание и информация';
$lang['admin']['sys_info'] = 'Сведения о системе';
$lang['admin']['dkim_add_key'] = 'Добавить ARC/DKIM ключ';
$lang['admin']['dkim_keys'] = 'ARC/DKIM ключи';
$lang['admin']['add'] = 'Добавить';
@ -487,20 +360,12 @@ $lang['admin']['unchanged_if_empty'] = 'Если без изменений ос
$lang['admin']['yes'] = '&#10004;';
$lang['admin']['no'] = '&#10008;';
$lang['admin']['access'] = 'Доступ к';
$lang['admin']['invalid_max_msg_size'] = 'Неверно указан максимальный размер писем';
$lang['admin']['site_not_found'] = 'Не удается найти конфигурацию сайта mailcow';
$lang['admin']['public_folder_empty'] = 'Имя общей папки не должно быть пустым';
$lang['admin']['set_rr_failed'] = 'Не удается задать ограничения Postfix';
$lang['admin']['no_record'] = 'Нет записей';
$lang['admin']['filter_table'] = 'Поиск';
$lang['admin']['empty'] = 'Нет результатов';
$lang['admin']['time'] = 'Время';
$lang['admin']['priority'] = 'Приоритет';
$lang['admin']['message'] = 'Письма';
$lang['admin']['refresh'] = 'Обновить';
$lang['admin']['to_top'] = 'Вернуться к началу';
$lang['admin']['in_use_by'] = 'Используемый в';
$lang['admin']['logs'] = 'Журналы';
$lang['admin']['forwarding_hosts'] = 'Переадресация хостов';
$lang['admin']['forwarding_hosts_hint'] = 'Безоговорочно входящие сообщения принимаются от любых хостов, перечисленных здесь. Затем эти хосты не проверяется DNSBL и greylisting. Спам, полученный от них никогда не отклоняется, но при необходимости он может быть помещен в папку Спам. Чаще всего для этого требуется указать почтовые серверы, на которых вы создали правило перенаправления входящих сообщений электронной почты на сервер mailcow.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Можно либо указать IPv4/IPv6-адресов сетей в нотации CIDR, имена узлов (которые будут разрешаться в IP-адреса) или доменные имена (которые будут решаться с IP-адресами путем запроса SPF записей или, в случае их отсутствия, MX записей).';
@ -510,7 +375,6 @@ $lang['admin']['host'] = 'Хост';
$lang['admin']['source'] = 'Источник';
$lang['admin']['add_forwarding_host'] = 'Добавить перенаправление узла';
$lang['admin']['add_relayhost'] = 'Добавление промежуточного узла';
$lang['delete']['remove_forwardinghost_warning'] = '<b>Внимание:</b> Вы собираетесь удалить узел пересылки <b>%s</b>!';
$lang['success']['forwarding_host_removed'] = "Перенаправление узла %s удалено";
$lang['success']['forwarding_host_added'] = "Перенаправление узла %s добавлено";
$lang['success']['relayhost_removed'] = "Промежуточный узел %s удален";
@ -530,10 +394,6 @@ $lang['admin']['add_row'] = "Добавить строку";
$lang['admin']['reset_default'] = "Восстановить по умолчанию";
$lang['admin']['merged_vars_hint'] = 'Серым цветом выделены строки полученные из <code>vars.(local.)inc.php</code> и не могут быть изменены.';
$lang['edit']['tls_policy'] = "Изменение политики TLS";
$lang['edit']['spam_score'] = "Задать индивидуальное определение спама";
$lang['edit']['spam_policy'] = "Добавление или удаление элементов в белом/черном списке";
$lang['edit']['delimiter_action'] = "Изменение разделителя действий";
$lang['edit']['syncjobs'] = "Добавление и изменение заданий синхронизации";
$lang['edit']['eas_reset'] = "Сброс устройства EAS";
$lang['edit']['spam_alias'] = "Создать или изменить временные псевдоним адреса";

View File

@ -21,7 +21,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
</li>
<li role="presentation"><a href="#tab-syncjobs" aria-controls="tab-syncjobs" role="tab" data-toggle="tab"><?=$lang['mailbox']['sync_jobs'];?></a></li>
<li role="presentation"><a href="#tab-filters" aria-controls="tab-filters" role="tab" data-toggle="tab"><?=$lang['mailbox']['filters'];?></a></li>
<li role="presentation"><a href="#tab-bcc" aria-controls="tab-filters" role="tab" data-toggle="tab"><?=$lang['mailbox']['bcc_maps'];?></a></li>
<li role="presentation"><a href="#tab-bcc" aria-controls="tab-filters" role="tab" data-toggle="tab"><?=$lang['mailbox']['address_rewriting'];?></a></li>
</ul>
<div class="row">
@ -234,6 +234,34 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><?=$lang['mailbox']['recipient_maps'];?></h3>
</div>
<p style="margin:10px" class="help-block"><?=$lang['mailbox']['recipient_map_info'];?></p>
<div class="table-responsive">
<table class="table table-striped" id="recipient_map_table"></table>
</div>
<?php
if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "admin"))
$display = 'block';
else
$display = 'none';
?>
<div class="mass-actions-mailbox" style="display: <?php echo $display; ?>">
<div class="btn-group">
<a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="recipient_map" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['mailbox']['toggle_all'];?></a>
<a class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['mailbox']['quick_actions'];?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a id="edit_selected" data-id="recipient_map" data-api-url='edit/recipient_map' data-api-attr='{"active":"1"}' href="#"><?=$lang['mailbox']['activate'];?></a></li>
<li><a id="edit_selected" data-id="recipient_map" data-api-url='edit/recipient_map' data-api-attr='{"active":"0"}' href="#"><?=$lang['mailbox']['deactivate'];?></a></li>
<li role="separator" class="divider"></li>
<li><a id="delete_selected" data-id="recipient_map" data-api-url='delete/recipient_map' href="#"><?=$lang['mailbox']['remove'];?></a></li>
</ul>
<a class="btn btn-sm btn-success" href="#" data-toggle="modal" data-target="#addRecipientMapModalAdmin"><span class="glyphicon glyphicon-plus"></span> <?=$lang['mailbox']['add_recipient_map_entry'];?></a>
</div>
</div>
</div>
</div>
</div> <!-- /tab-content -->
</div> <!-- /col-md-12 -->

View File

@ -595,6 +595,45 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
</div>
</div>
</div><!-- add add_bcc modal -->
<!-- add add_recipient_map modal -->
<div class="modal fade" id="addRecipientMapModalAdmin" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
<h3 class="modal-title"><?=$lang['mailbox']['recipient_maps'];?></h3>
</div>
<div class="modal-body">
<form class="form-horizontal" data-cached-form="true" role="form" data-id="add_recipient_map">
<div class="form-group">
<label class="control-label col-sm-2" for="recipient_map_old"><?=$lang['mailbox']['recipient_map_old'];?>:</label>
<div class="col-sm-10">
<textarea autocorrect="off" spellcheck="false" autocapitalize="none" class="form-control" rows="2" id="recipient_map_old" name="recipient_map_old" required></textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="recipient_map_new"><?=$lang['mailbox']['recipient_map_new'];?>:</label>
<div class="col-sm-10">
<textarea autocorrect="off" spellcheck="false" autocapitalize="none" class="form-control" rows="2" id="recipient_map_new" name="recipient_map_new" required></textarea>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label><input type="checkbox" value="1" name="active" checked> <?=$lang['add']['active'];?></label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button class="btn btn-success" id="add_item" data-id="add_recipient_map" data-api-url='add/recipient_map' data-api-attr='{}' href="#"><?=$lang['admin']['add'];?></button>
</div>
</div>
</form>
</div>
</div>
</div>
</div><!-- add add_recipient_map modal -->
<!-- log modal -->
<div class="modal fade" id="syncjobLogModal" tabindex="-1" role="dialog" aria-labelledby="syncjobLogModalLabel">
<div class="modal-dialog modal-lg" role="document">

View File

@ -9,24 +9,24 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button>
<h3 class="modal-title"><span class="glyphicon glyphicon-info"></span> <?=$lang['quarantaine']['qitem'];?></h3>
<h3 class="modal-title"><span class="glyphicon glyphicon-info"></span> <?=$lang['quarantine']['qitem'];?></h3>
</div>
<div class="modal-body">
<div id="qid_error" style="display:none" class="alert alert-danger"></div>
<div class="form-group">
<label for="qid_detail_subj"><h4><?=$lang['quarantaine']['subj'];?>:</h4></label>
<label for="qid_detail_subj"><h4><?=$lang['quarantine']['subj'];?>:</h4></label>
<p id="qid_detail_subj"></p>
</div>
<div class="form-group">
<label for="qid_detail_text"><h4><?=$lang['quarantaine']['text_plain_content'];?>:</h4></label>
<label for="qid_detail_text"><h4><?=$lang['quarantine']['text_plain_content'];?>:</h4></label>
<pre id="qid_detail_text"></pre>
</div>
<div class="form-group">
<label for="qid_detail_text_from_html"><h4><?=$lang['quarantaine']['text_from_html_content'];?>:</h4></label>
<label for="qid_detail_text_from_html"><h4><?=$lang['quarantine']['text_from_html_content'];?>:</h4></label>
<pre id="qid_detail_text_from_html"></pre>
</div>
<div class="form-group">
<label for="qid_detail_atts"><h4><?=$lang['quarantaine']['atts'];?>:</h4></label>
<label for="qid_detail_atts"><h4><?=$lang['quarantine']['atts'];?>:</h4></label>
<div id="qid_detail_atts">-</div>
</div>
</div>

View File

@ -11,20 +11,20 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><?=$lang['quarantaine']['quarantaine'];?></h3>
<h3 class="panel-title"><?=$lang['quarantine']['quarantine'];?></h3>
</div>
<p style="margin:10px" class="help-block"><?=$lang['quarantaine']['qinfo'];?></p>
<p style="margin:10px" class="help-block"><?=$lang['quarantine']['qinfo'];?></p>
<div class="table-responsive">
<table id="quarantainetable" class="table table-striped"></table>
<table id="quarantinetable" class="table table-striped"></table>
</div>
<div class="mass-actions-quarantaine">
<div class="mass-actions-quarantine">
<div class="btn-group">
<a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="qitems" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['quarantaine']['toggle_all'];?></a>
<a class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['quarantaine']['quick_actions'];?> <span class="caret"></span></a>
<a class="btn btn-sm btn-default" id="toggle_multi_select_all" data-id="qitems" href="#"><span class="glyphicon glyphicon-check" aria-hidden="true"></span> <?=$lang['quarantine']['toggle_all'];?></a>
<a class="btn btn-sm btn-default dropdown-toggle" data-toggle="dropdown" href="#"><?=$lang['quarantine']['quick_actions'];?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a id="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantaine']['release'];?></a></li>
<li><a id="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#"><?=$lang['quarantine']['release'];?></a></li>
<li role="separator" class="divider"></li>
<li><a id="delete_selected" data-id="qitems" data-api-url='delete/qitem' href="#"><?=$lang['quarantaine']['remove'];?></a></li>
<li><a id="delete_selected" data-id="qitems" data-api-url='delete/qitem' href="#"><?=$lang['quarantine']['remove'];?></a></li>
</ul>
</div>
</div>
@ -33,11 +33,11 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
</div> <!-- /row -->
</div> <!-- /container -->
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/modals/quarantaine.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/modals/quarantine.php';
?>
<script type='text/javascript'>
<?php
$lang_mailbox = json_encode($lang['quarantaine']);
$lang_mailbox = json_encode($lang['quarantine']);
echo "var lang = ". $lang_mailbox . ";\n";
echo "var csrf_token = '". $_SESSION['CSRF']['TOKEN'] . "';\n";
$role = ($_SESSION['mailcow_cc_role'] == "admin") ? 'admin' : 'domainadmin';
@ -46,7 +46,7 @@ echo "var pagination_size = '". $PAGINATION_SIZE . "';\n";
?>
</script>
<script src="js/footable.min.js"></script>
<script src="js/quarantaine.js"></script>
<script src="js/quarantine.js"></script>
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/footer.inc.php';
} else {

View File

@ -89,6 +89,9 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<div class="panel-body">
<div class="row">
<div class="col-sm-offset-3 col-sm-9">
<?php if ($mailboxdata['attributes']['force_pw_update'] == "1"): ?>
<div class="alert alert-danger"><?=$lang['user']['force_pw_update'];?></div>
<?php endif; ?>
<p><a href="#pwChangeModal" data-toggle="modal">[<?=$lang['user']['change_password'];?>]</a></p>
<p><a target="_blank" href="https://mailcow.github.io/mailcow-dockerized-docs/client/#<?=$clientconfigstr;?>">[<?=$lang['user']['client_configuration'];?>]</a></p>
</div>
@ -164,21 +167,21 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<button type="button" class="btn btn-sm btn-default <?=($get_tagging_options == "subfolder") ? 'active' : null; ?>"
id="edit_selected"
data-item="<?= $username; ?>"
data-item="<?= htmlentities($username); ?>"
data-id="delimiter_action"
data-api-url='edit/delimiter_action'
data-api-attr='{"tagged_mail_handler":"subfolder"}'><?=$lang['user']['tag_in_subfolder'];?></button>
<button type="button" class="btn btn-sm btn-default <?=($get_tagging_options == "subject") ? 'active' : null; ?>"
id="edit_selected"
data-item="<?= $username; ?>"
data-item="<?= htmlentities($username); ?>"
data-id="delimiter_action"
data-api-url='edit/delimiter_action'
data-api-attr='{"tagged_mail_handler":"subject"}'><?=$lang['user']['tag_in_subject'];?></button>
<button type="button" class="btn btn-sm btn-default <?=($get_tagging_options == "none") ? 'active' : null; ?>"
id="edit_selected"
data-item="<?= $username; ?>"
data-item="<?= htmlentities($username); ?>"
data-id="delimiter_action"
data-api-url='edit/delimiter_action'
data-api-attr='{"tagged_mail_handler":"none"}'><?=$lang['user']['tag_in_none'];?></button>
@ -201,14 +204,14 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<button type="button" class="btn btn-sm btn-default <?=($get_tls_policy['tls_enforce_in'] == "1") ? "active" : null;?>"
id="edit_selected"
data-item="<?= $username; ?>"
data-item="<?= htmlentities($username); ?>"
data-id="tls_policy"
data-api-url='edit/tls_policy'
data-api-attr='{"tls_enforce_in":<?=($get_tls_policy['tls_enforce_in'] == "1") ? "0" : "1";?>}'><?=$lang['user']['tls_enforce_in'];?></button>
<button type="button" class="btn btn-sm btn-default <?=($get_tls_policy['tls_enforce_out'] == "1") ? "active" : null;?>"
id="edit_selected"
data-item="<?= $username; ?>"
data-item="<?= htmlentities($username); ?>"
data-id="tls_policy"
data-api-url='edit/tls_policy'
data-api-attr='{"tls_enforce_out":<?=($get_tls_policy['tls_enforce_out'] == "1") ? "0" : "1";?>}'><?=$lang['user']['tls_enforce_out'];?></button>
@ -225,7 +228,7 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<div class="row">
<div class="col-md-3 col-xs-5 text-right"><?=$lang['user']['eas_reset'];?>:</div>
<div class="col-md-9 col-xs-7">
<button class="btn btn-xs btn-default" id="delete_selected" data-text="<?=$lang['user']['eas_reset'];?>?" data-item="<?= $username; ?>" data-id="eas_cache" data-api-url='delete/eas_cache' href="#"><?=$lang['user']['eas_reset_now'];?></button>
<button class="btn btn-xs btn-default" id="delete_selected" data-text="<?=$lang['user']['eas_reset'];?>?" data-item="<?= htmlentities($username); ?>" data-id="eas_cache" data-api-url='delete/eas_cache' href="#"><?=$lang['user']['eas_reset_now'];?></button>
<p class="help-block"><?=$lang['user']['eas_reset_help'];?></p>
</div>
</div>
@ -315,7 +318,7 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<div class="form-group">
<div class="col-sm-10">
<button type="button" class="btn btn-sm btn-success" id="edit_selected"
data-item="<?= $username; ?>"
data-item="<?= htmlentities($username); ?>"
data-id="spam_score"
data-api-url='edit/spam-score'
data-api-attr='{}'><?=$lang['user']['save_changes'];?></button>
@ -346,7 +349,7 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<div class="input-group">
<input type="text" class="form-control" name="object_from" id="object_from" placeholder="*@example.org" required>
<span class="input-group-btn">
<button class="btn btn-default" id="add_item" data-id="add_wl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username":"<?= $username; ?>","object_list":"wl"}' href="#"><span class="glyphicon glyphicon-plus"></span> <?=$lang['user']['spamfilter_table_add'];?></button>
<button class="btn btn-default" id="add_item" data-id="add_wl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username":<?= json_encode($username); ?>,"object_list":"wl"}' href="#"><span class="glyphicon glyphicon-plus"></span> <?=$lang['user']['spamfilter_table_add'];?></button>
</span>
</div>
</form>
@ -372,10 +375,10 @@ elseif (isset($_SESSION['mailcow_cc_role']) && $_SESSION['mailcow_cc_role'] == '
<form class="form-inline" data-id="add_bl_policy_mailbox">
<div class="input-group">
<input type="text" class="form-control" name="object_from" id="object_from" placeholder="*@example.org" required>
<input type="hidden" name="username" value="<?= $username ;?>">
<input type="hidden" name="username" value="<?= htmlentities($username) ;?>">
<input type="hidden" name="object_list" value="bl">
<span class="input-group-btn">
<button class="btn btn-default" id="add_item" data-id="add_bl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username":"<?= $username; ?>","object_list":"bl"}' href="#"><span class="glyphicon glyphicon-plus"></span> <?=$lang['user']['spamfilter_table_add'];?></button>
<button class="btn btn-default" id="add_item" data-id="add_bl_policy_mailbox" data-api-url='add/mailbox-policy' data-api-attr='{"username":<?= json_encode($username); ?>,"object_list":"bl"}' href="#"><span class="glyphicon glyphicon-plus"></span> <?=$lang['user']['spamfilter_table_add'];?></button>
</span>
</div>
</form>

View File

@ -10,6 +10,8 @@ services:
volumes:
- ./data/conf/unbound/unbound.conf:/etc/unbound/unbound.conf:ro
restart: always
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
networks:
mailcow-network:
ipv4_address: ${IPV4_NETWORK:-172.22.1}.254
@ -30,6 +32,10 @@ services:
restart: always
dns:
- ${IPV4_NETWORK:-172.22.1}.254
ports:
- "${SQL_PORT:-127.0.0.1:13306}:3306"
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
networks:
mailcow-network:
aliases:
@ -44,6 +50,8 @@ services:
- TZ=${TZ}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
networks:
mailcow-network:
ipv4_address: ${IPV4_NETWORK:-172.22.1}.249
@ -51,7 +59,7 @@ services:
- redis
clamd-mailcow:
image: mailcow/clamd:1.8
image: mailcow/clamd:1.9
build: ./data/Dockerfiles/clamd
restart: always
environment:
@ -61,13 +69,15 @@ services:
- ./data/conf/clamav/:/etc/clamav/
dns:
- ${IPV4_NETWORK:-172.22.1}.254
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
networks:
mailcow-network:
aliases:
- clamd
rspamd-mailcow:
image: mailcow/rspamd:1.16
image: mailcow/rspamd:1.17
build: ./data/Dockerfiles/rspamd
stop_grace_period: 30s
depends_on:
@ -76,12 +86,13 @@ services:
- TZ=${TZ}
volumes:
- ./data/conf/rspamd/custom/:/etc/rspamd/custom:ro
- ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro
- ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:rw
- ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro
- ./data/conf/rspamd/lua/:/etc/rspamd/lua/:ro
- dkim-vol-1:/data/dkim
- rspamd-vol-1:/var/lib/rspamd
- rspamd-sock:/rspamd-sock
restart: always
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
hostname: rspamd
@ -91,7 +102,7 @@ services:
- rspamd
php-fpm-mailcow:
image: mailcow/phpfpm:1.9
image: mailcow/phpfpm:1.12
build: ./data/Dockerfiles/phpfpm
command: "php-fpm -d date.timezone=${TZ} -d expose_php=0"
depends_on:
@ -99,13 +110,14 @@ services:
volumes:
- ./data/web:/web:rw
- ./data/conf/rspamd/dynmaps:/dynmaps:ro
- dkim-vol-1:/data/dkim
- rspamd-sock:/rspamd-sock
- ./data/conf/rspamd/meta_exporter:/meta_exporter:ro
- ./data/conf/phpfpm/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf
- ./data/conf/phpfpm/php-fpm.d/system.conf:/usr/local/etc/php-fpm.d/system.conf
- ./data/conf/phpfpm/php-conf.d/opcache-recommended.ini:/usr/local/etc/php/conf.d/opcache-recommended.ini
- ./data/conf/phpfpm/php-conf.d/upload.ini:/usr/local/etc/php/conf.d/upload.ini
environment:
- LOG_LINES=${LOG_LINES:-9999}
- LOG_LINES=${LOG_LINES}
- TZ=${TZ}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
@ -120,6 +132,8 @@ services:
- SMTPS_PORT=${SMTPS_PORT:-465}
- SMTP_PORT=${SMTP_PORT:-25}
restart: always
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
networks:
@ -128,18 +142,20 @@ services:
- phpfpm
sogo-mailcow:
image: mailcow/sogo:1.16
image: mailcow/sogo:1.18
build: ./data/Dockerfiles/sogo
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- TZ=${TZ}
- LOG_LINES=${LOG_LINES:-9999}
- LOG_LINES=${LOG_LINES}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
volumes:
- ./data/conf/sogo/:/etc/sogo/
restart: always
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
networks:
@ -149,7 +165,7 @@ services:
- sogo
dovecot-mailcow:
image: mailcow/dovecot:1.22
image: mailcow/dovecot:1.23
build: ./data/Dockerfiles/dovecot
cap_add:
- NET_BIND_SERVICE
@ -159,8 +175,9 @@ services:
- ./data/conf/sogo/:/etc/sogo/
- vmail-vol-1:/var/vmail
- crypt-vol-1:/mail_crypt/
- rspamd-sock:/rspamd-sock
environment:
- LOG_LINES=${LOG_LINES:-9999}
- LOG_LINES=${LOG_LINES}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
@ -180,6 +197,8 @@ services:
hard: 40000
dns:
- ${IPV4_NETWORK:-172.22.1}.254
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
hostname: ${MAILCOW_HOSTNAME}
networks:
mailcow-network:
@ -187,7 +206,7 @@ services:
- dovecot
postfix-mailcow:
image: mailcow/postfix:1.13
image: mailcow/postfix:1.14
build: ./data/Dockerfiles/postfix
volumes:
- ./data/conf/postfix:/opt/postfix/conf
@ -195,7 +214,7 @@ services:
- postfix-vol-1:/var/spool/postfix
- crypt-vol-1:/var/lib/zeyple
environment:
- LOG_LINES=${LOG_LINES:-9999}
- LOG_LINES=${LOG_LINES}
- TZ=${TZ}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
@ -209,6 +228,8 @@ services:
restart: always
dns:
- ${IPV4_NETWORK:-172.22.1}.254
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
hostname: ${MAILCOW_HOSTNAME}
networks:
mailcow-network:
@ -218,6 +239,8 @@ services:
memcached-mailcow:
image: memcached:alpine
restart: always
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
networks:
@ -240,6 +263,7 @@ services:
until ping phpfpm -c1 > /dev/null; do sleep 1; done &&
until ping sogo -c1 > /dev/null; do sleep 1; done &&
until ping redis -c1 > /dev/null; do sleep 1; done &&
until ping rspamd -c1 > /dev/null; do sleep 1; done &&
exec nginx -g 'daemon off;'"
environment:
- HTTPS_PORT=${HTTPS_PORT:-443}
@ -256,6 +280,8 @@ services:
- "${HTTPS_BIND:-0.0.0.0}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}"
- "${HTTP_BIND:-0.0.0.0}:${HTTP_PORT:-80}:${HTTP_PORT:-80}"
restart: always
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
networks:
@ -269,10 +295,12 @@ services:
- mysql-mailcow
image: mailcow/acme:1.28
build: ./data/Dockerfiles/acme
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
- LOG_LINES=${LOG_LINES:-9999}
- LOG_LINES=${LOG_LINES}
- ADDITIONAL_SAN=${ADDITIONAL_SAN}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- DBNAME=${DBNAME}
@ -290,9 +318,9 @@ services:
aliases:
- acme
fail2ban-mailcow:
image: mailcow/fail2ban:1.11
build: ./data/Dockerfiles/fail2ban
netfilter-mailcow:
image: mailcow/netfilter:1.11
build: ./data/Dockerfiles/netfilter
stop_grace_period: 30s
depends_on:
- dovecot-mailcow
@ -304,24 +332,28 @@ services:
privileged: true
environment:
- TZ=${TZ}
- SKIP_FAIL2BAN=${SKIP_FAIL2BAN:-n}
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
- SNAT_TO_SOURCE=${SNAT_TO_SOURCE:-n}
network_mode: "host"
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
volumes:
- /lib/modules:/lib/modules:ro
watchdog-mailcow:
image: mailcow/watchdog:1.13
image: mailcow/watchdog:1.14
# Debug
command: /watchdog.sh
#command: /watchdog.sh
build: ./data/Dockerfiles/watchdog
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
volumes:
- vmail-vol-1:/vmail:ro
- rspamd-sock:/rspamd-sock
restart: always
environment:
- LOG_LINES=${LOG_LINES:-9999}
- LOG_LINES=${LOG_LINES}
- TZ=${TZ}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
@ -337,9 +369,11 @@ services:
- watchdog
dockerapi-mailcow:
image: mailcow/dockerapi:1.5
image: mailcow/dockerapi:1.9
restart: always
build: ./data/Dockerfiles/dockerapi
sysctls:
- net.ipv6.conf.all.disable_ipv6=${SYSCTL_IPV6_DISABLED:-0}
oom_score_adj: -10
environment:
- TZ=${TZ}
@ -373,8 +407,8 @@ networks:
volumes:
vmail-vol-1:
mysql-vol-1:
dkim-vol-1:
redis-vol-1:
rspamd-vol-1:
postfix-vol-1:
crypt-vol-1:
rspamd-sock:

View File

@ -1,5 +1,18 @@
#!/bin/bash
+#exit on error and pipefail
+set -o errexit
+set -o pipefail
if grep --help 2>&1 | grep -q -i "busybox"; then
echo "BusybBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\""
exit 1
fi
if cp --help 2>&1 | grep -q -i "busybox"; then
echo "BusybBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\""
exit 1
fi
if [[ -f mailcow.conf ]]; then
read -r -p "A config file exists and will be overwritten, are you sure you want to contine? [y/N] " response
case $response in
@ -28,6 +41,8 @@ else
read -p "Timezone: " -ei ${TZ} TZ
fi
[[ ! -f ./data/conf/rspamd/override.d/worker-controller-password.inc ]] && echo '# Placeholder' > ./data/conf/rspamd/override.d/worker-controller-password.inc
cat << EOF > mailcow.conf
# ------------------------------
# mailcow web ui configuration
@ -74,6 +89,7 @@ POP_PORT=110
POPS_PORT=995
SIEVE_PORT=4190
DOVEADM_PORT=127.0.0.1:19991
SQL_PORT=127.0.0.1:13306
# Your timezone
TZ=${TZ}
@ -87,12 +103,10 @@ ADDITIONAL_SAN=
# Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n
SKIP_LETS_ENCRYPT=n
# Skip IPv4 check in ACME container - y/n
SKIP_IP_CHECK=n
# Skip Fail2ban implementation (fail2ban-mailcow) - y/n
SKIP_FAIL2BAN=n
# Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n
SKIP_CLAMD=n
@ -107,9 +121,17 @@ LOG_LINES=9999
# Internal IPv4 /24 subnet, format n.n.n. (expands to n.n.n.0/24)
IPV4_NETWORK=172.22.1
# Internal IPv6 subnet in fd00::/8
# Internal IPv6 subnet in fc00::/7
IPV6_NETWORK=fd4d:6169:6c63:6f77::/64
# Use this IP for outgoing connections (SNAT)' >> mailcow.conf
#SNAT_TO_SOURCE=" >> mailcow.conf
# Disable IPv6
# mailcow-network will still be created as IPv6 enabled, all containers will be created
# without IPv6 support.
# Use 1 for disabled, 0 for enabled
SYSCTL_IPV6_DISABLED=0
EOF

View File

@ -0,0 +1,34 @@
#!/usr/bin/ruby
MASTER="en"
DIR = "#{__dir__}/.."
keys = %x[sed -r 's/.*(\\['.*'\\]\\['.*'\\]).*/\\1/g' #{DIR}/data/web/lang/lang.#{MASTER}.php | grep '^\\\[' | sed 's/\\[/\\\\[/g' | sed 's/\\]/\\\\]/g'|sort | uniq]
not_used_in_php = []
keys.split("\n").each do |key|
%x[git grep "#{key}" -- #{DIR}/data/web/*.php #{DIR}/data/web/inc #{DIR}/data/web/modals]
if $?.exitstatus > 0
not_used_in_php << key
end
end
# \['user'\]\['username'\]
# \['user'\]\['waiting'\]
# \['warning'\]\['spam_alias_temp_error'\]
not_used = []
not_used_in_php.each do |string|
section = string.scan(/([a-z]+)/)[0][0]
key = string.scan(/([a-z]+)/)[1][0]
%x[git grep lang.#{key} -- #{DIR}/data/web/js/#{section}.js]
if $?.exitstatus > 0
not_used << string
end
end
puts "# Remove unused translation keys:"
not_used.each do |key|
puts "sed -i \"/\\$lang#{key}.*;/d\" data/web/lang/lang.??.php"
end

View File

@ -1,23 +1,32 @@
#!/bin/bash
[[ -z ${1} ]] && { echo "No parameters given"; exit 1; }
for bin in curl dirmngr; do
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
done
[[ -z ${1} ]] && NC_HELP=y
while [ "$1" != '' ]; do
case "${1}" in
-p|--purge) NC_PURGE=y && shift;;
-i|--install) NC_INSTALL=y && shift;;
-h|--help) NC_HELP=y && shift;;
*) echo "Unknown parameter: ${1}" && shift;;
esac
done
if [[ ${NC_HELP} == "y" ]]; then
printf 'Usage:\n\n'
printf ' -p|--purge\n Purge Nextcloud\n'
printf ' -i|--install\n Install Nextcloud\n\n'
exit 0
fi
[[ ${NC_PURGE} == "y" ]] && [[ ${NC_INSTALL} == "y" ]] && { echo "Cannot use -p and -i at the same time"; }
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source ${SCRIPT_DIR}/../mailcow.conf
cd ${SCRIPT_DIR}/../
source mailcow.conf
if [[ ${NC_PURGE} == "y" ]]; then
@ -55,7 +64,7 @@ elif [[ ${NC_INSTALL} == "y" ]]; then
ADMIN_NC_PASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
curl -L# -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/latest-12.tar.bz2" \
curl -L# -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/latest-13.tar.bz2" || { echo "Failed to download Nextcloud archive."; exit 1; } \
&& tar -xjf nextcloud.tar.bz2 -C ./data/web/ \
&& rm nextcloud.tar.bz2 \
&& rm -rf ./data/web/nextcloud/updater \

115
update.sh
View File

@ -1,12 +1,57 @@
#!/bin/bash
#exit on error and pipefail
set -o errexit
set -o pipefail
for bin in curl docker-compose docker git awk sha1sum; do
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
done
export LC_ALL=C
DATE=$(date +%Y-%m-%d_%H_%M_%S)
BRANCH=$(git rev-parse --abbrev-ref HEAD)
while (($#)); do
case "${1}" in
--check|-c)
echo "Checking remote code for updates..."
git fetch origin ${BRANCH}
if [[ -z $(git log HEAD --pretty=format:"%H" | grep $(git rev-parse origin/${BRANCH})) ]]; then
echo "Updated code is available."
exit 0
else
echo "No updates available."
exit 3
fi
;;
--ours)
MERGE_STRATEGY=ours
;;
esac
done
[[ ! -f mailcow.conf ]] && { echo "mailcow.conf is missing"; exit 1;}
CONFIG_ARRAY=("SKIP_LETS_ENCRYPT" "USE_WATCHDOG" "WATCHDOG_NOTIFY_EMAIL" "SKIP_CLAMD" "SKIP_IP_CHECK" "SKIP_FAIL2BAN" "ADDITIONAL_SAN" "DOVEADM_PORT" "IPV4_NETWORK" "IPV6_NETWORK" "LOG_LINES")
if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusybBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\""; exit 1; fi
if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusybBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\""; exit 1; fi
CONFIG_ARRAY=(
"SKIP_LETS_ENCRYPT"
"USE_WATCHDOG"
"WATCHDOG_NOTIFY_EMAIL"
"SKIP_CLAMD"
"SKIP_IP_CHECK"
"ADDITIONAL_SAN"
"DOVEADM_PORT"
"IPV4_NETWORK"
"IPV6_NETWORK"
"LOG_LINES"
"SNAT_TO_SOURCE"
"SYSCTL_IPV6_DISABLED"
"SQL_PORT"
)
sed -i '$a\' mailcow.conf
for option in ${CONFIG_ARRAY[@]}; do
if [[ ${option} == "ADDITIONAL_SAN" ]]; then
@ -14,6 +59,15 @@ for option in ${CONFIG_ARRAY[@]}; do
echo "Adding new option \"${option}\" to mailcow.conf"
echo "${option}=" >> mailcow.conf
fi
elif [[ ${option} == "SYSCTL_IPV6_DISABLED" ]]; then
if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
echo "# Disable IPv6" >> mailcow.conf
echo "# mailcow-network will still be created as IPv6 enabled, all containers will be created" >> mailcow.conf
echo "# without IPv6 support." >> mailcow.conf
echo "# Use 1 for disabled, 0 for enabled" >> mailcow.conf
echo "SYSCTL_IPV6_DISABLED=0" >> mailcow.conf
fi
elif [[ ${option} == "COMPOSE_PROJECT_NAME" ]]; then
if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
@ -44,9 +98,21 @@ for option in ${CONFIG_ARRAY[@]}; do
elif [[ ${option} == "IPV6_NETWORK" ]]; then
if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
echo '# Internal IPv6 subnet in fd00::/8' >> mailcow.conf
echo '# Internal IPv6 subnet in fc00::/7' >> mailcow.conf
echo "IPV6_NETWORK=fd4d:6169:6c63:6f77::/64" >> mailcow.conf
fi
elif [[ ${option} == "SQL_PORT" ]]; then
if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
echo '# Bind SQL to 127.0.0.1 on port 13306' >> mailcow.conf
echo "SQL_PORT=127.0.0.1:13306" >> mailcow.conf
fi
elif [[ ${option} == "SNAT_TO_SOURCE" ]]; then
if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
echo '# Use this IP for outgoing connections (SNAT)' >> mailcow.conf
echo "#SNAT_TO_SOURCE=" >> mailcow.conf
fi
elif ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
echo "${option}=n" >> mailcow.conf
@ -58,35 +124,10 @@ curl -o /dev/null google.com -sm3
if [[ $? != 0 ]]; then
echo -e "\e[31mfailed\e[0m"
exit 1
else
else
echo -e "\e[32mOK\e[0m"
fi
set -o pipefail
export LC_ALL=C
DATE=$(date +%Y-%m-%d_%H_%M_%S)
BRANCH=$(git rev-parse --abbrev-ref HEAD)
declare -a DC_PARAMS
while (($#)); do
case "${1}" in
--check|-c)
echo "Checking remote code for updates..."
git fetch origin ${BRANCH}
if [[ $(git branch ${BRANCH} --contains $(git rev-parse origin/${BRANCH}) > /dev/null 2> /dev/null; echo $?) != 0 ]]; then
echo "Updated code is available."
exit 0
else
echo "No updates available."
exit 3
fi
;;
--no-start)
DC_PARAMS=(${DC_PARAMS[@]} "--no-start")
;;
esac
done
echo -e "\e[32mChecking for newer update script...\e[0m"
SHA1_1=$(sha1sum update.sh)
git fetch origin ${BRANCH}
@ -100,7 +141,7 @@ fi
if [[ -f mailcow.conf ]]; then
source mailcow.conf
else
else
echo -e "\e[31mNo mailcow.conf - is mailcow installed?\e[0m"
exit 1
fi
@ -118,13 +159,14 @@ docker-compose down
# Silently fixing remote url from andryyy to mailcow
git remote set-url origin https://github.com/mailcow/mailcow-dockerized
echo -e "\e[32mCommitting current status...\e[0m"
git update-index --assume-unchanged data/conf/rspamd/override.d/worker-controller-password.inc
git add -u
git commit -am "Before update on ${DATE}" > /dev/null
echo -e "\e[32mFetching updated code from remote...\e[0m"
git fetch origin ${BRANCH}
echo -e "\e[32mMerging local with remote code (recursive, options: \"theirs\", \"patience\"...\e[0m"
echo -e "\e[32mMerging local with remote code (recursive, strategy: \"${MERGE_STRATEGY:-theirs}\", options: \"patience\"...\e[0m"
git config merge.defaultToUpstream true
git merge -Xtheirs -Xpatience -m "After update on ${DATE}"
git merge -X${MERGE_STRATEGY:-theirs} -Xpatience -m "After update on ${DATE}"
# Need to use a variable to not pass return codes of if checks
MERGE_RETURN=$?
if [[ ${MERGE_RETURN} == 128 ]]; then
@ -147,11 +189,14 @@ fi
echo -e "\e[32mFetching new docker-compose version...\e[0m"
sleep 2
if [[ $(curl -sL -w "%{http_code}" https://www.servercow.de/docker-compose/latest.php -o /dev/null) == "200" ]]; then
if [[ ! -z $(which pip) && $(pip list --local | grep -c docker-compose) == 1 ]]; then
true
#prevent breaking a working docker-compose installed with pip
elif [[ $(curl -sL -w "%{http_code}" https://www.servercow.de/docker-compose/latest.php -o /dev/null) == "200" ]]; then
LATEST_COMPOSE=$(curl -#L https://www.servercow.de/docker-compose/latest.php)
curl -#L https://github.com/docker/compose/releases/download/${LATEST_COMPOSE}/docker-compose-$(uname -s)-$(uname -m) > $(which docker-compose)
chmod +x $(which docker-compose)
else
else
echo -e "\e[33mCannot determine latest docker-compose version, skipping...\e[0m"
fi
@ -165,7 +210,7 @@ cp -n data/assets/ssl-example/*.pem data/assets/ssl/
echo -e "\e[32mStarting mailcow...\e[0m"
sleep 2
docker-compose up -d --remove-orphans ${DC_PARAMS[@]}
docker-compose up -d --remove-orphans
echo -e "\e[32mCollecting garbage...\e[0m"
IMGS_TO_DELETE=()
@ -203,7 +248,7 @@ if [[ ! -z ${IMGS_TO_DELETE[*]} ]]; then
read -r -p "Do you want to delete old image tags right now? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
docker rmi ${IMGS_TO_DELETE[*]}
else
else
echo "OK, skipped."
fi
fi