mirror of
https://github.com/mailcow/mailcow-dockerized.git
synced 2026-09-01 08:27:09 +00:00
Merge branch 'feat/remove-ip6nat' into nightly
This commit is contained in:
@@ -17,7 +17,7 @@ caller="${BASH_SOURCE[1]##*/}"
|
|||||||
|
|
||||||
get_installed_tools(){
|
get_installed_tools(){
|
||||||
for bin in openssl curl docker git awk sha1sum grep cut jq; do
|
for bin in openssl curl docker git awk sha1sum grep cut jq; do
|
||||||
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
|
if [[ -z $(command -v ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo -e "${LIGHT_RED}BusyBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\"${NC}"; exit 1; fi
|
if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo -e "${LIGHT_RED}BusyBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\"${NC}"; exit 1; fi
|
||||||
@@ -177,3 +177,47 @@ in_array() {
|
|||||||
for e; do [[ "$e" == "$match" ]] && return 0; done
|
for e; do [[ "$e" == "$match" ]] && return 0; done
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
detect_major_update() {
|
||||||
|
if [ ${BRANCH} == "master" ]; then
|
||||||
|
# Array with major versions
|
||||||
|
# Add major versions here
|
||||||
|
MAJOR_VERSIONS=(
|
||||||
|
"2025-02"
|
||||||
|
"2025-03"
|
||||||
|
)
|
||||||
|
|
||||||
|
current_version=""
|
||||||
|
if [[ -f "${SCRIPT_DIR}/data/web/inc/app_info.inc.php" ]]; then
|
||||||
|
current_version=$(grep 'MAILCOW_GIT_VERSION' ${SCRIPT_DIR}/data/web/inc/app_info.inc.php | sed -E 's/.*MAILCOW_GIT_VERSION="([^"]+)".*/\1/')
|
||||||
|
fi
|
||||||
|
if [[ -z "$current_version" ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
release_url="https://github.com/mailcow/mailcow-dockerized/releases/tag"
|
||||||
|
|
||||||
|
updates_to_apply=()
|
||||||
|
|
||||||
|
for version in "${MAJOR_VERSIONS[@]}"; do
|
||||||
|
if [[ "$current_version" < "$version" ]]; then
|
||||||
|
updates_to_apply+=("$version")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ ${#updates_to_apply[@]} -gt 0 ]]; then
|
||||||
|
echo -e "\e[33m\nMAJOR UPDATES to be applied:\e[0m"
|
||||||
|
for update in "${updates_to_apply[@]}"; do
|
||||||
|
echo "$update - $release_url/$update"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -e "\nPlease read the release notes before proceeding."
|
||||||
|
read -p "Do you want to proceed with the update? [y/n] " response
|
||||||
|
if [[ "${response}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
||||||
|
echo "Proceeding with the update..."
|
||||||
|
else
|
||||||
|
echo "Update canceled. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ get_ipv6_support() {
|
|||||||
# 2) Ensure Docker daemon.json has (or create) the required IPv6 settings
|
# 2) Ensure Docker daemon.json has (or create) the required IPv6 settings
|
||||||
docker_daemon_edit(){
|
docker_daemon_edit(){
|
||||||
DOCKER_DAEMON_CONFIG="/etc/docker/daemon.json"
|
DOCKER_DAEMON_CONFIG="/etc/docker/daemon.json"
|
||||||
|
DOCKER_MAJOR=$(docker version --format '{{.Server.Version}}' 2>/dev/null | cut -d. -f1)
|
||||||
MISSING=()
|
MISSING=()
|
||||||
|
|
||||||
_has_kv() { grep -Eq "\"$1\"\s*:\s*$2" "$DOCKER_DAEMON_CONFIG" 2>/dev/null; }
|
_has_kv() { grep -Eq "\"$1\"\s*:\s*$2" "$DOCKER_DAEMON_CONFIG" 2>/dev/null; }
|
||||||
@@ -40,7 +41,7 @@ docker_daemon_edit(){
|
|||||||
! _has_kv ipv6 true && MISSING+=("ipv6: true")
|
! _has_kv ipv6 true && MISSING+=("ipv6: true")
|
||||||
! grep -Eq '"fixed-cidr-v6"\s*:\s*".+"' "$DOCKER_DAEMON_CONFIG" \
|
! grep -Eq '"fixed-cidr-v6"\s*:\s*".+"' "$DOCKER_DAEMON_CONFIG" \
|
||||||
&& MISSING+=('fixed-cidr-v6: "fd00:dead:beef:c0::/80"')
|
&& MISSING+=('fixed-cidr-v6: "fd00:dead:beef:c0::/80"')
|
||||||
if [[ -n "$docker_version" && "$docker_version" -ge 27 ]]; then
|
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -ge 27 ]]; then
|
||||||
_has_kv ipv6 true && ! _has_kv ip6tables true && MISSING+=("ip6tables: true")
|
_has_kv ipv6 true && ! _has_kv ip6tables true && MISSING+=("ip6tables: true")
|
||||||
! _has_kv experimental true && MISSING+=("experimental: true")
|
! _has_kv experimental true && MISSING+=("experimental: true")
|
||||||
fi
|
fi
|
||||||
@@ -87,7 +88,6 @@ docker_daemon_edit(){
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $ans =~ ^[Yy]$ ]]; then
|
if [[ $ans =~ ^[Yy]$ ]]; then
|
||||||
DOCKER_MAJOR=$(docker version --format '{{.Server.Version}}' 2>/dev/null | cut -d. -f1)
|
|
||||||
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]]; then
|
if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]]; then
|
||||||
cat > "$DOCKER_DAEMON_CONFIG" <<EOF
|
cat > "$DOCKER_DAEMON_CONFIG" <<EOF
|
||||||
{
|
{
|
||||||
@@ -141,7 +141,6 @@ configure_ipv6() {
|
|||||||
echo -e "${RED}Please disable or fix your host/Docker IPv6 support, or set ENABLE_IPV6=false.${NC}"
|
echo -e "${RED}Please disable or fix your host/Docker IPv6 support, or set ENABLE_IPV6=false.${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
echo "Manual ENABLE_IPV6=$MANUAL_SETTING detected and matches system status—no changes applied."
|
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ adapt_new_options() {
|
|||||||
echo "# Switch here between native (compose plugin) and standalone" >> mailcow.conf
|
echo "# Switch here between native (compose plugin) and standalone" >> mailcow.conf
|
||||||
echo "# For more informations take a look at the mailcow docs regarding the configuration options." >> mailcow.conf
|
echo "# For more informations take a look at the mailcow docs regarding the configuration options." >> mailcow.conf
|
||||||
echo "# Normally this should be untouched but if you decided to use either of those you can switch it manually here." >> mailcow.conf
|
echo "# Normally this should be untouched but if you decided to use either of those you can switch it manually here." >> mailcow.conf
|
||||||
echo "# Please be aware that at least one of those variants should be installed on your maschine or mailcow will fail." >> mailcow.conf
|
echo "# Please be aware that at least one of those variants should be installed on your machine or mailcow will fail." >> mailcow.conf
|
||||||
echo "" >> mailcow.conf
|
echo "" >> mailcow.conf
|
||||||
echo "DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION}" >> mailcow.conf
|
echo "DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION}" >> mailcow.conf
|
||||||
;;
|
;;
|
||||||
@@ -139,7 +139,7 @@ adapt_new_options() {
|
|||||||
ACL_ANYONE)
|
ACL_ANYONE)
|
||||||
echo '# Set this to "allow" to enable the anyone pseudo user. Disabled by default.' >> mailcow.conf
|
echo '# Set this to "allow" to enable the anyone pseudo user. Disabled by default.' >> mailcow.conf
|
||||||
echo '# When enabled, ACL can be created, that apply to "All authenticated users"' >> mailcow.conf
|
echo '# When enabled, ACL can be created, that apply to "All authenticated users"' >> mailcow.conf
|
||||||
echo '# This should probably only be activated on mail hosts, that are used exclusivly by one organisation.' >> mailcow.conf
|
echo '# This should probably only be activated on mail hosts, that are used exclusively by one organisation.' >> mailcow.conf
|
||||||
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
|
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
|
||||||
echo 'ACL_ANYONE=disallow' >> mailcow.conf
|
echo 'ACL_ANYONE=disallow' >> mailcow.conf
|
||||||
;;
|
;;
|
||||||
@@ -297,7 +297,7 @@ adapt_new_options() {
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
REDISPASS)
|
REDISPASS)
|
||||||
echo "REDISPASS=\$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2>/dev/null | head -c 28)" >> mailcow.conf
|
echo "REDISPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2>/dev/null | head -c 28)" >> mailcow.conf
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
DEBUG = False
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -20,10 +22,13 @@ from modules.Logger import Logger
|
|||||||
from modules.IPTables import IPTables
|
from modules.IPTables import IPTables
|
||||||
from modules.NFTables import NFTables
|
from modules.NFTables import NFTables
|
||||||
|
|
||||||
|
def logdebug(msg):
|
||||||
|
if DEBUG:
|
||||||
|
logger.logInfo("DEBUG: %s" % msg)
|
||||||
|
|
||||||
# globals
|
# Globals
|
||||||
WHITELIST = []
|
WHITELIST = []
|
||||||
BLACKLIST= []
|
BLACKLIST = []
|
||||||
bans = {}
|
bans = {}
|
||||||
quit_now = False
|
quit_now = False
|
||||||
exit_code = 0
|
exit_code = 0
|
||||||
@@ -33,12 +38,10 @@ r = None
|
|||||||
pubsub = None
|
pubsub = None
|
||||||
clear_before_quit = False
|
clear_before_quit = False
|
||||||
|
|
||||||
|
|
||||||
def refreshF2boptions():
|
def refreshF2boptions():
|
||||||
global f2boptions
|
global f2boptions
|
||||||
global quit_now
|
global quit_now
|
||||||
global exit_code
|
global exit_code
|
||||||
|
|
||||||
f2boptions = {}
|
f2boptions = {}
|
||||||
|
|
||||||
if not r.get('F2B_OPTIONS'):
|
if not r.get('F2B_OPTIONS'):
|
||||||
@@ -52,8 +55,9 @@ def refreshF2boptions():
|
|||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
f2boptions = json.loads(r.get('F2B_OPTIONS'))
|
f2boptions = json.loads(r.get('F2B_OPTIONS'))
|
||||||
except ValueError:
|
except ValueError as e:
|
||||||
logger.logCrit('Error loading F2B options: F2B_OPTIONS is not json')
|
logger.logCrit(
|
||||||
|
'Error loading F2B options: F2B_OPTIONS is not json. Exception: %s' % e)
|
||||||
quit_now = True
|
quit_now = True
|
||||||
exit_code = 2
|
exit_code = 2
|
||||||
|
|
||||||
@@ -61,15 +65,15 @@ def refreshF2boptions():
|
|||||||
r.set('F2B_OPTIONS', json.dumps(f2boptions, ensure_ascii=False))
|
r.set('F2B_OPTIONS', json.dumps(f2boptions, ensure_ascii=False))
|
||||||
|
|
||||||
def verifyF2boptions(f2boptions):
|
def verifyF2boptions(f2boptions):
|
||||||
verifyF2boption(f2boptions,'ban_time', 1800)
|
verifyF2boption(f2boptions, 'ban_time', 1800)
|
||||||
verifyF2boption(f2boptions,'max_ban_time', 10000)
|
verifyF2boption(f2boptions, 'max_ban_time', 10000)
|
||||||
verifyF2boption(f2boptions,'ban_time_increment', True)
|
verifyF2boption(f2boptions, 'ban_time_increment', True)
|
||||||
verifyF2boption(f2boptions,'max_attempts', 10)
|
verifyF2boption(f2boptions, 'max_attempts', 10)
|
||||||
verifyF2boption(f2boptions,'retry_window', 600)
|
verifyF2boption(f2boptions, 'retry_window', 600)
|
||||||
verifyF2boption(f2boptions,'netban_ipv4', 32)
|
verifyF2boption(f2boptions, 'netban_ipv4', 32)
|
||||||
verifyF2boption(f2boptions,'netban_ipv6', 128)
|
verifyF2boption(f2boptions, 'netban_ipv6', 128)
|
||||||
verifyF2boption(f2boptions,'banlist_id', str(uuid.uuid4()))
|
verifyF2boption(f2boptions, 'banlist_id', str(uuid.uuid4()))
|
||||||
verifyF2boption(f2boptions,'manage_external', 0)
|
verifyF2boption(f2boptions, 'manage_external', 0)
|
||||||
|
|
||||||
def verifyF2boption(f2boptions, f2boption, f2bdefault):
|
def verifyF2boption(f2boptions, f2boption, f2bdefault):
|
||||||
f2boptions[f2boption] = f2boptions[f2boption] if f2boption in f2boptions and f2boptions[f2boption] is not None else f2bdefault
|
f2boptions[f2boption] = f2boptions[f2boption] if f2boption in f2boptions and f2boptions[f2boption] is not None else f2bdefault
|
||||||
@@ -111,7 +115,7 @@ def get_ip(address):
|
|||||||
def ban(address):
|
def ban(address):
|
||||||
global f2boptions
|
global f2boptions
|
||||||
global lock
|
global lock
|
||||||
|
logdebug("ban() called with address=%s" % address)
|
||||||
refreshF2boptions()
|
refreshF2boptions()
|
||||||
MAX_ATTEMPTS = int(f2boptions['max_attempts'])
|
MAX_ATTEMPTS = int(f2boptions['max_attempts'])
|
||||||
RETRY_WINDOW = int(f2boptions['retry_window'])
|
RETRY_WINDOW = int(f2boptions['retry_window'])
|
||||||
@@ -119,31 +123,43 @@ def ban(address):
|
|||||||
NETBAN_IPV6 = '/' + str(f2boptions['netban_ipv6'])
|
NETBAN_IPV6 = '/' + str(f2boptions['netban_ipv6'])
|
||||||
|
|
||||||
ip = get_ip(address)
|
ip = get_ip(address)
|
||||||
if not ip: return
|
if not ip:
|
||||||
|
logdebug("No valid IP -- skipping ban()")
|
||||||
|
return
|
||||||
address = str(ip)
|
address = str(ip)
|
||||||
self_network = ipaddress.ip_network(address)
|
self_network = ipaddress.ip_network(address)
|
||||||
|
|
||||||
with lock:
|
with lock:
|
||||||
temp_whitelist = set(WHITELIST)
|
temp_whitelist = set(WHITELIST)
|
||||||
if temp_whitelist:
|
logdebug("Checking if %s overlaps with any WHITELIST entries" % self_network)
|
||||||
for wl_key in temp_whitelist:
|
if temp_whitelist:
|
||||||
wl_net = ipaddress.ip_network(wl_key, False)
|
for wl_key in temp_whitelist:
|
||||||
if wl_net.overlaps(self_network):
|
wl_net = ipaddress.ip_network(wl_key, False)
|
||||||
logger.logInfo('Address %s is whitelisted by rule %s' % (self_network, wl_net))
|
logdebug("Checking overlap between %s and %s" % (self_network, wl_net))
|
||||||
return
|
if wl_net.overlaps(self_network):
|
||||||
|
logger.logInfo(
|
||||||
|
'Address %s is allowlisted by rule %s' % (self_network, wl_net))
|
||||||
|
return
|
||||||
|
|
||||||
net = ipaddress.ip_network((address + (NETBAN_IPV4 if type(ip) is ipaddress.IPv4Address else NETBAN_IPV6)), strict=False)
|
net = ipaddress.ip_network(
|
||||||
|
(address + (NETBAN_IPV4 if type(ip) is ipaddress.IPv4Address else NETBAN_IPV6)), strict=False)
|
||||||
net = str(net)
|
net = str(net)
|
||||||
|
logdebug("Ban net: %s" % net)
|
||||||
|
|
||||||
if not net in bans:
|
if not net in bans:
|
||||||
bans[net] = {'attempts': 0, 'last_attempt': 0, 'ban_counter': 0}
|
bans[net] = {'attempts': 0, 'last_attempt': 0, 'ban_counter': 0}
|
||||||
|
logdebug("Initing new ban counter for %s" % net)
|
||||||
|
|
||||||
current_attempt = time.time()
|
current_attempt = time.time()
|
||||||
|
logdebug("Current attempt ts=%s, previous: %s, retry_window: %s" %
|
||||||
|
(current_attempt, bans[net]['last_attempt'], RETRY_WINDOW))
|
||||||
if current_attempt - bans[net]['last_attempt'] > RETRY_WINDOW:
|
if current_attempt - bans[net]['last_attempt'] > RETRY_WINDOW:
|
||||||
bans[net]['attempts'] = 0
|
bans[net]['attempts'] = 0
|
||||||
|
logdebug("Ban counter for %s reset as window expired" % net)
|
||||||
|
|
||||||
bans[net]['attempts'] += 1
|
bans[net]['attempts'] += 1
|
||||||
bans[net]['last_attempt'] = current_attempt
|
bans[net]['last_attempt'] = current_attempt
|
||||||
|
logdebug("%s attempts now %d" % (net, bans[net]['attempts']))
|
||||||
|
|
||||||
if bans[net]['attempts'] >= MAX_ATTEMPTS:
|
if bans[net]['attempts'] >= MAX_ATTEMPTS:
|
||||||
cur_time = int(round(time.time()))
|
cur_time = int(round(time.time()))
|
||||||
@@ -151,34 +167,41 @@ def ban(address):
|
|||||||
logger.logCrit('Banning %s for %d minutes' % (net, NET_BAN_TIME / 60 ))
|
logger.logCrit('Banning %s for %d minutes' % (net, NET_BAN_TIME / 60 ))
|
||||||
if type(ip) is ipaddress.IPv4Address and int(f2boptions['manage_external']) != 1:
|
if type(ip) is ipaddress.IPv4Address and int(f2boptions['manage_external']) != 1:
|
||||||
with lock:
|
with lock:
|
||||||
|
logdebug("Calling tables.banIPv4(%s)" % net)
|
||||||
tables.banIPv4(net)
|
tables.banIPv4(net)
|
||||||
elif int(f2boptions['manage_external']) != 1:
|
elif int(f2boptions['manage_external']) != 1:
|
||||||
with lock:
|
with lock:
|
||||||
|
logdebug("Calling tables.banIPv6(%s)" % net)
|
||||||
tables.banIPv6(net)
|
tables.banIPv6(net)
|
||||||
|
|
||||||
|
logdebug("Updating F2B_ACTIVE_BANS[%s]=%d" %
|
||||||
|
(net, cur_time + NET_BAN_TIME))
|
||||||
r.hset('F2B_ACTIVE_BANS', '%s' % net, cur_time + NET_BAN_TIME)
|
r.hset('F2B_ACTIVE_BANS', '%s' % net, cur_time + NET_BAN_TIME)
|
||||||
else:
|
else:
|
||||||
logger.logWarn('%d more attempts in the next %d seconds until %s is banned' % (MAX_ATTEMPTS - bans[net]['attempts'], RETRY_WINDOW, net))
|
logger.logWarn('%d more attempts in the next %d seconds until %s is banned' % (
|
||||||
|
MAX_ATTEMPTS - bans[net]['attempts'], RETRY_WINDOW, net))
|
||||||
|
|
||||||
def unban(net):
|
def unban(net):
|
||||||
global lock
|
global lock
|
||||||
|
logdebug("Calling unban() with net=%s" % net)
|
||||||
if not net in bans:
|
if not net in bans:
|
||||||
logger.logInfo('%s is not banned, skipping unban and deleting from queue (if any)' % net)
|
logger.logInfo(
|
||||||
r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
|
'%s is not banned, skipping unban and deleting from queue (if any)' % net)
|
||||||
return
|
r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
|
||||||
|
return
|
||||||
logger.logInfo('Unbanning %s' % net)
|
logger.logInfo('Unbanning %s' % net)
|
||||||
if type(ipaddress.ip_network(net)) is ipaddress.IPv4Network:
|
if type(ipaddress.ip_network(net)) is ipaddress.IPv4Network:
|
||||||
with lock:
|
with lock:
|
||||||
|
logdebug("Calling tables.unbanIPv4(%s)" % net)
|
||||||
tables.unbanIPv4(net)
|
tables.unbanIPv4(net)
|
||||||
else:
|
else:
|
||||||
with lock:
|
with lock:
|
||||||
|
logdebug("Calling tables.unbanIPv6(%s)" % net)
|
||||||
tables.unbanIPv6(net)
|
tables.unbanIPv6(net)
|
||||||
|
|
||||||
r.hdel('F2B_ACTIVE_BANS', '%s' % net)
|
r.hdel('F2B_ACTIVE_BANS', '%s' % net)
|
||||||
r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
|
r.hdel('F2B_QUEUE_UNBAN', '%s' % net)
|
||||||
if net in bans:
|
if net in bans:
|
||||||
|
logdebug("Unban for %s, setting attempts=0, ban_counter+=1" % net)
|
||||||
bans[net]['attempts'] = 0
|
bans[net]['attempts'] = 0
|
||||||
bans[net]['ban_counter'] += 1
|
bans[net]['ban_counter'] += 1
|
||||||
|
|
||||||
@@ -204,17 +227,19 @@ def permBan(net, unban=False):
|
|||||||
|
|
||||||
if is_unbanned:
|
if is_unbanned:
|
||||||
r.hdel('F2B_PERM_BANS', '%s' % net)
|
r.hdel('F2B_PERM_BANS', '%s' % net)
|
||||||
logger.logCrit('Removed host/network %s from blacklist' % net)
|
logger.logCrit('Removed host/network %s from denylist' % net)
|
||||||
elif is_banned:
|
elif is_banned:
|
||||||
r.hset('F2B_PERM_BANS', '%s' % net, int(round(time.time())))
|
r.hset('F2B_PERM_BANS', '%s' % net, int(round(time.time())))
|
||||||
logger.logCrit('Added host/network %s to blacklist' % net)
|
logger.logCrit('Added host/network %s to denylist' % net)
|
||||||
|
|
||||||
def clear():
|
def clear():
|
||||||
global lock
|
global lock
|
||||||
logger.logInfo('Clearing all bans')
|
logger.logInfo('Clearing all bans')
|
||||||
for net in bans.copy():
|
for net in bans.copy():
|
||||||
|
logdebug("Unbanning net: %s" % net)
|
||||||
unban(net)
|
unban(net)
|
||||||
with lock:
|
with lock:
|
||||||
|
logdebug("Clearing IPv4/IPv6 table")
|
||||||
tables.clearIPv4Table()
|
tables.clearIPv4Table()
|
||||||
tables.clearIPv6Table()
|
tables.clearIPv6Table()
|
||||||
try:
|
try:
|
||||||
@@ -275,21 +300,35 @@ def snat6(snat_target):
|
|||||||
|
|
||||||
def autopurge():
|
def autopurge():
|
||||||
global f2boptions
|
global f2boptions
|
||||||
|
logdebug("autopurge thread started")
|
||||||
while not quit_now:
|
while not quit_now:
|
||||||
|
logdebug("autopurge tick")
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
refreshF2boptions()
|
refreshF2boptions()
|
||||||
MAX_ATTEMPTS = int(f2boptions['max_attempts'])
|
MAX_ATTEMPTS = int(f2boptions['max_attempts'])
|
||||||
QUEUE_UNBAN = r.hgetall('F2B_QUEUE_UNBAN')
|
QUEUE_UNBAN = r.hgetall('F2B_QUEUE_UNBAN')
|
||||||
|
logdebug("QUEUE_UNBAN: %s" % QUEUE_UNBAN)
|
||||||
if QUEUE_UNBAN:
|
if QUEUE_UNBAN:
|
||||||
for net in QUEUE_UNBAN:
|
for net in QUEUE_UNBAN:
|
||||||
|
logdebug("Autopurge: unbanning queued net: %s" % net)
|
||||||
unban(str(net))
|
unban(str(net))
|
||||||
for net in bans.copy():
|
# Only check expiry for actively banned IPs:
|
||||||
if bans[net]['attempts'] >= MAX_ATTEMPTS:
|
active_bans = r.hgetall('F2B_ACTIVE_BANS')
|
||||||
NET_BAN_TIME = calcNetBanTime(bans[net]['ban_counter'])
|
now = time.time()
|
||||||
TIME_SINCE_LAST_ATTEMPT = time.time() - bans[net]['last_attempt']
|
for net_str, expire_str in active_bans.items():
|
||||||
if TIME_SINCE_LAST_ATTEMPT > NET_BAN_TIME:
|
logdebug("Checking ban expiry for (actively banned): %s" % net_str)
|
||||||
unban(net)
|
# Defensive: always process if timer missing or expired
|
||||||
|
try:
|
||||||
|
expire = float(expire_str)
|
||||||
|
except Exception:
|
||||||
|
logdebug("Invalid expire time for %s; unbanning" % net_str)
|
||||||
|
unban(net_str)
|
||||||
|
continue
|
||||||
|
time_left = expire - now
|
||||||
|
logdebug("Time left for %s: %.1f seconds" % (net_str, time_left))
|
||||||
|
if time_left <= 0:
|
||||||
|
logdebug("Ban expired for %s" % net_str)
|
||||||
|
unban(net_str)
|
||||||
|
|
||||||
def mailcowChainOrder():
|
def mailcowChainOrder():
|
||||||
global lock
|
global lock
|
||||||
@@ -359,7 +398,7 @@ def whitelistUpdate():
|
|||||||
with lock:
|
with lock:
|
||||||
if Counter(new_whitelist) != Counter(WHITELIST):
|
if Counter(new_whitelist) != Counter(WHITELIST):
|
||||||
WHITELIST = new_whitelist
|
WHITELIST = new_whitelist
|
||||||
logger.logInfo('Whitelist was changed, it has %s entries' % len(WHITELIST))
|
logger.logInfo('Allowlist was changed, it has %s entries' % len(WHITELIST))
|
||||||
time.sleep(60.0 - ((time.time() - start_time) % 60.0))
|
time.sleep(60.0 - ((time.time() - start_time) % 60.0))
|
||||||
|
|
||||||
def blacklistUpdate():
|
def blacklistUpdate():
|
||||||
@@ -375,7 +414,7 @@ def blacklistUpdate():
|
|||||||
addban = set(new_blacklist).difference(BLACKLIST)
|
addban = set(new_blacklist).difference(BLACKLIST)
|
||||||
delban = set(BLACKLIST).difference(new_blacklist)
|
delban = set(BLACKLIST).difference(new_blacklist)
|
||||||
BLACKLIST = new_blacklist
|
BLACKLIST = new_blacklist
|
||||||
logger.logInfo('Blacklist was changed, it has %s entries' % len(BLACKLIST))
|
logger.logInfo('Denylist was changed, it has %s entries' % len(BLACKLIST))
|
||||||
if addban:
|
if addban:
|
||||||
for net in addban:
|
for net in addban:
|
||||||
permBan(net=net)
|
permBan(net=net)
|
||||||
@@ -386,25 +425,25 @@ def blacklistUpdate():
|
|||||||
|
|
||||||
def sigterm_quit(signum, frame):
|
def sigterm_quit(signum, frame):
|
||||||
global clear_before_quit
|
global clear_before_quit
|
||||||
|
logdebug("SIGTERM received, setting clear_before_quit to True and exiting")
|
||||||
clear_before_quit = True
|
clear_before_quit = True
|
||||||
sys.exit(exit_code)
|
sys.exit(exit_code)
|
||||||
|
|
||||||
def berfore_quit():
|
def before_quit():
|
||||||
|
logdebug("before_quit called, clear_before_quit=%s" % clear_before_quit)
|
||||||
if clear_before_quit:
|
if clear_before_quit:
|
||||||
clear()
|
clear()
|
||||||
if pubsub is not None:
|
if pubsub is not None:
|
||||||
pubsub.unsubscribe()
|
pubsub.unsubscribe()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
atexit.register(berfore_quit)
|
logger = Logger()
|
||||||
|
logdebug("Sys.argv: %s" % sys.argv)
|
||||||
|
atexit.register(before_quit)
|
||||||
signal.signal(signal.SIGTERM, sigterm_quit)
|
signal.signal(signal.SIGTERM, sigterm_quit)
|
||||||
|
|
||||||
# init Logger
|
|
||||||
logger = Logger()
|
|
||||||
|
|
||||||
# init backend
|
|
||||||
backend = sys.argv[1]
|
backend = sys.argv[1]
|
||||||
|
logdebug("Backend: %s" % backend)
|
||||||
if backend == "nftables":
|
if backend == "nftables":
|
||||||
logger.logInfo('Using NFTables backend')
|
logger.logInfo('Using NFTables backend')
|
||||||
tables = NFTables(chain_name, logger)
|
tables = NFTables(chain_name, logger)
|
||||||
@@ -412,16 +451,12 @@ if __name__ == '__main__':
|
|||||||
logger.logInfo('Using IPTables backend')
|
logger.logInfo('Using IPTables backend')
|
||||||
tables = IPTables(chain_name, logger)
|
tables = IPTables(chain_name, logger)
|
||||||
|
|
||||||
# In case a previous session was killed without cleanup
|
|
||||||
clear()
|
clear()
|
||||||
|
|
||||||
# Reinit MAILCOW chain
|
|
||||||
# Is called before threads start, no locking
|
|
||||||
logger.logInfo("Initializing mailcow netfilter chain")
|
logger.logInfo("Initializing mailcow netfilter chain")
|
||||||
tables.initChainIPv4()
|
tables.initChainIPv4()
|
||||||
tables.initChainIPv6()
|
tables.initChainIPv6()
|
||||||
|
|
||||||
if os.getenv("DISABLE_NETFILTER_ISOLATION_RULE").lower() in ("y", "yes"):
|
if os.getenv("DISABLE_NETFILTER_ISOLATION_RULE", "").lower() in ("y", "yes"):
|
||||||
logger.logInfo(f"Skipping {chain_name} isolation")
|
logger.logInfo(f"Skipping {chain_name} isolation")
|
||||||
else:
|
else:
|
||||||
logger.logInfo(f"Setting {chain_name} isolation")
|
logger.logInfo(f"Setting {chain_name} isolation")
|
||||||
@@ -432,23 +467,28 @@ if __name__ == '__main__':
|
|||||||
try:
|
try:
|
||||||
redis_slaveof_ip = os.getenv('REDIS_SLAVEOF_IP', '')
|
redis_slaveof_ip = os.getenv('REDIS_SLAVEOF_IP', '')
|
||||||
redis_slaveof_port = os.getenv('REDIS_SLAVEOF_PORT', '')
|
redis_slaveof_port = os.getenv('REDIS_SLAVEOF_PORT', '')
|
||||||
|
logdebug(
|
||||||
|
"Connecting redis (SLAVEOF_IP:%s, PORT:%s)" % (redis_slaveof_ip, redis_slaveof_port))
|
||||||
if "".__eq__(redis_slaveof_ip):
|
if "".__eq__(redis_slaveof_ip):
|
||||||
r = redis.StrictRedis(host=os.getenv('IPV4_NETWORK', '172.22.1') + '.249', decode_responses=True, port=6379, db=0, password=os.environ['REDISPASS'])
|
r = redis.StrictRedis(
|
||||||
|
host=os.getenv('IPV4_NETWORK', '172.22.1') + '.249', decode_responses=True, port=6379, db=0, password=os.environ['REDISPASS'])
|
||||||
else:
|
else:
|
||||||
r = redis.StrictRedis(host=redis_slaveof_ip, decode_responses=True, port=redis_slaveof_port, db=0, password=os.environ['REDISPASS'])
|
r = redis.StrictRedis(
|
||||||
|
host=redis_slaveof_ip, decode_responses=True, port=redis_slaveof_port, db=0, password=os.environ['REDISPASS'])
|
||||||
r.ping()
|
r.ping()
|
||||||
pubsub = r.pubsub()
|
pubsub = r.pubsub()
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
print('%s - trying again in 3 seconds' % (ex))
|
logdebug(
|
||||||
|
'Redis connection failed: %s - trying again in 3 seconds' % (ex))
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
logger.set_redis(r)
|
logger.set_redis(r)
|
||||||
|
logdebug("Redis connection established, setting up F2B keys")
|
||||||
|
|
||||||
# rename fail2ban to netfilter
|
|
||||||
if r.exists('F2B_LOG'):
|
if r.exists('F2B_LOG'):
|
||||||
|
logdebug("Renaming F2B_LOG to NETFILTER_LOG")
|
||||||
r.rename('F2B_LOG', 'NETFILTER_LOG')
|
r.rename('F2B_LOG', 'NETFILTER_LOG')
|
||||||
# clear bans in redis
|
|
||||||
r.delete('F2B_ACTIVE_BANS')
|
r.delete('F2B_ACTIVE_BANS')
|
||||||
r.delete('F2B_PERM_BANS')
|
r.delete('F2B_PERM_BANS')
|
||||||
|
|
||||||
@@ -463,7 +503,7 @@ if __name__ == '__main__':
|
|||||||
snat_ip = os.getenv('SNAT_TO_SOURCE')
|
snat_ip = os.getenv('SNAT_TO_SOURCE')
|
||||||
snat_ipo = ipaddress.ip_address(snat_ip)
|
snat_ipo = ipaddress.ip_address(snat_ip)
|
||||||
if type(snat_ipo) is ipaddress.IPv4Address:
|
if type(snat_ipo) is ipaddress.IPv4Address:
|
||||||
snat4_thread = Thread(target=snat4,args=(snat_ip,))
|
snat4_thread = Thread(target=snat4, args=(snat_ip,))
|
||||||
snat4_thread.daemon = True
|
snat4_thread.daemon = True
|
||||||
snat4_thread.start()
|
snat4_thread.start()
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@@ -499,4 +539,5 @@ if __name__ == '__main__':
|
|||||||
while not quit_now:
|
while not quit_now:
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
logdebug("Exiting with code %s" % exit_code)
|
||||||
sys.exit(exit_code)
|
sys.exit(exit_code)
|
||||||
@@ -10,7 +10,7 @@ def includes_conf(env, template_vars):
|
|||||||
server_name_config = f"server_name {template_vars['MAILCOW_HOSTNAME']} autodiscover.* autoconfig.* {' '.join(template_vars['ADDITIONAL_SERVER_NAMES'])};"
|
server_name_config = f"server_name {template_vars['MAILCOW_HOSTNAME']} autodiscover.* autoconfig.* {' '.join(template_vars['ADDITIONAL_SERVER_NAMES'])};"
|
||||||
listen_plain_config = f"listen {template_vars['HTTP_PORT']};"
|
listen_plain_config = f"listen {template_vars['HTTP_PORT']};"
|
||||||
listen_ssl_config = f"listen {template_vars['HTTPS_PORT']};"
|
listen_ssl_config = f"listen {template_vars['HTTPS_PORT']};"
|
||||||
if template_vars['ENABLE_IPV6'] == "false":
|
if not template_vars['ENABLE_IPV6']:
|
||||||
listen_plain_config += f"\nlisten [::]:{template_vars['HTTP_PORT']};"
|
listen_plain_config += f"\nlisten [::]:{template_vars['HTTP_PORT']};"
|
||||||
listen_ssl_config += f"\nlisten [::]:{template_vars['HTTPS_PORT']} ssl;"
|
listen_ssl_config += f"\nlisten [::]:{template_vars['HTTPS_PORT']} ssl;"
|
||||||
listen_ssl_config += "\nhttp2 on;"
|
listen_ssl_config += "\nhttp2 on;"
|
||||||
@@ -58,7 +58,7 @@ def prepare_template_vars():
|
|||||||
'SOGOHOST': os.getenv("SOGOHOST", ipv4_network + ".248"),
|
'SOGOHOST': os.getenv("SOGOHOST", ipv4_network + ".248"),
|
||||||
'RSPAMDHOST': os.getenv("RSPAMDHOST", "rspamd-mailcow"),
|
'RSPAMDHOST': os.getenv("RSPAMDHOST", "rspamd-mailcow"),
|
||||||
'PHPFPMHOST': os.getenv("PHPFPMHOST", "php-fpm-mailcow"),
|
'PHPFPMHOST': os.getenv("PHPFPMHOST", "php-fpm-mailcow"),
|
||||||
'ENABLE_IPV6': os.getenv("ENABLE_IPV6", "true").lower() in ("false"),
|
'ENABLE_IPV6': os.getenv("ENABLE_IPV6", "true").lower() != "false",
|
||||||
'HTTP_REDIRECT': os.getenv("HTTP_REDIRECT", "n").lower() in ("y", "yes"),
|
'HTTP_REDIRECT': os.getenv("HTTP_REDIRECT", "n").lower() in ("y", "yes"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Whitelist generated by Postwhite v3.4 on Tue Jul 1 00:22:55 UTC 2025
|
# Whitelist generated by Postwhite v3.4 on Fri Aug 1 00:24:14 UTC 2025
|
||||||
# https://github.com/stevejenkins/postwhite/
|
# https://github.com/stevejenkins/postwhite/
|
||||||
# 2105 total rules
|
# 2166 total rules
|
||||||
2a00:1450:4000::/36 permit
|
2a00:1450:4000::/36 permit
|
||||||
2a01:111:f400::/48 permit
|
2a01:111:f400::/48 permit
|
||||||
2a01:111:f403:8000::/50 permit
|
2a01:111:f403:8000::/50 permit
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
8.40.222.0/23 permit
|
8.40.222.0/23 permit
|
||||||
8.40.222.250/31 permit
|
8.40.222.250/31 permit
|
||||||
12.130.86.238 permit
|
12.130.86.238 permit
|
||||||
13.107.246.51 permit
|
13.107.253.40 permit
|
||||||
13.110.208.0/21 permit
|
13.110.208.0/21 permit
|
||||||
13.110.209.0/24 permit
|
13.110.209.0/24 permit
|
||||||
13.110.216.0/22 permit
|
13.110.216.0/22 permit
|
||||||
@@ -120,7 +120,6 @@
|
|||||||
27.123.206.56/29 permit
|
27.123.206.56/29 permit
|
||||||
27.123.206.76/30 permit
|
27.123.206.76/30 permit
|
||||||
27.123.206.80/28 permit
|
27.123.206.80/28 permit
|
||||||
31.25.48.222 permit
|
|
||||||
31.47.251.17 permit
|
31.47.251.17 permit
|
||||||
31.186.239.0/24 permit
|
31.186.239.0/24 permit
|
||||||
34.2.64.0/22 permit
|
34.2.64.0/22 permit
|
||||||
@@ -156,6 +155,7 @@
|
|||||||
34.218.115.239 permit
|
34.218.115.239 permit
|
||||||
34.218.116.3 permit
|
34.218.116.3 permit
|
||||||
34.225.212.172 permit
|
34.225.212.172 permit
|
||||||
|
34.241.242.183 permit
|
||||||
35.83.148.184 permit
|
35.83.148.184 permit
|
||||||
35.155.198.111 permit
|
35.155.198.111 permit
|
||||||
35.158.23.94 permit
|
35.158.23.94 permit
|
||||||
@@ -256,6 +256,7 @@
|
|||||||
50.112.246.219 permit
|
50.112.246.219 permit
|
||||||
52.1.14.157 permit
|
52.1.14.157 permit
|
||||||
52.5.230.59 permit
|
52.5.230.59 permit
|
||||||
|
52.6.74.205 permit
|
||||||
52.12.53.23 permit
|
52.12.53.23 permit
|
||||||
52.13.214.179 permit
|
52.13.214.179 permit
|
||||||
52.26.1.71 permit
|
52.26.1.71 permit
|
||||||
@@ -329,7 +330,6 @@
|
|||||||
62.13.144.0/21 permit
|
62.13.144.0/21 permit
|
||||||
62.13.152.0/21 permit
|
62.13.152.0/21 permit
|
||||||
62.17.146.128/26 permit
|
62.17.146.128/26 permit
|
||||||
62.179.121.0/24 permit
|
|
||||||
62.201.172.0/27 permit
|
62.201.172.0/27 permit
|
||||||
62.201.172.32/27 permit
|
62.201.172.32/27 permit
|
||||||
62.253.227.114 permit
|
62.253.227.114 permit
|
||||||
@@ -352,6 +352,7 @@
|
|||||||
64.127.115.252 permit
|
64.127.115.252 permit
|
||||||
64.132.88.0/23 permit
|
64.132.88.0/23 permit
|
||||||
64.132.92.0/24 permit
|
64.132.92.0/24 permit
|
||||||
|
64.181.194.190 permit
|
||||||
64.207.219.7 permit
|
64.207.219.7 permit
|
||||||
64.207.219.8 permit
|
64.207.219.8 permit
|
||||||
64.207.219.9 permit
|
64.207.219.9 permit
|
||||||
@@ -408,7 +409,6 @@
|
|||||||
65.154.166.0/24 permit
|
65.154.166.0/24 permit
|
||||||
65.212.180.36 permit
|
65.212.180.36 permit
|
||||||
66.102.0.0/20 permit
|
66.102.0.0/20 permit
|
||||||
66.102.0.0/21 permit
|
|
||||||
66.119.150.192/26 permit
|
66.119.150.192/26 permit
|
||||||
66.163.184.0/24 permit
|
66.163.184.0/24 permit
|
||||||
66.163.185.0/24 permit
|
66.163.185.0/24 permit
|
||||||
@@ -658,9 +658,6 @@
|
|||||||
82.165.159.45 permit
|
82.165.159.45 permit
|
||||||
82.165.159.130 permit
|
82.165.159.130 permit
|
||||||
82.165.159.131 permit
|
82.165.159.131 permit
|
||||||
84.116.6.0/23 permit
|
|
||||||
84.116.36.0/24 permit
|
|
||||||
84.116.50.0/23 permit
|
|
||||||
85.158.136.0/21 permit
|
85.158.136.0/21 permit
|
||||||
86.61.88.25 permit
|
86.61.88.25 permit
|
||||||
87.238.80.0/21 permit
|
87.238.80.0/21 permit
|
||||||
@@ -701,12 +698,13 @@
|
|||||||
87.248.117.205 permit
|
87.248.117.205 permit
|
||||||
87.253.232.0/21 permit
|
87.253.232.0/21 permit
|
||||||
89.22.108.0/24 permit
|
89.22.108.0/24 permit
|
||||||
|
91.198.2.0/24 permit
|
||||||
91.211.240.0/22 permit
|
91.211.240.0/22 permit
|
||||||
94.169.2.0/23 permit
|
|
||||||
94.236.119.0/26 permit
|
94.236.119.0/26 permit
|
||||||
94.245.112.0/27 permit
|
94.245.112.0/27 permit
|
||||||
94.245.112.10/31 permit
|
94.245.112.10/31 permit
|
||||||
95.131.104.0/21 permit
|
95.131.104.0/21 permit
|
||||||
|
95.217.114.154 permit
|
||||||
96.43.144.0/20 permit
|
96.43.144.0/20 permit
|
||||||
96.43.144.64/28 permit
|
96.43.144.64/28 permit
|
||||||
96.43.144.64/31 permit
|
96.43.144.64/31 permit
|
||||||
@@ -1344,7 +1342,7 @@
|
|||||||
108.174.6.215 permit
|
108.174.6.215 permit
|
||||||
108.175.18.45 permit
|
108.175.18.45 permit
|
||||||
108.175.30.45 permit
|
108.175.30.45 permit
|
||||||
108.177.8.0/21 permit
|
108.177.8.0/22 permit
|
||||||
108.177.96.0/19 permit
|
108.177.96.0/19 permit
|
||||||
108.179.144.0/20 permit
|
108.179.144.0/20 permit
|
||||||
109.237.142.0/24 permit
|
109.237.142.0/24 permit
|
||||||
@@ -1429,6 +1427,8 @@
|
|||||||
132.226.26.225 permit
|
132.226.26.225 permit
|
||||||
132.226.49.32 permit
|
132.226.49.32 permit
|
||||||
132.226.56.24 permit
|
132.226.56.24 permit
|
||||||
|
134.128.64.0/19 permit
|
||||||
|
134.128.96.0/19 permit
|
||||||
134.170.27.8 permit
|
134.170.27.8 permit
|
||||||
134.170.113.0/26 permit
|
134.170.113.0/26 permit
|
||||||
134.170.141.64/26 permit
|
134.170.141.64/26 permit
|
||||||
@@ -1618,10 +1618,14 @@
|
|||||||
168.245.127.231 permit
|
168.245.127.231 permit
|
||||||
169.148.129.0/24 permit
|
169.148.129.0/24 permit
|
||||||
169.148.131.0/24 permit
|
169.148.131.0/24 permit
|
||||||
|
169.148.138.0/24 permit
|
||||||
169.148.142.10 permit
|
169.148.142.10 permit
|
||||||
169.148.144.0/25 permit
|
169.148.144.0/25 permit
|
||||||
169.148.144.10 permit
|
169.148.144.10 permit
|
||||||
169.148.146.0/23 permit
|
169.148.146.0/23 permit
|
||||||
|
169.148.174.33 permit
|
||||||
|
169.148.175.3 permit
|
||||||
|
169.148.188.0/24 permit
|
||||||
169.148.188.182 permit
|
169.148.188.182 permit
|
||||||
170.10.128.0/24 permit
|
170.10.128.0/24 permit
|
||||||
170.10.129.0/24 permit
|
170.10.129.0/24 permit
|
||||||
@@ -1662,6 +1666,8 @@
|
|||||||
182.50.78.64/28 permit
|
182.50.78.64/28 permit
|
||||||
183.240.219.64/29 permit
|
183.240.219.64/29 permit
|
||||||
185.4.120.0/22 permit
|
185.4.120.0/22 permit
|
||||||
|
185.11.253.128/27 permit
|
||||||
|
185.11.255.0/24 permit
|
||||||
185.12.80.0/22 permit
|
185.12.80.0/22 permit
|
||||||
185.28.196.0/22 permit
|
185.28.196.0/22 permit
|
||||||
185.58.84.93 permit
|
185.58.84.93 permit
|
||||||
@@ -1672,6 +1678,8 @@
|
|||||||
185.138.56.128/25 permit
|
185.138.56.128/25 permit
|
||||||
185.189.236.0/22 permit
|
185.189.236.0/22 permit
|
||||||
185.211.120.0/22 permit
|
185.211.120.0/22 permit
|
||||||
|
185.233.188.0/23 permit
|
||||||
|
185.233.190.0/23 permit
|
||||||
185.250.236.0/22 permit
|
185.250.236.0/22 permit
|
||||||
185.250.239.148 permit
|
185.250.239.148 permit
|
||||||
185.250.239.168 permit
|
185.250.239.168 permit
|
||||||
@@ -1746,6 +1754,9 @@
|
|||||||
193.109.254.0/23 permit
|
193.109.254.0/23 permit
|
||||||
193.122.128.100 permit
|
193.122.128.100 permit
|
||||||
193.123.56.63 permit
|
193.123.56.63 permit
|
||||||
|
193.142.157.0/24 permit
|
||||||
|
193.142.157.191 permit
|
||||||
|
193.142.157.198 permit
|
||||||
194.19.134.0/25 permit
|
194.19.134.0/25 permit
|
||||||
194.64.234.129 permit
|
194.64.234.129 permit
|
||||||
194.97.196.0/24 permit
|
194.97.196.0/24 permit
|
||||||
@@ -1865,6 +1876,8 @@
|
|||||||
204.92.114.187 permit
|
204.92.114.187 permit
|
||||||
204.92.114.203 permit
|
204.92.114.203 permit
|
||||||
204.92.114.204/31 permit
|
204.92.114.204/31 permit
|
||||||
|
204.141.32.0/23 permit
|
||||||
|
204.141.42.0/23 permit
|
||||||
204.216.164.202 permit
|
204.216.164.202 permit
|
||||||
204.220.160.0/21 permit
|
204.220.160.0/21 permit
|
||||||
204.220.168.0/21 permit
|
204.220.168.0/21 permit
|
||||||
@@ -2039,7 +2052,8 @@
|
|||||||
212.227.126.225 permit
|
212.227.126.225 permit
|
||||||
212.227.126.226 permit
|
212.227.126.226 permit
|
||||||
212.227.126.227 permit
|
212.227.126.227 permit
|
||||||
213.46.255.0/24 permit
|
213.95.19.64/27 permit
|
||||||
|
213.95.135.4 permit
|
||||||
213.199.128.139 permit
|
213.199.128.139 permit
|
||||||
213.199.128.145 permit
|
213.199.128.145 permit
|
||||||
213.199.138.181 permit
|
213.199.138.181 permit
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ $DEFAULT_LANG = 'en-gb';
|
|||||||
// https://en.wikipedia.org/wiki/IETF_language_tag
|
// https://en.wikipedia.org/wiki/IETF_language_tag
|
||||||
$AVAILABLE_LANGUAGES = array(
|
$AVAILABLE_LANGUAGES = array(
|
||||||
// 'ca-es' => 'Català (Catalan)',
|
// 'ca-es' => 'Català (Catalan)',
|
||||||
|
'bg-bg' => 'Български (Bulgarian)',
|
||||||
'cs-cz' => 'Čeština (Czech)',
|
'cs-cz' => 'Čeština (Czech)',
|
||||||
'da-dk' => 'Danish (Dansk)',
|
'da-dk' => 'Danish (Dansk)',
|
||||||
'de-de' => 'Deutsch (German)',
|
'de-de' => 'Deutsch (German)',
|
||||||
@@ -237,12 +238,12 @@ $FIDO2_FORMATS = array('apple', 'android-key', 'android-safetynet', 'fido-u2f',
|
|||||||
// Set visible Rspamd maps in mailcow UI, do not change unless you know what you are doing
|
// Set visible Rspamd maps in mailcow UI, do not change unless you know what you are doing
|
||||||
$RSPAMD_MAPS = array(
|
$RSPAMD_MAPS = array(
|
||||||
'regex' => array(
|
'regex' => array(
|
||||||
'Header-From: Blacklist' => 'global_mime_from_blacklist.map',
|
'Header-From: Denylist' => 'global_mime_from_blacklist.map',
|
||||||
'Header-From: Whitelist' => 'global_mime_from_whitelist.map',
|
'Header-From: Allowlist' => 'global_mime_from_whitelist.map',
|
||||||
'Envelope Sender Blacklist' => 'global_smtp_from_blacklist.map',
|
'Envelope Sender Denylist' => 'global_smtp_from_blacklist.map',
|
||||||
'Envelope Sender Whitelist' => 'global_smtp_from_whitelist.map',
|
'Envelope Sender Allowlist' => 'global_smtp_from_whitelist.map',
|
||||||
'Recipient Blacklist' => 'global_rcpt_blacklist.map',
|
'Recipient Denylist' => 'global_rcpt_blacklist.map',
|
||||||
'Recipient Whitelist' => 'global_rcpt_whitelist.map',
|
'Recipient Allowlist' => 'global_rcpt_whitelist.map',
|
||||||
'Fishy TLDS (only fired in combination with bad words)' => 'fishy_tlds.map',
|
'Fishy TLDS (only fired in combination with bad words)' => 'fishy_tlds.map',
|
||||||
'Bad Words (only fired in combination with fishy TLDs)' => 'bad_words.map',
|
'Bad Words (only fired in combination with fishy TLDs)' => 'bad_words.map',
|
||||||
'Bad Words DE (only fired in combination with fishy TLDs)' => 'bad_words_de.map',
|
'Bad Words DE (only fired in combination with fishy TLDs)' => 'bad_words_de.map',
|
||||||
|
|||||||
+1391
-1
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@
|
|||||||
"sogo_access": "Verwalten des SOGo-Zugriffsrechts erlauben",
|
"sogo_access": "Verwalten des SOGo-Zugriffsrechts erlauben",
|
||||||
"sogo_profile_reset": "SOGo-Profil zurücksetzen",
|
"sogo_profile_reset": "SOGo-Profil zurücksetzen",
|
||||||
"spam_alias": "Temporäre E-Mail-Aliasse",
|
"spam_alias": "Temporäre E-Mail-Aliasse",
|
||||||
"spam_policy": "Blacklist/Whitelist",
|
"spam_policy": "Deny/Allowlist",
|
||||||
"spam_score": "Spam-Bewertung",
|
"spam_score": "Spam-Bewertung",
|
||||||
"syncjobs": "Sync Jobs",
|
"syncjobs": "Sync Jobs",
|
||||||
"tls_policy": "Verschlüsselungsrichtlinie",
|
"tls_policy": "Verschlüsselungsrichtlinie",
|
||||||
@@ -147,7 +147,7 @@
|
|||||||
"arrival_time": "Ankunftszeit (Serverzeit)",
|
"arrival_time": "Ankunftszeit (Serverzeit)",
|
||||||
"authed_user": "Auth. Benutzer",
|
"authed_user": "Auth. Benutzer",
|
||||||
"ays": "Soll der Vorgang wirklich ausgeführt werden?",
|
"ays": "Soll der Vorgang wirklich ausgeführt werden?",
|
||||||
"ban_list_info": "Übersicht ausgesperrter Netzwerke: <b>Netzwerk (verbleibende Bannzeit) - [Aktionen]</b>.<br />IPs, die zum Entsperren eingereiht werden, verlassen die Liste aktiver Banns nach wenigen Sekunden.<br />Rote Labels sind Indikatoren für aktive Blacklist-Einträge.",
|
"ban_list_info": "Übersicht ausgesperrter Netzwerke: <b>Netzwerk (verbleibende Bannzeit) - [Aktionen]</b>.<br />IPs, die zum Entsperren eingereiht werden, verlassen die Liste aktiver Banns nach wenigen Sekunden.<br />Rote Labels sind Indikatoren für aktive Allowlist-Einträge.",
|
||||||
"change_logo": "Logo ändern",
|
"change_logo": "Logo ändern",
|
||||||
"configuration": "Konfiguration",
|
"configuration": "Konfiguration",
|
||||||
"convert_html_to_text": "Konvertiere HTML zu reinem Text",
|
"convert_html_to_text": "Konvertiere HTML zu reinem Text",
|
||||||
@@ -184,9 +184,9 @@
|
|||||||
"excludes": "Diese Empfänger ausschließen",
|
"excludes": "Diese Empfänger ausschließen",
|
||||||
"f2b_ban_time": "Bannzeit in Sekunden",
|
"f2b_ban_time": "Bannzeit in Sekunden",
|
||||||
"f2b_ban_time_increment": "Bannzeit erhöht sich mit jedem Bann",
|
"f2b_ban_time_increment": "Bannzeit erhöht sich mit jedem Bann",
|
||||||
"f2b_blacklist": "Blacklist für Netzwerke und Hosts",
|
"f2b_blacklist": "Denyliste für Netzwerke und Hosts",
|
||||||
"f2b_filter": "Regex-Filter",
|
"f2b_filter": "Regex-Filter",
|
||||||
"f2b_list_info": "Ein Host oder Netzwerk auf der Blacklist wird immer eine Whitelist-Einheit überwiegen. <b>Die Aktualisierung der Liste dauert einige Sekunden.</b>",
|
"f2b_list_info": "Ein Host oder Netzwerk auf der Denyliste wird immer eine Allowlist-Einheit überwiegen. <b>Die Aktualisierung der Liste dauert einige Sekunden.</b>",
|
||||||
"f2b_manage_external": "Fail2Ban extern verwalten",
|
"f2b_manage_external": "Fail2Ban extern verwalten",
|
||||||
"f2b_manage_external_info": "Fail2ban wird die Banlist weiterhin pflegen, jedoch werden keine aktiven Regeln zum blockieren gesetzt. Die unten generierte Banlist, kann verwendet werden, um den Datenverkehr extern zu blockieren.",
|
"f2b_manage_external_info": "Fail2ban wird die Banlist weiterhin pflegen, jedoch werden keine aktiven Regeln zum blockieren gesetzt. Die unten generierte Banlist, kann verwendet werden, um den Datenverkehr extern zu blockieren.",
|
||||||
"f2b_max_attempts": "Max. Versuche",
|
"f2b_max_attempts": "Max. Versuche",
|
||||||
@@ -196,10 +196,10 @@
|
|||||||
"f2b_parameters": "Fail2ban-Parameter",
|
"f2b_parameters": "Fail2ban-Parameter",
|
||||||
"f2b_regex_info": "Berücksichtigte Logs: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"f2b_regex_info": "Berücksichtigte Logs: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Wiederholungen im Zeitraum von (s)",
|
"f2b_retry_window": "Wiederholungen im Zeitraum von (s)",
|
||||||
"f2b_whitelist": "Whitelist für Netzwerke und Hosts",
|
"f2b_whitelist": "Allowliste für Netzwerke und Hosts",
|
||||||
"filter_table": "Tabelle filtern",
|
"filter_table": "Tabelle filtern",
|
||||||
"force_sso_text": "Wenn ein externer OIDC-Provider konfiguriert ist, blendet diese Option die mailcow Loginform aus und zeigt nur den Single Sign-On-Button an.",
|
"force_sso_text": "Wenn ein externer OIDC-Provider konfiguriert ist, blendet diese Option die mailcow-Loginform aus und zeigt nur den Single-Sign-On-Button an.",
|
||||||
"force_sso": "mailcow Login deaktivieren und nur Single Sign-On anzeigen",
|
"force_sso": "mailcow-Login deaktivieren und nur Single Sign-On anzeigen",
|
||||||
"forwarding_hosts": "Weiterleitungs-Hosts",
|
"forwarding_hosts": "Weiterleitungs-Hosts",
|
||||||
"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.",
|
"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.",
|
||||||
"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.",
|
"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.",
|
||||||
@@ -272,6 +272,7 @@
|
|||||||
"message": "Nachricht",
|
"message": "Nachricht",
|
||||||
"message_size": "Nachrichtengröße",
|
"message_size": "Nachrichtengröße",
|
||||||
"nexthop": "Next Hop",
|
"nexthop": "Next Hop",
|
||||||
|
"needs_restart": "benötigt Neustart",
|
||||||
"no": "✕",
|
"no": "✕",
|
||||||
"no_active_bans": "Keine aktiven Banns",
|
"no_active_bans": "Keine aktiven Banns",
|
||||||
"no_new_rows": "Keine weiteren Zeilen vorhanden",
|
"no_new_rows": "Keine weiteren Zeilen vorhanden",
|
||||||
@@ -354,8 +355,8 @@
|
|||||||
"rspamd_com_settings": "Ein Name wird automatisch generiert. Beispielinhalte zur Einsicht stehen nachstehend bereit. Siehe auch <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd docs</a>",
|
"rspamd_com_settings": "Ein Name wird automatisch generiert. Beispielinhalte zur Einsicht stehen nachstehend bereit. Siehe auch <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd docs</a>",
|
||||||
"rspamd_global_filters": "Globale Filter-Maps",
|
"rspamd_global_filters": "Globale Filter-Maps",
|
||||||
"rspamd_global_filters_agree": "Ich werde vorsichtig sein!",
|
"rspamd_global_filters_agree": "Ich werde vorsichtig sein!",
|
||||||
"rspamd_global_filters_info": "Globale Filter-Maps steuern globales White- und Blacklisting dieses Servers.",
|
"rspamd_global_filters_info": "Globale Filter-Maps steuern globales Allow- und Denylisting dieses Servers.",
|
||||||
"rspamd_global_filters_regex": "Die akzeptierte Form für Einträge sind <b>ausschließlich</b> Regular Expressions.\r\n Trotz rudimentärer Überprüfung der Map, kann es zu fehlerhaften Einträgen kommen, die Rspamd im schlechtesten Fall mit unvorhersehbarer Funktionalität bestraft.<br>\r\n Das korrekte Format lautet \"/pattern/options\" (Beispiel: <code>/.+@domain\\.tld/i</code>).<br>\r\n Der Name der Map beschreibt die jeweilige Funktion.<br>\r\n Rspamd versucht die Maps umgehend aufzulösen. Bei Problemen sollte <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">Rspamd manuell neugestartet werden</a>.<br>Elemente auf Blacklists sind von der Quarantäne ausgeschlossen.",
|
"rspamd_global_filters_regex": "Die akzeptierte Form für Einträge sind <b>ausschließlich</b> Regular Expressions.\r\n Trotz rudimentärer Überprüfung der Map, kann es zu fehlerhaften Einträgen kommen, die Rspamd im schlechtesten Fall mit unvorhersehbarer Funktionalität bestraft.<br>\r\n Das korrekte Format lautet \"/pattern/options\" (Beispiel: <code>/.+@domain\\.tld/i</code>).<br>\r\n Der Name der Map beschreibt die jeweilige Funktion.<br>\r\n Rspamd versucht die Maps umgehend aufzulösen. Bei Problemen sollte <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">Rspamd manuell neugestartet werden</a>.<br>Elemente auf Denylisten sind von der Quarantäne ausgeschlossen.",
|
||||||
"rspamd_settings_map": "Rspamd-Settings-Map",
|
"rspamd_settings_map": "Rspamd-Settings-Map",
|
||||||
"sal_level": "Moo-Level",
|
"sal_level": "Moo-Level",
|
||||||
"save": "Änderungen speichern",
|
"save": "Änderungen speichern",
|
||||||
@@ -547,7 +548,8 @@
|
|||||||
"yotp_verification_failed": "Yubico OTP-Verifizierung fehlgeschlagen: %s",
|
"yotp_verification_failed": "Yubico OTP-Verifizierung fehlgeschlagen: %s",
|
||||||
"template_exists": "Vorlage %s existiert bereits",
|
"template_exists": "Vorlage %s existiert bereits",
|
||||||
"template_id_invalid": "Vorlagen-ID %s ungültig",
|
"template_id_invalid": "Vorlagen-ID %s ungültig",
|
||||||
"template_name_invalid": "Name der Vorlage ungültig"
|
"template_name_invalid": "Name der Vorlage ungültig",
|
||||||
|
"required_data_missing": "Die benötigten Daten: %s fehlen"
|
||||||
},
|
},
|
||||||
"datatables": {
|
"datatables": {
|
||||||
"collapse_all": "Alle Einklappen",
|
"collapse_all": "Alle Einklappen",
|
||||||
@@ -747,7 +749,7 @@
|
|||||||
"sogo_visible_info": "Diese Option hat lediglich Einfluss auf Objekte, die in SOGo darstellbar sind (geteilte oder nicht-geteilte Alias-Adressen mit dem Ziel mindestens einer lokalen Mailbox).",
|
"sogo_visible_info": "Diese Option hat lediglich Einfluss auf Objekte, die in SOGo darstellbar sind (geteilte oder nicht-geteilte Alias-Adressen mit dem Ziel mindestens einer lokalen Mailbox).",
|
||||||
"spam_alias": "Anpassen temporärer Alias-Adressen",
|
"spam_alias": "Anpassen temporärer Alias-Adressen",
|
||||||
"spam_filter": "Spamfilter",
|
"spam_filter": "Spamfilter",
|
||||||
"spam_policy": "Hinzufügen und Entfernen von Einträgen in White- und Blacklists",
|
"spam_policy": "Hinzufügen und Entfernen von Einträgen in Allow- und Denylisten",
|
||||||
"spam_score": "Einen benutzerdefiniterten Spam-Score festlegen",
|
"spam_score": "Einen benutzerdefiniterten Spam-Score festlegen",
|
||||||
"subfolder2": "Ziel-Ordner<br><small>(leer = kein Unterordner)</small>",
|
"subfolder2": "Ziel-Ordner<br><small>(leer = kein Unterordner)</small>",
|
||||||
"syncjob": "Sync-Job bearbeiten",
|
"syncjob": "Sync-Job bearbeiten",
|
||||||
@@ -941,7 +943,7 @@
|
|||||||
"recipient_map_new": "Neuer Empfänger",
|
"recipient_map_new": "Neuer Empfänger",
|
||||||
"recipient_map_new_info": "Der neue Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.",
|
"recipient_map_new_info": "Der neue Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.",
|
||||||
"recipient_map_old": "Original-Empfänger",
|
"recipient_map_old": "Original-Empfänger",
|
||||||
"recipient_map_old_info": "Der originale Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.",
|
"recipient_map_old_info": "Der originäre Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.",
|
||||||
"recipient_maps": "Empfängerumschreibungen",
|
"recipient_maps": "Empfängerumschreibungen",
|
||||||
"relay_all": "Alle Empfänger-Adressen relayen",
|
"relay_all": "Alle Empfänger-Adressen relayen",
|
||||||
"relay_unknown": "Unbekannte Mailboxen relayen",
|
"relay_unknown": "Unbekannte Mailboxen relayen",
|
||||||
@@ -1037,7 +1039,7 @@
|
|||||||
"notified": "Benachrichtigt",
|
"notified": "Benachrichtigt",
|
||||||
"qhandler_success": "Aktion wurde an das System übergeben. Sie dürfen dieses Fenster nun schließen.",
|
"qhandler_success": "Aktion wurde an das System übergeben. Sie dürfen dieses Fenster nun schließen.",
|
||||||
"qid": "Rspamd QID",
|
"qid": "Rspamd QID",
|
||||||
"qinfo": "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank (dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde) als auch diese, die als Kopie in den Junk-Ordner der jeweiligen Mailbox zugestellt wurden.\r\n <br>\"Als Spam lernen und löschen\" lernt Nachrichten nach bayesscher Statistik als Spam und erstellt Fuzzy Hashes ausgehend von der jeweiligen Nachricht, um ähnliche Inhalte zukünftig zu unterbinden.\r\n <br>Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.<br>Auf Blacklists vorkommende Elemente sind von der Quarantäne ausgeschlossen.",
|
"qinfo": "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank (dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde) als auch diese, die als Kopie in den Junk-Ordner der jeweiligen Mailbox zugestellt wurden.\r\n <br>\"Als Spam lernen und löschen\" lernt Nachrichten nach bayesscher Statistik als Spam und erstellt Fuzzy Hashes ausgehend von der jeweiligen Nachricht, um ähnliche Inhalte zukünftig zu unterbinden.\r\n <br>Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.<br>Auf Denylisten vorkommende Elemente sind von der Quarantäne ausgeschlossen.",
|
||||||
"qitem": "Quarantäneeintrag",
|
"qitem": "Quarantäneeintrag",
|
||||||
"quarantine": "Quarantäne",
|
"quarantine": "Quarantäne",
|
||||||
"quick_actions": "Aktionen",
|
"quick_actions": "Aktionen",
|
||||||
@@ -1326,8 +1328,8 @@
|
|||||||
"spam_score_reset": "Auf Server-Standard zurücksetzen",
|
"spam_score_reset": "Auf Server-Standard zurücksetzen",
|
||||||
"spamfilter": "Spamfilter",
|
"spamfilter": "Spamfilter",
|
||||||
"spamfilter_behavior": "Bewertung",
|
"spamfilter_behavior": "Bewertung",
|
||||||
"spamfilter_bl": "Blacklist",
|
"spamfilter_bl": "Denyliste",
|
||||||
"spamfilter_bl_desc": "Für E-Mail-Adressen, die vom Spamfilter <b>immer</b> als Spam erfasst und abgelehnt werden. Die Quarantäne-Funktion ist für diese Nachrichten deaktiviert. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte nicht-\"Catch All\" Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.",
|
"spamfilter_bl_desc": "Für E-Mail-Adressen, die vom Spamfilter <b>immer</b> als Spam erfasst und abgelehnt werden. Die Quarantäne-Funktion ist für diese Nachrichten <b>deaktiviert</b>. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte Nicht-„Catch-All“-Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.",
|
||||||
"spamfilter_default_score": "Standardwert",
|
"spamfilter_default_score": "Standardwert",
|
||||||
"spamfilter_green": "Grün: Die Nachricht ist kein Spam",
|
"spamfilter_green": "Grün: Die Nachricht ist kein Spam",
|
||||||
"spamfilter_hint": "Der erste Wert beschreibt den \"low spam score\", der zweite Wert den \"high spam score\".",
|
"spamfilter_hint": "Der erste Wert beschreibt den \"low spam score\", der zweite Wert den \"high spam score\".",
|
||||||
@@ -1338,8 +1340,8 @@
|
|||||||
"spamfilter_table_empty": "Keine Einträge vorhanden",
|
"spamfilter_table_empty": "Keine Einträge vorhanden",
|
||||||
"spamfilter_table_remove": "Entfernen",
|
"spamfilter_table_remove": "Entfernen",
|
||||||
"spamfilter_table_rule": "Regel",
|
"spamfilter_table_rule": "Regel",
|
||||||
"spamfilter_wl": "Whitelist",
|
"spamfilter_wl": "Allowliste",
|
||||||
"spamfilter_wl_desc": "Für E-Mail-Adressen, die vom Spamfilter <b>nicht</b> erfasst werden sollen. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte nicht-\"Catch All\" Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.",
|
"spamfilter_wl_desc": "Für E-Mail-Adressen, die vom Spamfilter <b>nicht</b> erfasst werden sollen. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte Nicht-„Catch-All“-Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.",
|
||||||
"spamfilter_yellow": "Gelb: Die Nachricht ist vielleicht Spam, wird als Spam markiert und in den Junk-Ordner verschoben",
|
"spamfilter_yellow": "Gelb: Die Nachricht ist vielleicht Spam, wird als Spam markiert und in den Junk-Ordner verschoben",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"sync_jobs": "Sync Jobs",
|
"sync_jobs": "Sync Jobs",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"sogo_access": "Allow management of SOGo access",
|
"sogo_access": "Allow management of SOGo access",
|
||||||
"sogo_profile_reset": "Reset SOGo profile",
|
"sogo_profile_reset": "Reset SOGo profile",
|
||||||
"spam_alias": "Temporary aliases",
|
"spam_alias": "Temporary aliases",
|
||||||
"spam_policy": "Blacklist/Whitelist",
|
"spam_policy": "Denylist/Allowlist",
|
||||||
"spam_score": "Spam score",
|
"spam_score": "Spam score",
|
||||||
"syncjobs": "Sync jobs",
|
"syncjobs": "Sync jobs",
|
||||||
"tls_policy": "TLS policy",
|
"tls_policy": "TLS policy",
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
"arrival_time": "Arrival time (server time)",
|
"arrival_time": "Arrival time (server time)",
|
||||||
"authed_user": "Auth. user",
|
"authed_user": "Auth. user",
|
||||||
"ays": "Are you sure you want to proceed?",
|
"ays": "Are you sure you want to proceed?",
|
||||||
"ban_list_info": "See a list of banned IPs below: <b>network (remaining ban time) - [actions]</b>.<br />IPs queued to be unbanned will be removed from the active ban list within a few seconds.<br />Red labels indicate active permanent bans by blacklisting.",
|
"ban_list_info": "See a list of banned IPs below: <b>network (remaining ban time) - [actions]</b>.<br />IPs queued to be unbanned will be removed from the active ban list within a few seconds.<br />Red labels indicate active permanent bans by denylisting.",
|
||||||
"change_logo": "Change logo",
|
"change_logo": "Change logo",
|
||||||
"logo_normal_label": "Normal",
|
"logo_normal_label": "Normal",
|
||||||
"logo_dark_label": "Inverted for dark mode",
|
"logo_dark_label": "Inverted for dark mode",
|
||||||
@@ -190,9 +190,9 @@
|
|||||||
"excludes": "Excludes these recipients",
|
"excludes": "Excludes these recipients",
|
||||||
"f2b_ban_time": "Ban time (s)",
|
"f2b_ban_time": "Ban time (s)",
|
||||||
"f2b_ban_time_increment": "Ban time is incremented with each ban",
|
"f2b_ban_time_increment": "Ban time is incremented with each ban",
|
||||||
"f2b_blacklist": "Blacklisted networks/hosts",
|
"f2b_blacklist": "Denylisted networks/hosts",
|
||||||
"f2b_filter": "Regex filters",
|
"f2b_filter": "Regex filters",
|
||||||
"f2b_list_info": "A blacklisted host or network will always outweigh a whitelist entity. <b>List updates will take a few seconds to be applied.</b>",
|
"f2b_list_info": "A denylisted host or network will always outweigh a allowlist entity. <b>List updates will take a few seconds to be applied.</b>",
|
||||||
"f2b_manage_external": "Manage Fail2Ban externally",
|
"f2b_manage_external": "Manage Fail2Ban externally",
|
||||||
"f2b_manage_external_info": "Fail2ban will still maintain the banlist, but it will not actively set rules to block traffic. Use the generated banlist below to externally block the traffic.",
|
"f2b_manage_external_info": "Fail2ban will still maintain the banlist, but it will not actively set rules to block traffic. Use the generated banlist below to externally block the traffic.",
|
||||||
"f2b_max_attempts": "Max. attempts",
|
"f2b_max_attempts": "Max. attempts",
|
||||||
@@ -202,7 +202,7 @@
|
|||||||
"f2b_parameters": "Fail2ban parameters",
|
"f2b_parameters": "Fail2ban parameters",
|
||||||
"f2b_regex_info": "Logs taken into consideration: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"f2b_regex_info": "Logs taken into consideration: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Retry window (s) for max. attempts",
|
"f2b_retry_window": "Retry window (s) for max. attempts",
|
||||||
"f2b_whitelist": "Whitelisted networks/hosts",
|
"f2b_whitelist": "Allowlisted networks/hosts",
|
||||||
"filter": "Filter",
|
"filter": "Filter",
|
||||||
"filter_table": "Filter table",
|
"filter_table": "Filter table",
|
||||||
"force_sso_text": "If an external OIDC provider is configured, this option hides the default mailcow login forms and only shows the Single Sign-On button",
|
"force_sso_text": "If an external OIDC provider is configured, this option hides the default mailcow login forms and only shows the Single Sign-On button",
|
||||||
@@ -279,6 +279,7 @@
|
|||||||
"message": "Message",
|
"message": "Message",
|
||||||
"message_size": "Message size",
|
"message_size": "Message size",
|
||||||
"nexthop": "Next hop",
|
"nexthop": "Next hop",
|
||||||
|
"needs_restart": "needs restart",
|
||||||
"no": "✕",
|
"no": "✕",
|
||||||
"no_active_bans": "No active bans",
|
"no_active_bans": "No active bans",
|
||||||
"no_new_rows": "No further rows available",
|
"no_new_rows": "No further rows available",
|
||||||
@@ -364,8 +365,8 @@
|
|||||||
"rspamd_com_settings": "A setting name will be auto-generated, please see the example presets below. For more details see <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd docs</a>",
|
"rspamd_com_settings": "A setting name will be auto-generated, please see the example presets below. For more details see <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">Rspamd docs</a>",
|
||||||
"rspamd_global_filters": "Global filter maps",
|
"rspamd_global_filters": "Global filter maps",
|
||||||
"rspamd_global_filters_agree": "I will be careful!",
|
"rspamd_global_filters_agree": "I will be careful!",
|
||||||
"rspamd_global_filters_info": "Global filter maps contain different kind of global black and whitelists.",
|
"rspamd_global_filters_info": "Global filter maps contain different kind of global deny and allowlists.",
|
||||||
"rspamd_global_filters_regex": "Their names explain their purpose. All content must contain valid regular expression in the format of \"/pattern/options\" (e.g. <code>/.+@domain\\.tld/i</code>).<br>\r\n Although rudimentary checks are being executed on each line of regex, Rspamds functionality can be broken, if it fails to read the syntax correctly.<br>\r\n Rspamd will try to read the map content when changed. If you experience problems, <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">restart Rspamd</a> to enforce a map reload.<br>Blacklisted elements are excluded from quarantine.",
|
"rspamd_global_filters_regex": "Their names explain their purpose. All content must contain valid regular expression in the format of \"/pattern/options\" (e.g. <code>/.+@domain\\.tld/i</code>).<br>\r\n Although rudimentary checks are being executed on each line of regex, Rspamds functionality can be broken, if it fails to read the syntax correctly.<br>\r\n Rspamd will try to read the map content when changed. If you experience problems, <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">restart Rspamd</a> to enforce a map reload.<br>Denylisted elements are excluded from quarantine.",
|
||||||
"rspamd_settings_map": "Rspamd settings map",
|
"rspamd_settings_map": "Rspamd settings map",
|
||||||
"sal_level": "Moo level",
|
"sal_level": "Moo level",
|
||||||
"save": "Save changes",
|
"save": "Save changes",
|
||||||
@@ -750,7 +751,7 @@
|
|||||||
"sogo_visible_info": "This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox). If hidden, an alias will not appear as selectable sender in SOGo.",
|
"sogo_visible_info": "This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox). If hidden, an alias will not appear as selectable sender in SOGo.",
|
||||||
"spam_alias": "Create or change time limited alias addresses",
|
"spam_alias": "Create or change time limited alias addresses",
|
||||||
"spam_filter": "Spam filter",
|
"spam_filter": "Spam filter",
|
||||||
"spam_policy": "Add or remove items to white-/blacklist",
|
"spam_policy": "Add or remove items to allow-/denylist",
|
||||||
"spam_score": "Set a custom spam score",
|
"spam_score": "Set a custom spam score",
|
||||||
"subfolder2": "Sync into subfolder on destination<br><small>(empty = do not use subfolder)</small>",
|
"subfolder2": "Sync into subfolder on destination<br><small>(empty = do not use subfolder)</small>",
|
||||||
"syncjob": "Edit sync job",
|
"syncjob": "Edit sync job",
|
||||||
@@ -1039,7 +1040,7 @@
|
|||||||
"notified": "Notified",
|
"notified": "Notified",
|
||||||
"qhandler_success": "Request successfully sent to the system. You can now close the window.",
|
"qhandler_success": "Request successfully sent to the system. You can now close the window.",
|
||||||
"qid": "Rspamd QID",
|
"qid": "Rspamd QID",
|
||||||
"qinfo": "The quarantine system will save rejected mail to the database (the sender will <em>not</em> be given the impression of a delivered mail) as well as mail, that is delivered as copy into the Junk folder of a mailbox.\r\n <br>\"Learn as spam and delete\" will learn a message as spam via Bayesian theorem and also calculate fuzzy hashes to deny similar messages in the future.\r\n <br>Please be aware that learning multiple messages can be - depending on your system - time consuming.<br>Blacklisted elements are excluded from the quarantine.",
|
"qinfo": "The quarantine system will save rejected mail to the database (the sender will <em>not</em> be given the impression of a delivered mail) as well as mail, that is delivered as copy into the Junk folder of a mailbox.\r\n <br>\"Learn as spam and delete\" will learn a message as spam via Bayesian theorem and also calculate fuzzy hashes to deny similar messages in the future.\r\n <br>Please be aware that learning multiple messages can be - depending on your system - time consuming.<br>Denylisted elements are excluded from the quarantine.",
|
||||||
"qitem": "Quarantine item",
|
"qitem": "Quarantine item",
|
||||||
"quarantine": "Quarantine",
|
"quarantine": "Quarantine",
|
||||||
"quick_actions": "Actions",
|
"quick_actions": "Actions",
|
||||||
@@ -1337,8 +1338,8 @@
|
|||||||
"spam_score_reset": "Reset to server default",
|
"spam_score_reset": "Reset to server default",
|
||||||
"spamfilter": "Spam filter",
|
"spamfilter": "Spam filter",
|
||||||
"spamfilter_behavior": "Rating",
|
"spamfilter_behavior": "Rating",
|
||||||
"spamfilter_bl": "Blacklist",
|
"spamfilter_bl": "Denylist",
|
||||||
"spamfilter_bl_desc": "Blacklisted email addresses to <b>always</b> classify as spam and reject. Rejected mail will <b>not</b> be copied to quarantine. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.",
|
"spamfilter_bl_desc": "Denylisted email addresses to <b>always</b> classify as spam and reject. Rejected mail will <b>not</b> be copied to quarantine. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.",
|
||||||
"spamfilter_default_score": "Default values",
|
"spamfilter_default_score": "Default values",
|
||||||
"spamfilter_green": "Green: this message is not spam",
|
"spamfilter_green": "Green: this message is not spam",
|
||||||
"spamfilter_hint": "The first value describes the \"low spam score\", the second represents the \"high spam score\".",
|
"spamfilter_hint": "The first value describes the \"low spam score\", the second represents the \"high spam score\".",
|
||||||
@@ -1349,8 +1350,8 @@
|
|||||||
"spamfilter_table_empty": "No data to display",
|
"spamfilter_table_empty": "No data to display",
|
||||||
"spamfilter_table_remove": "remove",
|
"spamfilter_table_remove": "remove",
|
||||||
"spamfilter_table_rule": "Rule",
|
"spamfilter_table_rule": "Rule",
|
||||||
"spamfilter_wl": "Whitelist",
|
"spamfilter_wl": "Allowlist",
|
||||||
"spamfilter_wl_desc": "Whitelisted email addresses are programmed to <b>never</b> classify as spam. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.",
|
"spamfilter_wl_desc": "Allowlisted email addresses are programmed to <b>never</b> classify as spam. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.",
|
||||||
"spamfilter_yellow": "Yellow: this message may be spam, will be tagged as spam and moved to your junk folder",
|
"spamfilter_yellow": "Yellow: this message may be spam, will be tagged as spam and moved to your junk folder",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"sync_jobs": "Sync jobs",
|
"sync_jobs": "Sync jobs",
|
||||||
|
|||||||
+456
-36
@@ -10,11 +10,11 @@
|
|||||||
"quarantine": "Acciones de cuarentena",
|
"quarantine": "Acciones de cuarentena",
|
||||||
"quarantine_attachments": "Archivos ajuntos en cuarentena",
|
"quarantine_attachments": "Archivos ajuntos en cuarentena",
|
||||||
"quarantine_notification": "Notificaciones de cuarentena",
|
"quarantine_notification": "Notificaciones de cuarentena",
|
||||||
"ratelimit": "Rate limit",
|
"ratelimit": "Límite de peticiones",
|
||||||
"recipient_maps": "Rutas del destinatario",
|
"recipient_maps": "Rutas del destinatario",
|
||||||
"sogo_profile_reset": "Resetear perfil SOGo",
|
"sogo_profile_reset": "Resetear perfil SOGo",
|
||||||
"spam_alias": "Aliases temporales",
|
"spam_alias": "Aliases temporales",
|
||||||
"spam_policy": "Lista blanca/negra",
|
"spam_policy": "Lista de bloqueo/desbloqueo",
|
||||||
"spam_score": "Puntuación de spam",
|
"spam_score": "Puntuación de spam",
|
||||||
"syncjobs": "Trabajos de sincronización",
|
"syncjobs": "Trabajos de sincronización",
|
||||||
"tls_policy": "Póliza de TLS",
|
"tls_policy": "Póliza de TLS",
|
||||||
@@ -25,8 +25,10 @@
|
|||||||
"quarantine_category": "Cambiar categoría de las notificaciones de cuarentena",
|
"quarantine_category": "Cambiar categoría de las notificaciones de cuarentena",
|
||||||
"domain_relayhost": "Cambiar relayhost por un dominio",
|
"domain_relayhost": "Cambiar relayhost por un dominio",
|
||||||
"extend_sender_acl": "Permitir extender la ACL del remitente por direcciones externas",
|
"extend_sender_acl": "Permitir extender la ACL del remitente por direcciones externas",
|
||||||
"pw_reset": "Permitir el reset de la contraseña del usario mailcow",
|
"pw_reset": "Permitir el restablecimiento de la contraseña del usuario mailcow",
|
||||||
"sogo_access": "Permitir la gestión del acceso a SOGo"
|
"sogo_access": "Permitir la gestión del acceso a SOGo",
|
||||||
|
"mailbox_relayhost": "Cambiar el host de reenvío para un buzón",
|
||||||
|
"smtp_ip_access": "Cambiar hosts permitidos para SMTP"
|
||||||
},
|
},
|
||||||
"add": {
|
"add": {
|
||||||
"activate_filter_warn": "Todos los demás filtros se desactivarán cuando este filtro se active.",
|
"activate_filter_warn": "Todos los demás filtros se desactivarán cuando este filtro se active.",
|
||||||
@@ -34,7 +36,7 @@
|
|||||||
"add": "Agregar",
|
"add": "Agregar",
|
||||||
"add_domain_only": "Agregar dominio solamente",
|
"add_domain_only": "Agregar dominio solamente",
|
||||||
"add_domain_restart": "Agregar dominio y reiniciar SOGo",
|
"add_domain_restart": "Agregar dominio y reiniciar SOGo",
|
||||||
"alias_address": "Dirección(es) alias:",
|
"alias_address": "Dirección(es) alias",
|
||||||
"alias_address_info": "<small>Dirección(es) de correo completa(s) ó @dominio.com, para atrapar todos los mensajes para un dominio (separado por coma). <b>Dominios que existan en mailcow solamente</b>.</small>",
|
"alias_address_info": "<small>Dirección(es) de correo completa(s) ó @dominio.com, para atrapar todos los mensajes para un dominio (separado por coma). <b>Dominios que existan en mailcow solamente</b>.</small>",
|
||||||
"alias_domain": "Dominio alias",
|
"alias_domain": "Dominio alias",
|
||||||
"alias_domain_info": "<small>Nombres de dominio válidos solamente (separado por coma).</small>",
|
"alias_domain_info": "<small>Nombres de dominio válidos solamente (separado por coma).</small>",
|
||||||
@@ -45,13 +47,13 @@
|
|||||||
"delete1": "Eliminar de la fuente cuando se complete",
|
"delete1": "Eliminar de la fuente cuando se complete",
|
||||||
"delete2": "Eliminar mensajes en el destino que no están en la fuente",
|
"delete2": "Eliminar mensajes en el destino que no están en la fuente",
|
||||||
"delete2duplicates": "Eliminar duplicados en el destino",
|
"delete2duplicates": "Eliminar duplicados en el destino",
|
||||||
"description": "Descripción:",
|
"description": "Descripción",
|
||||||
"destination": "Destino",
|
"destination": "Destino",
|
||||||
"domain": "Dominio",
|
"domain": "Dominio",
|
||||||
"domain_quota_m": "Cuota total del dominio (MiB):",
|
"domain_quota_m": "Cuota total del dominio (MiB)",
|
||||||
"enc_method": "Método de cifrado",
|
"enc_method": "Método de cifrado",
|
||||||
"exclude": "Excluir objectos (regex)",
|
"exclude": "Excluir objectos (regex)",
|
||||||
"full_name": "Nombre completo:",
|
"full_name": "Nombre completo",
|
||||||
"gal": "Lista global de direcciones (GAL)",
|
"gal": "Lista global de direcciones (GAL)",
|
||||||
"gal_info": "El GAL contiene todos los objetos de un dominio y no puede ser editado por ningún usuario. Falta información de disponibilidad en SOGo, si está desactivada. <b>Reinicia SOGo para aplicar los cambios.</b>",
|
"gal_info": "El GAL contiene todos los objetos de un dominio y no puede ser editado por ningún usuario. Falta información de disponibilidad en SOGo, si está desactivada. <b>Reinicia SOGo para aplicar los cambios.</b>",
|
||||||
"generate": "Generar",
|
"generate": "Generar",
|
||||||
@@ -61,20 +63,20 @@
|
|||||||
"hostname": "Host",
|
"hostname": "Host",
|
||||||
"kind": "Tipo",
|
"kind": "Tipo",
|
||||||
"mailbox_quota_def": "Cuota de buzón predeterminada",
|
"mailbox_quota_def": "Cuota de buzón predeterminada",
|
||||||
"mailbox_quota_m": "Máx. cuota por buzón (MiB):",
|
"mailbox_quota_m": "Máx. cuota por buzón (MiB)",
|
||||||
"mailbox_username": "Nombre de usuario (parte izquierda de una dirección de correo):",
|
"mailbox_username": "Nombre de usuario (parte izquierda de una dirección de correo)",
|
||||||
"max_aliases": "Máx. alias posibles:",
|
"max_aliases": "Máx. alias posibles",
|
||||||
"max_mailboxes": "Máx. buzones posibles:",
|
"max_mailboxes": "Máx. buzones posibles",
|
||||||
"mins_interval": "Intervalo de sondeo (minutos)",
|
"mins_interval": "Intervalo de sondeo (minutos)",
|
||||||
"multiple_bookings": "Múltiples reservas",
|
"multiple_bookings": "Múltiples reservas",
|
||||||
"nexthop": "Siguiente destino",
|
"nexthop": "Siguiente destino",
|
||||||
"password": "Constraseña:",
|
"password": "Contraseña",
|
||||||
"password_repeat": "Confirmación de contraseña (repetir):",
|
"password_repeat": "Confirmación de contraseña (repetir)",
|
||||||
"port": "Puerto",
|
"port": "Puerto",
|
||||||
"post_domain_add": "<b>Nota:</b> Necesitarás reiniciar el contenedor del servicio SOGo despues de agregar un nuevo dominio",
|
"post_domain_add": "Es necesario reiniciar el contenedor del servicio SOGo, \"sogo-mailcow\", tras agregar un nuevo dominio.<br><br>Además, la configuración DNS de los dominios debería ser comprobada. En cuanto la configuración DNS se apruebe, reinicie \"acme-mailcow\" para generar automáticamente certificados para su nuevo dominio (autoconfig.<dominio>, autodiscover.<dominio>).<br>Este paso es opcional y se reintentará cada 24 horas.",
|
||||||
"quota_mb": "Cuota (MiB):",
|
"quota_mb": "Cuota (MiB)",
|
||||||
"relay_all": "Retransmitir todos los destinatarios",
|
"relay_all": "Retransmitir todos los destinatarios",
|
||||||
"relay_all_info": "<small>Si eliges <b>no</b> retransmitir a todos los destinatarios, necesitas agregar un buzón \"ciego\" por cada destinatario que debe ser retransmitido.</small>",
|
"relay_all_info": "↪ Si se elige <b>no</b> retransmitir todos los destinatarios, será necesario agregar un buzón \"ciego\" por cada destinatario que deba ser retransmitido.",
|
||||||
"relay_domain": "Retransmitir este dominio",
|
"relay_domain": "Retransmitir este dominio",
|
||||||
"select": "Por favor selecciona...",
|
"select": "Por favor selecciona...",
|
||||||
"select_domain": "Por favor elige un dominio primero",
|
"select_domain": "Por favor elige un dominio primero",
|
||||||
@@ -83,7 +85,7 @@
|
|||||||
"skipcrossduplicates": "Omitir mensajes duplicados en carpetas (orden de llegada)",
|
"skipcrossduplicates": "Omitir mensajes duplicados en carpetas (orden de llegada)",
|
||||||
"subscribeall": "Suscribirse a todas las carpetas",
|
"subscribeall": "Suscribirse a todas las carpetas",
|
||||||
"syncjob": "Añadir trabajo de sincronización",
|
"syncjob": "Añadir trabajo de sincronización",
|
||||||
"syncjob_hint": "Ten en cuenta que las contraseñas deben guardarse en texto sin cifrado",
|
"syncjob_hint": "Tenga en cuenta que las contraseñas deben guardarse en texto plano sin cifrar",
|
||||||
"target_address": "Direcciones destino:",
|
"target_address": "Direcciones destino:",
|
||||||
"target_address_info": "<small>Dirección(es) de correo completa(s) (separado por coma).</small>",
|
"target_address_info": "<small>Dirección(es) de correo completa(s) (separado por coma).</small>",
|
||||||
"target_domain": "Dominio destino:",
|
"target_domain": "Dominio destino:",
|
||||||
@@ -100,7 +102,13 @@
|
|||||||
"comment_info": "Los comentarios privados no son visibles al usuario, mientras que los comentarios públicos aparecerán sobre la información general del usuario",
|
"comment_info": "Los comentarios privados no son visibles al usuario, mientras que los comentarios públicos aparecerán sobre la información general del usuario",
|
||||||
"dry": "Simular la sincronización",
|
"dry": "Simular la sincronización",
|
||||||
"private_comment": "Comentario privado",
|
"private_comment": "Comentario privado",
|
||||||
"app_passwd_protocols": "Protocolos autorizados para la contraseña de la aplicación"
|
"app_passwd_protocols": "Protocolos autorizados para la contraseña de la aplicación",
|
||||||
|
"relay_transport_info": "<div class=\"label label-info\">Información</div> Puede definir mapas de transporte para un destino personalizado para este dominio. En caso de no definirlo, se realizará una búsqueda MX.",
|
||||||
|
"bcc_dest_format": "El destino del CCO debe ser una única dirección de correo electrónico válida.<br>Si necesita enviar una copia a varias direcciones, cree un alias y utilícelo aquí.",
|
||||||
|
"domain_matches_hostname": "El dominio %s coincide con el nombre de host",
|
||||||
|
"relay_unknown_only": "Reenviar sólo los buzones no existentes. Los buzones existentes se entregarán localmente.",
|
||||||
|
"relayhost_wrapped_tls_info": "Por favor, no utilice puertos con TLS (habitualmente, el puerto 465). <br>Utilice cualquier puerto no cifrado y emita STARTTLS. Se puede crear una política para imponer TLS en \"TLS policy maps\".",
|
||||||
|
"tags": "Etiquetas"
|
||||||
},
|
},
|
||||||
"admin": {
|
"admin": {
|
||||||
"access": "Acceso",
|
"access": "Acceso",
|
||||||
@@ -129,7 +137,7 @@
|
|||||||
"app_name": "Nombre de la app",
|
"app_name": "Nombre de la app",
|
||||||
"apps_name": "Nombre \"mailcow Apps\"",
|
"apps_name": "Nombre \"mailcow Apps\"",
|
||||||
"arrival_time": "Tiempo de llegada (hora del servidor)",
|
"arrival_time": "Tiempo de llegada (hora del servidor)",
|
||||||
"ban_list_info": "Lista de IPs bloqueadas: <b>red (tiempo de prohibición restante) - [acciones]</b>.<br />Las IPs en cola para ser desbloqueadas se eliminarán de la lista de bloqueos en unos pocos segundos.<br />Las etiquetas rojas indican bloqueos permanentes mediante la inclusión en la lista negra.",
|
"ban_list_info": "Lista de direcciones IP bloqueadas: <b>red (tiempo de prohibición restante) - [acciones]</b>.<br />Las direcciones IP en cola para ser desbloqueadas se eliminarán de la lista de bloqueos en unos segundos.<br />Las etiquetas rojas indican bloqueos permanentes por inclusión en la lista de bloqueo.",
|
||||||
"change_logo": "Cambiar logo",
|
"change_logo": "Cambiar logo",
|
||||||
"configuration": "Configuración",
|
"configuration": "Configuración",
|
||||||
"credentials_transport_warning": "<b>Advertencia</b>: al agregar una nueva entrada de ruta de transporte se actualizarán las credenciales para todas las entradas con una columna de \"siguiente destino\" coincidente.",
|
"credentials_transport_warning": "<b>Advertencia</b>: al agregar una nueva entrada de ruta de transporte se actualizarán las credenciales para todas las entradas con una columna de \"siguiente destino\" coincidente.",
|
||||||
@@ -157,15 +165,15 @@
|
|||||||
"excludes": "Excluye a estos destinatarios",
|
"excludes": "Excluye a estos destinatarios",
|
||||||
"f2b_ban_time": "Tiempo de restricción (s)",
|
"f2b_ban_time": "Tiempo de restricción (s)",
|
||||||
"f2b_ban_time_increment": "Tiempo de restricción se incrementa con cada restricción",
|
"f2b_ban_time_increment": "Tiempo de restricción se incrementa con cada restricción",
|
||||||
"f2b_blacklist": "Redes y hosts en lista negra",
|
"f2b_blacklist": "Redes y hosts en lista de bloqueo",
|
||||||
"f2b_list_info": "Un host o red en lista negra siempre superará a una entidad de la lista blanca. <b>Las actualizaciones de la lista tardarán unos segundos en aplicarse.</b>",
|
"f2b_list_info": "Un host o red en lista de bloqueo siempre tendrá prioridad sobre una entidad de la lista de desbloqueo. <b>Las actualizaciones de la lista tardarán unos segundos en aplicarse.</b>",
|
||||||
"f2b_max_attempts": "Max num. de intentos",
|
"f2b_max_attempts": "Max num. de intentos",
|
||||||
"f2b_max_ban_time": "Max tiempo de restricción (s)",
|
"f2b_max_ban_time": "Max tiempo de restricción (s)",
|
||||||
"f2b_netban_ipv4": "Tamaño de subred IPv4 para aplicar la restricción (8-32)",
|
"f2b_netban_ipv4": "Tamaño de subred IPv4 para aplicar la restricción (8-32)",
|
||||||
"f2b_netban_ipv6": "Tamaño de subred IPv6 para aplicar la restricción (8-128)",
|
"f2b_netban_ipv6": "Tamaño de subred IPv6 para aplicar la restricción (8-128)",
|
||||||
"f2b_parameters": "Parametros Fail2ban",
|
"f2b_parameters": "Parametros Fail2ban",
|
||||||
"f2b_retry_window": "Ventana de tiempo entre reintentos",
|
"f2b_retry_window": "Ventana de tiempo entre reintentos",
|
||||||
"f2b_whitelist": "Redes y hosts en lista blanca",
|
"f2b_whitelist": "Redes y hosts en lista de desbloqueo",
|
||||||
"filter_table": "Filtrar tabla",
|
"filter_table": "Filtrar tabla",
|
||||||
"forwarding_hosts": "Hosts de reenvío",
|
"forwarding_hosts": "Hosts de reenvío",
|
||||||
"forwarding_hosts_add_hint": "Se puede especificar direcciones IPv4 / IPv6, redes en notación CIDR, nombres de host (que se resolverán en direcciones IP) o dominios (que se resolverán en direcciones IP consultando registros SPF o, en su defecto, registros MX)",
|
"forwarding_hosts_add_hint": "Se puede especificar direcciones IPv4 / IPv6, redes en notación CIDR, nombres de host (que se resolverán en direcciones IP) o dominios (que se resolverán en direcciones IP consultando registros SPF o, en su defecto, registros MX)",
|
||||||
@@ -253,7 +261,146 @@
|
|||||||
"unban_pending": "Desbloqueo pendiente",
|
"unban_pending": "Desbloqueo pendiente",
|
||||||
"unchanged_if_empty": "Si no hay cambios déjalo en blanco",
|
"unchanged_if_empty": "Si no hay cambios déjalo en blanco",
|
||||||
"upload": "Cargar",
|
"upload": "Cargar",
|
||||||
"username": "Nombre de usuario"
|
"username": "Nombre de usuario",
|
||||||
|
"force_sso_text": "Si se configura un proveedor OIDC externo, esta opción oculta los formularios por defecto de inicio de sesión y muestra solamente el botón de inicio de sesión único",
|
||||||
|
"admin_quicklink": "Ocultar enlace rápido a página de inicio de sesión para administradores",
|
||||||
|
"iam_default_template_description": "Si no se asigna una plantilla a un usuario, se utilizará la plantilla por defecto para crear el buzón, pero no para actualizarlo.",
|
||||||
|
"reset_password_vars": "<code>{{link}}</code> El enlace generado para el restablecimiento de contraseña<br><code>{{username}}</code> El buzón del usuario que ha solicitado el restablecimiento de contraseña<br><code>{{username2}}</code> La dirección del buzón de recuperación de contraseña<br><code>{{date}}</code> La fecha en que se realizó la solicitud de restablecimiento de contraseña<br><code>{{token_lifetime}}</code> El periodo de vigencia del token en minutos<br><code>{{hostname}}</code> El servidor Mailcow",
|
||||||
|
"api_info": "La API es un trabajo en curso. La documentación se puede encontrar en <a href=\"/api\">/api</a>",
|
||||||
|
"iam_description": "Configurar un proveedor de autenticación externo<br>Los buzones de usuario se crearán automáticamente la primera vez que se inicie sesión, siempre que se hayan configurado las equivalencias de atributos",
|
||||||
|
"ui_header_announcement_help": "El anuncio será visible para todos los usuarios conectados y también en la pantalla de inicio de sesión.",
|
||||||
|
"html": "HTML",
|
||||||
|
"oauth2_redirect_uri": "URI de redirección",
|
||||||
|
"quarantine_bcc": "Remitir una copia de todas las notificaciones (CCO) a este destinatario: <br><small>Dejar en blanco para desactivar. <b>Correo sin firmar y sin comprobar. Debe entregarse solo internamente.</b></small>",
|
||||||
|
"quarantine_redirect": "<b>Redirigir todas las notificaciones</b> a este destinatario:<br><small>Dejar en blanco para desactivar. <b>Correo sin firmar y sin comprobar. Debe entregarse sólo internamente.</b></small>",
|
||||||
|
"iam_authorize_url": "Endpoint de autorización",
|
||||||
|
"sal_level": "Nivel de Moo",
|
||||||
|
"ui_footer": "Pie de página (se permite HTML)",
|
||||||
|
"is_mx_based": "Basado en MX",
|
||||||
|
"password_reset_tmpl_text": "Plantilla de texto",
|
||||||
|
"password_length": "Longitud de la contraseña",
|
||||||
|
"quicklink_text": "Mostrar u ocultar enlaces rápidos a otras páginas de inicio bajo el formulario de inicio de sesión",
|
||||||
|
"password_policy_lowerupper": "Debe contener caracteres en minúsculas y mayúsculas",
|
||||||
|
"rspamd_global_filters_regex": "Sus nombres indican su propósito. Todo el contenido debe constar de expresiones regulares válidas con el formato \"/patrón/opciones\" (por ejemplo, <code>/.+@domain\\.tld/i</code>).<br>\n Si bien se llevan a cabo comprobaciones básicas de cada expresión regular, la funcionalidad de Rspamd puede verse inutilizada, si no consigue interpretar correctamente la sintaxis utilizada.<br>\n Rspamd intentará leer el contenido del mapa cuando éste se modifique. En caso de de problemas, <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">reinicie Rspamd</a> para forzar una recarga del mapa.<br>Los elementos incluidos en listas de bloqueo se excluyen de la cuarentena.",
|
||||||
|
"iam_use_ssl_info": "Si se habilita SSL y el puerto se establece en el 389, se cambiará automáticamente al 636.",
|
||||||
|
"iam_login_provisioning": "Crear usuarios automáticamente al iniciar sesión",
|
||||||
|
"iam_periodic_full_sync": "Sincronización completa periódica",
|
||||||
|
"iam_port": "Puerto",
|
||||||
|
"iam_realm": "Ámbito",
|
||||||
|
"iam_redirect_url": "URL de redirección",
|
||||||
|
"iam_server_url": "URL del servidor",
|
||||||
|
"iam_sso": "Inicio de sesión único (SSO)",
|
||||||
|
"iam_sync_interval": "Intervalo de sincronización/importación (minutos)",
|
||||||
|
"iam_test_connection": "Comprobar conexión",
|
||||||
|
"iam_token_url": "Endpoint del token",
|
||||||
|
"iam_username_field": "Campo de nombre de usuario",
|
||||||
|
"iam_use_ssl": "Utilizar SSL",
|
||||||
|
"iam_use_tls": "Utilizar STARTTLS",
|
||||||
|
"iam_userinfo_url": "Endopint de información de usuario",
|
||||||
|
"iam_use_tls_info": "Si se habilita TLS, se debe utilizar el puerto por defecto del servidor LDAP (389). No se permiten puertos SSL.",
|
||||||
|
"iam_version": "Versión",
|
||||||
|
"ignore_ssl_error": "Ignorar errores de SSL",
|
||||||
|
"ip_check": "Comprobación IP",
|
||||||
|
"ip_check_disabled": "La comprobación de IP está desactivada. Puede activarla en<br> <strong>Sistema > Configuración > Opciones > Personalizar</strong>.",
|
||||||
|
"ip_check_opt_in": "Aceptar utilizar el servicio de terceros <strong>ipv4.mailcow.email</strong> y <strong>ipv6.mailcow.email</strong> para resolver direcciones IP externas.",
|
||||||
|
"last_applied": "Aplicado por última vez",
|
||||||
|
"license_info": "No es obligatorio contar con una licencia, pero ayuda a continuar el desarrollo.<br><a href=\"https://www.servercow.de/mailcow?lang=en#sal\" target=\"_blank\" alt=\"SAL order\">Indique aquí su GUID</a> o <a href=\"https://www.servercow.de/mailcow?lang=en#support\" target=\"_blank\" alt=\"Support order\">adquiera servicios de soporte para su instalación de Mailcow.</a>",
|
||||||
|
"login_time": "Hora de inicio de sesión",
|
||||||
|
"lookup_mx": "Destino es una expresión regular con la que contrastar el nombre MX (<code>.*\\.google\\.com</code> para dirigir todo el tráfico dirigido a un MX que termina en google.com a través de este salto)",
|
||||||
|
"message": "Mensaje",
|
||||||
|
"no": "✕",
|
||||||
|
"optional": "opcional",
|
||||||
|
"app_hide": "Ocultar para inicio de sesión",
|
||||||
|
"convert_html_to_text": "Convertir HTML a texto plano",
|
||||||
|
"cors_settings": "Configuración de CORS",
|
||||||
|
"customer_id": "ID de cliente",
|
||||||
|
"dkim_overwrite_key": "Sobrescribir la clave DKIM existente",
|
||||||
|
"domain_admin": "Administrador de dominio",
|
||||||
|
"f2b_manage_external": "Gestionar Fail2Ban de manera externa",
|
||||||
|
"f2b_manage_external_info": "Fail2Ban conservará la lista de bloqueo, pero no establecerá activamente reglas para bloquear el tráfico. Utilizar la lista de bloqueo siguiente para bloquear externamente el tráfico.",
|
||||||
|
"filter": "Filtrar",
|
||||||
|
"admins": "Administradores",
|
||||||
|
"admins_ldap": "Administradores de LDAP",
|
||||||
|
"advanced_settings": "Configuración avanzada",
|
||||||
|
"allowed_methods": "Access-Control-Allow-Methods",
|
||||||
|
"allowed_origins": "Access-Control-Allow-Origin",
|
||||||
|
"api_read_only": "Acceso de sólo lectura",
|
||||||
|
"api_read_write": "Acceso de lectura y escritura",
|
||||||
|
"api_skip_ip_check": "Omitir la comprobación de la IP para la API",
|
||||||
|
"authed_user": "Usuario autentificado",
|
||||||
|
"ays": "¿Está seguro de querer continuar?",
|
||||||
|
"logo_normal_label": "Normal",
|
||||||
|
"logo_dark_label": "Invertido para modo oscuro",
|
||||||
|
"copy_to_clipboard": "¡Texto copiado al portapapeles!",
|
||||||
|
"login_page": "Inicio de sesión",
|
||||||
|
"domainadmin_quicklink": "Ocultar enlace rápido a página de inicio de sesión para administradores de dominios",
|
||||||
|
"domain_s": "Dominio(s)",
|
||||||
|
"f2b_filter": "Filtros regex",
|
||||||
|
"f2b_regex_info": "Registros tomados en consideración: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
|
"force_sso": "Deshabilitar el inicio de sesión de Mailcow y mostrar solamente el inicio de sesión único",
|
||||||
|
"guid": "GUID - ID de instancia único",
|
||||||
|
"guid_and_license": "GUID y licencia",
|
||||||
|
"hash_remove_info": "Al eliminar un hash de límite de velocidad (si todavía existe) se reiniciará su contador por completo.<br> Cada hash se indica con un color individual.",
|
||||||
|
"iam": "Proveedor de identidad",
|
||||||
|
"iam_attribute_field": "Campo de atributo",
|
||||||
|
"iam_auth_flow": "Flujo de autenticación",
|
||||||
|
"iam_basedn": "DN de base",
|
||||||
|
"iam_client_id": "ID de cliente",
|
||||||
|
"iam_client_secret": "Secreto de cliente",
|
||||||
|
"iam_client_scopes": "Ámbitos de cliente",
|
||||||
|
"iam_default_template": "Plantilla por defecto",
|
||||||
|
"iam_host": "Host",
|
||||||
|
"iam_host_info": "Introduzca uno o más hosts de LDAP, separados por comas.",
|
||||||
|
"iam_import_users": "Importar usuarios",
|
||||||
|
"iam_mapping": "Equivalencias de atributos",
|
||||||
|
"needs_restart": "necesita reinicio",
|
||||||
|
"oauth2_apps": "Aplicaciones OAuth2",
|
||||||
|
"oauth2_add_client": "Añadir cliente OAuth2",
|
||||||
|
"oauth2_renew_secret": "Generar nuevo secreto de cliente",
|
||||||
|
"oauth2_revoke_tokens": "Revocar todos los tokens de cliente",
|
||||||
|
"options": "Opciones",
|
||||||
|
"password_policy": "Política de contraseñas",
|
||||||
|
"password_policy_chars": "Debe contener al menos un caracter alfabético",
|
||||||
|
"password_policy_length": "La longitud mínima de la contraseña es %d",
|
||||||
|
"password_policy_numbers": "Debe contener al menos un número",
|
||||||
|
"password_policy_special_chars": "Debe contener caracteres especiales",
|
||||||
|
"password_reset_info": "Si no se indica una dirección para la recuperación de contraseñas, esta función no puede utilizarse.",
|
||||||
|
"password_reset_settings": "Configuración de recuperación de contraseña",
|
||||||
|
"password_reset_tmpl_html": "Plantilla HTML",
|
||||||
|
"password_settings": "Configuración de contraseña",
|
||||||
|
"priority": "Prioridad",
|
||||||
|
"quarantine_max_score": "Descartar notificación si la puntuación de spam de un mensaje de correo es mayor que este valor:<br><small>Por defecto 9999.0</small>",
|
||||||
|
"queue_unban": "desbloquear",
|
||||||
|
"regex_maps": "Mapas regex",
|
||||||
|
"relay_rcpt": "Dirección \"Para:\"",
|
||||||
|
"reset_limit": "Eliminar hash",
|
||||||
|
"restore_template": "Dejar en blanco para restablecer la plantilla por defecto",
|
||||||
|
"rsetting_no_selection": "Seleccione una regla",
|
||||||
|
"rsettings_preset_3": "Permitir solamente remitentes específicos para un buzón (utilizar únicamente como buzón interno)",
|
||||||
|
"rsettings_preset_4": "Deshabilitar Rspamd para un dominio",
|
||||||
|
"rspamd_global_filters": "Mapas de filtrado globales",
|
||||||
|
"rspamd_global_filters_agree": "¡Tendré cuidado!",
|
||||||
|
"rspamd_global_filters_info": "Los mapas de filtrado globales contienen distintos tipos de listos de bloqueo y desbloqueo.",
|
||||||
|
"service": "Servicio",
|
||||||
|
"service_id": "ID de servicio",
|
||||||
|
"success": "Éxito",
|
||||||
|
"task": "Tarea",
|
||||||
|
"time": "Tiempo",
|
||||||
|
"title": "Título",
|
||||||
|
"transport_dest_format": "Regex o sintaxis: ejemplo.org, .ejemplo.org, *, buzon@ejemplo.org (se pueden introducir varios valores separados por comas)",
|
||||||
|
"transport_test_rcpt_info": "• Utilizar null@hosted.mailcow.de para comprobar la retransmisión a un destino externo.",
|
||||||
|
"ui_header_announcement": "Anuncios",
|
||||||
|
"ui_header_announcement_content": "Texto (se permite HTML)",
|
||||||
|
"ui_header_announcement_select": "Seleccionar tipo de anuncio",
|
||||||
|
"ui_header_announcement_type": "Tipo",
|
||||||
|
"ui_header_announcement_type_danger": "Muy importante",
|
||||||
|
"ui_header_announcement_type_info": "Información",
|
||||||
|
"ui_header_announcement_type_warning": "Importante",
|
||||||
|
"user_link": "Enlace de usuario",
|
||||||
|
"user_quicklink": "Ocultar enlace rápido a página de inicio de sesión de usuario",
|
||||||
|
"validate_license_now": "Validar el GUID contra el servidor de licencias",
|
||||||
|
"verify": "Verificar",
|
||||||
|
"yes": "✓"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Acceso denegado o datos del formulario inválidos",
|
"access_denied": "Acceso denegado o datos del formulario inválidos",
|
||||||
@@ -341,7 +488,60 @@
|
|||||||
"username_invalid": "Nombre de usuario no se puede utilizar",
|
"username_invalid": "Nombre de usuario no se puede utilizar",
|
||||||
"validity_missing": "Por favor asigna un periodo de validez",
|
"validity_missing": "Por favor asigna un periodo de validez",
|
||||||
"value_missing": "Por favor proporcione todos los valores",
|
"value_missing": "Por favor proporcione todos los valores",
|
||||||
"yotp_verification_failed": "Verificación Yubico OTP fallida: %s"
|
"yotp_verification_failed": "Verificación Yubico OTP fallida: %s",
|
||||||
|
"last_key": "La última clave no se puede eliminar, en su lugar desactive la autenticación de doble factor.",
|
||||||
|
"img_dimensions_exceeded": "La imagen excede el tamaño máximo permitido",
|
||||||
|
"authsource_in_use": "El proveedor de identidades no se puede cambiar al estar en uso por uno o más usuario(s).",
|
||||||
|
"app_name_empty": "El nombre de la aplicación no puede quedar vacío",
|
||||||
|
"recovery_email_failed": "No se ha podido enviar un correo de recuperación. Contacte con su administrador.",
|
||||||
|
"tls_policy_map_dest_invalid": "Destino de política no válido",
|
||||||
|
"cors_invalid_method": "Allow-Method especificado no válido",
|
||||||
|
"dkim_domain_or_sel_exists": "Ya existe una clave DKIM para \"%s\" y no será sobrescrita",
|
||||||
|
"webauthn_publickey_failed": "No se ha almacenado ninguna clave pública para el autenticador seleccionado",
|
||||||
|
"invalid_reset_token": "Token de restablecimiento no válido",
|
||||||
|
"password_reset_na": "El restablecimiento de contraseña no está disponible en estos momentos. Contacte con su administrador.",
|
||||||
|
"generic_server_error": "Se ha producido un error inesperado en el servidor. Contacte con su administrador.",
|
||||||
|
"reset_f2b_regex": "El filtro Regex no se ha podido restablecer a tiempo, inténtelo de nuevo o espere unos segundos y vuelva a cargar la página web.",
|
||||||
|
"extra_acl_invalid": "Dirección de remitente externo \"%s\" no válida",
|
||||||
|
"extra_acl_invalid_domain": "El remitente externo \"%s\" utiliza un dominio no válido",
|
||||||
|
"max_alias_exceeded": "Se ha excedido el número máximo de alias",
|
||||||
|
"app_passwd_id_invalid": "Contraseña de aplicación con ID %s no válida",
|
||||||
|
"comment_too_long": "Comentario demasiado largo, máximo de 160 caracteres permitidos",
|
||||||
|
"cors_invalid_origin": "Allow-Origin especificado no válido",
|
||||||
|
"demo_mode_enabled": "Modo demo activado",
|
||||||
|
"description_invalid": "Descripción de recurso para %s no válida",
|
||||||
|
"extended_sender_acl_denied": "no se encuentra ACL para establecer direcciones de remitente externo",
|
||||||
|
"fido2_verification_failed": "Verificación FIDO2 fallida: %s",
|
||||||
|
"file_open_error": "El archivo no se puede abrir para escritura",
|
||||||
|
"global_filter_write_error": "No se ha podido escribir el archivo de filtro: %s",
|
||||||
|
"global_map_invalid": "Mapa global con ID %s no válido",
|
||||||
|
"global_map_write_error": "No se ha podido guardar el mapa global con ID %s: %s",
|
||||||
|
"ham_learn_error": "Error de aprendizaje de correo deseado: %s",
|
||||||
|
"iam_test_connection": "Conexión fallida",
|
||||||
|
"imagick_exception": "Error: Excepción en Imagick al leer la imagen",
|
||||||
|
"img_invalid": "No se ha podido validar el archivo de imagen",
|
||||||
|
"img_size_exceeded": "La imagen excede el tamaño máximo de archivo",
|
||||||
|
"img_tmp_missing": "No se ha podido validar el archivo de imagen: archivo temporal no encontrado",
|
||||||
|
"invalid_filter_type": "Tipo de filtro no válido",
|
||||||
|
"invalid_mime_type": "Tipo MIME no válido",
|
||||||
|
"maxquota_empty": "La cuota máxima por buzón no debe ser cero.",
|
||||||
|
"nginx_reload_failed": "Recarga de Nginx fallida: %s",
|
||||||
|
"password_reset_invalid_user": "Buzón no encontrado o dirección de correo para recuperación no establecida",
|
||||||
|
"pushover_credentials_missing": "Falta el token y/o la clave de Pushover",
|
||||||
|
"pushover_key": "La clave de Pushover tiene un formato incorrecto",
|
||||||
|
"pushover_token": "El token de Pushover tiene un formato incorrecto",
|
||||||
|
"required_data_missing": "Datos necesarios %s no proporcionados",
|
||||||
|
"reset_token_limit_exceeded": "Se ha superado el límite de tokens de restablecimiento. Inténtelo más tarde.",
|
||||||
|
"resource_invalid": "Nombre de recurso %s no válido",
|
||||||
|
"targetd_relay_domain": "El dominio de destino %s es un dominio de retransmisión",
|
||||||
|
"template_exists": "La plantilla %s ya existe",
|
||||||
|
"template_id_invalid": "Plantilla con ID %s no válida",
|
||||||
|
"template_name_invalid": "Nombre de plantilla no válido",
|
||||||
|
"temp_error": "Error transitorio",
|
||||||
|
"tfa_token_invalid": "Token de autenticación de doble factor no válido",
|
||||||
|
"to_invalid": "El destinatario no puede quedar en blanco",
|
||||||
|
"webauthn_authenticator_failed": "No se ha localizado el autenticador seleccionado",
|
||||||
|
"webauthn_username_failed": "El autenticador seleccionado pertenece a otra cuenta"
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"containers_info": "Información de los contenedores",
|
"containers_info": "Información de los contenedores",
|
||||||
@@ -357,7 +557,29 @@
|
|||||||
"started_at": "Iniciado el",
|
"started_at": "Iniciado el",
|
||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"static_logs": "Logs estáticos",
|
"static_logs": "Logs estáticos",
|
||||||
"system_containers": "Sistema y Contenedores"
|
"system_containers": "Sistema y Contenedores",
|
||||||
|
"show_ip": "Mostrar IP pública",
|
||||||
|
"wip": "Actualmente incompleto",
|
||||||
|
"current_time": "Hora del sistema",
|
||||||
|
"service": "Servicio",
|
||||||
|
"timezone": "Huso horario",
|
||||||
|
"update_available": "Hay una actualización disponible",
|
||||||
|
"update_failed": "No se han podido comprobar las actualizaciones",
|
||||||
|
"architecture": "Arquitectura",
|
||||||
|
"chart_this_server": "Gráfico (este servidor)",
|
||||||
|
"container_running": "En ejecución",
|
||||||
|
"container_disabled": "Contenedor detenido o desactivado",
|
||||||
|
"container_stopped": "Detenido",
|
||||||
|
"cores": "Núcleos",
|
||||||
|
"error_show_ip": "No se han podido resolver las direcciones IP públicas",
|
||||||
|
"history_all_servers": "Historial (todos los servidores)",
|
||||||
|
"login_time": "Tiempo",
|
||||||
|
"memory": "Memoria",
|
||||||
|
"online_users": "Usuarios conectados",
|
||||||
|
"started_on": "Iniciado",
|
||||||
|
"success": "Éxito",
|
||||||
|
"no_update_available": "El sistema está actualizado",
|
||||||
|
"username": "Nombre de usuario"
|
||||||
},
|
},
|
||||||
"diagnostics": {
|
"diagnostics": {
|
||||||
"cname_from_a": "Valor derivado del registro A / AAAA. Esto es permitido siempre que el registro apunte al recurso correcto.",
|
"cname_from_a": "Valor derivado del registro A / AAAA. Esto es permitido siempre que el registro apunte al recurso correcto.",
|
||||||
@@ -367,7 +589,8 @@
|
|||||||
"dns_records_name": "Nombre",
|
"dns_records_name": "Nombre",
|
||||||
"dns_records_status": "Información actual",
|
"dns_records_status": "Información actual",
|
||||||
"dns_records_type": "Tipo",
|
"dns_records_type": "Tipo",
|
||||||
"optional": "Este récord es opcional."
|
"optional": "Este récord es opcional.",
|
||||||
|
"dns_records_docs": "Consulte también <a target=\"_blank\" href=\"https://docs.mailcow.email/getstarted/prerequisite-dns\">la documentación</a>."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"active": "Activo",
|
"active": "Activo",
|
||||||
@@ -435,13 +658,79 @@
|
|||||||
"title": "Editar objeto",
|
"title": "Editar objeto",
|
||||||
"unchanged_if_empty": "Si no hay cambios dejalo en blanco",
|
"unchanged_if_empty": "Si no hay cambios dejalo en blanco",
|
||||||
"username": "Nombre de usuario",
|
"username": "Nombre de usuario",
|
||||||
"validate_save": "Validar y guardar"
|
"validate_save": "Validar y guardar",
|
||||||
|
"app_passwd_protocols": "Protocolos permitidos con contraseña de aplicación",
|
||||||
|
"domain_footer_info": "Los pies de página de dominio se añaden a todos los mensajes salientes remitidos por una dirección de dicho dominio.<br> Están disponibles las siguientes variables para el pie de página:",
|
||||||
|
"sender_acl_info": "Si el usuario del buzón A tiene permitido enviar como el buzón B, la dirección de remitente no se mostrará automáticamente como seleccionable en el campo \"De\" en SOGo.<br>\n El usuario del buzón B necesitará crear una delegación en SOGo para permitir al usuario A seleccionar su dirección como remitente. Para delegar un buzón en SOGo, utilice el menú (tres puntos) a la derecha del nombre del buzón en la esquina superior izquierda, en la vista de correo. Este comportamiento no se aplica a direcciones alias.",
|
||||||
|
"sogo_access_info": "Tras iniciar sesión, el usuario será redirigido automáticamente a SOGo.",
|
||||||
|
"comment_info": "Un comentario privado no es visible para el usuario, mientras que un comentario público se muestra como descripción emergente al pasar el ratón en la vista general del usuario",
|
||||||
|
"quota_warning_bcc_info": "Los avisos se enviarán como copias separadas a los siguientes destinatarios. Se indicará en el asunto el usuario afectado entre paréntesis, como por ejemplo: <code>Aviso de cuota (usuario@ejemplo.com)</code>.",
|
||||||
|
"sogo_access": "Redirección directa a SOGo",
|
||||||
|
"sogo_visible_info": "Esta opción solamente afecta a objetos que puedan ser visualizados en SOGo (alias compartidos o no compartidos que apunten al menos a un buzón interno). Si se oculta, el alias no aparecerá como seleccionable en SOGo.",
|
||||||
|
"extended_sender_acl_info": "Se aconseja importar una clave de dominio DKIM, si está disponible.<br>\n Recuerde añadir este servidor al registro SPF correspondiente.<br>\n Siempre que se añada un dominio o alias a este servidor, que se superponga con una dirección externa, se eliminará la dirección externa.<br>\n Utilice @dominio.tld para permitir enviar como *@dominio.tld.",
|
||||||
|
"pushover_info": "La configuración de notificaciones push se aplicará a todos los mensajes limpios (no spam) entregados a <b>%s</b> incluyendo alias (compartidos, no compartidos, etiquetados).",
|
||||||
|
"mbox_rl_info": "Este límite de peticiones se aplica al nombre de inicio de sesión SASL, coincide con cualquier dirección \"de\" que utilice el usuario conectado. Un límite de buzón tiene precedencia sobre un límite del dominio.",
|
||||||
|
"admin": "Editar administrador",
|
||||||
|
"none_inherit": "Ninguno / heredar",
|
||||||
|
"sender_acl_disabled": "<span class=\"badge fs-6 bg-danger\">Comprobación de remitente desactivada</span>",
|
||||||
|
"footer_exclude": "Excluir del pie de página",
|
||||||
|
"acl": "ACL (permisos)",
|
||||||
|
"advanced_settings": "Configuración avanzada",
|
||||||
|
"allow_from_smtp": "Permitir únicamente a las siguientes direcciones IP utilizar <b>SMTP</b>",
|
||||||
|
"allow_from_smtp_info": "Dejar en blanco para permitir cualquier remitente.<br>Direcciones y redes IPv4/IPv6.",
|
||||||
|
"allowed_protocols": "Protocolos permitidos para acceso directo del usuario (no afecta a protocolos con contraseña de aplicación)",
|
||||||
|
"app_name": "Nombre de aplicación",
|
||||||
|
"app_passwd": "Contraseña de aplicación",
|
||||||
|
"created_on": "Creado",
|
||||||
|
"custom_attributes": "Atributos personalizados",
|
||||||
|
"delete_ays": "Por favor, confirme el proceso de eliminación.",
|
||||||
|
"disable_login": "Deshabilitar inicio de sesión (se aceptará el correo entrante)",
|
||||||
|
"domain_footer": "Pie de página para todos los usuarios del dominio",
|
||||||
|
"domain_footer_html": "Pie de página HTML",
|
||||||
|
"domain_footer_skip_replies": "Descartar pie de página en correos de respuesta",
|
||||||
|
"extended_sender_acl": "Direcciones de remisión externas",
|
||||||
|
"generate": "generar",
|
||||||
|
"lookup_mx": "El destino es una expresión regular con la que contrastar el nombre MX (<code>.*\\.google\\.com</code> para dirigir todo el correo enviado a un MX que termine en google.com a través de este salto)",
|
||||||
|
"mailbox_relayhost_info": "Aplicable únicamente al buzón y sus alias directos, anula el host de retransmisión para el dominio",
|
||||||
|
"mailbox_rename": "Renombrar buzón",
|
||||||
|
"mailbox_rename_agree": "He creado una copia de seguridad.",
|
||||||
|
"mailbox_rename_warning": "¡IMPORTANTE! Realice una copia de seguridad antes de renombrar el buzón.",
|
||||||
|
"mailbox_rename_alias": "Crear alias automáticamente",
|
||||||
|
"mailbox_rename_title": "Nuevo nombre de buzón local",
|
||||||
|
"password_recovery_email": "Dirección de correo para recuperación de contraseña",
|
||||||
|
"private_comment": "Comentario privado",
|
||||||
|
"public_comment": "Comentario público",
|
||||||
|
"pushover": "Pushover",
|
||||||
|
"pushover_evaluate_x_prio": "Escalar correo de alta prioridad [<code>X-Priority: 1</code>]",
|
||||||
|
"pushover_sender_array": "Tener en cuenta únicamente las siguientes direcciones de correo de remitente <small>(separados por comas)</small>",
|
||||||
|
"pushover_text": "Texto de notificación",
|
||||||
|
"pushover_title": "Título de notificación",
|
||||||
|
"pushover_sound": "Sonido",
|
||||||
|
"pushover_verify": "Verificar credenciales",
|
||||||
|
"quota_warning_bcc": "CCO de aviso de cuota",
|
||||||
|
"ratelimit": "Límite de peticiones",
|
||||||
|
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Información</div> Puede definir mapas de transporte para destinatarios personalizados para este dominio. Si no se establece, se realizará una búsqueda MX.",
|
||||||
|
"relay_unknown_only": "Reenviar solamente los buzones no existentes. Los buzones existentes se entregarán localmente.",
|
||||||
|
"sogo_visible": "Alias visible en SOGo.",
|
||||||
|
"spam_alias": "Crear o modificar alias temporales (con caducidad)",
|
||||||
|
"spam_filter": "Filtro de spam",
|
||||||
|
"spam_policy": "Añadir o eliminar elementos de la lista de bloqueo/desbloqueo",
|
||||||
|
"spam_score": "Establecer una puntuación de spam personalizada"
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"hibp_nok": "¡Se encontró coincidencia - esta es una contraseña <b>no segura</b>, selecciona otra!",
|
"hibp_nok": "¡Se encontró coincidencia - esta es una contraseña <b>no segura</b>, selecciona otra!",
|
||||||
"hibp_ok": "No se encontraron coincidencias",
|
"hibp_ok": "No se encontraron coincidencias",
|
||||||
"loading": "Espera por favor...",
|
"loading": "Espera por favor...",
|
||||||
"restart_now": "Reiniciar ahora"
|
"restart_now": "Reiniciar ahora",
|
||||||
|
"restart_container": "Reiniciar contenedor",
|
||||||
|
"restart_container_info": "<b>Importante:</b> Un reinicio limpio puede llevar un tiempo. Por favor, espere a que finalice.",
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm_delete": "Confirmar eliminación",
|
||||||
|
"delete_now": "Eliminar ahora",
|
||||||
|
"delete_these_items": "Confirme sus cambios para el siguiente ID de objeto",
|
||||||
|
"hibp_check": "Comprobar en haveibeenpwned.com",
|
||||||
|
"nothing_selected": "Nada seleccionado",
|
||||||
|
"restarting_container": "Reiniciando contenedor, puede llevar un tiempo"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"administration": "Administración",
|
"administration": "Administración",
|
||||||
@@ -450,17 +739,38 @@
|
|||||||
"mailcow_config": "Configuración",
|
"mailcow_config": "Configuración",
|
||||||
"quarantine": "Cuarentena",
|
"quarantine": "Cuarentena",
|
||||||
"restart_sogo": "Reiniciar SOGo",
|
"restart_sogo": "Reiniciar SOGo",
|
||||||
"user_settings": "Configuraciones de usuario"
|
"user_settings": "Configuraciones de usuario",
|
||||||
|
"mailcow_system": "Sistema",
|
||||||
|
"apps": "Aplicaciones",
|
||||||
|
"restart_netfilter": "Reiniciar netfilter"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"awaiting_tfa_confirmation": "En espera de confirmación de TFA",
|
"awaiting_tfa_confirmation": "En espera de confirmación de TFA",
|
||||||
"no_action": "No hay acción aplicable"
|
"no_action": "No hay acción aplicable",
|
||||||
|
"session_expires": "Su sesión expirará en unos 15 segundos"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "El inicio de sesión ha sido retrasado %s segundos.",
|
"delayed": "El inicio de sesión ha sido retrasado %s segundos.",
|
||||||
"login": "Inicio de sesión",
|
"login": "Inicio de sesión",
|
||||||
"password": "Contraseña",
|
"password": "Contraseña",
|
||||||
"username": "Nombre de usuario"
|
"username": "Nombre de usuario",
|
||||||
|
"login_admin": "Inicio de sesión de administrador",
|
||||||
|
"invalid_pass_reset_token": "El token de restablecimiento de contraseña no es válido o ha caducado.<br>Solicite un nuevo enlace de restablecimiento de contraseña.",
|
||||||
|
"fido2_webauthn": "Inicio de sesión FIDO2/WebAuthn",
|
||||||
|
"forgot_password": "> ¿Contraseña olvidada?",
|
||||||
|
"mobileconfig_info": "Inicie sesión como usuario de buzón para descargar el perfil de conexión solicitado para dispositivos Apple.",
|
||||||
|
"new_password": "Nueva contraseña",
|
||||||
|
"back_to_mailcow": "Volver a mailcow",
|
||||||
|
"login_linkstext": "¿Sesión incorrecta?",
|
||||||
|
"login_usertext": "Iniciar sesión como usuario",
|
||||||
|
"login_domainadmintext": "Iniciar sesión como administrador de dominio",
|
||||||
|
"login_admintext": "Iniciar sesión como administrador",
|
||||||
|
"login_user": "Inicio de sesión de usuario",
|
||||||
|
"login_dadmin": "Inicio de sesión de administrador de dominio",
|
||||||
|
"new_password_confirm": "Confirmar nueva contraseña",
|
||||||
|
"other_logins": "o iniciar sesión con",
|
||||||
|
"reset_password": "Restablecer contraseña",
|
||||||
|
"request_reset_password": "Solicitar cambio de contraseña"
|
||||||
},
|
},
|
||||||
"mailbox": {
|
"mailbox": {
|
||||||
"action": "Acción",
|
"action": "Acción",
|
||||||
@@ -572,7 +882,67 @@
|
|||||||
"toggle_all": "Selecionar todo",
|
"toggle_all": "Selecionar todo",
|
||||||
"username": "Nombre de usuario",
|
"username": "Nombre de usuario",
|
||||||
"waiting": "Esperando",
|
"waiting": "Esperando",
|
||||||
"weekly": "Cada semana"
|
"weekly": "Cada semana",
|
||||||
|
"sieve_preset_4": "Colocar en bandeja de entrada, omitir procesamiento posterior en filtros de sieve",
|
||||||
|
"goto_spam": "Aprender como <b>correo no deseado</b>",
|
||||||
|
"sieve_preset_header": "Vea los preajustes de ejemplo más abajo. Para más detalles, consulte <a href=\"https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)\" target=\"_blank\">Wikipedia</a>.",
|
||||||
|
"syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Nombre de usuario o contraseña incorrectos",
|
||||||
|
"tls_policy_maps_enforced_tls": "Estas políticas tendrán precedencia también para aquellos usuarios de buzones en los que sea obligatoria una conexión TLS. Si no se indica ninguna política a continuación, dichos usuarios aplicarán los valores predeterminados que se especifiquen en <code>smtp_tls_mandatory_protocols</code> y <code>smtp_tls_mandatory_ciphers</code>.",
|
||||||
|
"alias_domain_alias_hint": "Los alias <b>no</b> se aplican a dominios de alias automáticamente. Una dirección alias <code>mi-alias@dominio</code> <b>no cubre</b> la dirección <code>mi-alias@dominio-alias</code> (donde \"dominio-alias\" es un hipotético alias para el dominio \"dominio\").<br>Utilice un filtro sieve para redirigir el correo a un buzón externo (ver la pestaña \"Filtros\" o utilice SOGo -> Desvío). Utilice \"expandir alias a dominio de alias\" para agregar automáticamente los alias que falten.",
|
||||||
|
"domain_templates": "Plantillas de dominio",
|
||||||
|
"sieve_preset_1": "Desechar correo con tipos de archivo probablemente peligrosos",
|
||||||
|
"created_on": "Creado",
|
||||||
|
"disable_login": "No permitir iniciar sesión (se seguirá aceptando el correo entrante)",
|
||||||
|
"mailbox": "Buzón",
|
||||||
|
"mailbox_defaults": "Ajustes por defecto",
|
||||||
|
"sogo_visible_y": "Mostrar alias en SOGo",
|
||||||
|
"spam_aliases": "Alias temporal",
|
||||||
|
"add_template": "Añadir plantilla",
|
||||||
|
"all_domains": "Todos los dominios",
|
||||||
|
"allow_from_smtp": "Permitir únicamente a estas direcciones IP utilizar <b>SMTP</b>",
|
||||||
|
"allow_from_smtp_info": "Dejar vacío para permitir cualquier remitente.<br>Direcciones y redes IPv4/IPv6.",
|
||||||
|
"allowed_protocols": "Protocolos permitidos",
|
||||||
|
"goto_ham": "Aprender como <b>correo deseado</b>",
|
||||||
|
"iam": "Proveedor de identidad",
|
||||||
|
"insert_preset": "Insertar valor predeterminado de ejemplo \"%s\"",
|
||||||
|
"last_mail_login": "Último acceso al correo",
|
||||||
|
"last_pw_change": "Último cambio de contraseña",
|
||||||
|
"mailbox_defaults_info": "Definir configuración por defecto para nuevos buzones.",
|
||||||
|
"mailbox_templates": "Plantillas de buzón",
|
||||||
|
"no": "✕",
|
||||||
|
"open_logs": "Abrir registros",
|
||||||
|
"owner": "Propietario",
|
||||||
|
"private_comment": "Comentario privado",
|
||||||
|
"public_comment": "Comentario público",
|
||||||
|
"q_add_header": "al mover a carpeta de Spam",
|
||||||
|
"q_all": " al mover a carpeta de Spam y al rechazar",
|
||||||
|
"q_reject": "al rechazar",
|
||||||
|
"quarantine_category": "Categoría de notificación de cuarentena",
|
||||||
|
"recipient": "Destinatario",
|
||||||
|
"relay_unknown": "Retransmitir buzones desconocidos",
|
||||||
|
"sender": "Remitente",
|
||||||
|
"sieve_preset_2": "Marcar siempre el correo de un remitente específico como leído",
|
||||||
|
"sieve_preset_3": "Descartar silenciosamente, detener procesado de sieve",
|
||||||
|
"sieve_preset_5": "Respuesta automática (vacaciones)",
|
||||||
|
"sieve_preset_6": "Rechazar correo con respuesta",
|
||||||
|
"sieve_preset_7": "Redireccionar y guardar/descartar",
|
||||||
|
"sieve_preset_8": "Redirigir correo de un remitente específico, marcarlo como leído y clasificarlo en subcarpeta",
|
||||||
|
"sogo_visible": "Alias visible en SOGo",
|
||||||
|
"sogo_visible_n": "Ocultar alias en SOGo",
|
||||||
|
"stats": "Estadísticas",
|
||||||
|
"syncjob_check_log": "Comprobar registros",
|
||||||
|
"syncjob_last_run_result": "Resultado de la última ejecución",
|
||||||
|
"syncjob_EX_OK": "Éxito",
|
||||||
|
"syncjob_EXIT_CONNECTION_FAILURE": "Problema de conexión",
|
||||||
|
"syncjob_EXIT_TLS_FAILURE": "Problema con la conexión cifrada",
|
||||||
|
"syncjob_EXIT_AUTHENTICATION_FAILURE": "Problema de autenticación",
|
||||||
|
"syncjob_EXIT_OVERQUOTA": "El buzón de destino ha superado la cuota",
|
||||||
|
"syncjob_EXIT_CONNECTION_FAILURE_HOST1": "No es posible conectar con el servidor remoto",
|
||||||
|
"table_size": "Tamaño de la tabla",
|
||||||
|
"table_size_show_n": "Mostrar %s elementos",
|
||||||
|
"templates": "Plantillas",
|
||||||
|
"template": "Plantilla",
|
||||||
|
"yes": "✓"
|
||||||
},
|
},
|
||||||
"oauth2": {
|
"oauth2": {
|
||||||
"access_denied": "Inicie sesión como propietario del buzón para otorgar acceso a través de OAuth2.",
|
"access_denied": "Inicie sesión como propietario del buzón para otorgar acceso a través de OAuth2.",
|
||||||
@@ -614,7 +984,13 @@
|
|||||||
"subj": "Asunto",
|
"subj": "Asunto",
|
||||||
"text_from_html_content": "Contenido (html convertido)",
|
"text_from_html_content": "Contenido (html convertido)",
|
||||||
"text_plain_content": "Contenido (text/plain)",
|
"text_plain_content": "Contenido (text/plain)",
|
||||||
"toggle_all": "Seleccionar todos"
|
"toggle_all": "Seleccionar todos",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"deliver_inbox": "Entregar en bandeja de entrada",
|
||||||
|
"download_eml": "Descargar (.eml)",
|
||||||
|
"info": "Información",
|
||||||
|
"junk_folder": "Carpeta de correo no deseado",
|
||||||
|
"notified": "Notificado"
|
||||||
},
|
},
|
||||||
"queue": {
|
"queue": {
|
||||||
"queue_manager": "Administrador de cola"
|
"queue_manager": "Administrador de cola"
|
||||||
@@ -773,11 +1149,55 @@
|
|||||||
"waiting": "Esperando",
|
"waiting": "Esperando",
|
||||||
"week": "Semana",
|
"week": "Semana",
|
||||||
"weekly": "Cada semana",
|
"weekly": "Cada semana",
|
||||||
"weeks": "Semanas"
|
"weeks": "Semanas",
|
||||||
|
"with_app_password": "con contraseña de aplicación",
|
||||||
|
"year": "año",
|
||||||
|
"years": "años"
|
||||||
},
|
},
|
||||||
"warning": {
|
"warning": {
|
||||||
"domain_added_sogo_failed": "Se agregó el dominio pero no se pudo reiniciar SOGo, revisa los logs del servidor.",
|
"domain_added_sogo_failed": "Se agregó el dominio pero no se pudo reiniciar SOGo, revisa los logs del servidor.",
|
||||||
"fuzzy_learn_error": "Error aprendiendo hash: %s",
|
"fuzzy_learn_error": "Error aprendiendo hash: %s",
|
||||||
"ip_invalid": "IP inválida omitida: %s"
|
"ip_invalid": "IP inválida omitida: %s",
|
||||||
|
"cannot_delete_self": "No se puede eliminar el usuario conectado"
|
||||||
|
},
|
||||||
|
"datatables": {
|
||||||
|
"collapse_all": "Contraer todo",
|
||||||
|
"aria": {
|
||||||
|
"sortAscending": ": activar para ordenar ascendentemente según la columna",
|
||||||
|
"sortDescending": ": activar para ordenar descendentemente según la columna"
|
||||||
|
},
|
||||||
|
"infoEmpty": "Mostrando 0 a 0 de 0 apuntes",
|
||||||
|
"paginate": {
|
||||||
|
"last": "Última",
|
||||||
|
"next": "Siguiente",
|
||||||
|
"previous": "Anterior",
|
||||||
|
"first": "Primero"
|
||||||
|
},
|
||||||
|
"processing": "Espere, por favor...",
|
||||||
|
"decimal": ".",
|
||||||
|
"emptyTable": "Sin datos disponibles en la tabla",
|
||||||
|
"expand_all": "Ampliar todo",
|
||||||
|
"info": "Mostrando apuntes _START_ a _END_ de _TOTAL_",
|
||||||
|
"infoFiltered": "(filtrado a partir de _MAX_ entradas totales)",
|
||||||
|
"thousands": ",",
|
||||||
|
"lengthMenu": "Mostrar entradas de _MENU_",
|
||||||
|
"loadingRecords": "Cargando...",
|
||||||
|
"search": "Buscar:",
|
||||||
|
"zeroRecords": "No se han encontrado registros coincidentes"
|
||||||
|
},
|
||||||
|
"fido2": {
|
||||||
|
"set_fido2": "Registrar dispositivo FIDO2",
|
||||||
|
"set_fido2_touchid": "Registrar Touch ID en Apple M1",
|
||||||
|
"set_fn": "Establecer nombre amistoso (fácil de recordar)",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"fido2_auth": "Iniciar sesión con FIDO2",
|
||||||
|
"fido2_success": "Dispositivo registrado con éxito",
|
||||||
|
"fido2_validation_failed": "Validación fallida",
|
||||||
|
"fn": "Nombre amistoso (fácil de recordar)",
|
||||||
|
"known_ids": "ID conocidas",
|
||||||
|
"none": "Deshabilitado",
|
||||||
|
"register_status": "Estado de registro",
|
||||||
|
"rename": "Renombrar",
|
||||||
|
"start_fido2_validation": "Iniciar validación FIDO2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -359,7 +359,12 @@
|
|||||||
"username": "Nome de usuário",
|
"username": "Nome de usuário",
|
||||||
"validate_license_now": "Valide o GUID em relação ao servidor de licenças",
|
"validate_license_now": "Valide o GUID em relação ao servidor de licenças",
|
||||||
"verify": "Verificar",
|
"verify": "Verificar",
|
||||||
"yes": "✓"
|
"yes": "✓",
|
||||||
|
"iam_client_id": "ID de cliente",
|
||||||
|
"iam_client_secret": "Senha de cliente",
|
||||||
|
"iam_auth_flow": "Fluxo de autenticação",
|
||||||
|
"iam_client_scopes": "Escopo do cliente",
|
||||||
|
"iam_default_template": "Template Padrão"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Acesso negado ou dados de formulário inválidos",
|
"access_denied": "Acesso negado ou dados de formulário inválidos",
|
||||||
@@ -508,7 +513,7 @@
|
|||||||
"infoFiltered": "(filtrado do total de entradas _MAX_)",
|
"infoFiltered": "(filtrado do total de entradas _MAX_)",
|
||||||
"infoPostFix": "",
|
"infoPostFix": "",
|
||||||
"thousands": ",",
|
"thousands": ",",
|
||||||
"lengthMenu": "Mostrar _ MENU_ entradas",
|
"lengthMenu": "Mostrar _MENU_ entradas",
|
||||||
"loadingRecords": "Carregando...",
|
"loadingRecords": "Carregando...",
|
||||||
"processing": "Por favor, aguarde...",
|
"processing": "Por favor, aguarde...",
|
||||||
"search": "Pesquisa:",
|
"search": "Pesquisa:",
|
||||||
|
|||||||
@@ -184,7 +184,7 @@
|
|||||||
"excludes": "Исключает этих получателей",
|
"excludes": "Исключает этих получателей",
|
||||||
"f2b_ban_time": "Время бана (в секундах)",
|
"f2b_ban_time": "Время бана (в секундах)",
|
||||||
"f2b_ban_time_increment": "Время бана увеличивается с каждым баном",
|
"f2b_ban_time_increment": "Время бана увеличивается с каждым баном",
|
||||||
"f2b_blacklist": "Черный список подсетей/хостов",
|
"f2b_blacklist": "Черный список сетей/хостов",
|
||||||
"f2b_filter": "Правила фильтрации с помощью регулярных выражений",
|
"f2b_filter": "Правила фильтрации с помощью регулярных выражений",
|
||||||
"f2b_list_info": "Хосты или подсети, занесенные в черный список, всегда будут перевешивать объекты из белого списка. <b>Обновление списка займет несколько секунд.</b>",
|
"f2b_list_info": "Хосты или подсети, занесенные в черный список, всегда будут перевешивать объекты из белого списка. <b>Обновление списка займет несколько секунд.</b>",
|
||||||
"f2b_manage_external": "Внешнее управление Fail2Ban",
|
"f2b_manage_external": "Внешнее управление Fail2Ban",
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
"f2b_parameters": "Настройки Fail2ban",
|
"f2b_parameters": "Настройки Fail2ban",
|
||||||
"f2b_regex_info": "Журналы которые принимаются во внимание: SOGo, Postfix, Dovecot, PHP-FPM.",
|
"f2b_regex_info": "Журналы которые принимаются во внимание: SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Промежуток времени для следующего бана (в секундах)",
|
"f2b_retry_window": "Промежуток времени для следующего бана (в секундах)",
|
||||||
"f2b_whitelist": "Белый список подсетей/хостов",
|
"f2b_whitelist": "Белый список сетей/хостов",
|
||||||
"filter_table": "Поиск",
|
"filter_table": "Поиск",
|
||||||
"forwarding_hosts": "Переадресация хостов",
|
"forwarding_hosts": "Переадресация хостов",
|
||||||
"forwarding_hosts_add_hint": "Можно указывать: IPv4/IPv6 подсети в нотации CIDR, имена хостов (которые будут разрешаться в IP-адреса) или доменные имена (которые будут решаться с IP-адресами путем запроса SPF записей или, в случае их отсутствия - запросом MX записей).",
|
"forwarding_hosts_add_hint": "Можно указывать: IPv4/IPv6 подсети в нотации CIDR, имена хостов (которые будут разрешаться в IP-адреса) или доменные имена (которые будут решаться с IP-адресами путем запроса SPF записей или, в случае их отсутствия - запросом MX записей).",
|
||||||
@@ -319,7 +319,7 @@
|
|||||||
"rspamd_global_filters": "Глобальные правила фильтрации",
|
"rspamd_global_filters": "Глобальные правила фильтрации",
|
||||||
"rspamd_global_filters_agree": "Я понимаю, что я делаю, и буду осторожен!",
|
"rspamd_global_filters_agree": "Я понимаю, что я делаю, и буду осторожен!",
|
||||||
"rspamd_global_filters_info": "Глобальные правила фильтрации содержат различные виды глобальных черных и белых списков.",
|
"rspamd_global_filters_info": "Глобальные правила фильтрации содержат различные виды глобальных черных и белых списков.",
|
||||||
"rspamd_global_filters_regex": "Названия фильтров отражают их предназначение. Все правила должены состоять из регулярных выражений в формате \"/pattern/options\" (например: <code>/.+@domain\\.tld/i</code>).<br>\r\nНесмотря на то, что перед сохранением правил выполняется проверка регулярных выражений, функциональность Rspamds может быть нарушена, если будет использован<br>\r\n некорректный синтаксис. Будьте внимательны при написании правил.<br>Электронные письма от адресов электронной почты, проходящие по регулярным выражениям черных списков, будут отклонены без сохранения в карантин.<br>\r\n Rspamd попытается прочитать содержимое правил при их изменении. Но, если что, вы можете <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">перезапустить Rspamd</a>, чтобы принять последние изменения принудительно.",
|
"rspamd_global_filters_regex": "Названия фильтров отражают их предназначение. Все правила должны состоять из регулярных выражений в формате \"/pattern/options\" (например: <code>/.+@domain\\.tld/i</code>).<br>\nНесмотря на то, что перед сохранением правил выполняется проверка регулярных выражений, функциональность Rspamds может быть нарушена, если будет использован<br>\n некорректный синтаксис. Будьте внимательны при написании правил.<br>Электронные письма от адресов электронной почты, проходящие по регулярным выражениям черных списков, будут отклонены без сохранения в карантин.<br>\n Rspamd попытается прочитать содержимое правил при их изменении. Но, если что, вы можете <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">перезапустить Rspamd</a>, чтобы принять последние изменения принудительно.",
|
||||||
"rspamd_settings_map": "Правила Rspamd",
|
"rspamd_settings_map": "Правила Rspamd",
|
||||||
"sal_level": "Уровень Муу",
|
"sal_level": "Уровень Муу",
|
||||||
"save": "Сохранить изменения",
|
"save": "Сохранить изменения",
|
||||||
@@ -408,7 +408,8 @@
|
|||||||
"iam_host": "Хост",
|
"iam_host": "Хост",
|
||||||
"iam_host_info": "Укажите один или несколько LDAP-хостов через запятую.",
|
"iam_host_info": "Укажите один или несколько LDAP-хостов через запятую.",
|
||||||
"iam_import_users": "Импорт пользователей",
|
"iam_import_users": "Импорт пользователей",
|
||||||
"admin_quicklink": "Скрыть ссылку на вход для администраторов"
|
"admin_quicklink": "Скрыть ссылку на вход для администраторов",
|
||||||
|
"needs_restart": "необходим перезапуск"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Доступ запрещён, или указаны неверные данные",
|
"access_denied": "Доступ запрещён, или указаны неверные данные",
|
||||||
@@ -750,7 +751,7 @@
|
|||||||
"sogo_visible_info": "Влияет только на объекты, которые могут отображаться в SOGo (персональные или общие псевдонимы, указывающие как минимум на один локальный почтовый аккаунт). Учтите, что если функция отключена, у пользователей не будет возможности выбрать адрес псевдонима в качестве отправителя в SOGo.",
|
"sogo_visible_info": "Влияет только на объекты, которые могут отображаться в SOGo (персональные или общие псевдонимы, указывающие как минимум на один локальный почтовый аккаунт). Учтите, что если функция отключена, у пользователей не будет возможности выбрать адрес псевдонима в качестве отправителя в SOGo.",
|
||||||
"spam_alias": "Создать или изменить временные (спам) псевдонимы",
|
"spam_alias": "Создать или изменить временные (спам) псевдонимы",
|
||||||
"spam_filter": "Спам фильтр",
|
"spam_filter": "Спам фильтр",
|
||||||
"spam_policy": "Добавление или удаление элементов в белом/черном списке",
|
"spam_policy": "Добавить или удалить элементы белого/черного списка",
|
||||||
"spam_score": "Задать индивидуальное определение спама",
|
"spam_score": "Задать индивидуальное определение спама",
|
||||||
"subfolder2": "Синхронизировать в подпапку<br><small>(пусто = в корень)</small>",
|
"subfolder2": "Синхронизировать в подпапку<br><small>(пусто = в корень)</small>",
|
||||||
"syncjob": "Изменить задание синхронизации",
|
"syncjob": "Изменить задание синхронизации",
|
||||||
@@ -1039,7 +1040,7 @@
|
|||||||
"notified": "Увед.",
|
"notified": "Увед.",
|
||||||
"qhandler_success": "Запрос успешно отправлен в систему. Теперь вы можете закрыть окно.",
|
"qhandler_success": "Запрос успешно отправлен в систему. Теперь вы можете закрыть окно.",
|
||||||
"qid": "Rspamd QID",
|
"qid": "Rspamd QID",
|
||||||
"qinfo": "Карантин сохраняет входящие сообщения, классифицированные как нежелательные, в базу данных.\r\n <br>Отправители писем, которые помечены как отвергнутые, будут уверены что их письма <b>не</b> были доставлены вам.\r\n <br>\"Освободить из карантина\" изучит сообщение как полезную почту; по теореме Байеса и доставит его вам в Inbox.\r\n <br>\"Запомнить как спам и удалить\" изучит сообщение как спам по теореме Байеса, а также вычислит нечёткие хэши, чтобы лучше блокировать подобные сообщения в дальнейшем.\r\n <br>Учтите, что в зависимости от технических характеристик вашей системы, изучение большого количества сообщений может занять много времени.",
|
"qinfo": "Карантин сохраняет входящие сообщения, классифицированные как нежелательные, в базу данных.\n <br>Отправители писем, которые помечены как отвергнутые, будут уверены что их письма <b>не</b> были доставлены вам.\n <br>\"Освободить из карантина\" изучит сообщение как полезную почту; по теореме Байеса и доставит его вам в Inbox.\n <br>\"Запомнить как спам и удалить\" изучит сообщение как спам по теореме Байеса, а также вычислит нечёткие хэши, чтобы лучше блокировать подобные сообщения в дальнейшем.\n <br>Учтите, что в зависимости от технических характеристик вашей системы, изучение большого количества сообщений может занять много времени.",
|
||||||
"qitem": "Обьект карантина",
|
"qitem": "Обьект карантина",
|
||||||
"quarantine": "Карантин",
|
"quarantine": "Карантин",
|
||||||
"quick_actions": "Действия",
|
"quick_actions": "Действия",
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"sogo_access": "Dovoli upravljanje SOGo dostopa",
|
"sogo_access": "Dovoli upravljanje SOGo dostopa",
|
||||||
"sogo_profile_reset": "Ponastavi SOGo profil",
|
"sogo_profile_reset": "Ponastavi SOGo profil",
|
||||||
"spam_alias": "Začasni vzdevki",
|
"spam_alias": "Začasni vzdevki",
|
||||||
"spam_policy": "Črna lista/Bela lista",
|
"spam_policy": "Seznam zavrnjenih/dovoljenih",
|
||||||
"spam_score": "Ocena neželene pošte",
|
"spam_score": "Ocena neželene pošte",
|
||||||
"tls_policy": "Politika TLS",
|
"tls_policy": "Politika TLS",
|
||||||
"unlimited_quota": "Neomejena kvota za poštne predale",
|
"unlimited_quota": "Neomejena kvota za poštne predale",
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
"excludes": "Izključuje te prejemnike",
|
"excludes": "Izključuje te prejemnike",
|
||||||
"f2b_ban_time": "Čas blokade (s)",
|
"f2b_ban_time": "Čas blokade (s)",
|
||||||
"f2b_ban_time_increment": "Čas blokade se poveča z vsako blokado",
|
"f2b_ban_time_increment": "Čas blokade se poveča z vsako blokado",
|
||||||
"f2b_blacklist": "Mreže/gostitelji na blacklisti",
|
"f2b_blacklist": "Omrežja/gostitelji na seznamu zavrnjenih",
|
||||||
"f2b_filter": "Regex filtri",
|
"f2b_filter": "Regex filtri",
|
||||||
"f2b_max_attempts": "Največ poskusov",
|
"f2b_max_attempts": "Največ poskusov",
|
||||||
"f2b_max_ban_time": "Maksimalno trajanje blokade (s)",
|
"f2b_max_ban_time": "Maksimalno trajanje blokade (s)",
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
"f2b_parameters": "Fail2ban parametri",
|
"f2b_parameters": "Fail2ban parametri",
|
||||||
"f2b_regex_info": "Upoštevajo se dnevniki SOGo, Postfix, Dovecot, PHP-FPM.",
|
"f2b_regex_info": "Upoštevajo se dnevniki SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Upoštevan čas (s) za največ poskusov",
|
"f2b_retry_window": "Upoštevan čas (s) za največ poskusov",
|
||||||
"f2b_whitelist": "Mreže/gostitelji na whitelisti",
|
"f2b_whitelist": "Omrežja/gostitelji na seznamu dovoljenih",
|
||||||
"filter_table": "Filtriraj tabelo",
|
"filter_table": "Filtriraj tabelo",
|
||||||
"from": "Od",
|
"from": "Od",
|
||||||
"generate": "ustvari",
|
"generate": "ustvari",
|
||||||
@@ -281,16 +281,16 @@
|
|||||||
"rspamd_com_settings": "Ime nastavitve bo samodejno generirano. Prosim oglejte si primere nastavitev spodaj. Za več informacij si oglejte <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">dokumentacijo Rspamd</a>",
|
"rspamd_com_settings": "Ime nastavitve bo samodejno generirano. Prosim oglejte si primere nastavitev spodaj. Za več informacij si oglejte <a href=\"https://rspamd.com/doc/configuration/settings.html#settings-structure\" target=\"_blank\">dokumentacijo Rspamd</a>",
|
||||||
"rspamd_global_filters": "Globalne preslikave filtrov",
|
"rspamd_global_filters": "Globalne preslikave filtrov",
|
||||||
"rspamd_global_filters_agree": "Previden bom!",
|
"rspamd_global_filters_agree": "Previden bom!",
|
||||||
"rspamd_global_filters_info": "Globalne preslikave filtrov vsebujejo različne vrste globalnih blacklist in whitelist.",
|
"rspamd_global_filters_info": "Globalni filtri vsebujejo različne vrste globalnih seznamov zavrnjenih in dovoljenih vsebin.",
|
||||||
"add_admin": "Dodaj skrbnika",
|
"add_admin": "Dodaj skrbnika",
|
||||||
"add_relayhost_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v golo besedilo.",
|
"add_relayhost_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v golo besedilo.",
|
||||||
"admin": "Skrbnik",
|
"admin": "Skrbnik",
|
||||||
"api_allow_from": "Dovoli API dostop s teh IP naslovov / CIDR mrežnih zapisov",
|
"api_allow_from": "Dovoli API dostop s teh IP naslovov / CIDR mrežnih zapisov",
|
||||||
"apps_name": "Ime aplikacije v mailcow",
|
"apps_name": "Ime aplikacije v mailcow",
|
||||||
"ban_list_info": "Oglejte si seznam blokiranih IP naslovov spodaj: <b>network (remaining ban time) - [actions]</b>.<br />. IPji v vrsti za odstranitev blokade bodo odstranjeni iz aktivnega seznama blokad v nekaj sekundah.<br />Rdeče oznake prikazujejo trajne blokade z blacklisto.",
|
"ban_list_info": "Spodaj si oglejte seznam prepovedanih IP-jev: <b>omrežje (preostali čas prepovedi) - [dejanja]</b>.<br />IP-ji, ki so v čakalni vrsti za odpravo prepovedi, bodo v nekaj sekundah odstranjeni s seznama aktivnih prepovedi.<br />Rdeče oznake označujejo aktivne trajne prepovedi s seznama zavrnjenih.",
|
||||||
"dkim_key_length": "Dolžina DKIM ključa (v bitih)",
|
"dkim_key_length": "Dolžina DKIM ključa (v bitih)",
|
||||||
"dkim_to_title": "Ciljne domene bodo prepisane",
|
"dkim_to_title": "Ciljne domene bodo prepisane",
|
||||||
"f2b_list_info": "Gostitelj ali omrežje na blacklisti bo vedno prevladal zapis na whitelisti. <b>Apliciranje sprememb seznama traja nekaj sekund.</b>",
|
"f2b_list_info": "Gostitelj ali omrežje na seznamu zavrnjenih bo vedno imelo prednost pred entiteto na seznamu dovoljenih. <b>Posodobitve seznama bodo trajale nekaj sekund, da se uporabijo.</b>",
|
||||||
"forwarding_hosts": "Gostitelji za posredovanje",
|
"forwarding_hosts": "Gostitelji za posredovanje",
|
||||||
"forwarding_hosts_add_hint": "Lahko vpišete IPv4/IPv6 naslove, mreže v CIDR obliki, imena gostiteljev (kateri se prevedejo v IP naslove) ali imena domen (katera se prevedejo v IP naslove glede na poizvedbo po SPF zapisih, v primeru manjkajočih zapisov pa MX zapisih).",
|
"forwarding_hosts_add_hint": "Lahko vpišete IPv4/IPv6 naslove, mreže v CIDR obliki, imena gostiteljev (kateri se prevedejo v IP naslove) ali imena domen (katera se prevedejo v IP naslove glede na poizvedbo po SPF zapisih, v primeru manjkajočih zapisov pa MX zapisih).",
|
||||||
"forwarding_hosts_hint": "Dohodna sporočila so brezpogojno sprejeta od katerih koli gostiteljev v tem seznamu. Ti gostitelji se ne bodo preverjali po DNSBL seznamih in ne bodo dodani v greyliste. Prejeti spam s teh gostiteljev ni nikoli zavrnjen, opcijsko pa se lahko premakne v mapo neželene pošte. Najpogostejša uporaba za to je navedba poštnih strežnikov, iz katerih ste nastavili pravilo za posredovanje pošte na vaš mailcow strežnik.",
|
"forwarding_hosts_hint": "Dohodna sporočila so brezpogojno sprejeta od katerih koli gostiteljev v tem seznamu. Ti gostitelji se ne bodo preverjali po DNSBL seznamih in ne bodo dodani v greyliste. Prejeti spam s teh gostiteljev ni nikoli zavrnjen, opcijsko pa se lahko premakne v mapo neželene pošte. Najpogostejša uporaba za to je navedba poštnih strežnikov, iz katerih ste nastavili pravilo za posredovanje pošte na vaš mailcow strežnik.",
|
||||||
@@ -306,7 +306,7 @@
|
|||||||
"relayhosts_hint": "Določite transporte glede na pošiljatelja, da jih lahko izberete v konfiguraciji domene.<br>\nTransportni servis je vedno \"smtp:\" in bo poskušal s TLS ko bo na voljo. Wrapped TLS (SMTPS) ni podprto. Upošteva se uporabnikova politika odhodnega TLS.<br>\nVpliva na izbrane domene vključno z alias domenami.",
|
"relayhosts_hint": "Določite transporte glede na pošiljatelja, da jih lahko izberete v konfiguraciji domene.<br>\nTransportni servis je vedno \"smtp:\" in bo poskušal s TLS ko bo na voljo. Wrapped TLS (SMTPS) ni podprto. Upošteva se uporabnikova politika odhodnega TLS.<br>\nVpliva na izbrane domene vključno z alias domenami.",
|
||||||
"transport_dest_format": "Regex ali sintaksa: example.org, .example.org, *, box@example.org (več vrednosti ločite z vejico)",
|
"transport_dest_format": "Regex ali sintaksa: example.org, .example.org, *, box@example.org (več vrednosti ločite z vejico)",
|
||||||
"transport_test_rcpt_info": "• Uporabite null@hosted.mailcow.de za testiranje relaya na drugo destinacijo.",
|
"transport_test_rcpt_info": "• Uporabite null@hosted.mailcow.de za testiranje relaya na drugo destinacijo.",
|
||||||
"rspamd_global_filters_regex": "Njihovi nazivi pojasnijo njihov namen. Vsa vsebina mora imeti veljaven regular expression v obliki \"/pattern/options\" (npr. <code>/.+@domain\\.tld/i</code>).<br>\nČeprav se v vsaki vrstici regexa izvedejo osnovni pregledi, je lahko funkcionalnost programa Rspamd motena, če sintaksa ni pravilna.<br>\nRspamd bo poskušal prebrati vsebino preslikave, ko bo spremenjena. Če imate težave, <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">ponovno zaženite Rspamd</a>, da prisilite ponovno nalaganje preslikav.<br> Elementi z Blackliste so izključeni iz karantene.",
|
"rspamd_global_filters_regex": "Njihovi nazivi pojasnijo njihov namen. Vsa vsebina mora imeti veljaven regular expression v obliki \"/pattern/options\" (npr. <code>/.+@domain\\.tld/i</code>).<br>\nČeprav se v vsaki vrstici regexa izvedejo osnovni pregledi, je lahko funkcionalnost programa Rspamd motena, če sintaksa ni pravilna.<br>\nRspamd bo poskušal prebrati vsebino preslikave, ko bo spremenjena. Če imate težave, <a href=\"\" data-toggle=\"modal\" data-container=\"rspamd-mailcow\" data-target=\"#RestartContainer\">ponovno zaženite Rspamd</a>, da prisilite ponovno nalaganje preslikav.<br> Elementi na seznamu zavrnjenih so izključeni iz karantene.",
|
||||||
"rspamd_settings_map": "Preslikava nastavitev Rspamd",
|
"rspamd_settings_map": "Preslikava nastavitev Rspamd",
|
||||||
"sal_level": "Moo stopnja",
|
"sal_level": "Moo stopnja",
|
||||||
"save": "Shrani spremembe",
|
"save": "Shrani spremembe",
|
||||||
@@ -408,7 +408,8 @@
|
|||||||
"restore_template": "Za obnovitev privzete predloge pustite polje prazno.",
|
"restore_template": "Za obnovitev privzete predloge pustite polje prazno.",
|
||||||
"task": "Naloga",
|
"task": "Naloga",
|
||||||
"user_link": "Uporabniška povezava",
|
"user_link": "Uporabniška povezava",
|
||||||
"iam_realm": "Realm"
|
"iam_realm": "Realm",
|
||||||
|
"needs_restart": "potreben je ponovni zagon"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"alias_goto_identical": "Alias in goto naslov morata biti identična",
|
"alias_goto_identical": "Alias in goto naslov morata biti identična",
|
||||||
@@ -745,7 +746,7 @@
|
|||||||
"sogo_visible_info": "Ta možnost vpliva samo na objekte, ki jih je mogoče prikazati v SOGo (naslovi aliasov v skupni rabi ali brez nje, ki kažejo na vsaj en lokalni poštni predal). Če je skrita, vzdevek ne bo prikazan kot izbirni pošiljatelj v SOGo.",
|
"sogo_visible_info": "Ta možnost vpliva samo na objekte, ki jih je mogoče prikazati v SOGo (naslovi aliasov v skupni rabi ali brez nje, ki kažejo na vsaj en lokalni poštni predal). Če je skrita, vzdevek ne bo prikazan kot izbirni pošiljatelj v SOGo.",
|
||||||
"spam_alias": "Ustvarjanje ali spreminjanje časovno omejenih vzdevkovnih naslovov",
|
"spam_alias": "Ustvarjanje ali spreminjanje časovno omejenih vzdevkovnih naslovov",
|
||||||
"spam_filter": "Filter neželene pošte",
|
"spam_filter": "Filter neželene pošte",
|
||||||
"spam_policy": "Dodajanje ali odstranjevanje elementov na beli/črni seznam",
|
"spam_policy": "Dodajanje ali odstranjevanje elementov na seznam dovoljenih/zavrnjenih",
|
||||||
"spam_score": "Nastavite oceno neželene pošte po meri",
|
"spam_score": "Nastavite oceno neželene pošte po meri",
|
||||||
"subfolder2": "Sinhroniziraj v podmapo na cilju<br><small>(prazno = ne uporabi podmape)</small>",
|
"subfolder2": "Sinhroniziraj v podmapo na cilju<br><small>(prazno = ne uporabi podmape)</small>",
|
||||||
"syncjob": "Urejanje sinhronizacijskega opravila",
|
"syncjob": "Urejanje sinhronizacijskega opravila",
|
||||||
@@ -1013,7 +1014,7 @@
|
|||||||
"medium_danger": "Srednje",
|
"medium_danger": "Srednje",
|
||||||
"notified": "Obveščen",
|
"notified": "Obveščen",
|
||||||
"low_danger": "Nizko",
|
"low_danger": "Nizko",
|
||||||
"qinfo": "Sistem karantene bo zavrnjeno pošto shranil v zbirko podatkov (pošiljatelj ne bo imel vtisa, da je bila pošta dostavljena), prav tako pa bo pošto, ki bo dostavljena kot kopija, shranil v mapo »Neželena pošta« v nabiralniku.\n<br>»Uči kot neželeno pošto in izbriši« bo sporočilo prepoznal kot neželeno pošto prek Bayesovega izreka in izračunal tudi mehke zgoščene vrednosti, da bi v prihodnje zavrnil podobna sporočila.\n<br>Upoštevajte, da je učenje več sporočil lahko – odvisno od vašega sistema – zamudno.<br>Elementi na črnem seznamu so izključeni iz karantene.",
|
"qinfo": "Sistem karantene bo zavrnjeno pošto shranil v zbirko podatkov (pošiljatelj ne bo imel vtisa, da je bila pošta dostavljena), prav tako pa bo pošto, ki bo dostavljena kot kopija, shranil v mapo »Neželena pošta« v nabiralniku.\n<br>»Uči kot neželeno pošto in izbriši« bo sporočilo prepoznal kot neželeno pošto prek Bayesovega izreka in izračunal tudi mehke zgoščene vrednosti, da bi v prihodnje zavrnil podobna sporočila.\n<br>Upoštevajte, da je učenje več sporočil lahko – odvisno od vašega sistema – zamudno.<br>Elementi na seznamu zavrnjenih so izključeni iz karantene.",
|
||||||
"junk_folder": "Mapa z neželeno pošto",
|
"junk_folder": "Mapa z neželeno pošto",
|
||||||
"action": "Dejanje",
|
"action": "Dejanje",
|
||||||
"atts": "Priloge",
|
"atts": "Priloge",
|
||||||
@@ -1232,8 +1233,8 @@
|
|||||||
"pushover_vars": "Če filter pošiljatelja ni definiran, bodo upoštevana vsa e-poštna sporočila.<br>Filtre regularnih izrazov in natančna preverjanja pošiljateljev je mogoče definirati posamično in bodo obravnavana zaporedno. Niso odvisna drug od drugega.<br>Uporabne spremenljivke za besedilo in naslov (upoštevajte pravilnike o varstvu podatkov)",
|
"pushover_vars": "Če filter pošiljatelja ni definiran, bodo upoštevana vsa e-poštna sporočila.<br>Filtre regularnih izrazov in natančna preverjanja pošiljateljev je mogoče definirati posamično in bodo obravnavana zaporedno. Niso odvisna drug od drugega.<br>Uporabne spremenljivke za besedilo in naslov (upoštevajte pravilnike o varstvu podatkov)",
|
||||||
"quarantine_notification_info": "Ko je obvestilo poslano, bodo elementi označeni kot »obveščeni« in za ta določen element ne bodo poslana nobena nadaljnja obvestila.",
|
"quarantine_notification_info": "Ko je obvestilo poslano, bodo elementi označeni kot »obveščeni« in za ta določen element ne bodo poslana nobena nadaljnja obvestila.",
|
||||||
"verify": "Preveri",
|
"verify": "Preveri",
|
||||||
"spamfilter_bl_desc": "E-poštni naslovi na črnem seznamu, ki jih <b>vedno</b> razvrstite kot neželeno pošto in zavrnete. Zavrnjena pošta <b>ne</b> bo kopirana v karanteno. Uporabite lahko nadomestne znake. Filter se uporabi samo za neposredne vzdevke (vzdevke z enim samim ciljnim nabiralnikom), izključujoč vseobsegajoče vzdevke in sam nabiralnik.",
|
"spamfilter_bl_desc": "E-poštni naslovi na seznamu zavrnjenih, ki bodo <b>vedno</b> razvrščeni kot neželena pošta in zavrnjeni. Zavrnjena pošta <b>ne</b> bo kopirana v karanteno. Uporabite lahko nadomestne znake. Filter se uporabi samo za neposredne vzdevke (vzdevke z enim samim ciljnim nabiralnikom), izključujoč vseobsegajoče vzdevke in sam nabiralnik.",
|
||||||
"spamfilter_wl_desc": "E-poštni naslovi na belem seznamu so programirani tako, da se <b>nikoli</b> ne razvrstijo kot neželena pošta. Uporabijo se lahko nadomestni znaki. Filter se uporabi samo za neposredne vzdevke (vzdevke z enim samim ciljnim poštnim predalom), izključujoč vseobsegajoče vzdevke in sam poštni predal.",
|
"spamfilter_wl_desc": "E-poštni naslovi na seznamu dovoljenih so programirani tako, da se <b>nikoli</b> ne razvrstijo kot neželena pošta. Uporabijo se lahko nadomestni znaki. Filter se uporabi samo za neposredne vzdevke (vzdevke z enim samim ciljnim poštnim predalom), izključujoč vseobsegajoče vzdevke in sam poštni predal.",
|
||||||
"tls_policy_warning": "<strong>Opozorilo:</strong> Če se odločite za uveljavitev šifriranega prenosa pošte, lahko izgubite e-pošto.<br>Sporočila, ki ne ustrezajo pravilniku, bo poštni sistem zavrnil s popolno napako.<br>Ta možnost velja za vaš primarni e-poštni naslov (prijavno ime), vse naslove, izpeljane iz vzdevkov domen, in vzdevke, <b>ki imajo samo ta en poštni predal</b> kot cilj.",
|
"tls_policy_warning": "<strong>Opozorilo:</strong> Če se odločite za uveljavitev šifriranega prenosa pošte, lahko izgubite e-pošto.<br>Sporočila, ki ne ustrezajo pravilniku, bo poštni sistem zavrnil s popolno napako.<br>Ta možnost velja za vaš primarni e-poštni naslov (prijavno ime), vse naslove, izpeljane iz vzdevkov domen, in vzdevke, <b>ki imajo samo ta en poštni predal</b> kot cilj.",
|
||||||
"allowed_protocols": "Dovoljeni protokoli",
|
"allowed_protocols": "Dovoljeni protokoli",
|
||||||
"title": "Naslov",
|
"title": "Naslov",
|
||||||
@@ -1341,7 +1342,7 @@
|
|||||||
"spam_score_reset": "Ponastavi na privzete nastavitve strežnika",
|
"spam_score_reset": "Ponastavi na privzete nastavitve strežnika",
|
||||||
"spamfilter": "Filter neželene pošte",
|
"spamfilter": "Filter neželene pošte",
|
||||||
"spamfilter_behavior": "Ocena",
|
"spamfilter_behavior": "Ocena",
|
||||||
"spamfilter_bl": "Črna lista",
|
"spamfilter_bl": "Seznam zavrnjenih",
|
||||||
"spamfilter_default_score": "Privzete vrednosti",
|
"spamfilter_default_score": "Privzete vrednosti",
|
||||||
"spamfilter_green": "Zelena: to sporočilo ni neželena pošta",
|
"spamfilter_green": "Zelena: to sporočilo ni neželena pošta",
|
||||||
"spamfilter_hint": "Prva vrednost opisuje »nizko oceno neželene pošte«, druga pa »visoko oceno neželene pošte«.",
|
"spamfilter_hint": "Prva vrednost opisuje »nizko oceno neželene pošte«, druga pa »visoko oceno neželene pošte«.",
|
||||||
@@ -1352,7 +1353,7 @@
|
|||||||
"spamfilter_table_empty": "Ni podatkov za prikaz",
|
"spamfilter_table_empty": "Ni podatkov za prikaz",
|
||||||
"spamfilter_table_remove": "odstrani",
|
"spamfilter_table_remove": "odstrani",
|
||||||
"spamfilter_table_rule": "Pravilo",
|
"spamfilter_table_rule": "Pravilo",
|
||||||
"spamfilter_wl": "Bela lista",
|
"spamfilter_wl": "Seznam dovoljenih",
|
||||||
"spamfilter_yellow": "Rumena: to sporočilo je morda neželena pošta, označeno bo kot neželena pošta in premaknjeno v mapo z neželeno pošto",
|
"spamfilter_yellow": "Rumena: to sporočilo je morda neželena pošta, označeno bo kot neželena pošta in premaknjeno v mapo z neželeno pošto",
|
||||||
"status": "Stanje",
|
"status": "Stanje",
|
||||||
"sync_jobs": "Sinhronizacija opravil",
|
"sync_jobs": "Sinhronizacija opravil",
|
||||||
|
|||||||
@@ -118,8 +118,8 @@
|
|||||||
<span class="d-none d-sm-inline"> - </span>
|
<span class="d-none d-sm-inline"> - </span>
|
||||||
{% if active_ban.queued_for_unban == 0 %}
|
{% if active_ban.queued_for_unban == 0 %}
|
||||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"unban"}' href="#">[{{ lang.admin.queue_unban }}]</a>
|
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"unban"}' href="#">[{{ lang.admin.queue_unban }}]</a>
|
||||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"whitelist"}' href="#">[whitelist]</a>
|
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"whitelist"}' href="#">[allowlist]</a>
|
||||||
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"blacklist"}' href="#">[blacklist (<b>needs restart</b>)]</a>
|
<a data-action="edit_selected" data-item="{{ active_ban.network }}" data-id="f2b-quick" data-api-url='edit/fail2ban' data-api-attr='{"action":"blacklist"}' href="#">[denylist (<b>{{ lang.admin.needs_restart }}</b>)]</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<i>{{ lang.admin.unban_pending }}</i>
|
<i>{{ lang.admin.unban_pending }}</i>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
+2
-2
@@ -200,7 +200,7 @@ services:
|
|||||||
- phpfpm
|
- phpfpm
|
||||||
|
|
||||||
sogo-mailcow:
|
sogo-mailcow:
|
||||||
image: ghcr.io/mailcow/sogo:1.133
|
image: ghcr.io/mailcow/sogo:1.134
|
||||||
environment:
|
environment:
|
||||||
- DBNAME=${DBNAME}
|
- DBNAME=${DBNAME}
|
||||||
- DBUSER=${DBUSER}
|
- DBUSER=${DBUSER}
|
||||||
@@ -477,7 +477,7 @@ services:
|
|||||||
- acme
|
- acme
|
||||||
|
|
||||||
netfilter-mailcow:
|
netfilter-mailcow:
|
||||||
image: ghcr.io/mailcow/netfilter:1.61
|
image: ghcr.io/mailcow/netfilter:1.62
|
||||||
stop_grace_period: 30s
|
stop_grace_period: 30s
|
||||||
restart: always
|
restart: always
|
||||||
privileged: true
|
privileged: true
|
||||||
|
|||||||
@@ -19,71 +19,6 @@ source _modules/scripts/ipv6_controller.sh
|
|||||||
source _modules/scripts/new_options.sh
|
source _modules/scripts/new_options.sh
|
||||||
source _modules/scripts/migrate_options.sh
|
source _modules/scripts/migrate_options.sh
|
||||||
|
|
||||||
detect_major_update() {
|
|
||||||
if [ ${BRANCH} == "master" ]; then
|
|
||||||
# Array with major versions
|
|
||||||
# Add major versions here
|
|
||||||
MAJOR_VERSIONS=(
|
|
||||||
"2025-02"
|
|
||||||
"2025-03"
|
|
||||||
)
|
|
||||||
|
|
||||||
current_version=""
|
|
||||||
if [[ -f "${SCRIPT_DIR}/data/web/inc/app_info.inc.php" ]]; then
|
|
||||||
current_version=$(grep 'MAILCOW_GIT_VERSION' ${SCRIPT_DIR}/data/web/inc/app_info.inc.php | sed -E 's/.*MAILCOW_GIT_VERSION="([^"]+)".*/\1/')
|
|
||||||
fi
|
|
||||||
if [[ -z "$current_version" ]]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
release_url="https://github.com/mailcow/mailcow-dockerized/releases/tag"
|
|
||||||
|
|
||||||
updates_to_apply=()
|
|
||||||
|
|
||||||
for version in "${MAJOR_VERSIONS[@]}"; do
|
|
||||||
if [[ "$current_version" < "$version" ]]; then
|
|
||||||
updates_to_apply+=("$version")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ${#updates_to_apply[@]} -gt 0 ]]; then
|
|
||||||
echo -e "\e[33m\nMAJOR UPDATES to be applied:\e[0m"
|
|
||||||
for update in "${updates_to_apply[@]}"; do
|
|
||||||
echo "$update - $release_url/$update"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo -e "\nPlease read the release notes before proceeding."
|
|
||||||
read -p "Do you want to proceed with the update? [y/n] " response
|
|
||||||
if [[ "${response}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
|
||||||
echo "Proceeding with the update..."
|
|
||||||
else
|
|
||||||
echo "Update canceled. Exiting."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
remove_obsolete_options() {
|
|
||||||
OBSOLETE_OPTIONS=(
|
|
||||||
"ACME_CONTACT"
|
|
||||||
)
|
|
||||||
|
|
||||||
for option in "${OBSOLETE_OPTIONS[@]}"; do
|
|
||||||
if [[ "$option" == "ACME_CONTACT" ]]; then
|
|
||||||
sed -i '/^# Lets Encrypt registration contact information/d' mailcow.conf
|
|
||||||
sed -i "/^# Let's Encrypt registration contact information/d" mailcow.conf
|
|
||||||
sed -i '/^# Optional: Leave empty for none/d' mailcow.conf
|
|
||||||
sed -i '/^# This value is only used on first order!/d' mailcow.conf
|
|
||||||
sed -i '/^# Setting it at a later point will require the following steps:/d' mailcow.conf
|
|
||||||
sed -i '/^# https:\/\/docs.mailcow.email\/troubleshooting\/debug-reset_tls\//d' mailcow.conf
|
|
||||||
sed -i '/^ACME_CONTACT=.*/d' mailcow.conf
|
|
||||||
sed -i '/^#ACME_CONTACT=.*/d' mailcow.conf
|
|
||||||
else
|
|
||||||
sed -i "/^${option}=.*/d" mailcow.conf
|
|
||||||
sed -i "/^#${option}=.*/d" mailcow.conf
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
############## End Function Section ##############
|
############## End Function Section ##############
|
||||||
|
|
||||||
# Check permissions
|
# Check permissions
|
||||||
|
|||||||
Reference in New Issue
Block a user