From 3bd01190bf84e67764801f64dd011b88603a10a3 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Fri, 16 May 2025 23:07:25 +0200 Subject: [PATCH 001/180] Translations update from Weblate (#6548) * [Web] Updated lang.fr-fr.json [Web] Updated lang.fr-fr.json Co-authored-by: Samuel F. <20537389+samuelfranzini@users.noreply.github.com> Co-authored-by: milkmaker * [Web] Updated lang.ru-ru.json [Web] Updated lang.ru-ru.json [Web] Updated lang.ru-ru.json Co-authored-by: Habetdin <15926758+Habetdin@users.noreply.github.com> Co-authored-by: Peter Co-authored-by: milkmaker * [Web] Updated lang.zh-cn.json Co-authored-by: Easton Man Co-authored-by: milkmaker * [Web] Updated lang.en-gb.json Co-authored-by: Habetdin <15926758+Habetdin@users.noreply.github.com> Co-authored-by: milkmaker --------- Co-authored-by: Samuel F. <20537389+samuelfranzini@users.noreply.github.com> Co-authored-by: Habetdin <15926758+Habetdin@users.noreply.github.com> Co-authored-by: Peter Co-authored-by: Easton Man --- data/web/lang/lang.en-gb.json | 2 +- data/web/lang/lang.fr-fr.json | 84 ++++++++++++++++++++++++++++++----- data/web/lang/lang.ru-ru.json | 83 ++++++++++++++++++++++++++++++---- data/web/lang/lang.zh-cn.json | 20 +++++++-- 4 files changed, 165 insertions(+), 24 deletions(-) diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index fb8fbb6e4..a04234610 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -205,7 +205,7 @@ "f2b_whitelist": "Whitelisted networks/hosts", "filter": "Filter", "filter_table": "Filter table", - "force_sso_text": "If an external OIDC provider is configured, this option hides the default mailcow login froms and only shows the Singe 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 Singe Sign-On button", "force_sso": "Disable mailcow Login and show only Singe Sign-On", "forwarding_hosts": "Forwarding Hosts", "forwarding_hosts_add_hint": "You can either specify IPv4/IPv6 addresses, networks in CIDR notation, host names (which will be resolved to IP addresses), or domain names (which will be resolved to IP addresses by querying SPF records or, in their absence, MX records).", diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json index 58300c0d4..313d6663c 100644 --- a/data/web/lang/lang.fr-fr.json +++ b/data/web/lang/lang.fr-fr.json @@ -359,7 +359,54 @@ "service": "Service", "success": "Succès", "cors_settings": "Paramètres CORS", - "login_time": "Horodatage de connexion" + "login_time": "Horodatage de connexion", + "domainadmin_quicklink": "Masquer le lien rapide vers la page de connexion de l'administrateur du domaine", + "force_sso_text": "Si un fournisseur OIDC externe est configuré, cette option masque les formulaires de connexion par défaut de mailcow et n'affiche que le bouton Singe Sign-On", + "app_hide": "Masquer pour la connexion", + "admin_quicklink": "Masquer le lien rapide vers la page de connexion de l'administrateur", + "login_page": "Page de connexion", + "force_sso": "Désactiver la connexion mailcow et n'afficher que Singe Sign-On", + "iam_attribute_field": "Champ d'attribut", + "iam_authorize_url": "Endpoint d'autorisation", + "iam_auth_flow": "Flow d'authentification", + "iam_auth_flow_info": "Outre le flux de code d'autorisation (flux standard dans Keycloak), qui est utilisé pour la connexion unique, mailcow prend également en charge le flux d'authentification avec des informations d'identification directes. Le flux Mailpassword tente de valider les informations d'identification de l'utilisateur en utilisant l'API REST de Keycloak Admin. mailcow récupère le mot de passe haché dans l'attribut mailcow_password, qui est mappé dans Keycloak.", + "iam_basedn": "Base DN", + "iam_client_id": "ID Client", + "iam_client_secret": "Secret Client", + "iam_use_ssl": "Utiliser SSL", + "iam_redirect_url": "Url de redirection", + "iam_use_ssl_info": "Si le protocole SSL est activé et que le port est défini sur 389, il sera automatiquement remplacé par 636.", + "iam_use_tls_info": "Si vous activez TLS, vous devez utiliser le port par défaut de votre serveur LDAP (389). Les ports SSL ne peuvent pas être utilisés.", + "iam_version": "Version", + "ignore_ssl_error": "Ignorer les erreurs SSL", + "iam_login_provisioning": "Créer automatiquement l'utilisateur à la connexion", + "iam_mapping": "Mapping des attributs", + "iam_bindpass": "Lier le mot de passe", + "iam_periodic_full_sync": "Synchronisation complète périodique", + "iam_port": "Port", + "iam_realm": "Realm", + "iam_rest_flow": "Flow Mailpassword", + "iam_server_url": "URL du serveur", + "iam_sso": "Single Sign-On", + "iam_sync_interval": "Interval de Sync / Import (min)", + "iam_test_connection": "Test de connexion", + "iam_token_url": "Endpoint Token", + "iam_userinfo_url": "Endpoint User info", + "iam_username_field": "Champ du nom d'utilisateur", + "iam_binddn": "Bind DN", + "iam_use_tls": "Utiliser StartTLS", + "quicklink_text": "Afficher ou masquer les liens rapides vers d'autres pages de connexion sous le formulaire de connexion", + "task": "Tâche", + "user_link": "Lien utilisateur", + "user_quicklink": "Masquer le lien rapide vers la page de connexion de l'utilisateur", + "iam_client_scopes": "Scopes Client", + "iam_default_template": "Template par défaut", + "iam_default_template_description": "Si aucun modèle n'est attribué à un utilisateur, le modèle par défaut sera utilisé pour créer la boîte aux lettres, mais pas pour la mettre à jour.", + "iam_description": "Configurer un fournisseur externe pour l'authentification
Les boîtes aux lettres des utilisateurs seront automatiquement créées lors de leur première connexion, à condition qu'un mappage d'attributs ait été défini.", + "iam_extra_permission": "Pour que les paramètres suivants fonctionnent, le client mailcow dans Keycloak a besoin d'un Compte de service et de l'autorisation de voir les utilisateurs.", + "iam_host": "Hôte", + "iam_host_info": "Saisissez un ou plusieurs hôtes LDAP, séparés par des virgules.", + "iam_import_users": "Importer des utilisateurs" }, "danger": { "access_denied": "Accès refusé ou données de formulaire non valides", @@ -496,7 +543,11 @@ "password_reset_invalid_user": "Boîte mail introuvable ou aucune adresse de récupération n'a été définie", "password_reset_na": "La réinitialisation des mots de passe est actuellement indisponible. Veuillez contacter votre administrateur.", "reset_token_limit_exceeded": "Le nombre limite de jetons de réinitialisation a été dépassé. Veuillez réessayer plus tard.", - "to_invalid": "Le destinataire ne doit pas être vide" + "to_invalid": "Le destinataire ne doit pas être vide", + "generic_server_error": "Une erreur de serveur inattendue s'est produite. Veuillez contacter votre administrateur.", + "authsource_in_use": "Le fournisseur d'identité ne peut pas être modifié ou supprimé car il est actuellement utilisé par un ou plusieurs utilisateurs.", + "iam_test_connection": "Échec de la connexion", + "required_data_missing": "La donnée requise %s est manquante" }, "debug": { "chart_this_server": "Graphique (ce serveur)", @@ -553,7 +604,7 @@ "alias": "Éditer les alias", "allow_from_smtp": "Restreindre l'utilisation de SMTP à ces adresses IP", "allow_from_smtp_info": "Laissez vide pour autoriser tous les expéditeurs.
Adresses IPv4/IPv6 et réseaux.", - "allowed_protocols": "Protocoles autorisés", + "allowed_protocols": "Protocoles autorisés pour l'accès direct de l'utilisateur (n'affecte pas les protocoles de mot de passe de l'application)", "app_name": "Nom de l'application", "app_passwd": "Mot de passe de l'application", "automap": "Tenter de cibler automatiquement les dossiers (« Sent items », « Sent » => « Sent » etc.)", @@ -672,7 +723,7 @@ "none_inherit": "Aucun / Héritage", "quota_warning_bcc": "Avertissement sur les quotas BCC", "quota_warning_bcc_info": "Les avertissements seront envoyés en copies séparées aux destinataires suivants. Le sujet sera précédé du nom d'utilisateur correspondant entre parenthèses, par exemple : Avertissement sur les quotas (user@example.com).", - "sogo_access_info": "L'authentification unique à partir de l'interface de messagerie reste opérationnelle. Ce paramètre n'affecte pas l'accès à tous les autres services et ne supprime ni, ne modifie le profil SOGo existant d'un utilisateur.", + "sogo_access_info": "Après s'être connecté, l'utilisateur est automatiquement redirigé vers SOGo.", "admin": "Modifier l'administrateur", "password_recovery_email": "Adresse email de récupération", "mailbox_rename_title": "Nouveau nom de la partie locale de la boîte de réception", @@ -680,7 +731,7 @@ "mailbox_rename_agree": "J'ai fait une sauvegarde.", "mailbox_rename_warning": "IMPORTANT ! Faites une sauvegarde avant de renommer la boîte de réception.", "mailbox_rename_alias": "Créer un alias automatiquement", - "sogo_access": "Autoriser la connexion directe à SOGo", + "sogo_access": "Redirection directe vers SOGo", "pushover": "Pushover", "pushover_sound": "Son" }, @@ -733,7 +784,11 @@ "request_reset_password": "Demander le changement du mot de passe", "login_user": "Connexion Utilisateur", "login_dadmin": "Connexion Administrateur de domaine", - "login_admin": "Connexion Administrateur" + "login_admin": "Connexion Administrateur", + "login_linkstext": "L'identifiant n'est pas correct ?", + "login_usertext": "Se connecter en tant qu'utilisateur", + "login_domainadmintext": "Se connecter en tant qu'administrateur du domaine", + "login_admintext": "Se connecter en tant qu'administrateur" }, "mailbox": { "action": "Action", @@ -839,7 +894,7 @@ "recipient_map_new": "Nouveau destinataire", "recipient_map_new_info": "La destination de la carte du destinataire doit être une adresse de courriel valide ou un nom de domaine.", "recipient_map_old": "Destinataire original", - "recipient_map_old_info": "Une carte de destination originale doit être une adresse de courriel valide ou un nom de domaine.", + "recipient_map_old_info": "La destination originale des cartes des destinataires doit être une adresse de courriel valide ou un nom de domaine.", "recipient_maps": "Cartes des bénéficiaires", "relay_all": "Relayer tous les destinataires", "remove": "Supprimer", @@ -908,7 +963,8 @@ "template": "Modèle", "syncjob_check_log": "Vérifier le journal", "recipient": "Destinataire", - "open_logs": "Afficher les journaux" + "open_logs": "Afficher les journaux", + "iam": "Fournisseur d'identité" }, "oauth2": { "access_denied": "Veuillez vous connecter en tant que propriétaire de la boîte de réception pour accorder l’accès via Oauth2.", @@ -1079,7 +1135,9 @@ "recovery_email_sent": "Email de réinitialisation envoyé à %s", "mailbox_renamed": "La boîte de réception a été renommée de %s à %s", "template_modified": "Les modifications au modèle %s ont été enregistrées", - "password_policy_saved": "La politique de mot de passe a été enregistrée avec succès" + "password_policy_saved": "La politique de mot de passe a été enregistrée avec succès", + "custom_login_modified": "La personnalisation de la connexion a été sauvegardée avec succès", + "iam_test_connection": "Connexion réussie" }, "tfa": { "api_register": "%s utilise l'API Yubico Cloud. Veuillez obtenir une clé API pour votre clé ici", @@ -1259,8 +1317,8 @@ "with_app_password": "avec le mot de passe de l'application", "apple_connection_profile_with_app_password": "Un nouveau mot de passe est généré et ajouté au profil, de sorte qu'aucun mot de passe ne doit être saisi lors de la configuration de votre appareil. Ne partagez pas le fichier car il vous donne un accès complet à votre boîte de réception.", "attribute": "Attribut", - "direct_protocol_access": "Cet utilisateur de la boîte aux lettres dispose d'un accès externe direct aux protocoles et applications suivants. Votre administrateur contrôle ce paramètre. Il est possible de créer des mots de passe d'application pour accorder l'accès à des protocoles et des applications individuels.
Le bouton « Connexion au webmail » permet une connexion unique à SOGo et est toujours disponible.", - "open_webmail_sso": "Connexion au webmail", + "direct_protocol_access": "Cet utilisateur de la boîte aux lettres dispose d'un accès externe direct aux protocoles et applications suivants. Votre administrateur contrôle ce paramètre. Il est possible de créer des mots de passe d'application pour accorder l'accès à des protocoles et des applications individuels.
Le bouton « Connexion au Webmail » permet une connexion unique à SOGo et est toujours disponible.", + "open_webmail_sso": "Connexion au Webmail", "recent_successful_connections": "Voir les connexions réussies", "syncjob_EXIT_TLS_FAILURE": "Problème de connexion chiffrée", "syncjob_EXIT_AUTHENTICATION_FAILURE": "Problème d'authentification", @@ -1289,7 +1347,9 @@ "open_logs": "Afficher les journaux", "pushover_sound": "Son", "mailbox_general": "Général", - "mailbox_settings": "Paramètres" + "mailbox_settings": "Paramètres", + "tfa_info": "L'authentification à deux facteurs permet de protéger votre compte. Si vous l'activez, vous aurez besoin de mots de passe d'application pour vous connecter à des applications ou des services qui ne prennent pas en charge l'authentification à deux facteurs (par exemple les clients e-mails).", + "overview": "Vue d'ensemble" }, "warning": { "cannot_delete_self": "Impossible de supprimer l’utilisateur connecté", diff --git a/data/web/lang/lang.ru-ru.json b/data/web/lang/lang.ru-ru.json index e9d856924..e17327978 100644 --- a/data/web/lang/lang.ru-ru.json +++ b/data/web/lang/lang.ru-ru.json @@ -359,7 +359,56 @@ "username": "Имя пользователя", "validate_license_now": "Получить лицензию на основе GUID с сервера лицензий", "verify": "Проверить", - "yes": "✓" + "yes": "✓", + "force_sso_text": "Если настроен внешний провайдер OIDC, эта опция скрывает стандартные формы входа mailcow и показывает только кнопку Singe Sign-On", + "domainadmin_quicklink": "Скрыть ссылку на вход для администраторов домена", + "iam_periodic_full_sync": "Периодическая полная синхронизация", + "iam_sync_interval": "Интервал синхронизации/импорта (мин)", + "iam_use_tls_info": "При включённом TLS необходимо использовать стандартный порт LDAP-сервера (389). Порты SSL не подходят.", + "iam_use_ssl_info": "При включённом SSL, если указан порт 389, то вместо него автоматически будет использоваться порт 636.", + "quicklink_text": "Показать или скрыть ссылки для быстрого перехода к другим страницам входа под формой авторизации", + "iam_login_provisioning": "Автоматическое создание пользователей при входе в систему", + "iam_mapping": "Сопоставление атрибутов", + "iam_bindpass": "Bind пароль", + "iam_port": "Порт", + "iam_realm": "Realm", + "iam_redirect_url": "URL переадресации", + "iam_rest_flow": "Поток Mailpassword", + "iam_server_url": "URL сервера", + "iam_sso": "Технология единого входа (SSO)", + "iam_token_url": "Token endpoint", + "iam_userinfo_url": "User info endpoint", + "iam_username_field": "Поле имени пользователя", + "iam_binddn": "Bind DN", + "iam_use_ssl": "Использовать SSL", + "iam_use_tls": "Использовать StartTLS", + "iam_version": "Версия", + "ignore_ssl_error": "Игнорировать ошибки SSL", + "task": "Задача", + "user_link": "Пользовательская ссылка", + "user_quicklink": "Скрыть ссылку на вход для пользователей", + "app_hide": "Скрыть для входа", + "iam_test_connection": "Проверка соединения", + "login_page": "Страница входа", + "filter": "Фильтр", + "force_sso": "Отключить mailcow авторизацию и показывать только Singe Sign-On", + "iam": "Провайдер идентификации", + "iam_attribute_field": "Поле атрибута", + "iam_authorize_url": "Конечная точка авторизации", + "iam_auth_flow": "Процесс аутентификации", + "iam_auth_flow_info": "В дополнение к потоку кода авторизации (стандартный поток в Keycloak), который используется для Single-Sign On входа, mailcow также поддерживает поток аутентификации с непосредственными учетными данными. Поток Mailpassword пытается проверить учетные данные пользователя с помощью REST API администратора Keycloak. mailcow извлекает хешированный пароль из атрибута mailcow_password, который отображается в Keycloak.", + "iam_basedn": "Base DN", + "iam_client_id": "ID клиента", + "iam_client_secret": "Секрет клиента", + "iam_client_scopes": "Области действия клиента", + "iam_default_template": "Шаблон по умолчанию", + "iam_default_template_description": "Если пользователю не назначен шаблон, шаблон по умолчанию будет использоваться при создании почтового ящика, но не при обновлении почтового ящика.", + "iam_description": "Настройка внешнего провайдера для аутентификации
Почтовые ящики пользователей будут автоматически создаваться при первом входе в систему, если было задано сопоставление атрибутов.", + "iam_extra_permission": "Для работы следующих настроек клиенту mailcow в Keycloak необходима служебная учетная запись и разрешение на просмотр пользователей.", + "iam_host": "Хост", + "iam_host_info": "Укажите один или несколько LDAP-хостов через запятую.", + "iam_import_users": "Импорт пользователей", + "admin_quicklink": "Скрыть ссылку на вход для администраторов" }, "danger": { "access_denied": "Доступ запрещён, или указаны неверные данные", @@ -496,7 +545,11 @@ "webauthn_publickey_failed": "Для выбранного аутентификатора не был сохранен открытый ключ", "webauthn_username_failed": "Выбранный аутентификатор принадлежит другой учетной записи", "webauthn_verification_failed": "Ошибка валидации WebAuthn: %s", - "yotp_verification_failed": "Ошибка валидации Yubico OTP: %s" + "yotp_verification_failed": "Ошибка валидации Yubico OTP: %s", + "generic_server_error": "На сервере произошла непредвиденная ошибка. Пожалуйста, свяжитесь с вашим администратором.", + "authsource_in_use": "Поставщик идентификационных данных не может быть изменен или удален, так как в данный момент он используется одним или несколькими пользователями.", + "iam_test_connection": "Ошибка соединения", + "required_data_missing": "Отсутствуют необходимые данные %s" }, "datatables": { "collapse_all": "Свернуть все", @@ -581,7 +634,7 @@ "alias": "Изменить псевдоним", "allow_from_smtp": "Разрешить использование SMTP только для этих IP", "allow_from_smtp_info": "Укажите IPv4/IPv6 адреса и/или подсети.
Оставьте поле пустым, чтобы разрешить отправку с любых адресов.", - "allowed_protocols": "Разрешённые протоколы", + "allowed_protocols": "Разрешённые протоколы для прямого доступа пользователей (не влияет на протоколы паролей приложений)", "app_name": "Название приложения", "app_passwd": "Пароль приложения", "app_passwd_protocols": "Разрешенные протоколы для пароля приложения", @@ -771,7 +824,14 @@ "password": "Пароль", "request_reset_password": "Запросить восстановление пароля", "reset_password": "Восстановление пароля", - "username": "Имя пользователя" + "username": "Имя пользователя", + "login_linkstext": "Неправильный логин?", + "login_usertext": "Войти как пользователь", + "login_domainadmintext": "Войти как администратор домена", + "login_admintext": "Войти как администратор", + "login_user": "Вход для пользователей", + "login_dadmin": "Вход для администраторов домена", + "login_admin": "Вход для администраторов" }, "mailbox": { "action": "Действия", @@ -946,7 +1006,8 @@ "username": "Имя пользователя", "waiting": "В ожидании", "weekly": "Раз в неделю", - "yes": "✓" + "yes": "✓", + "iam": "Поставщик идентификационных данных" }, "oauth2": { "access_denied": "Пожалуйста, войдите в систему как владелец почтового аккаунта, чтобы получить доступ через OAuth2.", @@ -1124,7 +1185,9 @@ "verified_fido2_login": "Авторизация FIDO2 пройдена", "verified_totp_login": "Авторизация TOTP пройдена", "verified_webauthn_login": "Авторизация WebAuthn пройдена", - "verified_yotp_login": "Авторизация Yubico OTP пройдена" + "verified_yotp_login": "Авторизация Yubico OTP пройдена", + "iam_test_connection": "Успешное соединение", + "custom_login_modified": "Настройки входа успешно сохранены" }, "tfa": { "api_register": "%s использует Yubico Cloud API. Пожалуйста, получите ключ API для вашего ключа здесь", @@ -1191,7 +1254,7 @@ "delete_ays": "Пожалуйста, подтвердите удаление", "direct_aliases": "Личные псевдонимы", "direct_aliases_desc": "На личные псевдонимы распространяются фильтры нежелательной почты и параметры политики TLS.", - "direct_protocol_access": "Этот пользователь почтового ящика имеет прямой, внешний доступ к следующим протоколам и приложениям. Эта настройка контролируется вашим администратором. Для предоставления доступа к отдельным протоколам и приложениям могут быть созданы пароли приложений.
Кнопка \"Вход в веб-почту\" обеспечивает единый вход в SOGo и всегда доступна.", + "direct_protocol_access": "Этот пользователь почтового ящика имеет прямой, внешний доступ к следующим протоколам и приложениям. Эта настройка контролируется вашим администратором. Для предоставления доступа к отдельным протоколам и приложениям могут быть созданы пароли приложений.
Кнопка \"Веб-почта\" обеспечивает единый вход в SOGo и всегда доступна.", "eas_reset": "Сбросить кеш ActiveSync устройств", "eas_reset_help": "Во многих случаях сброс кеша устройств помогает восстановить повреждённый профиль ActiveSync.
Внимание: все письма, календари и контакты будут загружены заново на все ваши устройства!", "eas_reset_now": "Сбросить кеш сейчас", @@ -1319,7 +1382,11 @@ "weeks": "недели", "with_app_password": "с паролем приложения", "year": "год", - "years": "лет" + "years": "лет", + "authentication": "Аутентификация", + "tfa_info": "Двухфакторная аутентификация помогает защитить вашу учетную запись. Если вы включите эту функцию, вам понадобятся пароли приложений для входа в приложения или службы, которые не поддерживают двухфакторную аутентификацию (например, почтовые клиенты).", + "protocols": "Протоколы", + "overview": "Обзор" }, "warning": { "cannot_delete_self": "Вы не можете удалить сами себя", diff --git a/data/web/lang/lang.zh-cn.json b/data/web/lang/lang.zh-cn.json index 486e8dcc3..44541f7d1 100644 --- a/data/web/lang/lang.zh-cn.json +++ b/data/web/lang/lang.zh-cn.json @@ -395,7 +395,16 @@ "ignore_ssl_error": "忽略 SSL 错误", "iam_auth_flow_info": "除了在单点登录(SSO)中使用的 Authorization Code 流程(在 Keycloak 中是标准流程)之外,mailcow 还支持使用 Credentials 的身份认证流程。Mailpassword 流程尝试通过 Keycloak 的 Admin REST API 验证用户凭据,mailcow 会从 Keycloak 中的 mailcow_password 属性中获取哈希后的密码。", "filter": "过滤", - "iam_extra_permission": "要使以下设置生效,Keycloak 中的 mailcow 客户端需要一个 服务账户(Service account) 以及 查看用户(view-users) 的权限。" + "iam_extra_permission": "要使以下设置生效,Keycloak 中的 mailcow 客户端需要一个 服务账户(Service account) 以及 查看用户(view-users) 的权限。", + "domainadmin_quicklink": "隐藏指向域管理员登陆页面的快捷链接", + "force_sso_text": "如果配置了外部的 OIDC 认证,这个选项隐藏默认的 mailcow 登陆界面,只显示单点登录(SSO)的按钮", + "iam_login_provisioning": "登录时自动创建用户", + "login_page": "登陆页面", + "iam_use_ssl_info": "如果使用了 SSL,且端口被设置为 389,该端口将自动被覆盖为 636。", + "quicklink_text": "显示或隐藏登陆表单下面指向其他登陆页面的快捷链接", + "user_quicklink": "隐藏指向用户登陆页面的快捷链接", + "admin_quicklink": "隐藏指向管理员登陆页面的快捷链接", + "force_sso": "强制要求单点登录(SSO)" }, "danger": { "access_denied": "访问被拒绝或者表单数据无效", @@ -788,7 +797,11 @@ "invalid_pass_reset_token": "密码重置 token 无效或已过期。
请重新获取新的密码重置链接。", "login_user": "用户登录", "login_dadmin": "域管理员登录", - "login_admin": "管理员登录" + "login_admin": "管理员登录", + "login_linkstext": "不是正确的登陆页面?", + "login_usertext": "以用户身份登陆", + "login_domainadmintext": "以域管理员身份登陆", + "login_admintext": "以管理员身份登陆" }, "mailbox": { "action": "操作", @@ -1143,7 +1156,8 @@ "template_added": "新增了模板 %s", "template_modified": "模板 %s 的修改已保存", "template_removed": "模板 ID %s 已删除", - "iam_test_connection": "连接成功" + "iam_test_connection": "连接成功", + "custom_login_modified": "登陆选项保存成功" }, "tfa": { "api_register": "%s 使用了 Yubico Cloud API,请在此为你的密钥获取 API 密钥", From 372923ae2fca354e843c8aa90dc3e32be86f8c37 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Mon, 19 May 2025 13:36:15 +0200 Subject: [PATCH 002/180] [Web] Updated lang.zh-cn.json (#6552) Co-authored-by: Easton Man --- data/web/lang/lang.zh-cn.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/data/web/lang/lang.zh-cn.json b/data/web/lang/lang.zh-cn.json index 44541f7d1..3c46eb8a4 100644 --- a/data/web/lang/lang.zh-cn.json +++ b/data/web/lang/lang.zh-cn.json @@ -390,7 +390,7 @@ "iam_username_field": "Username 域", "iam_binddn": "Bind DN", "iam_use_ssl": "使用 SSL", - "iam_use_tls": "使用 TLS", + "iam_use_tls": "使用 StartTLS", "iam_version": "版本", "ignore_ssl_error": "忽略 SSL 错误", "iam_auth_flow_info": "除了在单点登录(SSO)中使用的 Authorization Code 流程(在 Keycloak 中是标准流程)之外,mailcow 还支持使用 Credentials 的身份认证流程。Mailpassword 流程尝试通过 Keycloak 的 Admin REST API 验证用户凭据,mailcow 会从 Keycloak 中的 mailcow_password 属性中获取哈希后的密码。", @@ -404,7 +404,8 @@ "quicklink_text": "显示或隐藏登陆表单下面指向其他登陆页面的快捷链接", "user_quicklink": "隐藏指向用户登陆页面的快捷链接", "admin_quicklink": "隐藏指向管理员登陆页面的快捷链接", - "force_sso": "强制要求单点登录(SSO)" + "force_sso": "强制要求单点登录(SSO)", + "user_link": "自定义链接" }, "danger": { "access_denied": "访问被拒绝或者表单数据无效", @@ -690,7 +691,7 @@ "sieve_desc": "简短描述", "sieve_type": "过滤器类型", "skipcrossduplicates": "跳过其他文件夹中已存在的邮件(保留已经存在的邮件)", - "sogo_access": "直接转发给 SOGo", + "sogo_access": "直接转到 SOGo", "sogo_access_info": "登录后,用户会自动跳转到 SOGo。", "sogo_visible": "SOGo 显示的别名", "sogo_visible_info": "此设置只影响 SOGo 上可显示的对象 (指向本地邮箱的共享或非共享别名地址)。如果设置为隐藏,则别名地址不会作为可选发件人的下拉项显示。", @@ -905,7 +906,7 @@ "recipient_map": "收件人映射", "recipient_map_info": "收件人映射用于在邮件被发送前替换收件人的地址。", "recipient_map_new": "新收件人", - "recipient_map_new_info": "新收件人必须为合法的邮箱地址。", + "recipient_map_new_info": "收件人映射的目标必须为合法的邮件地址或域名。", "recipient_map_old": "原收件人", "recipient_map_old_info": "原收件人必须为合法的邮箱地址。", "recipient_maps": "收件人映射", From d4f899b091ed48e01fea3a674dd3278bf8b68caf Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Mon, 26 May 2025 11:35:34 +0200 Subject: [PATCH 003/180] compose: add selinux label to mysql-socket-vol to prevent "access denied" (#6560) --- docker-compose.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8f31c69c8..a67475316 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,7 @@ services: stop_grace_period: 45s volumes: - mysql-vol-1:/var/lib/mysql/ - - mysql-socket-vol-1:/var/run/mysqld/ + - mysql-socket-vol-1:/var/run/mysqld/:z - ./data/conf/mysql/:/etc/mysql/conf.d/:ro,Z environment: - TZ=${TZ} @@ -134,7 +134,7 @@ services: - ./data/web/inc/functions.ratelimit.inc.php:/mailcowauth/functions.ratelimit.inc.php:z - ./data/web/inc/functions.acl.inc.php:/mailcowauth/functions.acl.inc.php:z - rspamd-vol-1:/var/lib/rspamd - - mysql-socket-vol-1:/var/run/mysqld/ + - mysql-socket-vol-1:/var/run/mysqld/:z - ./data/conf/sogo/:/etc/sogo/:z - ./data/conf/rspamd/meta_exporter:/meta_exporter:ro,z - ./data/conf/phpfpm/crons:/crons:z @@ -230,7 +230,7 @@ services: - ./data/conf/sogo/custom-fulllogo.png:/usr/lib/GNUstep/SOGo/WebServerResources/img/sogo-logo.png:z - ./data/conf/sogo/custom-theme.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/theme.js:z - ./data/conf/sogo/custom-sogo.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/custom-sogo.js:z - - mysql-socket-vol-1:/var/run/mysqld/ + - mysql-socket-vol-1:/var/run/mysqld/:z - sogo-web-vol-1:/sogo_web - sogo-userdata-backup-vol-1:/sogo_backup labels: @@ -272,7 +272,7 @@ services: - ./data/conf/rspamd/custom/:/etc/rspamd/custom:z - ./data/assets/templates:/templates:z - rspamd-vol-1:/var/lib/rspamd - - mysql-socket-vol-1:/var/run/mysqld/ + - mysql-socket-vol-1:/var/run/mysqld/:z environment: - DOVECOT_MASTER_USER=${DOVECOT_MASTER_USER:-} - DOVECOT_MASTER_PASS=${DOVECOT_MASTER_PASS:-} @@ -351,7 +351,7 @@ services: - postfix-vol-1:/var/spool/postfix - crypt-vol-1:/var/lib/zeyple - rspamd-vol-1:/var/lib/rspamd - - mysql-socket-vol-1:/var/run/mysqld/ + - mysql-socket-vol-1:/var/run/mysqld/:z environment: - LOG_LINES=${LOG_LINES:-9999} - TZ=${TZ} @@ -470,7 +470,7 @@ services: - ./data/web/.well-known/acme-challenge:/var/www/acme:z - ./data/assets/ssl:/var/lib/acme/:z - ./data/assets/ssl-example:/var/lib/ssl-example/:ro,Z - - mysql-socket-vol-1:/var/run/mysqld/ + - mysql-socket-vol-1:/var/run/mysqld/:z restart: always networks: mailcow-network: @@ -505,7 +505,7 @@ services: - /tmp volumes: - rspamd-vol-1:/var/lib/rspamd - - mysql-socket-vol-1:/var/run/mysqld/ + - mysql-socket-vol-1:/var/run/mysqld/:z - postfix-vol-1:/var/spool/postfix - ./data/assets/ssl:/etc/ssl/mail/:ro,z restart: always From 407e9d358488f6fde5ce000eff14943ec362be97 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Thu, 12 Jun 2025 13:13:57 +0200 Subject: [PATCH 004/180] Translations update from Weblate (#6582) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Web] Updated lang.en-gb.json [Web] Updated lang.en-gb.json Co-authored-by: Filip Hajny Co-authored-by: milkmaker * [Web] Updated lang.cs-cz.json Co-authored-by: Filip Hajny Co-authored-by: milkmaker * [Web] Updated lang.si-si.json [Web] Updated lang.si-si.json Co-authored-by: Matjaž Tekavec Co-authored-by: milkmaker * [Web] Updated lang.it-it.json Co-authored-by: Stefano Co-authored-by: milkmaker --------- Co-authored-by: Filip Hajny Co-authored-by: Matjaž Tekavec Co-authored-by: Stefano --- data/web/lang/lang.cs-cz.json | 183 ++++++++++++++----- data/web/lang/lang.en-gb.json | 4 +- data/web/lang/lang.it-it.json | 42 ++++- data/web/lang/lang.si-si.json | 334 ++++++++++++++++++++++++++++++++-- 4 files changed, 498 insertions(+), 65 deletions(-) diff --git a/data/web/lang/lang.cs-cz.json b/data/web/lang/lang.cs-cz.json index 67eb52baa..b33332f66 100644 --- a/data/web/lang/lang.cs-cz.json +++ b/data/web/lang/lang.cs-cz.json @@ -1,7 +1,7 @@ { "acl": { "alias_domains": "Doménové aliasy", - "app_passwds": "Hesla aplikací", + "app_passwds": "Správa hesel aplikací", "bcc_maps": "BCC mapy", "delimiter_action": "Zacházení s označkovanou poštou", "domain_desc": "Změnit popis domény", @@ -82,12 +82,12 @@ "password": "Heslo", "password_repeat": "Potvrzení nového hesla (opakujte)", "port": "Port", - "post_domain_add": "Po přidání nové domény je nutné restartovat SOGo kontejner!", + "post_domain_add": "Po přidání nové domény se musí restartovat kontejner SOGo!

Je také třeba ověřit nastavení DNS nové domény. Po ověření restartujte kontejner \"acme-mailcow\", aby se vygenerovaly certifikáty domény (autoconfig.<domain>, autodiscover.<domain>).
Tento krok je volitelný, a provede se automaticky každých 24 hodin.", "private_comment": "Soukromý komentář", "public_comment": "Veřejný komentář", "quota_mb": "Kvóta (MiB)", "relay_all": "Předávání všech příjemců", - "relay_all_info": "Pokud se rozhodnete nepředávat všechny příjemce, musíte přidat prázdnou mailovou schránku pro každého příjemce, který se má předávat.", + "relay_all_info": "↪Pokud se rozhodnete nepředávat všechny příjemce, musíte přidat prázdnou mailovou schránku pro každého příjemce, který se má předávat.", "relay_domain": "Předávání domény", "relay_transport_info": "
Info
U této domény lze pro konkrétní cíl nastavit transportní mapu. Není-li nastavena, použije se MX záznam.", "relay_unknown_only": "Předávat jen neexistující schránky. Doručení do existujících proběhne lokálně.", @@ -183,7 +183,7 @@ "f2b_ban_time": "Doba blokování (s)", "f2b_blacklist": "Sítě/hostitelé na blacklistu", "f2b_filter": "Regex filtre", - "f2b_list_info": "Síť nebo hostitelé na blacklistu mají vždy větší váhu než položky na whitelistu. Blacklist se sestavuje vždy při startu kontejneru.", + "f2b_list_info": "Síť nebo hostitelé na blacklistu mají vždy větší váhu než položky na whitelistu. Každá úprava seznamů trvá pár sekund.", "f2b_max_attempts": "Max. pokusů", "f2b_netban_ipv4": "Rozsah IPv4 podsítě k zablokování (8-32)", "f2b_netban_ipv6": "Rozsah IPv6 podsítě k zablokování (8-128)", @@ -256,7 +256,7 @@ "quarantine_exclude_domains": "Vyloučené domény a doménové aliasy", "quarantine_max_age": "Maximální stáří ve dnech
Hodnota musí být rovna nebo větší než 1 den.", "quarantine_max_score": "Neposílat notifikace pokud je spam skóre větší než hodnota:
Výchozí je 9999.0", - "quarantine_max_size": "Maximální velikost v MiB (větší prvky budou smazány)
0 neznamená neomezeno.", + "quarantine_max_size": "Maximální velikost v MiB (větší prvky budou smazány)
0 neznamená neomezeno.", "quarantine_notification_html": "Šablona upozornění:
Ponechte prázdné, aby se obnovila výchozí šablona.", "quarantine_notification_sender": "Odesílatel upozornění", "quarantine_notification_subject": "Předmět upozornění", @@ -264,7 +264,7 @@ "quarantine_release_format": "Formát propuštěných položek", "quarantine_release_format_att": "Jako příloha", "quarantine_release_format_raw": "Nezměněný originál", - "quarantine_retention_size": "Počet zadržených zpráv na mailovou schránku
0 znamená neaktivní.", + "quarantine_retention_size": "Počet zadržených zpráv na mailovou schránku
0 znamená neaktivní.", "quota_notification_html": "Šablona upozornění:
Ponechte prázdné, aby se obnovila výchozí šablona.", "quota_notification_sender": "Odesílatel upozornění", "quota_notification_subject": "Předmět upozornění", @@ -283,7 +283,7 @@ "relay_rcpt": "\"Komu:\" adresa", "relay_run": "Provést test", "relayhosts": "Transporty podle odesílatele", - "relayhosts_hint": "Zde definujte transporty podle odesílatele, jež pak můžete použít v nastavení domény.
\r\nProtokol transportu je vždy \"smtp:\". Bere se v potaz uživatelské nastavení odchozího TLS.", + "relayhosts_hint": "Zde definujte transporty podle odesílatele, jež pak můžete použít v nastavení domény.
\nProtokol transportu je vždy \"smtp:\" a použije se TLS, je-li nabídnuto. Zabalené TLS (SMTPS) se nepodporuje. Bere se v potaz uživatelské nastavení odchozího TLS.
\nTýká se vybraných domén včetně doménových aliasů.", "remove": "Smazat", "remove_row": "Smazat řádek", "reset_default": "Obnovit výchozí nastavení", @@ -299,7 +299,7 @@ "rsettings_preset_2": "Postmasteři chtějí dostávat spam", "rsettings_preset_3": "Povolit jen určité odesílatele pro schránku (např. jen interní schránka)", "rsettings_preset_4": "Deaktivujte Rspamd pro doménu", - "rspamd_com_settings": "Rspamd dokumentace\r\n - Název nastavení bude automaticky vygenerován, viz níže uvedené předvolby.", + "rspamd_com_settings": "Název nastavení se vygeneruje automaticky, viz ukázky nastavení níže. Více informací viz Rspamd dokumentace", "rspamd_global_filters": "Mapa globálních filtrů", "rspamd_global_filters_agree": "Budu opatrný!", "rspamd_global_filters_info": "Mapa globálních filtrů obsahuje jiné globální black- a whitelisty.", @@ -324,8 +324,8 @@ "to_top": "Zpět na začátek", "transport_dest_format": "Formát: example.org, .example.org, *, box@example.org (vícero položek lze oddělit čárkou)", "transport_maps": "Transportní mapy", - "transport_test_rcpt_info": "• Na otestování odchozí pošty je možné použít null@hosted.mailcow.de jako adresáta", - "transports_hint": "→ Položka transportní mapy přebíjí transportní mapu podle odesílatele.
\r\n→ Uživatelské nastavení odchozího TLS se ignoruje a lze je výhradně vynutit mapováním TLS pravidel.
\r\n→ Protokol transportu je vždy \"smtp:\".
\r\n→ Adresy, jež odpovídají výrazu \"/localhost$/\", se vždy předají přes \"local:\", takže nejsou zahrnuty do definice cíle \"*\".
\r\n→ Pro stanovení přihlašovacích údajů dalšího skoku, např. \"[host]:25\", bude Postfix vždy hledat nejdříve \"host\" a teprve pak \"[host]:25\". Kvůli tomu nelze použít současně \"host\" a \"[host]:25\"", + "transport_test_rcpt_info": "• K otestování předávání pošty ven použijte null@hosted.mailcow.de.", + "transports_hint": "• Položka transportní mapy přebíjí transportní mapu podle odesílatele.
\n• Transporty založené na MX mají přednost.
\n• Uživatelské nastavení odchozího TLS se ignoruje a lze je vynutit výhradně mapou TLS pravidel.
\n• Transportní služnou pro tyto transporty je vždy \"smtp:\" a použije se TLS, je-li nabídnuto. Zabalené TLS (SMTPS) se nepodporuje.
\n• Adresy, jež odpovídají výrazu \"/localhost$/\", se vždy předají přes \"local:\", takže nejsou zahrnuty do definice cíle \"*\".
\n• Pro stanovení přihlašovacích údajů dalšího skoku, např. \"[host]:25\", bude Postfix vždy hledat nejdříve \"host\" a teprve pak \"[host]:25\". Kvůli tomu nelze použít současně \"host\" a \"[host]:25\".", "ui_footer": "Pata stránka (HTML povoleno)", "ui_header_announcement": "Oznámení", "ui_header_announcement_active": "Nastavit jako aktivní", @@ -344,17 +344,70 @@ "validate_license_now": "Ověřit GUID na licenčním serveru", "verify": "Ověřit", "yes": "✓", - "f2b_ban_time_increment": "Délka banu je prodlužována s každým dalším banem", - "f2b_max_ban_time": "Maximální délka banu (s)", + "f2b_ban_time_increment": "Délka bloku se prodlužuje s každým dalším zablokováním", + "f2b_max_ban_time": "Maximální délka bloku (s)", "cors_settings": "Nastavení CORS", - "queue_unban": "zrušit ban", + "queue_unban": "odblokovat", "password_reset_info": "Pokud není zadán žádný e-mail pro obnovení, nelze tuto funkci použít.", "password_reset_settings": "Nastavení obnovení hesla", "password_settings": "Nastavení hesel", "password_reset_tmpl_html": "HTML šablona", "password_reset_tmpl_text": "Textová šablona", "reset_password_vars": "{{link}} Vygenerovaný odkaz pro obnovení hesla
{{username}} Název mailboxu uživatele, který požádal o resetování hesla.
{{username2}} Název schránky pro obnovení
{{date}} Datum podání žádosti o obnovení hesla
{{token_lifetime}} Délka životnosti tokenu v minutách
{{hostname}} Název serveru mailcow", - "restore_template": "Ponechte prázdné pro obnovení výchozí šablony." + "restore_template": "Ponechte prázdné pro obnovení výchozí šablony.", + "copy_to_clipboard": "Text zkopírován do schránky!", + "iam_login_provisioning": "Automaticky vytvořit uživatele při přihlášení", + "user_quicklink": "Skrýt zkratku na přihlášení uživatele", + "domainadmin_quicklink": "Skrýt zkratku na přihlášení správce domény", + "iam_auth_flow_info": "Kromě metody autorizačního kódu (Authorization Code Flow, výchozího v Keycloaku), jež se používá pro SSO, podporuje mailcow také metody autentizaci přímo pomocí přihlašovacích údajů. The metoda Mailpassword Flow se pokusí ověřit přihlašovací údaje uživatele přímo v Admin REST API Keycloaku. mailcow získá hash hesla z atributu mailcow_password , namapovaného v Keycloaku.", + "iam_default_template_description": "Nemá-li uživatel přiřazenu šablonu, použije se výchozí šablona k vytvoření schránky, ale ne k její úpravě či aktualizaci.", + "iam_userinfo_url": "Koncový bod pro informace o uživatelích", + "iam_redirect_url": "URL přesměrování", + "user_link": "Odkaz pro uživatele", + "force_sso_text": "Je-li nastaven externí poskytovatel OIDC, zapnutím této volby skryjete výchozí přihlašovací formulář. Zůstane vidět jen tlačítko pro SSO", + "iam_mapping": "Mapování atributů", + "iam_bindpass": "Heslo pro bind", + "iam_periodic_full_sync": "Pravidelná úplná synchronizace", + "iam_port": "Port", + "iam_realm": "Realm", + "iam_rest_flow": "Mailpassword Flow", + "iam_server_url": "URL serveru", + "iam_sso": "Single Sign-On", + "iam_sync_interval": "Interval synchronizace/importu (min)", + "iam_test_connection": "Test spojení", + "iam_token_url": "Koncový bod pro tokeny", + "iam_username_field": "Pole uživatelského jména", + "iam_binddn": "Doména pro bind", + "iam_use_ssl": "Používat SSL", + "iam_use_tls": "Používat StartTLS", + "iam_version": "Verze", + "quicklink_text": "Zobrazení zkratek k dalším přihlašovacím stránkám", + "iam_use_tls_info": "Je-li zapnuto TLS, musí se používat standardní port pro LDAP (389). Port SSL nelze použít.", + "ignore_ssl_error": "Ignorovat chyby SSL", + "iam_use_ssl_info": "Je-li zapnuto SSL a nastaven port 389, použije se automaticky port 636.", + "task": "Úloha", + "app_hide": "Skrýt při přihlášení", + "admin_quicklink": "Skrýt zkratku na přihlášení správce", + "allowed_methods": "Access-Control-Allow-Methods", + "allowed_origins": "Access-Control-Allow-Origin", + "login_page": "Přihlašovací stránka", + "f2b_manage_external": "Spravovat Fail2Ban externě", + "f2b_manage_external_info": "Fail2ban bude udržovat seznam zakázaných adres, ale nebude aktivně nastavovat pravidla blokování. Pro blokování použijte seznam adres níže.", + "filter": "Filtr", + "force_sso": "Vypnout přihlášení mailcow a ponechat jen SSO", + "iam": "Poskytovatel identity", + "iam_attribute_field": "Pole atributu", + "iam_authorize_url": "Autorizační koncový bod", + "iam_basedn": "Doména (Base DN)", + "iam_client_id": "ID klienta", + "iam_client_secret": "Tajný kód klienta", + "iam_client_scopes": "Scopes klienta", + "iam_default_template": "Výchozí šablona", + "iam_description": "Nastavení externího poskytovatele ověření
Schránky uživatele se vytvoří po prvním přihlášení automaticky, pokud je tedy nastaveno mapování atributů.", + "iam_extra_permission": "Aby vše fungovalo, musí mít mailcow klient v Keycloaku nastavený servisní účet a povolení view-users.", + "iam_host": "Hostitel", + "iam_host_info": "Zadejte jeden či více hostitelů, oddělte čárkou", + "iam_import_users": "Importovat uživatele" }, "danger": { "access_denied": "Přístup odepřen nebo jsou neplatná data ve formuláři", @@ -408,7 +461,7 @@ "is_alias": "%s je již známa jako adresa aliasu", "is_alias_or_mailbox": "%s je již známa jako adresa aliasu, mailové schránky nebo aliasu rozvedeného z aliasu domény.", "is_spam_alias": "%s je již známa jako adresa spamového aliasu", - "last_key": "Nelze smazat poslední klíč", + "last_key": "Nelze smazat poslední klíč, vypněte tedy celé TFA.", "login_failed": "Přihlášení selhalo", "mailbox_defquota_exceeds_mailbox_maxquota": "Výchozí kvóta překračuje maximální kvótu schránky\"", "mailbox_invalid": "Název mailové schránky je neplatný", @@ -486,7 +539,16 @@ "demo_mode_enabled": "Demo režim je zapnutý", "recovery_email_failed": "Nepodařilo se odeslat e-mail pro obnovení. Obraťte se prosím na svého správce.", "password_reset_invalid_user": "Mailbox nebyl nalezen nebo není nastaven žádný e-mail pro obnovu", - "password_reset_na": "Obnovení hesla není v současné době k dispozici. Obraťte se prosím na svého správce." + "password_reset_na": "Obnovení hesla není v současné době k dispozici. Obraťte se prosím na svého správce.", + "generic_server_error": "Došlo k nečekané chybě. Obraťte se na vašeho správce.", + "to_invalid": "Adresát nemůže být prázdný", + "authsource_in_use": "Poskytovatele identity nelze změnit nebo odstranit, neboť se právě používá pro jednoho či více uživatelů.", + "iam_test_connection": "Spojení selhalo", + "img_dimensions_exceeded": "Obrázek je větší než povolené rozměry", + "img_size_exceeded": "Obrázek má větší než povolenou velikost souboru", + "invalid_reset_token": "Neplatný resetovací token", + "required_data_missing": "Chybí potřebný údaj %s", + "reset_token_limit_exceeded": "Byl překročen limit na reset tokeny. Zkuste to později." }, "datatables": { "emptyTable": "Tabulka neobsahuje žádná data", @@ -548,7 +610,8 @@ "update_failed": "Nepodařilo se zkontrolovat aktualizace", "wip": "Nedokončená vývojová verze", "memory": "Paměť", - "container_disabled": "Kontejner je zastaven nebo zakázán" + "container_disabled": "Kontejner je zastaven nebo zakázán", + "cores": "jádra" }, "diagnostics": { "cname_from_a": "Hodnota odvozena z A/AAAA záznamu. Lze použít, pokud záznam ukazuje na správný zdroj.", @@ -569,7 +632,7 @@ "alias": "Upravit alias", "allow_from_smtp": "Umožnit pouze těmto IP adresám používat SMTP", "allow_from_smtp_info": "Nechte prázdné pro povolení všech odesílatelů.
IPv4/IPv6 adresy a sítě.", - "allowed_protocols": "Povolené protokoly", + "allowed_protocols": "Povolené protokoly pro přímá spojení (netýká se protokolů na změnu hesla)", "app_name": "Název aplikace", "app_passwd": "Heslo aplikace", "app_passwd_protocols": "Povolené protokoly pro hesla aplikací", @@ -607,7 +670,7 @@ "inactive": "Neaktivní", "kind": "Druh", "last_modified": "Naposledy změněn", - "lookup_mx": "Cíl je regulární výraz který se shoduje s MX záznamem (.*\\.google\\.com směřuje veškerou poštu na MX které jsou cílem pro google.com přes tento skok)", + "lookup_mx": "Cíl je regulární výraz, jenž se porovná s MX záznamem (např. .*\\.google\\.com na tento skok nasměruje veškerou poštu s MX, jež končí na *.google.com)", "mailbox": "Úprava mailové schránky", "mailbox_quota_def": "Výchozí kvóta schránky", "mailbox_relayhost_info": "Aplikované jen na uživatelskou schránku a přímé aliasy, přepisuje předávající server domény.", @@ -641,7 +704,7 @@ "ratelimit": "Omezení přenosu", "redirect_uri": "URL přesměrování/odvolání", "relay_all": "Předávání všech příjemců", - "relay_all_info": "Pokud se rozhodnete nepředávat všechny příjemce, musíte přidat prázdnou mailovou schránku pro každého příjemce, který se má předávat.", + "relay_all_info": "↪ Pokud se rozhodnete nepředávat všechny příjemce, musíte přidat prázdnou mailovou schránku pro každého příjemce, který se má předávat.", "relay_domain": "Předávání domény", "relay_transport_info": "
Info
U této domény lze pro konkrétní cíl nastavit transportní mapu. Není-li nastavena, použije se MX záznam.", "relay_unknown_only": "Předávat jen neexistující schránky. Doručení do existujících proběhne lokálně.", @@ -666,7 +729,7 @@ "spam_score": "Nastavte vlastní skóre spamu", "subfolder2": "Synchronizace do podsložky v cílovém umístění
(prázdné = nepoužívat podsložku)", "syncjob": "Upravit synchronizační úlohu", - "target_address": "Cílová adresa/y
(oddělte čárkou)", + "target_address": "Cílová adresa/y (oddělte čárkou)", "target_domain": "Cílová doména", "timeout1": "Časový limit pro připojení ke vzdálenému serveru", "timeout2": "Časový limit pro připojení k lokálnímu serveru", @@ -690,7 +753,13 @@ "custom_attributes": "Vlastní atributy", "footer_exclude": "Vyloučit ze zápatí", "domain_footer_skip_replies": "Ignorovat patičku u odpovědí na e-maily", - "password_recovery_email": "E-mail pro obnovu hesla" + "password_recovery_email": "E-mail pro obnovu hesla", + "mailbox_rename": "Přejmenovat schránku", + "mailbox_rename_agree": "Mám vytvořenou zálohu.", + "mailbox_rename_warning": "DŮLEŽITÉ! Vytvořte si zálohu schránky, než ji přejmenujete.", + "mailbox_rename_alias": "Automaticky vytvořit alias", + "mailbox_rename_title": "Nový název zdejší schránky", + "pushover": "Pushover" }, "fido2": { "confirm": "Potvrdit", @@ -711,7 +780,7 @@ "cancel": "Zrušit", "confirm_delete": "Potvdit smazání", "delete_now": "Smazat", - "delete_these_items": "Prosím potvrďte změny objektu id:", + "delete_these_items": "Prosím potvrďte změny objektu id", "hibp_check": "Ověřit heslo v databázi hacknutých hesel haveibeenpwned.com", "hibp_nok": "Nalezeno! Toto je potenciálně nebezpečné heslo!", "hibp_ok": "Nebyla nalezena žádná shoda.", @@ -720,12 +789,12 @@ "restart_container": "Restartovat kontejner", "restart_container_info": "Důležité: Šetrný restart může chvíli trvat, prosím čekejte...", "restart_now": "Restartovat nyní", - "restarting_container": "Restartuje se kontejner, může to chvilku trvat..." + "restarting_container": "Restartuje se kontejner, může to chvilku trvat" }, "header": { "administration": "Hlavní nastavení", "apps": "Aplikace", - "debug": "Systémové informace", + "debug": "Informace", "email": "E-Mail", "mailcow_system": "Systém", "mailcow_config": "Nastavení", @@ -753,7 +822,14 @@ "new_password": "Nové heslo", "new_password_confirm": "Ověření nového hesla", "reset_password": "Obnovit heslo", - "request_reset_password": "Požádat o změnu hesla" + "request_reset_password": "Požádat o změnu hesla", + "login_domainadmintext": "Přihlášení správce domény", + "login_linkstext": "Hledáte jinou přihlašovací stránku?", + "login_usertext": "Přihlášení uživatele", + "login_admintext": "Přihlášení správce", + "login_user": "Přihlášení uživatele", + "login_dadmin": "Přihlášení správce domény", + "login_admin": "Přihlášení správce" }, "mailbox": { "action": "Akce", @@ -785,7 +861,7 @@ "bcc": "BCC", "bcc_destination": "Cíl kopie", "bcc_destinations": "Cíl kopií", - "bcc_info": "Skryté kopie (Mapa BCC) se používá pro tiché předávání kopií všech zpráv na jinou adresu. Při použití skryté kopie typu Přijatý e-mail budou přeposlány všechny maily směřující na dotyčnou adresu nebo doménu.\nU typu Odeslaný e-mail budou přeposlány všechny maily odeslané z dotyčné adresy nebo domény.\nPokud selže přeposlání na cílovou adresu, tak odesílatel o tom nebude informován.", + "bcc_info": "Skrytá kopie (mapa BCC) se používá pro tiché předávání kopií všech zpráv na jinou adresu. Mapa příjemců se použije, funguje-li je místní cíl jako adresát zprávy. Totéž platí pro mapy odesílatelů.\nMístní cíl se nedozví, selže-li doručení na cíl BCC.", "bcc_local_dest": "Týká se", "bcc_map": "Skrytá kopie", "bcc_map_type": "Typ skryté kopie", @@ -840,7 +916,7 @@ "last_run_reset": "Znovu naplánovat", "mailbox": "Mailová schránka", "mailbox_defaults": "Výchozí nastavení", - "mailbox_defaults_info": "Definuje výchozí nastavení pro nové schránky", + "mailbox_defaults_info": "Definuje výchozí nastavení pro nové schránky.", "mailbox_defquota": "Výchozí velikost schránky", "mailbox_templates": "Šablony schránek", "mailbox_quota": "Max. velikost schránky", @@ -860,7 +936,7 @@ "private_comment": "Soukromý komentář", "public_comment": "Veřejný komentář", "q_add_header": "Složka nevyžádaná pošta", - "q_all": "Všechny kategorie", + "q_all": " Nevyžádaná pošta a Odmítnuta", "q_reject": "Odmítnuta", "quarantine_category": "Kategorie oznámení karantény", "quarantine_notification": "Upozornění z karantény", @@ -869,7 +945,7 @@ "recipient_map": "Mapa příjemce", "recipient_map_info": "Mapy příjemců slouží k nahrazení cílové adresy zprávy před doručením.", "recipient_map_new": "Nový přijemce", - "recipient_map_new_info": "Cílová adresa mapy příjemce musí být emailová adresa nebo název domény.", + "recipient_map_new_info": "Cílovou adresou mapy příjemců musí být emailová adresa nebo název domény.", "recipient_map_old": "Původní příjemce", "recipient_map_old_info": "Původní příjemce musí být platná emailová adresa nebo název domény.", "recipient_maps": "Mapy příjemců", @@ -888,7 +964,7 @@ "sieve_preset_5": "Automatický odpovídač (dovolená)", "sieve_preset_6": "Odmítnout zprávu s odpovědí", "sieve_preset_7": "Přesměrovat a ponechat/zahodit", - "sieve_preset_8": "Zahodit zprávu poslanou na alias, do něhož patří i odesílatel", + "sieve_preset_8": "Zprávu od určitého odesílatele přesměrovat, označit jako přečtenou a uložit do složky", "sieve_preset_header": "Vizte následující ukázková pravidla. Více informací na Wikipedii.", "sogo_visible": "Alias dostupný v SOGo", "sogo_visible_n": "Skrýt alias v SOGo", @@ -928,7 +1004,8 @@ "waiting": "Čekání", "weekly": "Každý týden", "yes": "✓", - "relay_unknown": "Předávání neexistujících schránek" + "relay_unknown": "Předávání neexistujících schránek", + "iam": "Poskytovatel identity" }, "oauth2": { "access_denied": "K udělení přístupu se přihlašte jako vlastník mailové schránky.", @@ -936,7 +1013,7 @@ "deny": "Zamítnout", "permit": "Ověřit aplikaci", "profile": "Profil", - "profile_desc": "Zobrazit osobní údaje: uživ. jméno, jméno, datum vytvoření a úpravy, stav", + "profile_desc": "Zobrazit osobní údaje: uživ. jméno, celé jméno, datum vytvoření a úpravy, stav", "scope_ask_permission": "Aplikace požádala o následující oprávnění" }, "quarantine": { @@ -1066,7 +1143,7 @@ "logged_in_as": "Přihlášen jako %s", "mailbox_added": "Mailová schránka %s přidána", "mailbox_modified": "Změny mailové schránky %s uloženy", - "mailbox_removed": "Mailová schránka %s odebrána", + "mailbox_removed": "Mailová schránka %s odstraněna", "nginx_reloaded": "Nginx reload byl úspěšný", "object_modified": "Změny objektu %s uloženy", "password_policy_saved": "Politika hesel byla úspěšně uložena", @@ -1100,7 +1177,14 @@ "verified_yotp_login": "Yubico OTP přihlášení ověřeno", "cors_headers_edited": "Nastavení CORS byla uložena", "domain_footer_modified": "Změny patičky domény %s byly uloženy", - "recovery_email_sent": "E-mail k obnovení byl odeslán na adresu %s" + "recovery_email_sent": "E-mail k obnovení byl odeslán na adresu %s", + "custom_login_modified": "Úpravy přihlašování úspěšně uloženy", + "domain_add_dkim_available": "Klíč DKIM už existoval", + "f2b_banlist_refreshed": "Seznam zákazů úspěšně obnoven", + "iam_test_connection": "Spojení úspěšně navázano", + "ip_check_opt_in_modified": "Kontrola IP adresy úspěšně uložena", + "mailbox_renamed": "Schránka přejmenována z %s na %s", + "password_changed_success": "Heslo úspěšně změněno" }, "tfa": { "api_register": "%s používá Yubico Cloud API. Prosím získejte API klíč pro své Yubico ZDE", @@ -1116,7 +1200,7 @@ "none": "Deaktivovat", "reload_retry": "- (znovu načtěte stránku, opakuje-li se chyba)", "scan_qr_code": "Prosím načtěte následující kód svou aplikací na ověření nebo zadejte kód ručně.", - "select": "Prosím vyberte...", + "select": "Vyberte prosím", "set_tfa": "Nastavení způsobu dvoufaktorového ověření", "start_webauthn_validation": "Zahájit inicializaci", "tfa": "Dvoufaktorové ověření (TFA)", @@ -1125,7 +1209,10 @@ "webauthn": "WebAuthn ověření", "waiting_usb_auth": "Čeká se na USB zařízení...

Prosím stiskněte tlačítko na svém WebAuthn USB zařízení.", "waiting_usb_register": "Čeká se na USB zařízení...

Prosím zadejte své heslo výše a potvrďte WebAuthn registraci stiskem tlačítka na svém WebAuthn USB zařízení.", - "yubi_otp": "Yubico OTP ověření" + "yubi_otp": "Yubico OTP ověření", + "u2f_deprecated": "Zdá se, že váš klíč byl registrován zastaralou metodou U2F. Dojde k deaktivaci dvoufaktorové autentifikace a smazání klíče.", + "authenticators": "Autentifikátory", + "u2f_deprecated_important": "Registrujte svůj klíč novou metodou WebAuthn ve správě správců" }, "user": { "action": "Akce", @@ -1141,7 +1228,7 @@ "alias_time_left": "Zbývající čas", "alias_valid_until": "Platný do", "aliases_also_send_as": "Smí odesílat také jako uživatel", - "aliases_send_as_all": "Nekontrolovat přístup odesílatele pro následující doménu(y) a jejich aliasy domény:", + "aliases_send_as_all": "Nekontrolovat přístup odesílatele pro následující doménu(y) a jejich aliasy", "allowed_protocols": "Povolené protokoly", "app_hint": "Hesla aplikací jsou alternativní heslo pro přihlášení k IMAP, SMTP, CalDAV, CardDAV a EAS. Uživatelské jméno zůstává stejné.
SOGo však nelze s heslem aplikace použít.", "app_name": "Název aplikace", @@ -1162,8 +1249,8 @@ "description": "Popis", "delete_ays": "Potvrďte odstranění.", "direct_aliases": "Přímé aliasy", - "direct_aliases_desc": "Na přímé aliasy se uplatňuje filtr spamu a nastavení pravidel TLS", - "direct_protocol_access": "Tento uživatel mailové schránky má přímý externí přístup k následujícím protokolům a aplikacím. Toto nastavení je řízeno správcem. Pro udělení přístupu k jednotlivým protokolům a aplikacím lze vytvořit hesla aplikací.
Tlačítko \"Webmailu\" zajišťuje jednotné přihlášení k SOGo a je vždy k dispozici.", + "direct_aliases_desc": "Na přímé aliasy se uplatňuje filtr spamu a nastavení pravidel TLS.", + "direct_protocol_access": "Tento uživatel mailové schránky má přímý externí přístup k následujícím protokolům a aplikacím. Toto nastavení je řízeno správcem. Pro udělení přístupu k jednotlivým protokolům a aplikacím lze vytvořit hesla aplikací.
Tlačítko \"Webmail\" zajišťuje jednotné přihlášení k SOGo a je vždy k dispozici.", "eas_reset": "Smazat mezipaměť zařízení ActiveSync", "eas_reset_help": "Obnovení mezipaměti zařízení pomůže zpravidla obnovit poškozený profil služby ActiveSync.
Upozornění: Všechna data budou opětovně stažena!", "eas_reset_now": "Smazat", @@ -1204,7 +1291,7 @@ "no_last_login": "Žádný záznam o přihlášení", "no_record": "Žádný záznam", "open_logs": "Otevřít záznam", - "open_webmail_sso": "Webmailu", + "open_webmail_sso": "Webmail", "password": "Heslo", "password_now": "Současné heslo (pro potvrzení změny)", "password_repeat": "Heslo (znovu)", @@ -1241,8 +1328,8 @@ "spamfilter": "Filtr spamu", "spamfilter_behavior": "Hodnocení", "spamfilter_bl": "Seznam zakázaných adres (blacklist)", - "spamfilter_bl_desc": "Zakázané emailové adresy budou vždy klasifikovány jako spam a odmítnuty. Lze použít zástupné znaky (*). Filtr se použije pouze na přímé aliasy (s jednou cílovou mailovou schránkou), s výjimkou doménových košů a samotné mailové schránky.", - "spamfilter_default_score": "Výchozí hodnoty:", + "spamfilter_bl_desc": "Zakázané emailové adresy budou vždy klasifikovány jako spam a odmítnuty. Odmítnutá pošta nebude uložena do karantény. Lze použít zástupné znaky (*). Filtr se použije pouze na přímé aliasy (s jednou cílovou poštovní schránkou), s výjimkou doménových košů a samotné poštovní schránky.", + "spamfilter_default_score": "Výchozí hodnoty", "spamfilter_green": "Zelená: tato zpráva není spam", "spamfilter_hint": "První hodnota představuje \"nízké spam skóre\" a druhá \"vysoké spam skóre\".", "spamfilter_red": "Červená: Tato zpráva je spam a server ji odmítne", @@ -1274,7 +1361,7 @@ "tag_in_subject": "V předmětu", "text": "Text", "title": "Předmět", - "tls_enforce_in": "Vynutit TLS pro příchozí poštu ", + "tls_enforce_in": "Vynutit TLS pro příchozí poštu", "tls_enforce_out": "Vynutit TLS pro odchozí poštu", "tls_policy": "Politika šifrování", "tls_policy_warning": "Varování: Pokud se rozhodnete vynutit šifrovaný přenos pošty, může dojít ke ztrátě e-mailů.
Zprávy, které nesplňují tuto politiku, budou mailovým systémem odmítnuty.
Tato volba ovlivňuje primární e-mailovou adresu (přihlašovací jméno), všechny adresy odvozené z doménových aliasů i aliasy, jež mají tuto mailovou schránku jako cíl.", @@ -1290,7 +1377,13 @@ "years": "let", "pushover_sound": "Zvukové upozornění", "password_reset_info": "Pokud není zadán e-mail pro obnovení hesla, nelze tuto funkci použít.", - "pw_recovery_email": "E-mail pro obnovení hesla" + "pw_recovery_email": "E-mail pro obnovení hesla", + "tfa_info": "Dvoufaktorová autentizace vám pomáhá chránit svůj účet. Je-li zapnuta, musíte si vytvořit aplikační hesla pro aplikace, jež dvoufaktorovou autentizaci nepodporují (např. poštovní klienti).", + "attribute": "Atribut", + "authentication": "Autentifikace", + "overview": "Přehled", + "protocols": "Protokoly", + "value": "Hodnota" }, "warning": { "cannot_delete_self": "Nelze smazat právě přihlášeného uživatele", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index a04234610..21d26d8c8 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -205,8 +205,8 @@ "f2b_whitelist": "Whitelisted networks/hosts", "filter": "Filter", "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 Singe Sign-On button", - "force_sso": "Disable mailcow Login and show only Singe Sign-On", + "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": "Disable mailcow Login and show only Single Sign-On", "forwarding_hosts": "Forwarding Hosts", "forwarding_hosts_add_hint": "You can either specify IPv4/IPv6 addresses, networks in CIDR notation, host names (which will be resolved to IP addresses), or domain names (which will be resolved to IP addresses by querying SPF records or, in their absence, MX records).", "forwarding_hosts_hint": "Incoming messages are unconditionally accepted from any hosts listed here. These hosts are then not checked against DNSBLs or subjected to greylisting. Spam received from them is never rejected, but optionally it can be filed into the Junk folder. The most common use for this is to specify mail servers on which you have set up a rule that forwards incoming emails to your mailcow server.", diff --git a/data/web/lang/lang.it-it.json b/data/web/lang/lang.it-it.json index fdfa78161..a2f0a87e3 100644 --- a/data/web/lang/lang.it-it.json +++ b/data/web/lang/lang.it-it.json @@ -353,7 +353,30 @@ "password_settings": "Impostazioni della password", "queue_unban": "sblocca", "restore_template": "Lasciare vuoto per ripristinare il modello predefinito.", - "logo_normal_label": "Normale" + "logo_normal_label": "Normale", + "app_hide": "Nascondi per il login", + "ip_check_disabled": "Il controllo IP è disabilitato. Puoi abilitarlo sotto
Sistema > Configurazione > Opzioni > Personalizza ", + "ip_check_opt_in": "Attiva l'utilizzo dei servizi di terze parti ipv4.mailcow.email e ipv6.mailcow.email per risolvere gli indirizzi IP esterni", + "iam_login_provisioning": "Creazione automatica di utenti al login", + "iam_port": "Porta", + "iam_redirect_url": "URL di reindirizzamento", + "iam_server_url": "URL server", + "iam_sso": "Single Sign-On", + "iam_test_connection": "Test connessione", + "iam_use_ssl": "Usa SSL", + "iam_use_tls": "Usa StartTLS", + "iam_version": "Versione", + "ignore_ssl_error": "Ignorare gli errori SSL", + "task": "Attività", + "login_page": "Pagina di accesso", + "filter": "Filtro", + "iam_attribute_field": "Campo attributo", + "iam_authorize_url": "Endpoint di autorizzazione", + "iam_auth_flow": "Flusso di autenticazione", + "iam_client_id": "ID cliente", + "iam_default_template": "Template predefinito", + "iam_host": "Host", + "iam_import_users": "Importa utenti" }, "danger": { "access_denied": "Accesso negato o form di login non corretto", @@ -484,7 +507,11 @@ "password_reset_invalid_user": "La casella di posta elettronica non è stata trovata o non è stata impostata un'e-mail di recupero", "password_reset_na": "Il recupero della password non è attualmente disponibile. Contattare l'amministratore.", "recovery_email_failed": "Impossibile inviare un'e-mail di recupero. Contattare l'amministratore.", - "to_invalid": "Il destinatario non deve essere vuoto" + "to_invalid": "Il destinatario non deve essere vuoto", + "iam_test_connection": "Connessione non riuscita", + "webauthn_authenticator_failed": "L'autenticator selezionato non è stato trovato", + "webauthn_username_failed": "L'authenticator selezionato appartiene ad un altro account", + "webauthn_publickey_failed": "Nessuna chiave pubblica è stata salvata per l'authenticator selezionato" }, "debug": { "chart_this_server": "Grafico (questo server)", @@ -655,7 +682,10 @@ "domain_footer_html": "Piè di pagina HTML", "domain_footer_plain": "Piè di pagina PLAIN", "footer_exclude": "Escludi dal piè di pagina", - "password_recovery_email": "E-mail di recupero password" + "password_recovery_email": "E-mail di recupero password", + "mailbox_rename": "Rinominare la casella mail", + "mailbox_rename_agree": "Ho creato un backup.", + "mailbox_rename_alias": "Creare alias automaticamente" }, "fido2": { "confirm": "Conferma", @@ -717,7 +747,11 @@ "forgot_password": "> Password dimenticata?", "new_password": "Nuova password", "new_password_confirm": "Conferma la nuova password", - "reset_password": "Ripristino della password" + "reset_password": "Ripristino della password", + "login_linkstext": "Non è il login corretto?", + "login_usertext": "Accedere come utente", + "login_domainadmintext": "Accedere come domain admin", + "login_admintext": "Accedere come admin" }, "mailbox": { "action": "Azione", diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json index b5a093a35..2028996aa 100644 --- a/data/web/lang/lang.si-si.json +++ b/data/web/lang/lang.si-si.json @@ -352,13 +352,68 @@ "allowed_origins": "Upravljanje-dostopa-Dovoljeni-Viri", "copy_to_clipboard": "Besedilo kopirano v odložišče!", "f2b_manage_external": "Zunanje upravljanje Fail2Ban", - "f2b_manage_external_info": "Fail2ban bo še vedno vzdrževal seznam prepovedi, vendar ne bo aktivno nastavil pravil za blokiranje prometa. Uporabite spodnji ustvarjeni seznam prepovedi za zunanje blokiranje prometa." + "f2b_manage_external_info": "Fail2ban bo še vedno vzdrževal seznam prepovedi, vendar ne bo aktivno nastavil pravil za blokiranje prometa. Uporabite spodnji ustvarjeni seznam prepovedi za zunanje blokiranje prometa.", + "force_sso_text": "Če je konfiguriran zunanji ponudnik OIDC, ta možnost skrije privzete obrazce za prijavo v Mailcow in prikaže samo gumb za enkratno prijavo.", + "app_hide": "Skrij za prijavo", + "iam_login_provisioning": "Samodejno ustvarjanje uporabnikov ob prijavi", + "admin_quicklink": "Skrij hitro povezavo do strani za prijavo skrbnika", + "login_page": "Prijavna stran", + "domainadmin_quicklink": "Skrij hitro povezavo do strani za prijavo v Skrbnik domen", + "filter": "Filter", + "force_sso": "Onemogoči prijavo v Mailcow in prikaži samo enotno prijavo", + "iam": "Ponudnik identitete", + "iam_attribute_field": "Polje atributa", + "iam_authorize_url": "Končna točka avtorizacije", + "iam_auth_flow": "Potek preverjanja pristnosti", + "iam_auth_flow_info": "Poleg toka avtorizacijske kode (standardni tok v Keycloaku), ki se uporablja za prijavo z enotno prijavo, mailcow podpira tudi tok preverjanja pristnosti z neposrednimi poverilnicami. Tok Mailpassword poskuša preveriti uporabnikove poverilnice z uporabo REST API-ja Keycloak Admin. mailcow pridobi zgoščeno geslo iz atributa mailcow_password, ki je preslikan v Keycloaku.", + "iam_basedn": "Osnovni DN", + "iam_client_id": "ID odjemalca", + "iam_client_secret": "Skrivnost odjemalca", + "iam_client_scopes": "Obsegi odjemalcev", + "iam_default_template": "Privzeta predloga", + "iam_default_template_description": "Če uporabniku ni dodeljena nobena predloga, bo privzeta predloga uporabljena za ustvarjanje nabiralnika, ne pa za posodabljanje nabiralnika.", + "iam_description": "Konfigurirajte zunanjega ponudnika za preverjanje pristnosti
Uporabnikovi poštni nabiralniki bodo samodejno ustvarjeni ob prvi prijavi, če je nastavljeno preslikavanje atributov.", + "iam_extra_permission": "Za delovanje naslednjih nastavitev potrebuje odjemalec mailcow v Keycloaku Servisni račun in dovoljenje za ogled uporabnikov.", + "iam_host": "Gostitelj", + "iam_host_info": "Vnesite enega ali več gostiteljev LDAP, ločenih z vejicami.", + "iam_import_users": "Uvozi uporabnike", + "iam_use_tls_info": "Če omogočite TLS, morate uporabiti privzeta vrata za strežnik LDAP (389). Vrat SSL ni mogoče uporabiti.", + "iam_sync_interval": "Interval sinhronizacije / uvoza (min)", + "user_quicklink": "Skrij hitro povezavo do strani za prijavo uporabnika", + "iam_use_ssl_info": "Če omogočite SSL in so vrata nastavljena na 389, bodo samodejno prepisana na uporabo 636.", + "iam_mapping": "Preslikava atributov", + "iam_bindpass": "Vezano geslo", + "iam_periodic_full_sync": "Periodična popolna sinhronizacija", + "iam_port": "Vrata", + "iam_redirect_url": "Preusmeri URL", + "iam_rest_flow": "Tok gesla za pošto", + "iam_server_url": "URL strežnika", + "iam_sso": "Enotna prijava", + "iam_test_connection": "Preizkus povezave", + "iam_token_url": "Končna točka žetona", + "iam_userinfo_url": "Končna točka z uporabniškimi podatki", + "iam_username_field": "Polje z uporabniškim imenom", + "iam_binddn": "Povezava DN", + "iam_use_ssl": "Uporabi SSL", + "iam_use_tls": "Uporabi StartTLS", + "iam_version": "Različica", + "ignore_ssl_error": "Prezri napake SSL", + "password_reset_info": "Če ni naveden e-poštni naslov za obnovitev, te funkcije ni mogoče uporabiti.", + "password_reset_settings": "Nastavitve za obnovitev gesla", + "password_reset_tmpl_html": "Predloga HTML", + "password_reset_tmpl_text": "Predloga besedila", + "password_settings": "Nastavitve gesla", + "quicklink_text": "Prikaži ali skrij hitre povezave do drugih strani za prijavo pod prijavnim obrazcem", + "reset_password_vars": "{{link}} Ustvarjena povezava za ponastavitev gesla
{{username}} Ime nabiralnika uporabnika, ki je zahteval ponastavitev gesla
{{username2}} Ime obnovitvenega nabiralnika
{{date}} Datum zahteve za ponastavitev gesla
{{token_lifetime}} Življenjska doba žetona v minutah
{{hostname}} Ime gostitelja mailcow", + "restore_template": "Za obnovitev privzete predloge pustite polje prazno.", + "task": "Naloga", + "user_link": "Uporabniška povezava" }, "danger": { "alias_goto_identical": "Alias in goto naslov morata biti identična", "aliasd_targetd_identical": "Alias domena ne sme biti enaka ciljni domeni: %s", "bcc_exists": "BCC preslikava obstaja za vrsto %s", - "dkim_domain_or_sel_exists": "DKIM ključ za \"%s\" obstaja in ne bo prepisan.", + "dkim_domain_or_sel_exists": "DKIM ključ za \"%s\" obstaja in ne bo prepisan", "domain_quota_m_in_use": "Kvota domene mora biti večja ali enaka %s MiB", "extra_acl_invalid_domain": "Zunanji pošiljatelj \"%s\" uporablja neveljavno domeno", "global_map_write_error": "Ni mogoče zapisati ID globalne preslikave %s: %s", @@ -375,8 +430,8 @@ "app_passwd_id_invalid": "ID gesla aplikacije %s je neveljaven", "bcc_empty": "BCC cilj ne more biti prazen", "bcc_must_be_email": "BCC cilj %s ni veljaven e-poštni naslov", - "comment_too_long": "Komentar je predolg, dovoljeno je največ 100 znakov.", - "defquota_empty": "Privzeta kvota na poštni predal ne more biti 0", + "comment_too_long": "Komentar je predolg, dovoljeno je največ 160 znakov", + "defquota_empty": "Privzeta kvota na poštni predal ne more biti 0.", "description_invalid": "Opis resursa za %s ni veljaven", "dkim_domain_or_sel_invalid": "Domena ali izbirnik DKIM ni veljaven: %s", "domain_cannot_match_hostname": "Domena se ne more ujemati z imenom gostitelja", @@ -414,9 +469,9 @@ "invalid_recipient_map_old": "Naveden neveljaven izvirni prejemnik: %s", "ip_list_empty": "Seznam dovoljenih IPjev ne sme biti prazen", "is_alias": "%s je že znan kot alias naslov", - "is_alias_or_mailbox": "%s je že znan kot alias, poštni naslov, ali alias izveden iz alias domene", + "is_alias_or_mailbox": "%s je že znan kot alias, poštni naslov, ali alias izveden iz alias domene.", "is_spam_alias": "%s že obstaja kot začasen alias (spam alias naslov)", - "last_key": "Zadnji ključ ne more biti izbrisan, prosim raje deaktivirajte dvofaktorsko avtentikacijo (TFA)", + "last_key": "Zadnji ključ ne more biti izbrisan, prosim raje deaktivirajte dvofaktorsko avtentikacijo (TFA).", "login_failed": "Prijava ni uspela", "mailbox_defquota_exceeds_mailbox_maxquota": "Privzeta kvota presega najvišjo omejitev", "mailbox_invalid": "Ime poštnega predala ni veljavno", @@ -428,7 +483,7 @@ "map_content_empty": "Preslikava vsebine ne more biti prazna", "max_alias_exceeded": "Preseženo največje število aliasov", "max_mailbox_exceeded": "Preseženo največje število poštnih predalov (%d od %d)", - "maxquota_empty": "Največja kvota na poštni predal ne more biti 0", + "maxquota_empty": "Največja kvota na poštni predal ne more biti 0.", "mysql_error": "Napaka MySQL: %s", "network_host_invalid": "Nepravilno omrežje ali gostitel: %s", "next_hop_interferes": "% moti naslednji skok %s", @@ -483,7 +538,17 @@ "cors_invalid_origin": "Naveden neveljaven Allow-Origin", "invalid_recipient_map_new": "Naveden neveljaven nov prejemnik: %s", "img_dimensions_exceeded": "Slika presega največje dovoljene dimenzije", - "img_size_exceeded": "Slika presega največjo dovoljeno velikost datoteke" + "img_size_exceeded": "Slika presega največjo dovoljeno velikost datoteke", + "iam_test_connection": "Povezava ni uspela", + "authsource_in_use": "Ponudnika identitete ni mogoče spremeniti ali izbrisati, ker ga trenutno uporablja eden ali več uporabnikov.", + "password_reset_na": "Obnovitev gesla trenutno ni na voljo. Obrnite se na skrbnika.", + "generic_server_error": "Prišlo je do nepričakovane napake strežnika. Obrnite se na skrbnika.", + "invalid_reset_token": "Neveljaven žeton za ponastavitev", + "password_reset_invalid_user": "Poštni predal ni bil najden ali pa ni nastavljen e-poštni naslov za obnovitev", + "recovery_email_failed": "E-poštnega sporočila za obnovitev ni bilo mogoče poslati. Obrnite se na skrbnika.", + "required_data_missing": "Manjkajo zahtevani podatki %s", + "reset_token_limit_exceeded": "Omejitev žetonov za ponastavitev je bila presežena. Poskusite znova pozneje.", + "to_invalid": "Polje za prejemnika ne sme biti prazno" }, "debug": { "containers_info": "Informacije o vsebniku (containerju)", @@ -583,8 +648,8 @@ "pushover_sender_array": "Upoštevaj samo sledeče e-poštne naslove pošiljateljev (ločeni z vejico)", "mbox_rl_info": "Ta omejitev velja za SASL uporabniško ime, preverja se ujemanje s katerim koli \"from\" naslovom, ki ga uporablja prijavljeni uporabnik. Omejitev pošiljanja za poštni predal preglasi pravilo omejitve za domeno.", "kind": "Tip", - "client_secret": "Client secret", - "comment_info": "Zasebni komentar ni viden uporabniku, javni komentar pa je viden kot tooltip v uporabnikovem pregledu.", + "client_secret": "Skrivnost odjemalca", + "comment_info": "Zasebni komentar ni viden uporabniku, javni komentar pa se prikaže kot opis orodja, ko nanj v pregledu uporabnika zadržite miško", "created_on": "Ustvarjeno", "custom_attributes": "Atributi po meri", "delete1": "Izbriši na viru, ko je končano", @@ -601,11 +666,11 @@ "pushover_verify": "Preveri poverilnice", "quota_mb": "Omejitev (MiB)", "quota_warning_bcc": "BCC za sporočilo z opozorilom omejitve", - "quota_warning_bcc_info": "Opozorila bodo poslana kot ločene kopije sledečim prejemnikom. K naslovu sporočila bo dodano uporabniško ime v oklepajih, npr. Opozorilo omejitve (user@example.com)", + "quota_warning_bcc_info": "Opozorila bodo poslana kot ločene kopije naslednjim prejemnikom. Zadevi bo v oklepaju dodano ustrezno uporabniško ime, na primer: Opozorilo o kvoti (uporabnik@example.com).", "ratelimit": "Omejitev pošiljanja", "advanced_settings": "Napredne nastavitve", "allow_from_smtp_info": "Pustite prazno da dovolite vse pošiljatelje.
IPv4/IPv6 naslovi in omrežja.", - "allowed_protocols": "Dovoljeni protokoli", + "allowed_protocols": "Dovoljeni protokoli za neposreden dostop uporabnikov (ne vpliva na protokole za gesla aplikacij)", "app_name": "Ime aplikacije", "app_passwd": "Geslo aplikacije", "app_passwd_protocols": "Dovoljeni protokoli za geslo aplikacije", @@ -647,12 +712,253 @@ "public_comment": "Javni komentar", "pushover": "Pushover", "pushover_evaluate_x_prio": "Eskaliraj visoko prednostno pošto [X-Priority: 1]", - "pushover_info": "Nastavitve potisnih obvestil bodo veljala za vsa čisto (ne spam) elektronsko pošto dostavljeno v %s vključno z aliasi (deljeni, nedeljeni, označeni)", + "pushover_info": "Nastavitve potisnih obvestil bodo veljale za vso čisto (ne neželeno) pošto, dostavljeno na %s, vključno z vzdevki (v skupni rabi, brez skupne rabe, označeni).", "pushover_only_x_prio": "Upoštevaj samo pošto z visoko prioriteto [X-Priority: 1]", "pushover_sender_regex": "Upoštevaj sledeči regex za pošiljatelja", "pushover_text": "Besedilo obvestila", "pushover_sound": "Zvok", "encryption": "Šifriranje", - "alias": "Uredi alias" + "alias": "Uredi alias", + "relayhost": "Prenosi, odvisni od pošiljatelja", + "mailbox_rename_alias": "Samodejno ustvari vzdevek", + "sender_acl_info": "Če lahko uporabnik poštnega predala A pošilja kot uporabnik poštnega predala B, se naslov pošiljatelja v SOGo ne prikaže samodejno kot izbirno polje \"od\".
\n Uporabnik poštnega predala B mora v SOGo ustvariti pooblastilo, da lahko uporabnik poštnega predala A izbere svoj naslov kot pošiljatelja. Če želite pooblastiti poštni predal v SOGo, uporabite meni (tri pike) desno od imena vašega poštnega predala v zgornjem levem kotu v pogledu pošte. To vedenje ne velja za vzdevke.", + "redirect_uri": "URL za preusmeritev/povratni klic", + "relay_all": "Posreduj vsem prejemnikom", + "relay_unknown_only": "Posreduj samo neobstoječe poštne nabiralnike. Obstoječi poštni nabiralniki bodo dostavljeni lokalno.", + "relay_domain": "Posreduj to domeno", + "remove": "Odstrani", + "resource": "Vir", + "mailbox_rename_title": "Novo ime lokalnega poštnega predala", + "password_recovery_email": "E-poštno sporočilo za obnovitev gesla", + "relay_all_info": "↪ Če se odločite, da ne želite posredovati vseh prejemnikov, boste morali za vsakega posameznega prejemnika, ki ga želite posredovati, dodati (\"slepi\") poštni predal.", + "relay_transport_info": "
Informacije
Za to domeno lahko določite transportne zemljevide za cilj po meri. Če niso nastavljeni, bo izvedeno iskanje MX.", + "save": "Shrani spremembe", + "scope": "Obseg", + "sender_acl": "Dovoli pošiljanje kot", + "sender_acl_disabled": "Preverjanje pošiljatelja je onemogočeno", + "sieve_type": "Vrsta filtra", + "skipcrossduplicates": "Preskoči podvojena sporočila med mapami (po principu \"kdor prej pride, prej melje\")", + "sogo_access": "Neposredno posredovanje na SOGo", + "sogo_access_info": "Po prijavi je uporabnik samodejno preusmerjen na SOGo.", + "sogo_visible": "Vzdevek je viden 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_filter": "Filter neželene pošte", + "spam_policy": "Dodajanje ali odstranjevanje elementov na beli/črni seznam", + "spam_score": "Nastavite oceno neželene pošte po meri", + "subfolder2": "Sinhroniziraj v podmapo na cilju
(prazno = ne uporabi podmape)", + "syncjob": "Urejanje sinhronizacijskega opravila", + "target_address": "Pojdi na naslov/e (ločeno z vejico)", + "target_domain": "Ciljna domena", + "timeout1": "Časovna omejitev za povezavo z oddaljenim gostiteljem", + "timeout2": "Časovna omejitev za povezavo z lokalnim gostiteljem", + "title": "Urejanje predmeta", + "unchanged_if_empty": "Če ni spremenjeno, pustite prazno", + "username": "Uporabniško ime", + "validate_save": "Potrdi in shrani", + "mailbox_rename": "Preimenuj poštni predal", + "mailbox_rename_agree": "Ustvaril/a sem varnostno kopijo.", + "mailbox_rename_warning": "POMEMBNO! Pred preimenovanjem nabiralnika ustvarite varnostno kopijo.", + "sieve_desc": "Kratek opis" + }, + "footer": { + "restart_container_info": "Pomembno: Ugoden ponovni zagon lahko traja nekaj časa, zato počakajte, da se konča.", + "delete_these_items": "Prosimo, potrdite spremembe naslednjega ID-ja objekta", + "confirm_delete": "Potrdi brisanje", + "delete_now": "Izbriši zdaj", + "hibp_check": "Preverite na haveibeenpwned.com", + "hibp_nok": "Ujema se! To je potencialno nevarno geslo!", + "hibp_ok": "Ni najdenega ujemanja.", + "loading": "Prosim, počakajte...", + "nothing_selected": "Nič izbranega", + "restart_container": "Znova zaženite zabojnik", + "restart_now": "Znova zaženi zdaj", + "restarting_container": "Ponovni zagon zabojnika, to lahko traja nekaj časa", + "cancel": "Prekliči" + }, + "login": { + "password": "Geslo", + "invalid_pass_reset_token": "Žeton za ponastavitev gesla je neveljaven ali je potekel.
Zahtevajte novo povezavo za ponastavitev gesla.", + "back_to_mailcow": "Nazaj v mailcow", + "delayed": "Prijava je bila zakasnjena za %s sekund.", + "fido2_webauthn": "Prijava FIDO2/WebAuthent", + "forgot_password": "> Ste pozabili geslo?", + "login": "Prijava", + "login_linkstext": "Ni pravilna prijava?", + "login_usertext": "Prijava kot uporabnik", + "login_domainadmintext": "Prijava kot skrbnik domene", + "login_admintext": "Prijava kot skrbnik", + "login_user": "Prijava uporabnika", + "login_dadmin": "Prijava skrbnika domene", + "login_admin": "Prijava skrbnika", + "mobileconfig_info": "Za prenos zahtevanega profila povezave Apple se prijavite kot uporabnik poštnega predala.", + "new_password": "Novo geslo", + "new_password_confirm": "Potrdi novo geslo", + "other_logins": "ali se prijavite s/z", + "reset_password": "Ponastavi geslo", + "request_reset_password": "Zahteva za spremembo gesla", + "username": "Uporabniško ime" + }, + "mailbox": { + "last_mail_login": "Zadnja prijava v e-pošto", + "deactivate": "Deaktiviraj", + "domain_admins": "Skrbniki domen", + "kind": "Prijazno", + "mailbox_defaults_info": "Določite privzete nastavitve za nove poštne nabiralnike.", + "allowed_protocols": "Dovoljeni protokoli", + "add_alias": "Dodaj vzdevek", + "mins_interval": "Interval (min)", + "recipient_map_info": "Zemljevidi prejemnikov se uporabljajo za zamenjavo naslova prejemnika v sporočilu, preden je dostavljeno.", + "add_domain_record_first": "Najprej dodajte domeno", + "booking_ltnull": "Neomejeno, vendar se ob rezervaciji prikaži kot zasedeno", + "alias_domain_alias_hint": "Vzdevki se na vzdevke domen samodejno ne uporabijo. Naslov vzdevka my-alias@domain ne pokriva naslova my-alias@alias-domain (kjer je \"vzdevek domene\" namišljeni vzdevek domene za \"domeno\").
Za preusmeritev pošte v zunanji nabiralnik uporabite filter sito (glejte zavihek »Filtri« ali uporabite SOGo -> Posrednik). Za samodejno dodajanje manjkajočih vzdevkov uporabite \"Razširi vzdevek čez domene vzdevkov\".", + "q_all": " ob premiku v mapo Neželena pošta in ob zavrnitvi", + "bcc_info": "BCC zemljevidi se uporabljajo za tiho posredovanje kopij vseh sporočil na drug naslov. Vnos vrste preslikave prejemnika se uporablja, kadar lokalni cilj deluje kot prejemnik pošte. Preslikave pošiljatelja delujejo po istem načelu.
\nLokalni cilj ne bo obveščen o neuspeli dostavi.", + "force_pw_update": "Vsiljena posodobitev gesla ob naslednji prijavi", + "recipient_map_new_info": "Cilj zemljevida prejemnika mora biti veljaven e-poštni naslov ali ime domene.", + "recipient_map_old_info": "Izvirni cilj prejemnika mora biti veljaven e-poštni naslov ali ime domene.", + "action": "Dejanje", + "activate": "Aktiviraj", + "active": "Aktivno", + "add": "Dodaj", + "add_alias_expand": "Razširi vzdevek nad vzdevki domen", + "add_bcc_entry": "Dodaj zemljevid BCC", + "add_domain": "Dodaj domeno", + "add_domain_alias": "Dodaj vzdevek domene", + "add_filter": "Dodaj filter", + "add_mailbox": "Dodaj poštni predal", + "add_recipient_map_entry": "Dodaj zemljevid prejemnikov", + "add_resource": "Dodaj vir", + "add_template": "Dodaj predlogo", + "add_tls_policy_map": "Dodaj zemljevid pravilnikov TLS", + "address_rewriting": "Prepisovanje naslovov", + "alias": "Vzdevek", + "alias_domain_backupmx": "Vzdevek domene ni aktiven za posredovalno domeno", + "aliases": "Vzdevki", + "all_domains": "Vse domene", + "allow_from_smtp": "Dovoli samo tem IP-jem uporabo SMTP", + "allow_from_smtp_info": "Pustite prazno, da dovolite vse pošiljatelje.
Naslovi in omrežja IPv4/IPv6.", + "backup_mx": "Posredovalna domena", + "bcc": "BCC", + "bcc_destination": "Ciljna stran BCC", + "bcc_destinations": "Ciljna stran BCC", + "bcc_local_dest": "Lokalni cilj", + "bcc_map": "BCC zemljevid", + "bcc_map_type": "BCC tip", + "bcc_maps": "BCC zemljevidi", + "bcc_rcpt_map": "Zemljevid prejemnikov", + "bcc_sender_map": "Zemljevid pošiljatelja", + "bcc_to_rcpt": "Preklopi na vrsto zemljevida prejemnika", + "bcc_to_sender": "Preklopi na vrsto zemljevida pošiljatelja", + "bcc_type": "BCC tip", + "booking_null": "Vedno prikaži kot brezplačno", + "booking_0_short": "Vedno prost", + "booking_custom": "Točna omejitev na število rezervacij po meri", + "booking_custom_short": "Trda omejitev", + "booking_lt0_short": "Mehka omejitev", + "catch_all": "Zajemi vse", + "created_on": "Ustvarjeno dne", + "daily": "Dnevno", + "description": "Opis", + "disable_login": "Prepreči prijavo (dohodna pošta je še vedno sprejeta)", + "disable_x": "Onemogoči", + "dkim_domains_selector": "Izbirnik", + "dkim_key_length": "Dolžina ključa DKIM (biti)", + "domain": "Domena", + "domain_aliases": "Vzdevki domen", + "domain_templates": "Predloge domen", + "domain_quota": "Kvota", + "domain_quota_total": "Celotna kvota domene", + "domains": "Domene", + "edit": "Uredi", + "empty": "Ni rezultatov", + "enable_x": "Omogoči", + "filters": "Filtri", + "fname": "Polno ime", + "gal": "Globalni seznam naslovov", + "goto_ham": "Uči se kot ham", + "goto_spam": "Uči se kot spam", + "hourly": "Urno", + "iam": "Ponudnik identitete", + "in_use": "V uporabi (%)", + "inactive": "Neaktivno", + "insert_preset": "Vstavi primer prednastavitve \"%s\"", + "last_modified": "Zadnja sprememba", + "last_pw_change": "Zadnja sprememba gesla", + "last_run_reset": "Načrtuj naslednje", + "mailbox": "Poštni nabiralnik", + "mailbox_defaults": "Privzete nastavitve", + "mailbox_defquota": "Privzeta velikost poštnega nabiralnika", + "mailbox_templates": "Predloge poštnih nabiralnikov", + "mailbox_quota": "Največja velikost poštnega nabiralnika", + "mailboxes": "Poštni nabiralniki", + "max_aliases": "Največje število vzdevkov", + "max_mailboxes": "Največje možno število poštnih predalov", + "max_quota": "Največja kvota na poštni predal", + "msg_num": "Sporočilo #", + "multiple_bookings": "Več rezervacij", + "never": "Nikoli", + "no": "✕", + "no_record": "Ni zapisa za objekt %s", + "no_record_single": "Ni zapisa", + "open_logs": "Odpri dnevnike", + "owner": "Lastnik", + "private_comment": "Zasebni komentar", + "public_comment": "Javni komentar", + "q_add_header": "ko je premaknjeno v mapo Neželena pošta", + "q_reject": "ob zavrnitvi", + "quarantine_category": "Kategorija obvestil o karanteni", + "quarantine_notification": "Obvestila o karanteni", + "quick_actions": "Dejanja", + "recipient": "Prejemnik", + "recipient_map": "Zemljevid prejemnikov", + "recipient_map_new": "Nov prejemnik", + "recipient_map_old": "Prvotni prejemnik", + "recipient_maps": "Zemljevidi prejemnikov", + "relay_all": "Posreduj vsem prejemnikom", + "relay_unknown": "Posredovanje neznanih poštnih predalov", + "remove": "Odstrani", + "resources": "Viri", + "running": "V teku", + "sender": "Pošiljatelj", + "set_postfilter": "Označi kot postfilter", + "set_prefilter": "Označi kot predfilter", + "sieve_preset_1": "Zavrzi pošto z verjetno nevarnimi vrstami datotek", + "filter_table": "Filtriraj tabelo", + "excludes": "Izključuje", + "last_run": "Zadnji zagon", + "sieve_preset_2": "Vedno označi e-pošto določenega pošiljatelja kot videno" + }, + "fido2": { + "known_ids": "Znani ID-ji", + "set_fido2_touchid": "Registrirajte Touch ID na Apple M1", + "confirm": "Potrdi", + "fido2_auth": "Prijava s FIDO2", + "fido2_success": "Naprava je bila uspešno registrirana", + "fido2_validation_failed": "Preverjanje ni uspelo", + "fn": "Prijazno ime", + "none": "Onemogočeno", + "register_status": "Status registracije", + "rename": "Preimenuj", + "set_fido2": "Registrirajte napravo FIDO2", + "set_fn": "Nastavi prijazno ime", + "start_fido2_validation": "Začni validacijo FIDO2" + }, + "info": { + "session_expires": "Vaša seja bo potekla čez približno 15 sekund", + "awaiting_tfa_confirmation": "Čakam na potrditev TFA", + "no_action": "Ni veljavnih ukrepov" + }, + "header": { + "administration": "Konfiguracija in podrobnosti", + "apps": "Aplikacije", + "debug": "Informacije", + "email": "E-pošta", + "mailcow_system": "Sistem", + "mailcow_config": "Konfiguracija", + "quarantine": "Karantena", + "restart_netfilter": "Znova zaženite omrežni filter", + "restart_sogo": "Znova zaženite SOGo", + "user_settings": "Uporabniške nastavitve" } } From dd475c0ab341398113cda317417ef7827dfbc19d Mon Sep 17 00:00:00 2001 From: milkmaker Date: Thu, 12 Jun 2025 13:14:20 +0200 Subject: [PATCH 005/180] update postscreen_access.cidr (#6573) --- data/conf/postfix/postscreen_access.cidr | 86 ++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr index 10c609097..57425e5df 100644 --- a/data/conf/postfix/postscreen_access.cidr +++ b/data/conf/postfix/postscreen_access.cidr @@ -1,6 +1,6 @@ -# Whitelist generated by Postwhite v3.4 on Thu May 1 00:21:10 UTC 2025 +# Whitelist generated by Postwhite v3.4 on Sun Jun 1 00:24:21 UTC 2025 # https://github.com/stevejenkins/postwhite/ -# 2058 total rules +# 2132 total rules 2a00:1450:4000::/36 permit 2a01:111:f400::/48 permit 2a01:111:f403:8000::/50 permit @@ -19,24 +19,37 @@ 2c0f:fb50:4000::/36 permit 2.207.151.53 permit 2.207.217.30 permit +3.65.3.180 permit 3.70.123.177 permit +3.72.182.33 permit +3.74.81.189 permit +3.75.33.185 permit 3.93.157.0/24 permit 3.94.40.108 permit 3.129.120.190 permit 3.210.190.0/24 permit +3.211.80.218 permit +3.216.221.67 permit +3.221.209.22 permit 8.20.114.31 permit 8.25.194.0/23 permit 8.25.196.0/23 permit 8.36.116.0/24 permit +8.39.54.0/23 permit +8.39.54.250/31 permit 8.39.144.0/24 permit +8.40.222.0/23 permit +8.40.222.250/31 permit 12.130.86.238 permit -13.107.246.59 permit +13.107.246.38 permit 13.110.208.0/21 permit 13.110.209.0/24 permit 13.110.216.0/22 permit 13.110.224.0/20 permit 13.111.0.0/16 permit 13.111.191.0/24 permit +13.216.7.111 permit +13.216.54.180 permit 15.200.21.50 permit 15.200.44.248 permit 15.200.201.185 permit @@ -49,9 +62,12 @@ 18.97.1.184/29 permit 18.97.2.64/26 permit 18.156.89.250 permit +18.156.205.64 permit 18.157.243.190 permit 18.194.95.56 permit +18.197.217.180 permit 18.198.96.88 permit +18.207.52.234 permit 18.208.124.128/25 permit 18.216.232.154 permit 18.235.27.253 permit @@ -88,6 +104,7 @@ 23.253.183.147 permit 23.253.183.148 permit 23.253.183.150 permit +24.110.64.0/18 permit 27.123.204.128/30 permit 27.123.204.132/31 permit 27.123.204.148/30 permit @@ -125,15 +142,16 @@ 34.74.74.140 permit 34.83.159.189 permit 34.141.160.224 permit +34.193.58.168 permit 34.195.217.107 permit 34.212.163.75 permit 34.215.104.144 permit 34.218.116.3 permit 34.225.212.172 permit +35.158.23.94 permit 35.161.32.253 permit 35.167.93.243 permit 35.176.132.251 permit -35.190.247.0/24 permit 35.191.0.0/16 permit 35.205.92.9 permit 35.228.216.85 permit @@ -154,6 +172,10 @@ 44.217.45.156 permit 44.236.56.93 permit 44.238.220.251 permit +44.245.243.92 permit +44.246.1.125 permit +44.246.68.102 permit +44.246.77.92 permit 45.14.148.0/22 permit 46.19.170.16 permit 46.226.48.0/21 permit @@ -221,11 +243,15 @@ 50.56.130.222 permit 52.1.14.157 permit 52.5.230.59 permit +52.13.214.179 permit +52.26.1.71 permit 52.27.5.72 permit 52.27.28.47 permit 52.28.63.81 permit +52.34.181.151 permit 52.36.138.31 permit 52.37.142.146 permit +52.42.203.116 permit 52.50.24.208 permit 52.58.216.183 permit 52.59.143.3 permit @@ -272,12 +298,12 @@ 54.213.20.246 permit 54.214.39.184 permit 54.240.0.0/18 permit -54.240.64.0/19 permit -54.240.96.0/19 permit +54.240.64.0/18 permit 54.241.16.209 permit 54.244.54.130 permit 54.244.242.0/24 permit 54.255.61.23 permit +56.124.6.228 permit 57.103.64.0/18 permit 62.13.128.0/24 permit 62.13.129.128/25 permit @@ -293,6 +319,7 @@ 63.128.21.0/24 permit 63.143.57.128/25 permit 63.143.59.128/25 permit +63.176.194.123 permit 64.18.0.0/20 permit 64.20.241.45 permit 64.69.212.0/24 permit @@ -358,6 +385,7 @@ 65.110.161.77 permit 65.123.29.213 permit 65.123.29.220 permit +65.154.166.0/24 permit 65.212.180.36 permit 66.102.0.0/20 permit 66.119.150.192/26 permit @@ -1153,6 +1181,7 @@ 99.83.190.102 permit 103.9.96.0/22 permit 103.28.42.0/24 permit +103.122.78.238 permit 103.151.192.0/23 permit 103.168.172.128/27 permit 103.237.104.0/22 permit @@ -1287,6 +1316,7 @@ 106.50.16.0/28 permit 107.20.18.111 permit 107.20.210.250 permit +107.22.191.150 permit 108.174.0.0/24 permit 108.174.0.215 permit 108.174.3.0/24 permit @@ -1321,6 +1351,9 @@ 117.120.16.0/21 permit 119.42.242.52/31 permit 119.42.242.156 permit +121.244.91.48 permit +121.244.91.52 permit +122.15.156.182 permit 123.126.78.64/29 permit 124.108.96.24/31 permit 124.108.96.28/31 permit @@ -1383,7 +1416,21 @@ 134.170.141.64/26 permit 134.170.143.0/24 permit 134.170.174.0/24 permit +135.84.80.0/24 permit +135.84.81.0/24 permit +135.84.82.0/24 permit +135.84.83.0/24 permit 135.84.216.0/22 permit +136.143.160.0/24 permit +136.143.161.0/24 permit +136.143.162.0/24 permit +136.143.176.0/24 permit +136.143.177.0/24 permit +136.143.178.49 permit +136.143.182.0/23 permit +136.143.184.0/24 permit +136.143.188.0/24 permit +136.143.190.0/23 permit 136.147.128.0/20 permit 136.147.135.0/24 permit 136.147.176.0/20 permit @@ -1398,6 +1445,7 @@ 139.138.46.219 permit 139.138.57.55 permit 139.138.58.119 permit +139.167.79.86 permit 139.180.17.0/24 permit 140.238.148.191 permit 141.148.159.229 permit @@ -1518,6 +1566,9 @@ 164.152.23.32 permit 164.152.25.241 permit 164.177.132.168/30 permit +165.173.128.0/24 permit +165.173.180.250/31 permit +165.173.182.250/31 permit 166.78.68.0/22 permit 166.78.68.221 permit 166.78.69.169 permit @@ -1546,6 +1597,13 @@ 168.245.12.252 permit 168.245.46.9 permit 168.245.127.231 permit +169.148.129.0/24 permit +169.148.131.0/24 permit +169.148.142.10 permit +169.148.144.0/25 permit +169.148.144.10 permit +169.148.146.0/23 permit +169.148.188.182 permit 170.10.128.0/24 permit 170.10.129.0/24 permit 170.10.132.56/29 permit @@ -1722,7 +1780,16 @@ 199.16.156.0/22 permit 199.33.145.1 permit 199.33.145.32 permit +199.34.22.36 permit 199.59.148.0/22 permit +199.67.80.2 permit +199.67.80.20 permit +199.67.82.2 permit +199.67.82.20 permit +199.67.84.0/24 permit +199.67.86.0/24 permit +199.67.88.0/24 permit +199.67.90.0/24 permit 199.101.161.130 permit 199.101.162.0/25 permit 199.122.120.0/21 permit @@ -1779,6 +1846,8 @@ 204.92.114.187 permit 204.92.114.203 permit 204.92.114.204/31 permit +204.141.32.0/23 permit +204.141.42.0/23 permit 204.220.160.0/21 permit 204.220.168.0/21 permit 204.220.176.0/20 permit @@ -1998,6 +2067,8 @@ 216.99.5.68 permit 216.109.114.32/27 permit 216.109.114.64/29 permit +216.113.162.65 permit +216.113.163.65 permit 216.128.126.97 permit 216.136.162.65 permit 216.136.162.120/29 permit @@ -2046,6 +2117,9 @@ 2603:1030:20e:3::23c permit 2603:1030:b:3::152 permit 2603:1030:c02:8::14 permit +2607:13c0:0001:0000:0000:0000:0000:7000/116 permit +2607:13c0:0002:0000:0000:0000:0000:1000/116 permit +2607:13c0:0004:0000:0000:0000:0000:0000/116 permit 2607:f8b0:4000::/36 permit 2620:109:c003:104::/64 permit 2620:109:c003:104::215 permit From 5861c9af29d7902995426d0779fefeedc11d2282 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Mon, 16 Jun 2025 19:45:13 +0200 Subject: [PATCH 006/180] [Web] Updated lang.cs-cz.json (#6589) --- data/web/lang/lang.cs-cz.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/web/lang/lang.cs-cz.json b/data/web/lang/lang.cs-cz.json index b33332f66..9ef0304c8 100644 --- a/data/web/lang/lang.cs-cz.json +++ b/data/web/lang/lang.cs-cz.json @@ -404,9 +404,9 @@ "iam_client_scopes": "Scopes klienta", "iam_default_template": "Výchozí šablona", "iam_description": "Nastavení externího poskytovatele ověření
Schránky uživatele se vytvoří po prvním přihlášení automaticky, pokud je tedy nastaveno mapování atributů.", - "iam_extra_permission": "Aby vše fungovalo, musí mít mailcow klient v Keycloaku nastavený servisní účet a povolení view-users.", + "iam_extra_permission": "Aby vše fungovalo, musí mít mailcow klient v Keycloaku nastavený servisní účet a povolení view-users.", "iam_host": "Hostitel", - "iam_host_info": "Zadejte jeden či více hostitelů, oddělte čárkou", + "iam_host_info": "Zadejte jeden či více hostitelů, oddělte čárkou.", "iam_import_users": "Importovat uživatele" }, "danger": { @@ -1180,7 +1180,7 @@ "recovery_email_sent": "E-mail k obnovení byl odeslán na adresu %s", "custom_login_modified": "Úpravy přihlašování úspěšně uloženy", "domain_add_dkim_available": "Klíč DKIM už existoval", - "f2b_banlist_refreshed": "Seznam zákazů úspěšně obnoven", + "f2b_banlist_refreshed": "Seznam zákazů úspěšně obnoven.", "iam_test_connection": "Spojení úspěšně navázano", "ip_check_opt_in_modified": "Kontrola IP adresy úspěšně uložena", "mailbox_renamed": "Schránka přejmenována z %s na %s", @@ -1212,7 +1212,7 @@ "yubi_otp": "Yubico OTP ověření", "u2f_deprecated": "Zdá se, že váš klíč byl registrován zastaralou metodou U2F. Dojde k deaktivaci dvoufaktorové autentifikace a smazání klíče.", "authenticators": "Autentifikátory", - "u2f_deprecated_important": "Registrujte svůj klíč novou metodou WebAuthn ve správě správců" + "u2f_deprecated_important": "Registrujte svůj klíč novou metodou WebAuthn ve správě správců." }, "user": { "action": "Akce", From cc0e4fee9dbaf99e02a5369ce5e4e17d016075aa Mon Sep 17 00:00:00 2001 From: milkmaker Date: Fri, 20 Jun 2025 18:14:22 +0200 Subject: [PATCH 007/180] [Web] Updated lang.si-si.json (#6599) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matjaž Tekavec --- data/web/lang/lang.si-si.json | 43 ++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json index 2028996aa..dd1c13607 100644 --- a/data/web/lang/lang.si-si.json +++ b/data/web/lang/lang.si-si.json @@ -353,14 +353,14 @@ "copy_to_clipboard": "Besedilo kopirano v odložišče!", "f2b_manage_external": "Zunanje upravljanje Fail2Ban", "f2b_manage_external_info": "Fail2ban bo še vedno vzdrževal seznam prepovedi, vendar ne bo aktivno nastavil pravil za blokiranje prometa. Uporabite spodnji ustvarjeni seznam prepovedi za zunanje blokiranje prometa.", - "force_sso_text": "Če je konfiguriran zunanji ponudnik OIDC, ta možnost skrije privzete obrazce za prijavo v Mailcow in prikaže samo gumb za enkratno prijavo.", + "force_sso_text": "Če je konfiguriran zunanji ponudnik OIDC, ta možnost skrije privzete obrazce za prijavo v Mailcow in prikaže samo gumb za enotno prijavo", "app_hide": "Skrij za prijavo", "iam_login_provisioning": "Samodejno ustvarjanje uporabnikov ob prijavi", "admin_quicklink": "Skrij hitro povezavo do strani za prijavo skrbnika", "login_page": "Prijavna stran", "domainadmin_quicklink": "Skrij hitro povezavo do strani za prijavo v Skrbnik domen", "filter": "Filter", - "force_sso": "Onemogoči prijavo v Mailcow in prikaži samo enotno prijavo", + "force_sso": "Onemogoči prijavo v mailcow in prikaži samo enotno prijavo", "iam": "Ponudnik identitete", "iam_attribute_field": "Polje atributa", "iam_authorize_url": "Končna točka avtorizacije", @@ -927,7 +927,44 @@ "filter_table": "Filtriraj tabelo", "excludes": "Izključuje", "last_run": "Zadnji zagon", - "sieve_preset_2": "Vedno označi e-pošto določenega pošiljatelja kot videno" + "sieve_preset_2": "Vedno označi e-pošto določenega pošiljatelja kot videno", + "target_address": "Pojdi na naslov", + "syncjob_EXIT_TLS_FAILURE": "Težava s šifrirano povezavo", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Ni mogoče vzpostaviti povezave z oddaljenim strežnikom", + "tls_map_parameters_info": "Prazno ali parametri, na primer: protocols=!SSLv2 ciphers=medium exclude=3DES", + "tls_policy_maps_enforced_tls": "Ti pravilniki bodo preglasili tudi vedenje uporabnikov poštnih predalov, ki vsiljujejo odhodne povezave TLS. Če spodaj ni pravilnika, bodo ti uporabniki uporabili privzete vrednosti, določene kot smtp_tls_mandatory_protocols in smtp_tls_mandatory_ciphers.", + "spam_aliases": "Začasni vzdevek", + "sieve_preset_3": "Tiho zavrzite, ustavite vso nadaljnjo obdelavo s presejanjem", + "sieve_preset_4": "Vloži v mapo PREJETO, preskoči nadaljnjo obdelavo s sitastimi filtri", + "sieve_preset_5": "Samodejni odzivnik (dopust)", + "sieve_preset_6": "Zavrni pošto z odgovorom", + "sieve_preset_7": "Preusmeritev in ohrani/opusti", + "sieve_preset_8": "Preusmeritev e-pošte od določenega pošiljatelja, označitev kot prebrano in razvrščanje v podmapo", + "sieve_preset_header": "Spodaj si oglejte primere prednastavitev. Za več podrobnosti glejte Wikipedijo.", + "sogo_visible": "Vzdevek je viden v SOGo", + "sogo_visible_n": "Skrij vzdevek v SOGo", + "sogo_visible_y": "Prikaži vzdevek v SOGo", + "stats": "Statistika", + "status": "Stanje", + "sync_jobs": "Sinhronizacija opravil", + "syncjob_check_log": "Preveri dnevnik", + "syncjob_last_run_result": "Rezultat zadnjega zagona", + "syncjob_EX_OK": "Uspešno", + "syncjob_EXIT_CONNECTION_FAILURE": "Težava s povezavo", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Težava z overjanjem", + "syncjob_EXIT_OVERQUOTA": "Ciljni poštni predal presega kvoto", + "table_size_show_n": "Prikaži %s elementov", + "target_domain": "Ciljna domena", + "template": "Predloga", + "tls_enforce_in": "Uveljavi dohodni TLS", + "tls_enforce_out": "Uveljavi odhodni TLS", + "tls_map_dest": "Cilj", + "tls_map_dest_info": "Primeri: example.org, .example.org, [mail.example.org]:25", + "tls_map_parameters": "Parametri", + "tls_map_policy": "Politika", + "tls_policy_maps": "Zemljevidi pravilnikov TLS", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Napačno uporabniško ime ali geslo", + "templates": "Predloge" }, "fido2": { "known_ids": "Znani ID-ji", From 8a89f5c685869c4fb28165751d1602cd5ad87deb Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Mon, 23 Jun 2025 10:36:49 +0200 Subject: [PATCH 008/180] updated Readme (sponsors) --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 40288f10e..2aad841c2 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,9 @@ A big thank you to everyone supporting us on GitHub Sponsors—your contribution + ### 50$/Month Sponsors Date: Mon, 23 Jun 2025 21:58:50 +0200 Subject: [PATCH 009/180] [Web] Updated lang.si-si.json (#6600) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matjaž Tekavec --- data/web/lang/lang.si-si.json | 42 ++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json index dd1c13607..e3e35b508 100644 --- a/data/web/lang/lang.si-si.json +++ b/data/web/lang/lang.si-si.json @@ -964,7 +964,14 @@ "tls_map_policy": "Politika", "tls_policy_maps": "Zemljevidi pravilnikov TLS", "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Napačno uporabniško ime ali geslo", - "templates": "Predloge" + "templates": "Predloge", + "tls_policy_maps_long": "Preglasitve zemljevidov pravilnikov odhodnega TLS", + "table_size": "Velikost tabele", + "toggle_all": "Preklopi vse", + "username": "Uporabniško ime", + "waiting": "Čakanje", + "yes": "✓", + "weekly": "Tedensko" }, "fido2": { "known_ids": "Znani ID-ji", @@ -997,5 +1004,38 @@ "restart_netfilter": "Znova zaženite omrežni filter", "restart_sogo": "Znova zaženite SOGo", "user_settings": "Uporabniške nastavitve" + }, + "quarantine": { + "learn_spam_delete": "Uči se kot neželena pošta in izbriši", + "medium_danger": "Srednje", + "notified": "Obveščen", + "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
»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
Upoštevajte, da je učenje več sporočil lahko – odvisno od vašega sistema – zamudno.
Elementi na črnem seznamu so izključeni iz karantene.", + "junk_folder": "Mapa z neželeno pošto", + "action": "Dejanje", + "atts": "Priloge", + "check_hash": "Iskanje zgoščene vrednosti datoteke @ VT", + "confirm": "Potrdi", + "confirm_delete": "Potrdite brisanje tega elementa.", + "danger": "Nevarnost", + "deliver_inbox": "Dostavi v mapo »Prejeto«", + "disabled_by_config": "Trenutna konfiguracija sistema onemogoča funkcionalnost karantene. Nastavite »število hranjenj na poštni predal« in »največjo velikost« za elemente karantene.", + "download_eml": "Prenesi (.eml)", + "empty": "Ni rezultatov", + "high_danger": "Visoko", + "info": "Informacija", + "neutral_danger": "Nevtralno", + "qhandler_success": "Zahteva je bila uspešno poslana v sistem. Zdaj lahko zaprete okno.", + "qid": "Rspamd QID", + "qitem": "Predmet iz karantene" + }, + "oauth2": { + "access_denied": "Za odobritev dostopa prek OAuth2 se prijavite kot lastnik poštnega predala.", + "authorize_app": "Avtorizacija aplikacije", + "deny": "Zavrni", + "permit": "Avtorizacija aplikacije", + "profile": "Profil", + "profile_desc": "Ogled osebnih podatkov: uporabniško ime, polno ime, ustvarjeno, spremenjeno, aktivno", + "scope_ask_permission": "Aplikacija je zahtevala naslednja dovoljenja" } } From 4e7adacda9643f5c91dd64350e4f4a6a0573afef Mon Sep 17 00:00:00 2001 From: milkmaker Date: Tue, 24 Jun 2025 20:06:38 +0200 Subject: [PATCH 010/180] [Web] Updated lang.si-si.json (#6601) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matjaž Tekavec --- data/web/lang/lang.si-si.json | 162 +++++++++++++++++++++++++++++++++- 1 file changed, 160 insertions(+), 2 deletions(-) diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json index e3e35b508..91d4916ac 100644 --- a/data/web/lang/lang.si-si.json +++ b/data/web/lang/lang.si-si.json @@ -971,7 +971,9 @@ "username": "Uporabniško ime", "waiting": "Čakanje", "yes": "✓", - "weekly": "Tedensko" + "weekly": "Tedensko", + "sieve_info": "Na uporabnika lahko shranite več filtrov, vendar je lahko hkrati aktiven le en predfilter in en postfilter.
\nVsak filter bo obdelan v opisanem vrstnem redu. Niti neuspešen skript niti izdan ukaz »keep;« ne bosta ustavila obdelave nadaljnjih skript. Spremembe globalnih skriptov sita bodo sprožile ponovni zagon Dovecota.

Globalni predfilter sita • Predfilter • Uporabniški skripti • Postfilter • Globalni postfilter sita", + "tls_policy_maps_info": "Ta preslikava pravilnikov preglasi pravila odhodnega prenosa TLS neodvisno od uporabnikovih nastavitev pravilnikov TLS.
\n Za več informacij preverite
dokumentacijo »smtp_tls_policy_maps«." }, "fido2": { "known_ids": "Znani ID-ji", @@ -1027,7 +1029,36 @@ "neutral_danger": "Nevtralno", "qhandler_success": "Zahteva je bila uspešno poslana v sistem. Zdaj lahko zaprete okno.", "qid": "Rspamd QID", - "qitem": "Predmet iz karantene" + "qitem": "Predmet iz karantene", + "spam_score": "Rezultat", + "text_from_html_content": "Vsebina (pretvorjen html)", + "quarantine": "Karantena", + "quick_delete_link": "Odpri povezavo za hitro brisanje", + "quick_info_link": "Odpri povezavo z informacijami", + "quick_release_link": "Odpri povezavo za hitro objavo", + "rcpt": "Prejemnik", + "received": "Prejeto", + "recipients": "Prejemniki", + "refresh": "Osveži", + "rejected": "Zavrnjeno", + "release": "Izdaja", + "release_body": "Vaše sporočilo smo priložili kot datoteko eml temu sporočilu.", + "release_subject": "Potencialno škodljiv predmet v karanteni %s", + "remove": "Odstrani", + "rewrite_subject": "Prepiši zadevo", + "rspamd_result": "Rezultat Rspamd", + "sender": "Pošiljatelj (SMTP)", + "sender_header": "Pošiljatelj (glava »Od«)", + "settings_info": "Največje število elementov za karanteno: %s
Največja velikost e-pošte: %s MiB", + "show_item": "Prikaži element", + "spam": "Neželena pošta", + "subj": "Zadeva", + "table_size": "Velikost tabele", + "table_size_show_n": "Prikaži %s elementov", + "text_plain_content": "Vsebina (besedilo/navadno)", + "toggle_all": "Preklopi vse", + "type": "Vrsta", + "quick_actions": "Dejanja" }, "oauth2": { "access_denied": "Za odobritev dostopa prek OAuth2 se prijavite kot lastnik poštnega predala.", @@ -1037,5 +1068,132 @@ "profile": "Profil", "profile_desc": "Ogled osebnih podatkov: uporabniško ime, polno ime, ustvarjeno, spremenjeno, aktivno", "scope_ask_permission": "Aplikacija je zahtevala naslednja dovoljenja" + }, + "queue": { + "info": "Čakalna vrsta pošte vsebuje vsa e-poštna sporočila, ki čakajo na dostavo. Če je e-poštno sporočilo dlje časa obtičalo v čakalni vrsti, ga sistem samodejno izbriše.
Sporočilo o napaki ustreznega e-poštnega sporočila vsebuje informacije o tem, zakaj sporočila ni bilo mogoče dostaviti.", + "delete": "Izbriši vse", + "flush": "Izprazni čakalno vrsto", + "legend": "Funkcije dejanj čakalne vrste pošte:", + "ays": "Potrdite, da želite izbrisati vse elemente iz trenutne čakalne vrste.", + "deliver_mail": "Dostavi", + "deliver_mail_legend": "Poskusi ponovne dostave izbranih e-poštnih sporočil.", + "hold_mail": "Zadrži", + "hold_mail_legend": "Zadrži izbrano pošto. (Prepreči nadaljnje poskuse dostave)", + "queue_manager": "Upravitelj čakalnih vrst", + "show_message": "Prikaži sporočilo", + "unban": "odblokiraj čakalno vrsto", + "unhold_mail": "Nezadrži", + "unhold_mail_legend": "Sprosti izbrana sporočila za dostavo. (Zahteva predhodno zadržanje)" + }, + "success": { + "eas_reset": "Naprave ActiveSync za uporabnika %s so bile ponastavljene", + "alias_added": "Dodan je bil vzdevek %s (%d)", + "app_passwd_added": "Dodano novo geslo za aplikacijo", + "domain_add_dkim_available": "Ključ DKIM je že obstajal", + "custom_login_modified": "Prilagoditev prijave je bila uspešno shranjena", + "rl_saved": "Omejitev hitrosti za objekt %s je shranjena", + "domain_admin_modified": "Spremembe skrbnika domene %s so bile shranjene", + "license_modified": "Spremembe licence so bile shranjene", + "pushover_settings_edited": "Nastavitve Pushoverja so bile uspešno nastavljene, preverite poverilnice.", + "mailbox_renamed": "Poštni nabiralnik je bil preimenovan iz %s v %s", + "recovery_email_sent": "E-poštno sporočilo za obnovitev je bilo poslano na %s", + "relayhost_removed": "Vnos na zemljevidu %s je bil odstranjen", + "acl_saved": "ACL za objekt %s shranjen", + "admin_added": "Dodan je bil skrbnik %s", + "admin_api_modified": "Spremembe API-ja so bile shranjene", + "admin_modified": "Spremembe skrbnika so bile shranjene", + "admin_removed": "Administrator %s je bil odstranjen", + "alias_domain_removed": "Vzdevek domene %s je bil odstranjen", + "alias_modified": "Spremembe vzdevka %s so bile shranjene", + "alias_removed": "Vzdevek %s je bil odstranjen", + "aliasd_added": "Dodan vzdevek domene %s", + "aliasd_modified": "Spremembe vzdevka domene %s so bile shranjene", + "app_links": "Shranjene spremembe povezav aplikacij", + "app_passwd_removed": "Odstranjen ID gesla za aplikacijo %s", + "bcc_deleted": "Vnosi na zemljevidu BCC so izbrisani: %s", + "bcc_edited": "Vnos na zemljevidu BCC %s je bil urejen", + "db_init_complete": "Inicializacija baze podatkov končana", + "delete_filter": "Izbrisani filtri ID %s", + "delete_filters": "Izbrisani filtri: %s", + "deleted_syncjob": "Izbrisan ID sinhronizacijskega opravila %s", + "deleted_syncjobs": "Izbrisana opravila sinhronizacije: %s", + "dkim_added": "Ključ DKIM %s je bil shranjen", + "dkim_duplicated": "Ključ DKIM za domeno %s je bil kopiran v %s", + "dkim_removed": "Ključ DKIM %s je bil odstranjen", + "domain_added": "Dodana domena %s", + "domain_admin_added": "Dodan je bil skrbnik domene %s", + "domain_admin_removed": "Skrbnik domene %s je bil odstranjen", + "domain_footer_modified": "Spremembe v nogi domene %s so bile shranjene", + "domain_modified": "Spremembe domene %s so bile shranjene", + "domain_removed": "Domena %s je bila odstranjena", + "dovecot_restart_success": "Dovecot je bil uspešno ponovno zagnan", + "f2b_banlist_refreshed": "ID seznama prepovedanih je bil uspešno osvežen.", + "f2b_modified": "Spremembe parametrov Fail2ban so bile shranjene", + "forwarding_host_added": "Dodan je bil posredovalni gostitelj %s", + "forwarding_host_removed": "Gostitelj za posredovanje %s je bil odstranjen", + "global_filter_written": "Filter je bil uspešno zapisan v datoteko", + "hash_deleted": "Zgoščena vrednost je izbrisana", + "iam_test_connection": "Povezava je bila uspešna", + "ip_check_opt_in_modified": "Preverjanje IP-ja je bilo uspešno shranjeno", + "item_deleted": "Element %s je bil uspešno izbrisan", + "items_deleted": "Element %s je bil uspešno izbrisan", + "items_released": "Izbrani elementi so bili izdani", + "logged_in_as": "Prijavljen kot %s", + "mailbox_added": "Dodan je bil poštni predal %s", + "mailbox_modified": "Spremembe poštnega nabiralnika %s so bile shranjene", + "mailbox_removed": "Poštni nabiralnik %s je bil odstranjen", + "nginx_reloaded": "Nginx je bil ponovno naložen", + "object_modified": "Spremembe objekta %s so bile shranjene", + "password_policy_saved": "Pravilnik o geslih je bil uspešno shranjen", + "password_changed_success": "Geslo je bilo uspešno spremenjeno", + "qlearn_spam": "Sporočilo z ID-jem %s je bilo prepoznano kot neželena pošta in izbrisano", + "queue_command_success": "Ukaz za čakalno vrsto je bil uspešno zaključen", + "recipient_map_entry_deleted": "ID zemljevida prejemnika %s je bil izbrisan", + "recipient_map_entry_saved": "Vnos zemljevida prejemnika »%s« je bil shranjen", + "relayhost_added": "Dodan je bil vnos na zemljevid %s", + "reset_main_logo": "Ponastavi na privzeti logotip", + "resource_added": "Dodan je bil vir %s", + "resource_modified": "Spremembe poštnega nabiralnika %s so bile shranjene", + "resource_removed": "Vir %s je bil odstranjen", + "rspamd_ui_pw_set": "Geslo uporabniškega vmesnika Rspamd je bilo uspešno nastavljeno", + "settings_map_added": "Dodan vnos nastavitev zemljevida", + "settings_map_removed": "Odstranjen ID zemljevida nastavitev %s", + "sogo_profile_reset": "Profil SOGo za uporabnika %s je bil ponastavljen", + "template_added": "Dodana predloga %s", + "template_modified": "Spremembe predloge %s so bile shranjene", + "template_removed": "ID predloge %s je bil izbrisan", + "tls_policy_map_entry_deleted": "ID zemljevida pravilnika TLS %s je bil izbrisan", + "tls_policy_map_entry_saved": "Vnos zemljevida pravilnika TLS »%s« je bil shranjen", + "ui_texts": "Shranjene spremembe besedil uporabniškega vmesnika", + "upload_success": "Datoteka je bila uspešno naložena", + "verified_fido2_login": "Preverjena prijava v FIDO2", + "verified_totp_login": "Preverjena prijava v TOTP", + "verified_webauthn_login": "Preverjena prijava v WebAuth", + "verified_yotp_login": "Preverjena prijava z enkratnim geslom Yubico", + "bcc_saved": "Vnos na zemljevidu BCC je shranjen", + "cors_headers_edited": "Nastavitve CORS so bile shranjene", + "item_released": "Izdan je bil element %s", + "saved_settings": "Shranjene nastavitve" + }, + "start": { + "imap_smtp_server_auth_info": "Prosimo, uporabite svoj celoten e-poštni naslov in mehanizem za preverjanje pristnosti PLAIN.
\nVaši podatki za prijavo bodo šifrirani z obveznim šifriranjem na strani strežnika.", + "help": "Prikaži/skrij ploščo s pomočjo" + }, + "tfa": { + "api_register": "%s uporablja Yubico Cloud API. Pridobite API ključ za svoj ključ tukaj", + "authenticators": "Preverjevalniki pristnosti", + "confirm": "Potrdi", + "delete_tfa": "Onemogoči TFA", + "disable_tfa": "Onemogoči TFA do naslednje uspešne prijave", + "enter_qr_code": "Vaša koda TOTP, če vaša naprava ne more skenirati kod QR", + "error_code": "Koda napake", + "confirm_totp_token": "Spremembe potrdite z vnosom ustvarjenega žetona." + }, + "ratelimit": { + "disabled": "Onemogočeno", + "second": "sporočil / sekundo", + "minute": "sporočil / minuto", + "hour": "sporočil / uro", + "day": "sporočil / dan" } } From a0f5454c2a980c9de255fdc4b777bf1aad958858 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Sun, 29 Jun 2025 18:12:59 +0200 Subject: [PATCH 011/180] [Web] Updated lang.si-si.json (#6609) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matjaž Tekavec --- data/web/lang/lang.si-si.json | 212 +++++++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 4 deletions(-) diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json index 91d4916ac..474328e38 100644 --- a/data/web/lang/lang.si-si.json +++ b/data/web/lang/lang.si-si.json @@ -407,7 +407,8 @@ "reset_password_vars": "{{link}} Ustvarjena povezava za ponastavitev gesla
{{username}} Ime nabiralnika uporabnika, ki je zahteval ponastavitev gesla
{{username2}} Ime obnovitvenega nabiralnika
{{date}} Datum zahteve za ponastavitev gesla
{{token_lifetime}} Življenjska doba žetona v minutah
{{hostname}} Ime gostitelja mailcow", "restore_template": "Za obnovitev privzete predloge pustite polje prazno.", "task": "Naloga", - "user_link": "Uporabniška povezava" + "user_link": "Uporabniška povezava", + "iam_realm": "Realm" }, "danger": { "alias_goto_identical": "Alias in goto naslov morata biti identična", @@ -813,7 +814,7 @@ "booking_ltnull": "Neomejeno, vendar se ob rezervaciji prikaži kot zasedeno", "alias_domain_alias_hint": "Vzdevki se na vzdevke domen samodejno ne uporabijo. Naslov vzdevka my-alias@domain ne pokriva naslova my-alias@alias-domain (kjer je \"vzdevek domene\" namišljeni vzdevek domene za \"domeno\").
Za preusmeritev pošte v zunanji nabiralnik uporabite filter sito (glejte zavihek »Filtri« ali uporabite SOGo -> Posrednik). Za samodejno dodajanje manjkajočih vzdevkov uporabite \"Razširi vzdevek čez domene vzdevkov\".", "q_all": " ob premiku v mapo Neželena pošta in ob zavrnitvi", - "bcc_info": "BCC zemljevidi se uporabljajo za tiho posredovanje kopij vseh sporočil na drug naslov. Vnos vrste preslikave prejemnika se uporablja, kadar lokalni cilj deluje kot prejemnik pošte. Preslikave pošiljatelja delujejo po istem načelu.
\nLokalni cilj ne bo obveščen o neuspeli dostavi.", + "bcc_info": "BCC zemljevidi se uporabljajo za tiho posredovanje kopij vseh sporočil na drug naslov. Vnos vrste preslikave prejemnika se uporablja, kadar lokalni cilj deluje kot prejemnik pošte. Preslikave pošiljatelja delujejo po istem načelu.
\n Lokalni cilj ne bo obveščen o neuspeli dostavi.", "force_pw_update": "Vsiljena posodobitev gesla ob naslednji prijavi", "recipient_map_new_info": "Cilj zemljevida prejemnika mora biti veljaven e-poštni naslov ali ime domene.", "recipient_map_old_info": "Izvirni cilj prejemnika mora biti veljaven e-poštni naslov ali ime domene.", @@ -1173,7 +1174,8 @@ "bcc_saved": "Vnos na zemljevidu BCC je shranjen", "cors_headers_edited": "Nastavitve CORS so bile shranjene", "item_released": "Izdan je bil element %s", - "saved_settings": "Shranjene nastavitve" + "saved_settings": "Shranjene nastavitve", + "learned_ham": "Uspešno naučen ID %s kot zaželjen" }, "start": { "imap_smtp_server_auth_info": "Prosimo, uporabite svoj celoten e-poštni naslov in mehanizem za preverjanje pristnosti PLAIN.
\nVaši podatki za prijavo bodo šifrirani z obveznim šifriranjem na strani strežnika.", @@ -1187,7 +1189,25 @@ "disable_tfa": "Onemogoči TFA do naslednje uspešne prijave", "enter_qr_code": "Vaša koda TOTP, če vaša naprava ne more skenirati kod QR", "error_code": "Koda napake", - "confirm_totp_token": "Spremembe potrdite z vnosom ustvarjenega žetona." + "confirm_totp_token": "Spremembe potrdite z vnosom ustvarjenega žetona", + "tfa": "Dvofaktorska avtentikacija", + "webauthn": "Preverjanje pristnosti WebAuthn", + "none": "Deaktiviraj", + "init_webauthn": "Inicializacija, prosim počakajte...", + "key_id": "Identifikator za vašo napravo", + "key_id_totp": "Identifikator za vaš ključ", + "reload_retry": "- (če napaka vztraja, znova zaženite brskalnik)", + "scan_qr_code": "Prosimo, skenirajte naslednjo kodo z aplikacijo za preverjanje pristnosti ali jo vnesite ročno.", + "select": "Prosimo, izberite", + "set_tfa": "Nastavite metodo dvofaktorske avtentikacije", + "start_webauthn_validation": "Začni validacijo", + "tfa_token_invalid": "Žeton TFA neveljaven", + "totp": "Enkratno geslo na podlagi časa (Google Authenticator, Authy itd.)", + "u2f_deprecated": "Zdi se, da je bil vaš ključ registriran z zastarelo metodo U2F. Deaktivirali bomo dvofaktorsko overjanje in izbrisali vaš ključ.", + "u2f_deprecated_important": "Prosimo, registrirajte svoj ključ v skrbniški plošči z novo metodo WebAuthn.", + "waiting_usb_auth": "Čakanje na napravo USB ...

Zdaj se dotaknite gumba na napravi USB.", + "waiting_usb_register": "Čakanje na napravo USB ...

Vnesite svoje geslo zgoraj in potrdite registracijo tako, da tapnete gumb na napravi USB.", + "yubi_otp": "Avtentikacija z enkratnim geslom Yubico" }, "ratelimit": { "disabled": "Onemogočeno", @@ -1195,5 +1215,189 @@ "minute": "sporočil / minuto", "hour": "sporočil / uro", "day": "sporočil / dan" + }, + "user": { + "create_syncjob": "Ustvari novo sinhronizacijsko opravilo", + "open_webmail_sso": "Spletna pošta", + "attribute": "Atribut", + "description": "Opis", + "direct_aliases_desc": "Na neposredne vzdevke vplivajo nastavitve filtra neželene pošte in pravilnika TLS.", + "direct_protocol_access": "Ta uporabnik poštnega predala ima neposreden zunanji dostop do naslednjih protokolov in aplikacij. To nastavitev nadzoruje vaš skrbnik. Za dostop do posameznih protokolov in aplikacij je mogoče ustvariti gesla za aplikacije.
Gumb »Spletna pošta« omogoča enotno prijavo v SOGo in je vedno na voljo.", + "shared_aliases_desc": "Na uporabniške nastavitve, kot sta filter neželene pošte ali pravilnik za šifriranje, ne vplivajo skupni vzdevki. Ustrezne filtre neželene pošte lahko nastavi le skrbnik kot pravilnik za celotno domeno.", + "force_pw_update": "Za dostop do storitev, povezanih s skupinsko programsko opremo, morate nastaviti novo geslo.", + "new_password": "Novo geslo", + "password_reset_info": "Če ni naveden e-poštni naslov za obnovitev gesla, te funkcije ni mogoče uporabiti.", + "pushover_sender_array": "Upoštevajte naslednje e-poštne naslove pošiljateljev (ločeni z vejico)", + "tag_help_explain": "V podmapi: pod mapo INBOX (\"INBOX/Facebook\") bo ustvarjena nova podmapa, poimenovana po oznaki.
\nV zadevi: ime oznake bo dodano pred zadevo e-poštnega sporočila, na primer: \"[Facebook] Moje novice\".", + "pushover_vars": "Če filter pošiljatelja ni definiran, bodo upoštevana vsa e-poštna sporočila.
Filtre regularnih izrazov in natančna preverjanja pošiljateljev je mogoče definirati posamično in bodo obravnavana zaporedno. Niso odvisna drug od drugega.
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.", + "verify": "Preveri", + "spamfilter_bl_desc": "E-poštni naslovi na črnem seznamu, ki jih vedno razvrstite kot neželeno pošto in zavrnete. Zavrnjena pošta ne 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 nikoli 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": "Opozorilo: Če se odločite za uveljavitev šifriranega prenosa pošte, lahko izgubite e-pošto.
Sporočila, ki ne ustrezajo pravilniku, bo poštni sistem zavrnil s popolno napako.
Ta možnost velja za vaš primarni e-poštni naslov (prijavno ime), vse naslove, izpeljane iz vzdevkov domen, in vzdevke, ki imajo samo ta en poštni predal kot cilj.", + "allowed_protocols": "Dovoljeni protokoli", + "title": "Naslov", + "action": "Dejanje", + "active": "Aktivno", + "active_sieve": "Aktiven filter", + "advanced_settings": "Napredne nastavitve", + "alias": "Vzdevek", + "alias_create_random": "Generiraj naključne vzdevke", + "alias_extend_all": "Podaljšaj vzdevek za 1 uro", + "alias_full_date": "d.m.Y, H:i:s T", + "alias_remove_all": "Odstrani vse vzdevke", + "alias_select_validity": "Obdobje veljavnosti", + "alias_time_left": "Preostali čas", + "alias_valid_until": "Veljavno do", + "aliases_also_send_as": "Pošiljanje je dovoljeno tudi kot uporabnik", + "aliases_send_as_all": "Ne preverjaj dostopa pošiljatelja za naslednje domene in njihove vzdevke", + "app_hint": "Gesla aplikacij so alternativna gesla za prijavo v IMAP, SMTP, CalDAV, CardDAV in EAS. Uporabniško ime ostane nespremenjeno. Spletna pošta SOGo ni na voljo prek gesel aplikacij.", + "app_name": "Ime aplikacije", + "app_passwds": "Gesla aplikacij", + "apple_connection_profile": "Profil povezave Apple", + "apple_connection_profile_complete": "Ta profil povezave vključuje parametre IMAP in SMTP ter poti CalDAV (koledarji) in CardDAV (stiki) za napravo Apple.", + "apple_connection_profile_mailonly": "Ta profil povezave vključuje konfiguracijske parametre IMAP in SMTP za napravo Apple.", + "apple_connection_profile_with_app_password": "Novo geslo za aplikacijo se ustvari in doda v profil, tako da pri nastavitvi naprave ni treba vnesti gesla. Datoteke ne delite, saj omogoča poln dostop do vašega nabiralnika.", + "authentication": "Avtentikacija", + "change_password": "Spremeni geslo", + "change_password_hint_app_passwords": "Vaš račun ima %d gesel aplikacij, ki ne bodo spremenjena. Če jih želite upravljati, odprite zavihek Gesla aplikacij.", + "clear_recent_successful_connections": "Jasno vidne uspešne povezave", + "client_configuration": "Prikaži vodnike za konfiguracijo e-poštnih odjemalcev in pametnih telefonov", + "create_app_passwd": "Ustvari geslo za aplikacijo", + "created_on": "Ustvarjeno dne", + "daily": "Dnevno", + "day": "dan", + "delete_ays": "Prosimo, potrdite postopek brisanja.", + "direct_aliases": "Neposredni vzdevki", + "eas_reset": "Ponastavi predpomnilnik naprave ActiveSync", + "eas_reset_help": "V mnogih primerih bo ponastavitev predpomnilnika naprave pomagala obnoviti pokvarjen profil ActiveSync.
Pozor: Vsi elementi bodo ponovno preneseni!", + "eas_reset_now": "Ponastavi zdaj", + "edit": "Uredi", + "email": "E-pošta", + "email_and_dav": "E-pošta, koledarji in stiki", + "empty": "Ni rezultatov", + "encryption": "Šifriranje", + "excludes": "Izključuje", + "expire_in": "Poteče čez", + "fido2_webauthn": "FIDO2/WebAuthn", + "from": "od", + "generate": "ustvari", + "hour": "ura", + "hourly": "Urno", + "hours": "ure", + "in_use": "Uporabljeno", + "interval": "Interval", + "is_catch_all": "Vseobsegajoča povezava za domeno/e", + "last_mail_login": "Zadnja prijava v e-pošto", + "last_pw_change": "Zadnja sprememba gesla", + "last_run": "Zadnji zagon", + "last_ui_login": "Zadnja prijava v uporabniški vmesnik", + "loading": "Nalaganje ...", + "login_history": "Zgodovina prijav", + "mailbox": "Poštni nabiralnik", + "mailbox_details": "Podrobnosti", + "mailbox_general": "Splošno", + "mailbox_settings": "Nastavitve", + "messages": "sporočila", + "month": "mesec", + "months": "meseci", + "never": "Nikoli", + "new_password_repeat": "Potrditveno geslo (ponovite)", + "no_active_filter": "Ni aktivnega filtra", + "no_last_login": "Ni zadnjih podatkov za prijavo v uporabniški vmesnik", + "no_record": "Ni zapisa", + "open_logs": "Odpri dnevnike", + "overview": "Pregled", + "password": "Geslo", + "password_now": "Trenutno geslo (potrdite spremembe)", + "password_repeat": "Geslo (ponovite)", + "protocols": "Protokoli", + "pushover_evaluate_x_prio": "Eskalacija e-pošte z visoko prioriteto [X-Priority: 1]", + "pushover_info": "Nastavitve potisnih obvestil bodo veljale za vso čisto (ne neželeno) pošto, dostavljeno na %s, vključno z vzdevki (v skupni rabi, brez skupne rabe, označeni).", + "pushover_only_x_prio": "Upoštevaj samo pošto z visoko prioriteto [X-Priority: 1]", + "pushover_sender_regex": "Poišči ujemanje pošiljateljev z naslednjim regularnim izrazom", + "pushover_text": "Besedilo obvestila", + "pushover_title": "Naslov obvestila", + "pushover_sound": "Zvok", + "pushover_verify": "Preverite poverilnice", + "pw_recovery_email": "E-poštno sporočilo za obnovitev gesla", + "q_add_header": "Mapa z neželeno pošto", + "q_reject": "Zavrnjeno", + "quarantine_category": "Kategorija obvestil o karanteni", + "quarantine_category_info": "Kategorija obvestil »Zavrnjeno« vključuje zavrnjeno pošto, medtem ko »Mapa z neželeno pošto« obvesti uporabnika o e-pošti, ki je bila premaknjena v mapo z neželeno pošto.", + "quarantine_notification": "Obvestila o karanteni", + "recent_successful_connections": "Videne uspešne povezave", + "remove": "Odstrani", + "running": "V teku", + "save": "Shrani spremembe", + "save_changes": "Shrani spremembe", + "sender_acl_disabled": "Preverjanje pošiljatelja je onemogočeno", + "shared_aliases": "Skupni vzdevki", + "show_sieve_filters": "Prikaži filter sita aktivnega uporabnika", + "sogo_profile_reset": "Ponastavi profil SOGo", + "sogo_profile_reset_help": "S tem boste uničili uporabnikov profil SOGo in nepovratno izbrisali vse stike in podatke koledarja.", + "sogo_profile_reset_now": "Ponastavi profil zdaj", + "spam_aliases": "Začasni vzdevki e-pošte", + "spam_score_reset": "Ponastavi na privzete nastavitve strežnika", + "spamfilter": "Filter neželene pošte", + "spamfilter_behavior": "Ocena", + "spamfilter_bl": "Črna lista", + "spamfilter_default_score": "Privzete vrednosti", + "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_red": "Rdeča: To sporočilo je neželena pošta in ga bo strežnik zavrnil.", + "spamfilter_table_action": "Dejanje", + "spamfilter_table_add": "Dodaj element", + "spamfilter_table_domain_policy": "ni na voljo (pravilnik domene)", + "spamfilter_table_empty": "Ni podatkov za prikaz", + "spamfilter_table_remove": "odstrani", + "spamfilter_table_rule": "Pravilo", + "spamfilter_wl": "Bela lista", + "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", + "sync_jobs": "Sinhronizacija opravil", + "syncjob_check_log": "Preveri dnevnik", + "syncjob_last_run_result": "Rezultat zadnjega zagona", + "syncjob_EXIT_CONNECTION_FAILURE": "Težava s povezavo", + "syncjob_EXIT_TLS_FAILURE": "Težava s šifrirano povezavo", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Težava z overjanjem", + "syncjob_EXIT_OVERQUOTA": "Ciljni poštni predal presega kvoto", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Ni mogoče vzpostaviti povezave z oddaljenim strežnikom", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Napačno uporabniško ime ali geslo", + "tag_handling": "Nastavitev obravnave označene pošte", + "tag_help_example": "Primer označenega e-poštnega naslova: jaz+Facebook@example.org", + "tag_in_none": "Ne naredi ničesar", + "tag_in_subfolder": "V podmapi", + "tag_in_subject": "V zadevi", + "text": "Besedilo", + "tfa_info": "Dvofaktorska avtentikacija pomaga zaščititi vaš račun. Če jo omogočite, boste za prijavo v aplikacije ali storitve, ki ne podpirajo dvofaktorske avtentikacije (npr. poštni odjemalci), potrebovali gesla za aplikacije.", + "tls_enforce_in": "Uveljavi dohodni TLS", + "tls_enforce_out": "Uveljavi odhodni TLS", + "tls_policy": "Pravilnik o šifriranju", + "user_settings": "Uporabniške nastavitve", + "username": "Uporabniško ime", + "value": "Vrednost", + "week": "teden", + "weekly": "Tedensko", + "weeks": "tedni", + "with_app_password": "z geslom za aplikacijo", + "year": "leto", + "years": "leta", + "waiting": "Čakanje", + "q_all": "Vse kategorije", + "syncjob_EX_OK": "Uspeh" + }, + "warning": { + "cannot_delete_self": "Prijavljenega uporabnika ni mogoče izbrisati", + "domain_added_sogo_failed": "Domena je bila dodana, vendar ponovni zagon SOGo ni uspel. Preverite dnevnike strežnika.", + "dovecot_restart_failed": "Dovecota ni uspelo znova zagnati, preverite dnevnike.", + "fuzzy_learn_error": "Napaka učenja mehkega zgoščevanja: %s", + "hash_not_found": "Zgoščena vrednost ni bila najdena ali je bila že izbrisana", + "ip_invalid": "Preskočen neveljaven IP: %s", + "is_not_primary_alias": "Preskočen neprimarni vzdevek %s", + "no_active_admin": "Zadnjega aktivnega skrbnika ni mogoče deaktivirati", + "quota_exceeded_scope": "Kvota domene presežena: V tem obsegu domene je mogoče ustvariti le neomejeno število poštnih predalov.", + "session_token": "Neveljaven žeton obrazca: Neujemanje žetonov", + "session_ua": "Neveljaven žeton obrazca: Napaka pri preverjanju uporabniškega agenta" } } From 1e4f3c55d82503dffa7987499c877780ae7d00d6 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Tue, 1 Jul 2025 17:14:24 +0200 Subject: [PATCH 012/180] [Web] Updated lang.pt-pt.json (#6614) Co-authored-by: luiscanato --- data/web/lang/lang.pt-pt.json | 65 +++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/data/web/lang/lang.pt-pt.json b/data/web/lang/lang.pt-pt.json index baa90f797..fafb957c9 100644 --- a/data/web/lang/lang.pt-pt.json +++ b/data/web/lang/lang.pt-pt.json @@ -1,7 +1,7 @@ { "add": { "active": "Ativo", - "add": "Salvar", + "add": "Guardar", "alias_address": "Apelidos:", "alias_address_info": "Endereço de email completo ou @example.com, para uma conta coringa -catch all. (separado por vírgula). apenas domínios cadastrados.", "alias_domain": "Encaminhamento de Domínio", @@ -17,7 +17,7 @@ "max_mailboxes": "Máximo de contas:", "password": "Senha:", "password_repeat": "Confirmar a senha (repetir):", - "port": "Port", + "port": "Porta", "quota_mb": "Espaço (MiB):", "relay_all": "Relay para todas as contas", "relay_all_info": "Se não selecionar para retransmitir todas as contas, você deve adicionar uma (\"blind\") para cada conta que será direcionada.", @@ -27,13 +27,25 @@ "target_address": "Encaminhar para:", "target_address_info": "Endereço de email completo (separado por vírgulas).", "target_domain": "Domínio de Destino:", - "username": "Administrador" + "username": "Nome de utilizador", + "app_name": "Nome da App", + "destination": "Destino", + "generate": "gerar", + "private_comment": "Comentário privado", + "inactive": "Inativo", + "public_comment": "Comentário público", + "sieve_desc": "Breve descrição", + "sieve_type": "Tipo de filtro", + "subscribeall": "Subscrever todas as pastas", + "syncjob": "Adicionar sincronização", + "validate": "Validar", + "validation_success": "Validado com sucesso" }, "admin": { "access": "Acessos", "action": "Ação", "active": "Ativo", - "add": "Salvar", + "add": "Adicionar", "add_domain_admin": "Adicionar administrador de domínio(s)", "admin": "Administrador", "admin_details": "Editar informações do administrator", @@ -58,7 +70,43 @@ "search_domain_da": "Selecione o(s) domínio(s)", "spamfilter": "Filtro de Spam", "unchanged_if_empty": "Deixar em branco para não alterar", - "username": "Administrador" + "username": "Administrador", + "add_row": "Adicionar linha", + "add_transport": "Adicionar transporte", + "change_logo": "Alterar logo", + "filter": "Filtro", + "iam_port": "Porta", + "iam_use_ssl": "Usar SSL", + "iam_version": "Versão", + "import": "Importar", + "import_private_key": "Importar chave privada", + "message": "Mensagem", + "dkim_private_key": "Chave privada", + "customize": "Personalizar", + "destination": "Destino", + "dkim_from": "De", + "activate_api": "Ativar API", + "add_admin": "Adicionar administrador", + "admins": "Administradores", + "advanced_settings": "Configurações avançadas", + "api_key": "Chave API", + "api_read_only": "Acesso leitura", + "api_read_write": "Acesso leitura e escrita", + "login_page": "Página de login", + "dkim_key_missing": "Chave em falta", + "dkim_key_valid": "Chave válida", + "dkim_to": "Para", + "domain_admin": "Administrador de dominio", + "domain_s": "Dominio(s)", + "duplicate": "Duplicar", + "duplicate_dkim": "Duplicar registo DKIM", + "empty": "Sem resultados", + "excludes": "Excluir estes recipientes", + "f2b_filter": "Filtros de regex", + "from": "De", + "generate": "gerar", + "html": "HTML", + "iam_import_users": "Importar Utilizadores" }, "danger": { "access_denied": "Acesso negado ou dados inválidos", @@ -270,5 +318,10 @@ "username": "Administrador", "week": "Semana", "weeks": "Semanas" + }, + "acl": { + "tls_policy": "Política de TLS", + "quarantine_attachments": "Anexos de quarentena", + "filters": "Filtros" } -} \ No newline at end of file +} From 2fbbbbe9a981ed90834ee838016a3842915a00bd Mon Sep 17 00:00:00 2001 From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> Date: Wed, 2 Jul 2025 08:59:29 +0200 Subject: [PATCH 013/180] [Dovecot] Use Jinja2 sandbox for rendering quota and quarantine notifications --- data/Dockerfiles/dovecot/quarantine_notify.py | 26 ++++++++++++------- data/Dockerfiles/dovecot/quota_notify.py | 22 +++++++++++----- docker-compose.yml | 2 +- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/data/Dockerfiles/dovecot/quarantine_notify.py b/data/Dockerfiles/dovecot/quarantine_notify.py index dfcb1f2c6..824d4092f 100755 --- a/data/Dockerfiles/dovecot/quarantine_notify.py +++ b/data/Dockerfiles/dovecot/quarantine_notify.py @@ -8,7 +8,8 @@ from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import COMMASPACE, formatdate import jinja2 -from jinja2 import Template +from jinja2 import TemplateError +from jinja2.sandbox import SandboxedEnvironment import json import redis import time @@ -80,17 +81,22 @@ try: if len(meta_query) == 0: return msg_count = len(meta_query) + env = SandboxedEnvironment() if r.get('Q_HTML'): - try: - template = Template(r.get('Q_HTML')) - except: - print("Error: Cannot parse quarantine template, falling back to default template.") - with open('/templates/quarantine.tpl') as file_: - template = Template(file_.read()) + try: + template = env.from_string(r.get('Q_HTML')) + except Exception: + print("Error: Cannot parse quarantine template, falling back to default template.") + with open('/templates/quarantine.tpl') as file_: + template = env.from_string(file_.read()) else: - with open('/templates/quarantine.tpl') as file_: - template = Template(file_.read()) - html = template.render(meta=meta_query, username=rcpt, counter=msg_count, hostname=mailcow_hostname, quarantine_acl=quarantine_acl) + with open('/templates/quarantine.tpl') as file_: + template = env.from_string(file_.read()) + try: + html = template.render(meta=meta_query, username=rcpt, counter=msg_count, hostname=mailcow_hostname, quarantine_acl=quarantine_acl) + except (jinja2.exceptions.SecurityError, TemplateError) as ex: + print(f"SecurityError or TemplateError in template rendering: {ex}") + return text = html2text.html2text(html) count = 0 while count < 15: diff --git a/data/Dockerfiles/dovecot/quota_notify.py b/data/Dockerfiles/dovecot/quota_notify.py index 598134e22..99be7cc68 100755 --- a/data/Dockerfiles/dovecot/quota_notify.py +++ b/data/Dockerfiles/dovecot/quota_notify.py @@ -6,7 +6,7 @@ from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import COMMASPACE, formatdate import jinja2 -from jinja2 import Template +from jinja2.sandbox import SandboxedEnvironment import redis import time import json @@ -33,16 +33,24 @@ while True: if r.get('QW_HTML'): try: - template = Template(r.get('QW_HTML')) - except: - print("Error: Cannot parse quarantine template, falling back to default template.") + env = SandboxedEnvironment() + template = env.from_string(r.get('QW_HTML')) + except Exception: + print("Error: Cannot parse quota template, falling back to default template.") with open('/templates/quota.tpl') as file_: - template = Template(file_.read()) + env = SandboxedEnvironment() + template = env.from_string(file_.read()) else: with open('/templates/quota.tpl') as file_: - template = Template(file_.read()) + env = SandboxedEnvironment() + template = env.from_string(file_.read()) + +try: + html = template.render(username=username, percent=percent) +except (jinja2.exceptions.SecurityError, jinja2.TemplateError) as ex: + print(f"SecurityError or TemplateError in template rendering: {ex}") + sys.exit(1) -html = template.render(username=username, percent=percent) text = html2text.html2text(html) try: diff --git a/docker-compose.yml b/docker-compose.yml index a67475316..6db20454e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -251,7 +251,7 @@ services: - sogo dovecot-mailcow: - image: ghcr.io/mailcow/dovecot:2.33 + image: ghcr.io/mailcow/dovecot:2.34 depends_on: - mysql-mailcow - netfilter-mailcow From ec6dbb099aa4ae559b10217906a62da694c6f182 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> Date: Wed, 2 Jul 2025 10:37:23 +0200 Subject: [PATCH 014/180] [ACME] Remove deprecated ACME_CONTACT variable --- data/Dockerfiles/acme/acme.sh | 14 +------ data/Dockerfiles/acme/obtain-certificate.sh | 4 +- docker-compose.yml | 3 +- generate_config.sh | 7 ---- update.sh | 44 ++++++++++----------- 5 files changed, 25 insertions(+), 47 deletions(-) diff --git a/data/Dockerfiles/acme/acme.sh b/data/Dockerfiles/acme/acme.sh index a6766efd0..15b757ff9 100755 --- a/data/Dockerfiles/acme/acme.sh +++ b/data/Dockerfiles/acme/acme.sh @@ -159,18 +159,6 @@ while true; do fi if [[ ! -f ${ACME_BASE}/acme/account.pem ]]; then log_f "Generating missing Lets Encrypt account key..." - if [[ ! -z ${ACME_CONTACT} ]]; then - if ! verify_email "${ACME_CONTACT}"; then - log_f "Invalid email address, will not start registration!" - sleep 365d - exec $(readlink -f "$0") - else - ACME_CONTACT_PARAMETER="--contact mailto:${ACME_CONTACT}" - log_f "Valid email address, using ${ACME_CONTACT} for registration" - fi - else - ACME_CONTACT_PARAMETER="" - fi openssl genrsa 4096 > ${ACME_BASE}/acme/account.pem else log_f "Using existing Lets Encrypt account key ${ACME_BASE}/acme/account.pem" @@ -299,7 +287,7 @@ while true; do VALIDATED_CERTIFICATES+=("${CERT_NAME}") # obtain server certificate if required - ACME_CONTACT_PARAMETER=${ACME_CONTACT_PARAMETER} DOMAINS=${SERVER_SAN_VALIDATED[@]} /srv/obtain-certificate.sh rsa + DOMAINS=${SERVER_SAN_VALIDATED[@]} /srv/obtain-certificate.sh rsa RETURN="$?" if [[ "$RETURN" == "0" ]]; then # 0 = cert created successfully CERT_AMOUNT_CHANGED=1 diff --git a/data/Dockerfiles/acme/obtain-certificate.sh b/data/Dockerfiles/acme/obtain-certificate.sh index 16c4e2588..f476bf666 100644 --- a/data/Dockerfiles/acme/obtain-certificate.sh +++ b/data/Dockerfiles/acme/obtain-certificate.sh @@ -93,8 +93,8 @@ until dig letsencrypt.org +time=3 +tries=1 @unbound > /dev/null; do sleep 2 done log_f "Resolver OK" -log_f "Using command acme-tiny ${DIRECTORY_URL} ${ACME_CONTACT_PARAMETER} --account-key ${ACME_BASE}/acme/account.pem --disable-check --csr ${CSR} --acme-dir /var/www/acme/" -ACME_RESPONSE=$(acme-tiny ${DIRECTORY_URL} ${ACME_CONTACT_PARAMETER} \ +log_f "Using command acme-tiny ${DIRECTORY_URL} --account-key ${ACME_BASE}/acme/account.pem --disable-check --csr ${CSR} --acme-dir /var/www/acme/" +ACME_RESPONSE=$(acme-tiny ${DIRECTORY_URL} \ --account-key ${ACME_BASE}/acme/account.pem \ --disable-check \ --csr ${CSR} \ diff --git a/docker-compose.yml b/docker-compose.yml index a67475316..edc2b10ff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -440,12 +440,11 @@ services: condition: service_started unbound-mailcow: condition: service_healthy - image: ghcr.io/mailcow/acme:1.92 + image: ghcr.io/mailcow/acme:1.93 dns: - ${IPV4_NETWORK:-172.22.1}.254 environment: - LOG_LINES=${LOG_LINES:-9999} - - ACME_CONTACT=${ACME_CONTACT:-} - ADDITIONAL_SAN=${ADDITIONAL_SAN} - AUTODISCOVER_SAN=${AUTODISCOVER_SAN:-y} - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} diff --git a/generate_config.sh b/generate_config.sh index c4396a9ce..61b72109c 100755 --- a/generate_config.sh +++ b/generate_config.sh @@ -498,13 +498,6 @@ DOVECOT_MASTER_USER= # LEAVE EMPTY IF UNSURE DOVECOT_MASTER_PASS= -# Let's Encrypt registration contact information -# Optional: Leave empty for none -# This value is only used on first order! -# Setting it at a later point will require the following steps: -# https://docs.mailcow.email/troubleshooting/debug-reset_tls/ -ACME_CONTACT= - # WebAuthn device manufacturer verification # After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed # root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates diff --git a/update.sh b/update.sh index e4e88afb3..2c6cbaff2 100755 --- a/update.sh +++ b/update.sh @@ -353,7 +353,6 @@ adapt_new_options() { "DOVECOT_MASTER_PASS" "MAILCOW_PASS_SCHEME" "ADDITIONAL_SERVER_NAMES" - "ACME_CONTACT" "WATCHDOG_VERBOSE" "WEBAUTHN_ONLY_TRUSTED_VENDORS" "SPAMHAUS_DQS_KEY" @@ -599,16 +598,6 @@ adapt_new_options() { echo '# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f' >> mailcow.conf echo 'ADDITIONAL_SERVER_NAMES=' >> mailcow.conf fi - elif [[ ${option} == "ACME_CONTACT" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Lets Encrypt registration contact information' >> mailcow.conf - echo '# Optional: Leave empty for none' >> mailcow.conf - echo '# This value is only used on first order!' >> mailcow.conf - echo '# Setting it at a later point will require the following steps:' >> mailcow.conf - echo '# https://docs.mailcow.email/troubleshooting/debug-reset_tls/' >> mailcow.conf - echo 'ACME_CONTACT=' >> mailcow.conf - fi elif [[ ${option} == "WEBAUTHN_ONLY_TRUSTED_VENDORS" ]]; then if ! grep -q ${option} mailcow.conf; then echo "Adding new option \"${option}\" to mailcow.conf" @@ -761,6 +750,26 @@ detect_major_update() { 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 '/^# 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 ############## # Check permissions @@ -996,7 +1005,6 @@ CONFIG_ARRAY=( "DOVECOT_MASTER_PASS" "MAILCOW_PASS_SCHEME" "ADDITIONAL_SERVER_NAMES" - "ACME_CONTACT" "WATCHDOG_VERBOSE" "WEBAUTHN_ONLY_TRUSTED_VENDORS" "SPAMHAUS_DQS_KEY" @@ -1232,17 +1240,6 @@ for option in "${CONFIG_ARRAY[@]}"; do echo '# in the reverse proxy.' >> mailcow.conf echo 'AUTODISCOVER_SAN=y' >> mailcow.conf fi - - elif [[ "${option}" == "ACME_CONTACT" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Lets Encrypt registration contact information' >> mailcow.conf - echo '# Optional: Leave empty for none' >> mailcow.conf - echo '# This value is only used on first order!' >> mailcow.conf - echo '# Setting it at a later point will require the following steps:' >> mailcow.conf - echo '# https://docs.mailcow.email/troubleshooting/debug-reset_tls/' >> mailcow.conf - echo 'ACME_CONTACT=' >> mailcow.conf - fi elif [[ "${option}" == "WEBAUTHN_ONLY_TRUSTED_VENDORS" ]]; then if ! grep -q "${option}" mailcow.conf; then echo "Adding new option \"${option}\" to mailcow.conf" @@ -1488,6 +1485,7 @@ done [[ -f data/conf/nginx/ZZZ-ejabberd.conf ]] && rm data/conf/nginx/ZZZ-ejabberd.conf migrate_solr_config_options adapt_new_options +remove_obsolete_options # Silently fixing remote url from andryyy to mailcow # git remote set-url origin https://github.com/mailcow/mailcow-dockerized From b12ce1eacd6ae74c9eb3d1570c8cbc79a7a7a174 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Wed, 2 Jul 2025 17:12:06 +0200 Subject: [PATCH 015/180] update postscreen_access.cidr (#6611) --- data/conf/postfix/postscreen_access.cidr | 38 ++++++++++++++++++------ 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr index 57425e5df..259bd062b 100644 --- a/data/conf/postfix/postscreen_access.cidr +++ b/data/conf/postfix/postscreen_access.cidr @@ -1,6 +1,6 @@ -# Whitelist generated by Postwhite v3.4 on Sun Jun 1 00:24:21 UTC 2025 +# Whitelist generated by Postwhite v3.4 on Tue Jul 1 00:22:55 UTC 2025 # https://github.com/stevejenkins/postwhite/ -# 2132 total rules +# 2105 total rules 2a00:1450:4000::/36 permit 2a01:111:f400::/48 permit 2a01:111:f403:8000::/50 permit @@ -19,6 +19,7 @@ 2c0f:fb50:4000::/36 permit 2.207.151.53 permit 2.207.217.30 permit +3.64.237.68 permit 3.65.3.180 permit 3.70.123.177 permit 3.72.182.33 permit @@ -41,7 +42,7 @@ 8.40.222.0/23 permit 8.40.222.250/31 permit 12.130.86.238 permit -13.107.246.38 permit +13.107.246.51 permit 13.110.208.0/21 permit 13.110.209.0/24 permit 13.110.216.0/22 permit @@ -64,9 +65,11 @@ 18.156.89.250 permit 18.156.205.64 permit 18.157.243.190 permit +18.158.153.154 permit 18.194.95.56 permit 18.197.217.180 permit 18.198.96.88 permit +18.199.210.3 permit 18.207.52.234 permit 18.208.124.128/25 permit 18.216.232.154 permit @@ -144,15 +147,22 @@ 34.141.160.224 permit 34.193.58.168 permit 34.195.217.107 permit +34.197.10.50 permit +34.197.254.9 permit +34.198.94.229 permit +34.198.218.121 permit 34.212.163.75 permit 34.215.104.144 permit +34.218.115.239 permit 34.218.116.3 permit 34.225.212.172 permit +35.83.148.184 permit +35.155.198.111 permit 35.158.23.94 permit 35.161.32.253 permit +35.162.73.231 permit 35.167.93.243 permit 35.176.132.251 permit -35.191.0.0/16 permit 35.205.92.9 permit 35.228.216.85 permit 35.242.169.159 permit @@ -169,6 +179,7 @@ 40.233.83.78 permit 40.233.88.28 permit 44.206.138.57 permit +44.210.169.44 permit 44.217.45.156 permit 44.236.56.93 permit 44.238.220.251 permit @@ -228,6 +239,7 @@ 46.243.88.177 permit 46.243.95.179 permit 46.243.95.180 permit +50.16.246.183 permit 50.18.45.249 permit 50.18.121.236 permit 50.18.121.248 permit @@ -241,18 +253,23 @@ 50.56.130.220 permit 50.56.130.221 permit 50.56.130.222 permit +50.112.246.219 permit 52.1.14.157 permit 52.5.230.59 permit +52.12.53.23 permit 52.13.214.179 permit 52.26.1.71 permit 52.27.5.72 permit 52.27.28.47 permit 52.28.63.81 permit +52.28.197.132 permit 52.34.181.151 permit +52.35.192.45 permit 52.36.138.31 permit 52.37.142.146 permit 52.42.203.116 permit 52.50.24.208 permit +52.57.120.243 permit 52.58.216.183 permit 52.59.143.3 permit 52.60.41.5 permit @@ -295,6 +312,7 @@ 54.174.63.0/24 permit 54.186.193.102 permit 54.191.223.56 permit +54.211.126.101 permit 54.213.20.246 permit 54.214.39.184 permit 54.240.0.0/18 permit @@ -320,6 +338,8 @@ 63.143.57.128/25 permit 63.143.59.128/25 permit 63.176.194.123 permit +63.178.132.221 permit +63.178.143.178 permit 64.18.0.0/20 permit 64.20.241.45 permit 64.69.212.0/24 permit @@ -388,8 +408,8 @@ 65.154.166.0/24 permit 65.212.180.36 permit 66.102.0.0/20 permit +66.102.0.0/21 permit 66.119.150.192/26 permit -66.162.193.226/31 permit 66.163.184.0/24 permit 66.163.185.0/24 permit 66.163.186.0/24 permit @@ -595,7 +615,6 @@ 74.86.241.250/31 permit 74.112.67.243 permit 74.125.0.0/16 permit -74.202.227.40 permit 74.208.4.200 permit 74.208.4.201 permit 74.208.4.220 permit @@ -1402,7 +1421,6 @@ 129.213.195.191 permit 130.61.9.72 permit 130.162.39.83 permit -130.211.0.0/22 permit 130.248.172.0/24 permit 130.248.173.0/24 permit 131.253.30.0/24 permit @@ -1593,6 +1611,7 @@ 168.138.5.36 permit 168.138.73.51 permit 168.138.77.31 permit +168.138.237.153 permit 168.245.0.0/17 permit 168.245.12.252 permit 168.245.46.9 permit @@ -1846,11 +1865,11 @@ 204.92.114.187 permit 204.92.114.203 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.220.160.0/21 permit 204.220.168.0/21 permit 204.220.176.0/20 permit +204.220.181.105 permit 204.232.168.0/24 permit 205.139.110.0/24 permit 205.201.128.0/20 permit @@ -2030,6 +2049,7 @@ 216.17.150.242 permit 216.17.150.251 permit 216.24.224.0/20 permit +216.27.86.152/31 permit 216.39.60.154/31 permit 216.39.60.156/30 permit 216.39.60.160/30 permit From fc43c26c4852d741311a867cf5aa39ae58b77a14 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:38:28 +0200 Subject: [PATCH 016/180] Remove obsolete ACME_CONTACT option and related comments from mailcow.conf --- update.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/update.sh b/update.sh index 2c6cbaff2..b7d22bf8a 100755 --- a/update.sh +++ b/update.sh @@ -758,6 +758,7 @@ remove_obsolete_options() { 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 From d5b30a7a0870ba14377ab02e143ec25d3c2b1c6d Mon Sep 17 00:00:00 2001 From: milkmaker Date: Sun, 6 Jul 2025 16:42:58 +0200 Subject: [PATCH 017/180] [Web] Updated lang.pt-pt.json (#6622) Co-authored-by: luiscanato --- data/web/lang/lang.pt-pt.json | 50 +++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/data/web/lang/lang.pt-pt.json b/data/web/lang/lang.pt-pt.json index fafb957c9..e86391fa7 100644 --- a/data/web/lang/lang.pt-pt.json +++ b/data/web/lang/lang.pt-pt.json @@ -39,7 +39,8 @@ "subscribeall": "Subscrever todas as pastas", "syncjob": "Adicionar sincronização", "validate": "Validar", - "validation_success": "Validado com sucesso" + "validation_success": "Validado com sucesso", + "app_passwd_protocols": "Protocolos permitidos para senha de aplicação" }, "admin": { "access": "Acessos", @@ -106,7 +107,11 @@ "from": "De", "generate": "gerar", "html": "HTML", - "iam_import_users": "Importar Utilizadores" + "iam_import_users": "Importar Utilizadores", + "ui_header_announcement_content": "Texto (HTML permitido)", + "ui_footer": "Rodapé (HTML permitido)", + "activate_send": "Ativar botão de envio", + "help_text": "Anular texto de ajuda abaixo da máscara de login (HTML permitido)" }, "danger": { "access_denied": "Acesso negado ou dados inválidos", @@ -145,7 +150,10 @@ "target_domain_invalid": "O endereço de Domínio Destino é inválido", "targetd_not_found": "Domínio de Destino não encontrado", "username_invalid": "Nome de utilizador inválido", - "validity_missing": "Você deve definir um período de validade" + "validity_missing": "Você deve definir um período de validade", + "comment_too_long": "Comentário demasiado longo, máximo 160 chars permitidos", + "ip_list_empty": "Lista de IPs permitidos não pode estar vazia", + "last_key": "A última tecla não pode ser apagada, por favor desactivar a TFA." }, "edit": { "active": "Ativo", @@ -177,7 +185,9 @@ "target_domain": "Domínio de Destino:", "title": "Editar dos Objetos", "unchanged_if_empty": "Deixar em branco para não modificar", - "username": "Administrador" + "username": "Administrador", + "app_passwd_protocols": "Protocolos permitidos para palavra-passe de aplicação", + "allowed_protocols": "Protocolos permitidos para acesso direto do utilizador (não afeta os protocolos de palavra-passe da aplicação)" }, "footer": { "loading": "Aguarde..." @@ -234,11 +244,15 @@ "target_domain": "Domínio Destino", "tls_enforce_in": "Forçar TLS na entrada", "tls_enforce_out": "Forçar TLS na saída", - "username": "Utilizador" + "username": "Utilizador", + "allowed_protocols": "Protocolos permitidos", + "activate": "Ativar", + "deactivate": "Desativar" }, "quarantine": { "action": "Ação", - "remove": "Remover" + "remove": "Remover", + "check_hash": "Pesquisar hash de ficheiro @ VT" }, "queue": { "queue_manager": "Queue Manager" @@ -317,11 +331,31 @@ "user_settings": "Configurações do utilizador", "username": "Administrador", "week": "Semana", - "weeks": "Semanas" + "weeks": "Semanas", + "aliases_also_send_as": "Também autorizado a enviar como utilizador", + "app_hint": "As senhas de aplicação são senhas alternativas para o seu login IMAP, SMTP, CalDAV, CardDAV e EAS. O nome de utilizador permanece inalterado. O webmail SOGo não está disponível através de passwords de aplicação.", + "allowed_protocols": "Protocolos permitidos" }, "acl": { "tls_policy": "Política de TLS", "quarantine_attachments": "Anexos de quarentena", - "filters": "Filtros" + "filters": "Filtros", + "smtp_ip_access": "Mudar anfitriões permitidos para SMTP" + }, + "warning": { + "no_active_admin": "Não é possível desactivar o último administrador activo" + }, + "tfa": { + "u2f_deprecated": "Parece que a sua chave foi registada usando o método U2F depreciado. Desactivaremos dois factores-autenticação para si e apagaremos a sua Chave.", + "none": "Desativar" + }, + "datatables": { + "search": "Procurar:", + "info": "A mostrar _START_ a _END_ de _TOTAL_ entradas", + "infoEmpty": "A mostrar 0 a 0 de 0 entradas", + "aria": { + "sortAscending": ": activar para ordenar a coluna ascendente", + "sortDescending": ": activar para ordenar a coluna descendente" + } } } From 4c7a9ed1953e986ee76dc68a74a78d18414bd053 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Sun, 13 Jul 2025 16:20:40 +0200 Subject: [PATCH 018/180] Translations update from Weblate (#6629) * [Web] Updated lang.fr-fr.json Co-authored-by: Tagada * [Web] Updated lang.pl-pl.json Co-authored-by: robsonek --------- Co-authored-by: Tagada Co-authored-by: robsonek --- data/web/lang/lang.fr-fr.json | 3 ++- data/web/lang/lang.pl-pl.json | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json index 313d6663c..07ac641b8 100644 --- a/data/web/lang/lang.fr-fr.json +++ b/data/web/lang/lang.fr-fr.json @@ -406,7 +406,8 @@ "iam_extra_permission": "Pour que les paramètres suivants fonctionnent, le client mailcow dans Keycloak a besoin d'un Compte de service et de l'autorisation de voir les utilisateurs.", "iam_host": "Hôte", "iam_host_info": "Saisissez un ou plusieurs hôtes LDAP, séparés par des virgules.", - "iam_import_users": "Importer des utilisateurs" + "iam_import_users": "Importer des utilisateurs", + "filter": "Filtrer" }, "danger": { "access_denied": "Accès refusé ou données de formulaire non valides", diff --git a/data/web/lang/lang.pl-pl.json b/data/web/lang/lang.pl-pl.json index 521c17779..02c892c64 100644 --- a/data/web/lang/lang.pl-pl.json +++ b/data/web/lang/lang.pl-pl.json @@ -2,7 +2,8 @@ "acl": { "sogo_profile_reset": "Usuń profil SOGo (webmail)", "syncjobs": "Polecenie synchronizacji", - "alias_domains": "Dodaj aliasy domen" + "alias_domains": "Dodaj aliasy domen", + "delimiter_action": "Akcja oparta na separatorze" }, "add": { "active": "Aktywny", @@ -430,4 +431,4 @@ "weekly": "Co tydzień", "weeks": "Tygodnie" } -} \ No newline at end of file +} From 1e5fcfe3922a4eeb755f0c2a218ea948820e0101 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 16 Jul 2025 09:29:35 +0200 Subject: [PATCH 019/180] Bulgarian language added (#6623) --- data/web/inc/vars.inc.php | 1 + data/web/lang/lang.bg-bg.json | 1398 ++++++++++++++++++++++++++++++++- 2 files changed, 1398 insertions(+), 1 deletion(-) diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php index 62197e54a..802a41f95 100644 --- a/data/web/inc/vars.inc.php +++ b/data/web/inc/vars.inc.php @@ -83,6 +83,7 @@ $DEFAULT_LANG = 'en-gb'; // https://en.wikipedia.org/wiki/IETF_language_tag $AVAILABLE_LANGUAGES = array( // 'ca-es' => 'Català (Catalan)', + 'bg-bg' => 'Български (Bulgarian)', 'cs-cz' => 'Čeština (Czech)', 'da-dk' => 'Danish (Dansk)', 'de-de' => 'Deutsch (German)', diff --git a/data/web/lang/lang.bg-bg.json b/data/web/lang/lang.bg-bg.json index 0967ef424..0d8632859 100644 --- a/data/web/lang/lang.bg-bg.json +++ b/data/web/lang/lang.bg-bg.json @@ -1 +1,1397 @@ -{} +{ + "acl": { + "alias_domains": "Добавяне на домейни за псевдоними", + "app_passwds": "Управление на пароли за приложения", + "bcc_maps": "BCC карти", + "delimiter_action": "Действие на разделител", + "domain_desc": "Промяна на описанието на домейна", + "domain_relayhost": "Промяна на релеен хост за домейн", + "eas_reset": "Нулиране на устройствата с ActiveSync", + "extend_sender_acl": "Разрешаване на разширяване на ACL на изпращащите от външни адреси", + "filters": "Филтри", + "login_as": "Вход като потребител на пощенска кутия", + "mailbox_relayhost": "Промяна на релеен хост за пощенска кутия", + "prohibited": "Забранено от ACL", + "protocol_access": "Промяна на достъпа до протоколи", + "pushover": "Pushover", + "pw_reset": "Разрешаване на нулиране на паролата на потребител на mailcow", + "quarantine": "Действия с карантина", + "quarantine_attachments": "Прикачени файлове в карантина", + "quarantine_category": "Промяна на категорията на уведомленията за карантина", + "quarantine_notification": "Промяна на уведомленията за карантина", + "ratelimit": "Ограничение на скоростта", + "recipient_maps": "Карти на получатели", + "smtp_ip_access": "Промяна на разрешените хостове за SMTP", + "sogo_access": "Разрешаване на управление на достъпа до SOGo", + "sogo_profile_reset": "Нулиране на профила на SOGo", + "spam_alias": "Временни псевдоними", + "spam_policy": "Черен/Бял списък", + "spam_score": "Резултат за спам", + "syncjobs": "Синхронизиращи задачи", + "tls_policy": "Политика за TLS", + "unlimited_quota": "Неограничена квота за пощенски кутии" + }, + "add": { + "activate_filter_warn": "Всички други филтри ще бъдат деактивирани, когато активното е отбелязано.", + "active": "Активен", + "add": "Добавяне", + "add_domain_only": "Добавяне само на домейн", + "add_domain_restart": "Добавяне на домейн и рестартиране на SOGo", + "alias_address": "Адрес/и за псевдоним", + "alias_address_info": "Пълни имейл адреси или @example.com, за да хванете всички съобщения за домейн (разделени с запетая). само домейни на mailcow.", + "alias_domain": "Домейн за псевдоним", + "alias_domain_info": "Валидни имена на домейни (разделени с запетая).", + "app_name": "Име на приложението", + "app_password": "Добавяне на парола за приложение", + "app_passwd_protocols": "Разрешени протоколи за паролата на приложението", + "automap": "Опит за автоматично картографиране на папки (\"Изпратени\", \"Изпратени\" => \"Изпратени\" и т.н.)", + "backup_mx_options": "Опции за реле", + "bcc_dest_format": "BCC дестинацията трябва да бъде един валиден имейл адрес.
Ако имате нужда да изпратите копие до множество адреси, създайте псевдоним и го използвайте тук.", + "comment_info": "Частен коментар не е видим за потребителя, докато публичен коментар се показва като подсказка при преминаване с мишката върху него в прегледа на потребителя", + "custom_params": "Персонализирани параметри", + "custom_params_hint": "Дясно: --param=xy, грешно: --param xy", + "delete1": "Изтриване от източника след завършване", + "delete2": "Изтриване на съобщенията в дестинацията, които не са в източника", + "delete2duplicates": "Изтриване на дубликати в дестинацията", + "description": "Описание", + "destination": "Дестинация", + "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", + "domain": "Домейн", + "domain_matches_hostname": "Домейнът %s съвпада с името на хоста", + "domain_quota_m": "Обща квота на домейна (MiB)", + "dry": "Симулиране на синхронизация", + "enc_method": "Метод на криптиране", + "exclude": "Изключване на обекти (regex)", + "full_name": "Пълно име", + "gal": "Глобален адресен списък", + "gal_info": "Глобалният адресен списък съдържа всички обекти на домейна и не може да бъде редактиран от нито един потребител. Липсва информация за заетост/свободно време в SOGo, ако е деактивирано! Рестартирайте SOGo, за да приложите промените.", + "generate": "генериране", + "goto_ham": "Учен като не е спам", + "goto_null": "Тихо изхвърляне на имейла", + "goto_spam": "Учен като спам", + "hostname": "Хост", + "inactive": "Неактивен", + "kind": "Вид", + "mailbox_quota_def": "Квота по подразбиране за пощенска кутия", + "mailbox_quota_m": "Макс. квота за пощенска кутия (MiB)", + "mailbox_username": "Потребителско име (лява част на имейл адрес)", + "max_aliases": "Макс. възможни псевдоними", + "max_mailboxes": "Макс. възможни пощенски кутии", + "mins_interval": "Интервал за проверка (минути)", + "multiple_bookings": "Множествени резервации", + "nexthop": "Следващ хоп", + "password": "Парола", + "password_repeat": "Потвърждаване на паролата (повторете)", + "port": "Порт", + "post_domain_add": "След добавянето на нов домейн, контейнерът на SOGo, \"sogo-mailcow\", трябва да бъде рестартиран!

Освен това, конфигурацията на DNS на домейна трябва да бъде прегледана. След като конфигурацията на DNS бъде одобрена, рестартирайте \"acme-mailcow\", за да генерирате автоматично сертификати за вашия нов домейн (autoconfig.<domain>, autodiscover.<domain>).
Тази стъпка е опционална и ще бъде повторена всеки 24 часа.", + "private_comment": "Частен коментар", + "public_comment": "Публичен коментар", + "quota_mb": "Квота (MiB)", + "relay_all": "Реле на всички получатели", + "relay_all_info": "↪ Ако изберете да не релеирате всички получатели, ще трябва да добавите (\"скрита\") пощенска кутия за всеки отделен получател, който трябва да бъде релеиран.", + "relay_domain": "Реле на този домейн", + "relay_transport_info": "
Инфо
Можете да дефинирате транспортни карти за персонализирана дестинация за този домейн. Ако не е зададено, ще бъде направен MX lookup.", + "relay_unknown_only": "Реле на несъществуващи пощенски кутии. Съществуващите пощенски кутии ще бъдат доставени локално.", + "relayhost_wrapped_tls_info": "Моля, не използвайте TLS-wrapped портове (най-често използвани на порт 465).
\r\nИзползвайте всеки не-wrapped порт и издайте STARTTLS. Политика за TLS може да бъде създадена в \"TLS политики\", за да се наложи TLS.", + "select": "Моля, изберете...", + "select_domain": "Моля, изберете първо домейн", + "sieve_desc": "Кратко описание", + "sieve_type": "Тип на филтър", + "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)", + "subscribeall": "Абониране за всички папки", + "syncjob": "Добавяне на синхронизираща задача", + "syncjob_hint": "Имайте предвид, че паролите трябва да бъдат запазени като обикновен текст!", + "tags": "Тагове", + "target_address": "Адреси за пренасочване", + "target_address_info": "Пълни имейл адреси (разделени с запетая).", + "target_domain": "Целеви домейн", + "timeout1": "Таймаут за връзка с отдалечен хост", + "timeout2": "Таймаут за връзка с локален хост", + "username": "Потребителско име", + "validate": "Валидиране", + "validation_success": "Успешно валидиране" + }, + "admin": { + "access": "Достъп", + "action": "Действие", + "activate_api": "Активиране на API", + "activate_send": "Активиране на бутона за изпращане", + "active": "Активен", + "active_rspamd_settings_map": "Активна карта с настройки", + "add": "Добавяне", + "add_admin": "Добавяне на администратор", + "add_domain_admin": "Добавяне на администратор на домейн", + "add_forwarding_host": "Добавяне на хост за препращане", + "add_relayhost": "Добавяне на транспорт, зависим от изпращач", + "add_relayhost_hint": "Имайте предвид, че данните за удостоверяване, ако има такива, ще бъдат запазени като обикновен текст.", + "add_row": "Добавяне на ред", + "add_settings_rule": "Добавяне на правило за настройки", + "add_transport": "Добавяне на транспорт", + "add_transports_hint": "Имайте предвид, че данните за удостоверяване, ако има такива, ще бъдат запазени като обикновен текст.", + "additional_rows": "добавени допълнителни редове", + "admin": "Администратор", + "admin_details": "Редактиране на детайлите на администратора", + "admin_domains": "Назначения на домейни", + "admins": "Администратори", + "admins_ldap": "LDAP администратори", + "advanced_settings": "Разширени настройки", + "allowed_methods": "Access-Control-Allow-Methods", + "allowed_origins": "Access-Control-Allow-Origin", + "api_allow_from": "Разрешаване на API достъп от тези IP адреси/CIDR мрежови нотации", + "api_info": "API е в процес на разработка. Документацията може да бъде намерена на /api", + "api_key": "API ключ", + "api_read_only": "Достъп само за четене", + "api_read_write": "Достъп за четене и писане", + "api_skip_ip_check": "Пропускане на IP проверка за API", + "app_hide": "Скриване за вход", + "app_links": "Връзки към приложения", + "app_name": "Име на приложението", + "apps_name": "Име на \"mailcow приложенията\"", + "arrival_time": "Време на пристигане (време на сървъра)", + "authed_user": "Удостоверен потребител", + "ays": "Сигурни ли сте, че искате да продължите?", + "ban_list_info": "Вижте списък с блокирани IP адреси по-долу: мрежа (оставащо време за блокиране) - [действия].
IP адресите в опашката за разблокиране ще бъдат премахнати от активния списък с блокирани в рамките на няколко секунди.
Червените етикети показват активни постоянни блокирания от черния списък.", + "change_logo": "Промяна на логото", + "logo_normal_label": "Нормално", + "logo_dark_label": "Обърнато за тъмен режим", + "configuration": "Конфигурация", + "convert_html_to_text": "Конвертиране на HTML в обикновен текст", + "copy_to_clipboard": "Текстът е копиран в клипборда!", + "cors_settings": "Настройки на CORS", + "credentials_transport_warning": "Внимание: Добавянето на нов запис в картата на транспорта ще обнови данните за удостоверяване за всички записи с съвпадаща колона за следващ хоп.", + "customer_id": "Идентификатор на клиента", + "customize": "Персонализиране", + "destination": "Дестинация", + "dkim_add_key": "Добавяне на ARC/DKIM ключ", + "dkim_domains_selector": "Селектор", + "dkim_domains_wo_keys": "Избор на домейни без ключове", + "dkim_from": "От", + "dkim_from_title": "Източник на домейн за копиране на данни", + "dkim_key_length": "Дължина на DKIM ключа (битове)", + "dkim_key_missing": "Липсващ ключ", + "dkim_key_unused": "Неизползван ключ", + "dkim_key_valid": "Валиден ключ", + "dkim_keys": "ARC/DKIM ключове", + "dkim_overwrite_key": "Презаписване на съществуващ DKIM ключ", + "dkim_private_key": "Частен ключ", + "dkim_to": "До", + "dkim_to_title": "Целеви домейн/и - ще бъде презаписан", + "domain": "Домейн", + "domain_admin": "Администратор на домейн", + "domain_admins": "Администратори на домейн", + "domain_s": "Домейн/и", + "duplicate": "Дублиране", + "duplicate_dkim": "Дублиране на DKIM запис", + "edit": "Редактиране", + "empty": "Няма резултати", + "excludes": "Изключване на тези получатели", + "f2b_ban_time": "Време за блокиране (с)", + "f2b_ban_time_increment": "Времето за блокиране се увеличава с всяко блокиране", + "f2b_blacklist": "Черни списъци/хостове", + "f2b_filter": "Филтри с регулярни изрази", + "f2b_list_info": "Черният списък на хостове или мрежи винаги ще надделява над белия списък. Актуализациите на списъка отнемат няколко секунди, за да бъдат приложени.", + "f2b_manage_external": "Управление на Fail2Ban външно", + "f2b_manage_external_info": "Fail2ban все още ще поддържа черния списък, но няма да задава правила за блокиране на трафика. Използвайте генерирания черн списък по-долу, за да блокирате трафика външно.", + "f2b_max_attempts": "Макс. опити", + "f2b_max_ban_time": "Макс. време за блокиране (с)", + "f2b_netban_ipv4": "IPv4 размер на подмрежа за прилагане на блокиране (8-32)", + "f2b_netban_ipv6": "IPv6 размер на подмрежа за прилагане на блокиране (8-128)", + "f2b_parameters": "Параметри на Fail2ban", + "f2b_regex_info": "Логовете, които се вземат предвид: SOGo, Postfix, Dovecot, PHP-FPM.", + "f2b_retry_window": "Прозорец за повторен опит (с) за макс. опити", + "f2b_whitelist": "Бели списъци/хостове", + "filter": "Филтър", + "filter_table": "Таблица с филтри", + "forwarding_hosts": "Хостове за препращане", + "forwarding_hosts_add_hint": "Можете да посочите IPv4/IPv6 адреси, мрежи в CIDR нотация, имена на хостове (които ще бъдат разрешени в IP адреси), или имена на домейни (които ще бъдат разрешени в IP адреси чрез заявки към SPF записи или, при липсата им, MX записи).", + "forwarding_hosts_hint": "Входящите съобщения се приемат безрезервно от всички хостове, изброени тук. Тези хостове след това не се проверяват срещу DNSBL или подлагат на сиво списък. Спамът, получен от тях, никога не се отхвърля, но опционално може да бъде поставен във файла за нежелана поща. Най-често използваната употреба за това е да се посочат пощенски сървъри, на които сте настроили правило, което препраща входящите имейли към вашия mailcow сървър.", + "from": "От", + "generate": "генериране", + "guid": "GUID - уникален инстанционен идентификатор", + "guid_and_license": "GUID & Лиценз", + "hash_remove_info": "Премахването на хеш за ограничение на скоростта (ако все още съществува) ще нулира неговия брояч напълно.
\r\nВсеки хеш е показан с индивидуален цвят.", + "help_text": "Презаписване на помощния текст под маската за вход (разрешен е HTML)", + "host": "Хост", + "html": "HTML", + "iam": "Доставчик на идентичност", + "iam_attribute_field": "Поле за атрибут", + "iam_authorize_url": "Крайна точка за удостоверяване", + "iam_auth_flow": "Поток за удостоверяване", + "iam_auth_flow_info": "Освен стандартния поток за удостоверяване (поток с код за удостоверяване в Keycloak), който се използва за единичен вход, mailcow поддържа и поток за удостоверяване с пряки удостоверения. Потокът за удостоверяване с пароли за поща проверява удостоверенията на потребителя, като използва Keycloak Admin REST API. mailcow извлича хешираната парола от атрибута mailcow_password, който е картиран в Keycloak.", + "iam_basedn": "Основен DN", + "iam_client_id": "Идентификатор на клиента", + "iam_client_secret": "Тайна на клиента", + "iam_client_scopes": "Обхват на клиента", + "iam_default_template": "Шаблон по подразбиране", + "iam_default_template_description": "Ако няма зададен шаблон за потребител, шаблонът по подразбиране ще бъде използван за създаване на пощенската кутия, но не и за актуализиране на пощенската кутия.", + "iam_description": "Конфигуриране на външен доставчик за удостоверяване
Потребителските пощенски кутии ще бъдат създавани автоматично при първия им вход, при условие че е зададено картиране на атрибути.", + "iam_extra_permission": "За да работят следните настройки, клиентът на mailcow в Keycloak трябва да има услуга акаунт и разрешението да вижда потребители.", + "iam_host": "Хост", + "iam_host_info": "Въведете един или повече LDAP хостове, разделени с запетаи.", + "iam_import_users": "Импортиране на потребители", + "iam_mapping": "Картиране на атрибути", + "iam_bindpass": "Парола за свързване", + "iam_periodic_full_sync": "Периодичен пълен синхрон", + "iam_port": "Порт", + "iam_realm": "Реалм", + "iam_redirect_url": "URL за пренасочване", + "iam_rest_flow": "Поток за пароли за поща", + "iam_server_url": "URL на сървъра", + "iam_sso": "Единичен вход", + "iam_sync_interval": "Интервал за синхронизиране/импортиране (мин)", + "iam_test_connection": "Тест на връзката", + "iam_token_url": "Крайна точка за токени", + "iam_userinfo_url": "Крайна точка за информация за потребителя", + "iam_username_field": "Поле за потребителско име", + "iam_binddn": "DN за свързване", + "iam_use_ssl": "Използване на SSL", + "iam_use_ssl_info": "Ако активирате SSL и портът е зададен на 389, той ще бъде автоматично променен на 636.", + "iam_use_tls": "Използване на StartTLS", + "iam_use_tls_info": "Ако активирате TLS, трябва да използвате стандартния порт за вашия LDAP сървър (389). SSL портовете не могат да бъдат използвани.", + "iam_version": "Версия", + "ignore_ssl_error": "Игнориране на SSL грешки", + "import": "Импортиране", + "import_private_key": "Импортиране на частен ключ", + "in_use_by": "Използван от", + "inactive": "Неактивен", + "include_exclude": "Включване/Изключване", + "include_exclude_info": "По подразбиране - без избор - всички пощенски кутии се адресират", + "includes": "Включване на тези получатели", + "ip_check": "Проверка на IP", + "ip_check_disabled": "Проверката на IP е деактивирана. Можете да я активирате в
Система > Конфигурация > Опции > Персонализиране", + "ip_check_opt_in": "Оптиране за използване на услугата на трета страна ipv4.mailcow.email и ipv6.mailcow.email, за да разрешавате външни IP адреси.", + "is_mx_based": "MX базиран", + "last_applied": "Последно приложено", + "license_info": "Лицензът не е задължителен, но помага за по-нататъшното развитие.
Регистрирайте вашия GUID тук или купете поддръжка за вашата инсталация на mailcow.", + "link": "Връзка", + "loading": "Моля, изчакайте...", + "login_time": "Време за вход", + "logo_info": "Вашето изображение ще бъде мащабирано до височина 40 px за горната навигационна лента и макс. ширина 250 px за началната страница. Препоръчва се използването на скалируема графика.", + "lookup_mx": "Дестинацията е регулярен израз за съвпадение с MX име (.*\\.google\\.com за пренасочване на всички съобщения, предназначени за MX, завършващ на google.com, през този хоп)", + "main_name": "Име на \"mailcow UI\"", + "merged_vars_hint": "Редовете в сиво са сляти от vars.(local.)inc.php и не могат да бъдат променени.", + "message": "Съобщение", + "message_size": "Размер на съобщението", + "nexthop": "Следващ хоп", + "no": "✕", + "no_active_bans": "Няма активни блокирания", + "no_new_rows": "Няма допълнителни редове", + "no_record": "Няма запис", + "oauth2_apps": "OAuth2 приложения", + "oauth2_add_client": "Добавяне на OAuth2 клиент", + "oauth2_client_id": "Идентификатор на клиента", + "oauth2_client_secret": "Тайна на клиента", + "oauth2_info": "Реализацията на OAuth2 поддържа типа разрешение \"Код за удостоверяване\" и издава токени за презареждане.
\r\nСървърът автоматично издава нови токени за презареждане, след като токен за презареждане е бил използван.

\r\n• Обхватът по подразбиране е профил. Само потребителите на пощенски кутии могат да бъдат удостоверени срещу OAuth2. Ако параметърът за обхват е пропуснат, той се връща към профил.
\r\n• Параметърът state трябва да бъде изпратен от клиента като част от заявката за удостоверяване.

\r\nПътища за заявки към OAuth2 API:
\r\n
    \r\n
  • Крайна точка за удостоверяване: /oauth/authorize
  • \r\n
  • Крайна точка за токени: /oauth/token
  • \r\n
  • Страница с ресурси: /oauth/profile
  • \r\n
\r\nГенерирането на нова тайна на клиента няма да анулира съществуващите кодове за удостоверяване, но те няма да могат да подновят своя токен.

\r\nАнулирането на токените на клиента ще доведе до незабавно прекратяване на всички активни сесии. Всички клиенти ще трябва да се преудостоверят.", + "oauth2_redirect_uri": "URI за пренасочване", + "oauth2_renew_secret": "Генериране на нова тайна на клиента", + "oauth2_revoke_tokens": "Анулиране на всички токени на клиента", + "optional": "опционално", + "options": "Опции", + "password": "Парола", + "password_length": "Дължина на паролата", + "password_policy": "Политика за пароли", + "password_policy_chars": "Трябва да съдържа поне една буквена буква", + "password_policy_length": "Минималната дължина на паролата е %d", + "password_policy_lowerupper": "Трябва да съдържа малки и главни букви", + "password_policy_numbers": "Трябва да съдържа поне една цифра", + "password_policy_special_chars": "Трябва да съдържа специални символи", + "password_repeat": "Потвърждаване на паролата (повторете)", + "password_reset_info": "Ако не е зададен имейл за възстановяване, тази функция не може да бъде използвана.", + "password_reset_settings": "Настройки за възстановяване на парола", + "password_reset_tmpl_html": "HTML шаблон", + "password_reset_tmpl_text": "Текстов шаблон", + "password_settings": "Настройки на паролата", + "priority": "Приоритет", + "private_key": "Частен ключ", + "quarantine": "Карантина", + "quarantine_bcc": "Изпращане на копие от всички уведомления (BCC) до този получател:
Оставете празно, за да деактивирате. Неподписано, непроверено имейл. Трябва да бъде доставено само вътрешно.", + "quarantine_exclude_domains": "Изключване на домейни и домейни на псевдоними", + "quarantine_max_age": "Максимална възраст в дни
Стойността трябва да бъде равна или по-голяма от 1 ден.", + "quarantine_max_score": "Изхвърляне на уведомление, ако резултатът за спам на имейла е по-висок от тази стойност:
По подразбиране е 9999.0", + "quarantine_max_size": "Максимален размер в MiB (по-големи елементи се изхвърлят):
0 не означава неограничен.", + "quarantine_notification_html": "Шаблон на имейл за уведомление:
Оставете празно, за да възстановите шаблона по подразбиране.", + "quarantine_notification_sender": "Изпращач на имейл за уведомление", + "quarantine_notification_subject": "Тема на имейл за уведомление", + "quarantine_redirect": "Пренасочване на всички уведомления към този получател:
Оставете празно, за да деактивирате. Неподписано, непроверено имейл. Трябва да бъде доставено само вътрешно.", + "quarantine_release_format": "Формат на освободените елементи", + "quarantine_release_format_att": "Като прикачен файл", + "quarantine_release_format_raw": "Непроменен оригинал", + "quarantine_retention_size": "Задържания за пощенска кутия:
0 показва неактивен.", + "quota_notification_html": "Шаблон на имейл за уведомление:
Оставете празно, за да възстановите шаблона по подразбиране.", + "quota_notification_sender": "Изпращач на имейл за уведомление", + "quota_notification_subject": "Тема на имейл за уведомление", + "quota_notifications": "Уведомления за квота", + "quota_notifications_info": "Уведомленията за квота се изпращат на потребителите веднъж при преминаване на 80% и веднъж при преминаване на 95% използване.", + "quota_notifications_vars": "{{percent}} е равно на текущата квота на потребителя
{{username}} е името на пощенската кутия", + "queue_unban": "разблокиране", + "r_active": "Активни ограничения", + "r_inactive": "Неактивни ограничения", + "r_info": "Елементите в сиво в списъка с активни ограничения не са известни като валидни ограничения за mailcow и не могат да бъдат преместени. Неизвестните ограничения ще бъдат зададени в реда на появяване все пак.
Можете да добавяте нови елементи в inc/vars.local.inc.php, за да можете да ги превключвате.", + "rate_name": "Име на ограничението", + "recipients": "Получатели", + "refresh": "Опресняване", + "regen_api_key": "Регенериране на API ключ", + "regex_maps": "Карти с регулярни изрази", + "relay_from": "Адрес \"From:\"", + "relay_rcpt": "Адрес \"To:\"", + "relay_run": "Изпълнение на тест", + "relayhosts": "Транспорти, зависими от изпращач", + "relayhosts_hint": "Дефинирайте транспорти, зависими от изпращач, за да можете да ги избирате в диалоговия прозорец за конфигурация на домейн.
\r\n Услугата за транспорт винаги е \"smtp:\" и ще се опита да използва TLS, ако бъде предложена. Wrapped TLS (SMTPS) не се поддържа. Политиката за TLS на потребителя ще бъде взета предвид.
\r\n Засегнатите домейни, включително домейни на псевдоними.", + "remove": "Премахване", + "remove_row": "Премахване на ред", + "reset_default": "Нулиране до подразбиране", + "reset_limit": "Премахване на хеш", + "reset_password_vars": "{{link}} Генерираната връзка за нулиране на парола
{{username}} Името на пощенската кутия на потребителя, който е поискал нулиране на парола
{{username2}} Името на пощенската кутия за възстановяване
{{date}} Датата на заявката за нулиране на парола
{{token_lifetime}} Времетраенето на токена в минути
{{hostname}} Името на хоста на mailcow", + "restore_template": "Оставете празно, за да възстановите шаблона по подразбиране.", + "routing": "Маршрутизация", + "rsetting_add_rule": "Добавяне на правило", + "rsetting_content": "Съдържание на правилото", + "rsetting_desc": "Кратко описание", + "rsetting_no_selection": "Моля, изберете правило", + "rsetting_none": "Няма налични правила", + "rsettings_insert_preset": "Вмъкване на примерен предефиниран набор \"%s\"", + "rsettings_preset_1": "Деактивиране на всичко, освен DKIM и ограничение на скоростта за удостоверени потребители", + "rsettings_preset_2": "Пощенските администратори искат спам", + "rsettings_preset_3": "Разрешаване само на определени изпращачи за пощенска кутия (напр. използване като вътрешна пощенска кутия)", + "rsettings_preset_4": "Деактивиране на Rspamd за домейн", + "rspamd_com_settings": "Името на настройката ще бъде автоматично генерирано, моля, вижте примерните предефинирани набори по-долу. За повече детайли вижте документацията на Rspamd", + "rspamd_global_filters": "Глобални карти на филтри", + "rspamd_global_filters_agree": "Ще бъда внимателен!", + "rspamd_global_filters_info": "Глобалните карти на филтри съдържат различни видове глобални черни и бели списъци.", + "rspamd_global_filters_regex": "Имената им обясняват тяхната цел. Всичкото съдържание трябва да съдържа валиден регулярен израз във формат \"/pattern/options\" (напр. /.+@domain\\.tld/i).
\r\n Въпреки че се извършват основни проверки за всеки ред с регулярен израз, функционалността на Rspamd може да бъде нарушена, ако не успява да прочете синтаксиса коректно.
\r\n Rspamd ще се опита да прочете съдържанието на картата при промяна. Ако срещнете проблеми, рестартирайте Rspamd, за да наложите презареждане на картата.
Елементите в черния списък са изключени от карантина.", + "rspamd_settings_map": "Карта с настройки на Rspamd", + "sal_level": "Ниво на Moo", + "save": "Запазване на промените", + "search_domain_da": "Търсене на домейни", + "send": "Изпращане", + "sender": "Изпращач", + "service": "Услуга", + "service_id": "Идентификатор на услугата", + "source": "Източник", + "spamfilter": "Филтър за спам", + "subject": "Тема", + "success": "Успех", + "sys_mails": "Системни имейли", + "task": "Задача", + "text": "Текст", + "time": "Време", + "title": "Заглавие", + "title_name": "Име на уеб страницата на \"mailcow UI\"", + "to_top": "Обратно нагоре", + "transport_dest_format": "Регулярен израз или синтаксис: example.org, .example.org, *, box@example.org (няколко стойности могат да бъдат разделени с запетая)", + "transport_maps": "Карти за транспорт", + "transport_test_rcpt_info": "• Използвайте null@hosted.mailcow.de, за да тествате препращането към чуждестранна дестинация.", + "transports_hint": "• Записът в картата на транспорта пренарежда запис в картата на транспорт, зависим от изпращач.
\r\n• Транспортите, базирани на MX, се използват предимно.
\r\n• Настройките за политика на TLS на потребителя се игнорират и могат да бъдат приложени само чрез записи в картите на политиката на TLS.
\r\n• Услугата за транспорт за дефинираните транспорти винаги е \"smtp:\" и ще се опита да използва TLS, ако бъде предложена. Wrapped TLS (SMTPS) не се поддържа.
\r\n• Адресите, съвпадащи с \"/localhost$/\", винаги ще бъдат транспортирани през \"local:\", следователно записът \"*\" няма да се приложи към тези адреси.
\r\n• За да определите удостоверения за следващ хоп \"[host]:25\", Postfix винаги заявява за \"host\", преди да търси за \"[host]:25\". Това поведение прави невъзможно да се използват \"host\" и \"[host]:25\" едновременно.", + "ui_footer": "Подвал (разрешен е HTML)", + "ui_header_announcement": "Обяви", + "ui_header_announcement_active": "Задаване на активна обява", + "ui_header_announcement_content": "Текст (разрешен е HTML)", + "ui_header_announcement_help": "Обявата е видима за всички влезли потребители и на екрана за вход на UI.", + "ui_header_announcement_select": "Избор на тип обява", + "ui_header_announcement_type": "Тип", + "ui_header_announcement_type_danger": "Много важно", + "ui_header_announcement_type_info": "Информация", + "ui_header_announcement_type_warning": "Важно", + "ui_texts": "Етикети и текстове на UI", + "unban_pending": "разблокиране в опашката", + "unchanged_if_empty": "Ако не е променено, оставете празно", + "upload": "Качване", + "username": "Потребителско име", + "user_link": "Връзка към потребител", + "validate_license_now": "Валидиране на GUID срещу лицензен сървър", + "verify": "Проверка", + "yes": "✓" + }, + "danger": { + "access_denied": "Достъпът е отказан или данните от формуляра са невалидни", + "alias_domain_invalid": "Домейнът на псевдонима %s е невалиден", + "alias_empty": "Адресът на псевдонима не трябва да е празен", + "alias_goto_identical": "Адресът на псевдонима и адресът за пренасочване не трябва да са идентични", + "alias_invalid": "Адресът на псевдонима %s е невалиден", + "aliasd_targetd_identical": "Домейнът на псевдонима не трябва да е равен на целевия домейн: %s", + "aliases_in_use": "Макс. псевдоними трябва да бъдат по-големи или равни на %d", + "app_name_empty": "Името на приложението не може да бъде празно", + "app_passwd_id_invalid": "Идентификаторът на паролата за приложението %s е невалиден", + "authsource_in_use": "Доставчикът на идентичност не може да бъде променен или изтрит, тъй като се използва в момента от един или повече потребители.", + "bcc_empty": "BCC дестинацията не може да бъде празна", + "bcc_exists": "Картата BCC %s съществува за тип %s", + "bcc_must_be_email": "BCC дестинацията %s не е валиден имейл адрес", + "comment_too_long": "Коментарът е твърде дълъг, разрешени са макс. 160 символа", + "cors_invalid_method": "Зададен е невалиден метод за разрешаване", + "cors_invalid_origin": "Зададен е невалиден източник за разрешаване", + "defquota_empty": "Квотата по подразбиране за пощенска кутия не трябва да бъде 0.", + "demo_mode_enabled": "Режимът на демонстрация е активиран", + "description_invalid": "Описанието на ресурса за %s е невалидно", + "dkim_domain_or_sel_exists": "Съществува DKIM ключ за \"%s\", който няма да бъде презаписан", + "dkim_domain_or_sel_invalid": "DKIM домейн или селектор е невалиден: %s", + "domain_cannot_match_hostname": "Домейнът не може да съвпада с името на хоста", + "domain_exists": "Домейнът %s вече съществува", + "domain_invalid": "Името на домейна е празно или невалидно", + "domain_not_empty": "Не може да бъде премахнат непразен домейн %s", + "domain_not_found": "Домейнът %s не е намерен", + "domain_quota_m_in_use": "Квотата на домейна трябва да бъде по-голяма или равна на %s MiB", + "extended_sender_acl_denied": "липсва ACL за задаване на външни адреси на изпращач", + "extra_acl_invalid": "Външният адрес на изпращач \"%s\" е невалиден", + "extra_acl_invalid_domain": "Външният изпращач \"%s\" използва невалиден домейн", + "fido2_verification_failed": "Проверката на FIDO2 е неуспешна: %s", + "file_open_error": "Файлът не може да бъде отворен за писане", + "filter_type": "Грешен тип на филтър", + "from_invalid": "Изпращачът не трябва да бъде празен", + "generic_server_error": "Възникна неочаквана грешка на сървъра. Моля, свържете се с вашия администратор.", + "global_filter_write_error": "Файлът с филтър не може да бъде записан: %s", + "global_map_invalid": "Идентификаторът на глобалната карта %s е невалиден", + "global_map_write_error": "Глобалният идентификатор на картата %s не може да бъде записан: %s", + "goto_empty": "Адресът на псевдоним трябва да съдържа поне един валиден адрес за пренасочване", + "goto_invalid": "Адресът за пренасочване %s е невалиден", + "ham_learn_error": "Грешка при обучение за не-спам: %s", + "iam_test_connection": "Връзката е неуспешна", + "imagick_exception": "Грешка: Грешка при четене на изображение с Imagick", + "img_dimensions_exceeded": "Изображението надхвърля максималния размер", + "img_invalid": "Не може да се валидира файл с изображение", + "img_size_exceeded": "Изображението надхвърля максималния размер на файла", + "img_tmp_missing": "Не може да се валидира файл с изображение: Липсва временен файл", + "invalid_bcc_map_type": "Невалиден тип на картата BCC", + "invalid_destination": "Форматът на дестинацията \"%s\" е невалиден", + "invalid_filter_type": "Невалиден тип на филтър", + "invalid_host": "Зададен е невалиден хост: %s", + "invalid_mime_type": "Невалиден MIME тип", + "invalid_nexthop": "Форматът на следващия хоп е невалиден", + "invalid_nexthop_authenticated": "Следващият хоп съществува с различни удостоверения, моля, актуализирайте съществуващите удостоверения за този следващ хоп първо.", + "invalid_recipient_map_new": "Зададен е невалиден нов получател: %s", + "invalid_recipient_map_old": "Зададен е невалиден оригинален получател: %s", + "invalid_reset_token": "Невалиден токен за нулиране", + "ip_list_empty": "Списъкът с разрешени IP адреси не може да бъде празен", + "is_alias": "%s вече е известен като адрес на псевдоним", + "is_alias_or_mailbox": "%s вече е известен като адрес на псевдоним, пощенска кутия или адрес на псевдоним, разширен от домейн на псевдоним.", + "is_spam_alias": "%s вече е известен като временен адрес на псевдоним (спам адрес на псевдоним)", + "last_key": "Последното ключове не може да бъде изтрито, моля, деактивирайте TFA вместо това.", + "login_failed": "Неуспешен вход", + "mailbox_defquota_exceeds_mailbox_maxquota": "Квотата по подразбиране надхвърля лимита на макс. квота", + "mailbox_invalid": "Името на пощенската кутия е невалидно", + "mailbox_quota_exceeded": "Квотата надхвърля лимита на домейна (макс. %d MiB)", + "mailbox_quota_exceeds_domain_quota": "Макс. квотата надхвърля лимита на квотата на домейна", + "mailbox_quota_left_exceeded": "Няма достатъчно място (оставащо място: %d MiB)", + "mailboxes_in_use": "Макс. пощенски кутии трябва да бъдат по-големи или равни на %d", + "malformed_username": "Неправилно формирано потребителско име", + "map_content_empty": "Съдържанието на картата не може да бъде празно", + "max_alias_exceeded": "Макс. псевдоними са надхвърлени", + "max_mailbox_exceeded": "Макс. пощенски кутии са надхвърлени (%d от %d)", + "max_quota_in_use": "Квотата на пощенската кутия трябва да бъде по-голяма или равна на %d MiB", + "maxquota_empty": "Макс. квотата за пощенска кутия не трябва да бъде 0.", + "mysql_error": "Грешка на MySQL: %s", + "network_host_invalid": "Невалидна мрежа или хост: %s", + "next_hop_interferes": "%s се намесва с nexthop %s", + "next_hop_interferes_any": "Съществуващ следващ хоп се намесва с %s", + "nginx_reload_failed": "Презареждането на Nginx е неуспешно: %s", + "no_user_defined": "Няма зададен потребител", + "object_exists": "Обектът %s вече съществува", + "object_is_not_numeric": "Стойността %s не е числова", + "password_complexity": "Паролата не отговаря на изискванията", + "password_empty": "Паролата не трябва да бъде празна", + "password_mismatch": "Паролата за потвърждение не съвпада", + "password_reset_invalid_user": "Пощенската кутия не е намерена или не е зададен имейл за възстановяване", + "password_reset_na": "Възстановяването на парола в момента е недостъпно. Моля, свържете се с вашия администратор.", + "policy_list_from_exists": "Съществува запис с даденото име", + "policy_list_from_invalid": "Записът има невалиден формат", + "private_key_error": "Грешка с частен ключ: %s", + "pushover_credentials_missing": "Липсва токен или ключ на Pushover", + "pushover_key": "Ключът на Pushover има грешен формат", + "pushover_token": "Токенът на Pushover има грешен формат", + "quota_not_0_not_numeric": "Квотата трябва да бъде числова и >= 0", + "recipient_map_entry_exists": "Съществува запис в картата на получатели \"%s\"", + "recovery_email_failed": "Не може да бъде изпратен имейл за възстановяване. Моля, свържете се с вашия администратор.", + "redis_error": "Грешка на Redis: %s", + "relayhost_invalid": "Записът в картата %s е невалиден", + "release_send_failed": "Съобщението не може да бъде освободено: %s", + "required_data_missing": "Липсват необходими данни %s", + "reset_f2b_regex": "Регулярният филтър не може да бъде нулиран навреме, моля, опитайте отново или изчакайте още няколко секунди и презаредете уеб сайта.", + "reset_token_limit_exceeded": "Лимитът на токена за нулиране е надхвърлен. Моля, опитайте по-късно.", + "resource_invalid": "Името на ресурса %s е невалидно", + "rl_timeframe": "Временният интервал за ограничение на скоростта е некоректен", + "rspamd_ui_pw_length": "Паролата на UI на Rspamd трябва да бъде поне 6 символа", + "script_empty": "Скриптът не може да бъде празен", + "sender_acl_invalid": "Стойността на ACL на изпращач %s е невалидна", + "set_acl_failed": "Неуспешно задаване на ACL", + "settings_map_invalid": "Идентификаторът на картата с настройки %s е невалиден", + "sieve_error": "Грешка при синтаксиса на Sieve: %s", + "spam_learn_error": "Грешка при обучение за спам: %s", + "subject_empty": "Темата не трябва да бъде празна", + "target_domain_invalid": "Целевият домейн %s е невалиден", + "targetd_not_found": "Целевият домейн %s не е намерен", + "targetd_relay_domain": "Целевият домейн %s е домейн за реле", + "template_exists": "Шаблонът %s вече съществува", + "template_id_invalid": "Идентификаторът на шаблона %s е невалиден", + "template_name_invalid": "Името на шаблона е невалидно", + "temp_error": "Временна грешка", + "text_empty": "Текстът не трябва да бъде празен", + "tfa_token_invalid": "Токенът за TFA е невалиден", + "tls_policy_map_dest_invalid": "Дестинацията на политиката е невалидна", + "tls_policy_map_entry_exists": "Съществува запис в картата на политиката на TLS \"%s\"", + "tls_policy_map_parameter_invalid": "Параметърът на политиката е невалиден", + "to_invalid": "Получателят не трябва да бъде празен", + "totp_verification_failed": "Проверката на TOTP е неуспешна", + "transport_dest_exists": "Дестинацията на транспорта \"%s\" съществува", + "webauthn_verification_failed": "Проверката на WebAuthn е неуспешна: %s", + "webauthn_authenticator_failed": "Избраният аутентикатор не е намерен", + "webauthn_publickey_failed": "Не е запазен публичен ключ за избрания аутентикатор", + "webauthn_username_failed": "Избраният аутентикатор принадлежи на друга сметка", + "unknown": "Възникна неизвестна грешка", + "unknown_tfa_method": "Неизвестен метод за TFA", + "unlimited_quota_acl": "Неограничената квота е забранена от ACL", + "username_invalid": "Потребителското име %s не може да бъде използвано", + "validity_missing": "Моля, задайте период на валидност", + "value_missing": "Моля, предоставете всички стойности", + "yotp_verification_failed": "Проверката на Yubico OTP е неуспешна: %s" + }, + "datatables": { + "collapse_all": "Свиване на всичко", + "decimal": ".", + "emptyTable": "Няма данни в таблицата", + "expand_all": "Разширяване на всичко", + "info": "Показване на _START_ до _END_ от _TOTAL_ записа", + "infoEmpty": "Показване на 0 до 0 от 0 записа", + "infoFiltered": "(филтрирани от общо _MAX_ записа)", + "infoPostFix": "", + "thousands": ",", + "lengthMenu": "Показване на _MENU_ записа", + "loadingRecords": "Зареждане...", + "processing": "Моля, изчакайте...", + "search": "Търсене:", + "zeroRecords": "Няма съвпадащи записи", + "paginate": { + "first": "Първи", + "last": "Последен", + "next": "Следващ", + "previous": "Предишен" + }, + "aria": { + "sortAscending": ": активиране за сортиране на колоната във възходящ ред", + "sortDescending": ": активиране за сортиране на колоната в низходящ ред" + } + }, + "debug": { + "architecture": "Архитектура", + "chart_this_server": "Графика (този сървър)", + "containers_info": "Информация за контейнерите", + "container_running": "Изпълнява се", + "container_disabled": "Контейнерът е спрян или деактивиран", + "container_stopped": "Спрян", + "cores": "Ядра", + "current_time": "Системно време", + "disk_usage": "Използване на диска", + "docs": "Документи", + "error_show_ip": "Не може да се разреши публичния IP адрес", + "external_logs": "Външни логове", + "history_all_servers": "История (всички сървъри)", + "in_memory_logs": "Логове в паметта", + "last_modified": "Последно модифициране", + "log_info": "

Логовете на mailcow в паметта се събират в списъци на Redis и се подрязват до LOG_LINES (%d) на всяка минута, за да се намали натоварването.
Логовете в паметта не са предназначени да бъдат постоянни. Всички приложения, които записват в паметта, също записват в демона на Docker и следователно в основния драйвер за логсване.
Логовете в паметта трябва да се използват за отстраняване на леки проблеми с контейнери.

\r\n

Външните логове се събират чрез API на даденото приложение.

\r\n

Статичните логове са най-вече логове на активност, които не се записват в демона на Docker, но все още трябва да бъдат постоянни (с изключение на логовете на API).

", + "login_time": "Време", + "logs": "Логове", + "memory": "Памет", + "online_users": "Потребители онлайн", + "restart_container": "Рестартиране", + "service": "Услуга", + "show_ip": "Показване на публичен IP", + "size": "Размер", + "started_at": "Стартирано в", + "started_on": "Стартирано на", + "static_logs": "Статични логове", + "success": "Успех", + "system_containers": "Система & Контейнери", + "timezone": "Часова зона", + "uptime": "Време на работа", + "update_available": "Има налична актуализация", + "no_update_available": "Системата е на последното издание", + "update_failed": "Не може да се провери за актуализация", + "username": "Потребителско име", + "wip": "В момента се работи" + }, + "diagnostics": { + "cname_from_a": "Стойността е извлечена от A/AAAA запис. Това се поддържа, докато записът сочи към правилния ресурс.", + "dns_records": "DNS записи", + "dns_records_24hours": "Моля, имайте предвид, че промените в DNS може да отнемат до 24 часа, за да имат актуалното си състояние правилно отразено на тази страница. Тя е предназначена да ви позволи лесно да видите как да конфигурирате вашите DNS записи и да проверите дали всичките ви записи са правилно запазени в DNS.", + "dns_records_data": "Правилни данни", + "dns_records_docs": "Моля, вижте и документацията.", + "dns_records_name": "Име", + "dns_records_status": "Текущо състояние", + "dns_records_type": "Тип", + "optional": "Този запис е опционален." + }, + "edit": { + "acl": "ACL (Разрешение)", + "active": "Активен", + "admin": "Редактиране на администратор", + "advanced_settings": "Разширени настройки", + "alias": "Редактиране на псевдоним", + "allow_from_smtp": "Разрешаване само на тези IP адреси да използват SMTP", + "allow_from_smtp_info": "Оставете празно, за да разрешите всички изпращачи.
IPv4/IPv6 адреси и мрежи.", + "allowed_protocols": "Разрешени протоколи за пряк потребителски достъп (не засяга протоколите за пароли на приложения)", + "app_name": "Име на приложението", + "app_passwd": "Парола за приложение", + "app_passwd_protocols": "Разрешени протоколи за паролата на приложението", + "automap": "Опит за автоматично картографиране на папки (\"Изпратени\", \"Изпратени\" => \"Изпратени\" и т.н.)", + "backup_mx_options": "Опции за реле", + "bcc_dest_format": "BCC дестинацията трябва да бъде един валиден имейл адрес.
Ако имате нужда да изпратите копие до множество адреси, създайте псевдоним и го използвайте тук.", + "client_id": "Идентификатор на клиента", + "client_secret": "Тайна на клиента", + "comment_info": "Частен коментар не е видим за потребителя, докато публичен коментар се показва като подсказка при преминаване с мишката върху него в прегледа на потребителя", + "created_on": "Създаден на", + "custom_attributes": "Персонализирани атрибути", + "delete1": "Изтриване от източника след завършване", + "delete2": "Изтриване на съобщенията в дестинацията, които не са в източника", + "delete2duplicates": "Изтриване на дубликати в дестинацията", + "delete_ays": "Моля, потвърдете процеса на изтриване.", + "description": "Описание", + "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", + "domain": "Редактиране на домейн", + "domain_admin": "Редактиране на администратор на домейн", + "domain_footer": "Подвал за домейн", + "domain_footer_html": "HTML подвал", + "domain_footer_info": "Подвалите за домейн се добавят към всички изходящи имейли, свързани с адрес в този домейн. Следните променливи могат да бъдат използвани за подвала:", + "domain_footer_info_vars": { + "auth_user": "{= auth_user =} - Удостоверен потребител, посочен от MTA", + "from_user": "{= from_user =} - Потребителска част на обвивката, напр. за \"moo@mailcow.tld\" връща \"moo\"", + "from_name": "{= from_name =} - Име на обвивката, напр. за \"Mailcow <moo@mailcow.tld>\" връща \"Mailcow\"", + "from_addr": "{= from_addr =} - Адресна част на обвивката", + "from_domain": "{= from_domain =} - Домейна част на обвивката", + "custom": "{= foo =} - Ако пощенската кутия има персонализиран атрибут \"foo\" със стойност \"bar\", ще върне \"bar\"" + }, + "domain_footer_plain": "PLAIN подвал", + "domain_footer_skip_replies": "Игнориране на подвал в отговорни имейли", + "domain_quota": "Квота на домейна", + "domains": "Домейни", + "dont_check_sender_acl": "Деактивиране на проверката на изпращач за домейн %s (+ домейни на псевдоними)", + "edit_alias_domain": "Редактиране на домейн на псевдоним", + "encryption": "Криптиране", + "exclude": "Изключване на обекти (regex)", + "extended_sender_acl": "Външни адреси на изпращач", + "extended_sender_acl_info": "Трябва да бъде импортиран DKIM домейн ключ, ако е наличен.
\r\n Помнете да добавите този сървър към съответния SPF TXT запис.
\r\n Когато домейн или домейн на псевдоним бъде добавен към този сървър, който се припокрива с външен адрес, външният адрес ще бъде премахнат.
\r\n Използвайте @domain.tld, за да разрешите изпращане като *@domain.tld.", + "footer_exclude": "Изключване от подвал", + "force_pw_update": "Принудително обновяване на парола при следващия вход", + "force_pw_update_info": "Този потребител ще може да влезе само в %s. Паролите за приложения остават използваеми.", + "full_name": "Пълно име", + "gal": "Глобален адресен списък", + "gal_info": "Глобалният адресен списък съдържа всички обекти на домейна и не може да бъде редактиран от нито един потребител. Липсва информация за заетост/свободно време в SOGo, ако е деактивирано! Рестартирайте SOGo, за да приложите промените.", + "generate": "генериране", + "grant_types": "Типове разрешения", + "hostname": "Име на хост", + "inactive": "Неактивен", + "kind": "Вид", + "last_modified": "Последно модифициране", + "lookup_mx": "Дестинацията е регулярен израз за съвпадение с MX име (.*\\.google\\.com за пренасочване на всички съобщения, предназначени за MX, завършващ на google.com, през този хоп)", + "mailbox": "Редактиране на пощенска кутия", + "mailbox_quota_def": "Квота по подразбиране за пощенска кутия", + "mailbox_relayhost_info": "Прилага се за пощенската кутия и директните псевдоними само, пренарежда запис в картата на транспорта за домейн.", + "mailbox_rename": "Преименуване на пощенска кутия", + "mailbox_rename_agree": "Създадох резервно копие.", + "mailbox_rename_alias": "Автоматично създаване на псевдоним", + "mailbox_rename_title": "Ново локално име на пощенска кутия", + "mailbox_rename_warning": "ВНИМАНИЕ! Създайте резервно копие преди преименуване на пощенската кутия.", + "max_aliases": "Макс. псевдоними", + "max_mailboxes": "Макс. възможни пощенски кутии", + "max_quota": "Макс. квота за пощенска кутия (MiB)", + "maxage": "Максимална възраст на съобщенията в дни, които ще бъдат проверени от отдалечен
(0 = игнорирай възраст)", + "maxbytespersecond": "Макс. байтове за секунда
(0 = неограничен)", + "mbox_rl_info": "Това ограничение на скоростта се прилага върху SASL името за вход, то съвпада с всеки \"от\" адрес, използван от влезлия потребител. Ограничението на скоростта на пощенска кутия пренарежда ограничението на скоростта за домейн.", + "mins_interval": "Интервал (мин)", + "multiple_bookings": "Множествени резервации", + "nexthop": "Следващ хоп", + "none_inherit": "Без / Наследяване", + "password": "Парола", + "password_recovery_email": "Имейл за възстановяване на парола", + "password_repeat": "Потвърждаване на паролата (повторете)", + "previous": "Предишна страница", + "private_comment": "Частен коментар", + "public_comment": "Публичен коментар", + "pushover": "Pushover", + "pushover_evaluate_x_prio": "Ескалиране на високоприоритетни съобщения [X-Priority: 1]", + "pushover_info": "Настройките за известия на Pushover ще се прилагат за всички чисти (не-спам) съобщения, доставени до %s, включително псевдоними (споделени, несподелени, таговани).", + "pushover_only_x_prio": "Разглеждане само на високоприоритетни съобщения [X-Priority: 1]", + "pushover_sender_array": "Разглеждане само на следните адреси на изпращач (разделени с запетая)", + "pushover_sender_regex": "Разглеждане на следния regex на изпращач", + "pushover_sound": "Звук", + "pushover_text": "Текст на известието", + "pushover_title": "Заглавие на известието", + "pushover_vars": "Когато не е зададен филтър на изпращач, всички съобщения ще бъдат разглеждани.
Филтрите с регулярен израз, както и точните проверки на изпращач, могат да бъдат дефинирани индивидуално и ще бъдат разглеждани последователно. Те не зависят един от друг.
Използвайте следните променливи за текст и заглавие (моля, вземете предвид политиките за поверителност на данните)", + "pushover_verify": "Проверка на удостоверения", + "quota_mb": "Квота (MiB)", + "quota_warning_bcc": "Предупреждения за квота ще бъдат изпращани като отделни копия до следните получатели:", + "quota_warning_bcc_info": "Съобщенията ще бъдат изпратени с тема, допълнена с името на потребителя в скоби, например: Предупреждение за квота (user@example.com).", + "ratelimit": "Ограничение на скоростта", + "redirect_uri": "URI за пренасочване/обратно извикване", + "relay_all": "Реле на всички получатели", + "relay_all_info": "↪ Ако изберете да не релеирате всички получатели, ще трябва да добавите (\"скрита\") пощенска кутия за всеки отделен получател, който трябва да бъде релеиран.", + "relay_domain": "Реле на този домейн", + "relay_transport_info": "
Инфо
Можете да дефинирате транспортни карти за персонализирана дестинация за този домейн. Ако не е зададено, ще бъде направен MX lookup.", + "relay_unknown_only": "Реле на несъществуващи пощенски кутии. Съществуващите пощенски кутии ще бъдат доставени локално.", + "relayhost": "Транспорти, зависими от изпращач", + "remove": "Премахване", + "resource": "Ресурс", + "save": "Запазване на промените", + "scope": "Обхват", + "sender_acl": "Разрешаване на изпращане като", + "sender_acl_disabled": "Проверката на изпращач е деактивирана", + "sender_acl_info": "Ако потребителят на пощенска кутия A е разрешен да изпраща като потребителя на пощенска кутия B, адресът на изпращач не се показва автоматично като избираем \"от\" поле в SOGo.
\r\n Потребителят на пощенска кутия B трябва да създаде делегация в SOGo, за да разреши на потребителя на пощенска кутия A да избира техния адрес като изпращач. За да делегирате пощенска кутия в SOGo, използвайте менюто (три точки) вдясно от името на пощенската кутия в горния ляв ъгъл, докато сте в режим на поща. Това поведение не се прилага за адреси на псевдоними.", + "sieve_desc": "Кратко описание", + "sieve_type": "Тип на филтър", + "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)", + "sogo_access": "Директно препращане към SOGo", + "sogo_access_info": "След влизане, потребителят се пренасочва автоматично към SOGo.", + "sogo_visible": "Псевдонимът е видим в SOGo", + "sogo_visible_info": "Тази опция засяга само обекти, които могат да бъдат показани в SOGo (споделени или несподелени адреси на псевдоними, сочещи поне една локална пощенска кутия). Ако е скрит, псевдонимът няма да се появи като избираем адрес на изпращач в SOGo.", + "spam_alias": "Създаване или промяна на временни псевдоними", + "spam_filter": "Филтър за спам", + "spam_policy": "Добавяне или премахване на елементи към черния/бял списък", + "spam_score": "Задаване на персонализиран резултат за спам", + "subfolder2": "Синхронизиране в подпапка в дестинацията
(празно = не използвай подпапка)", + "syncjob": "Редактиране на синхронизираща задача", + "target_address": "Адрес/и за пренасочване (разделени с запетая)", + "target_domain": "Целеви домейн", + "timeout1": "Таймаут за връзка с отдалечен хост", + "timeout2": "Таймаут за връзка с локален хост", + "title": "Редактиране на обект", + "unchanged_if_empty": "Ако не е променено, оставете празно", + "username": "Потребителско име", + "validate_save": "Валидиране и запазване" + }, + "fido2": { + "confirm": "Потвърждаване", + "fido2_auth": "Вход с FIDO2", + "fido2_success": "Устройството е регистрирано успешно", + "fido2_validation_failed": "Проверката е неуспешна", + "fn": "Приятелско име", + "known_ids": "Известни идентификатори", + "none": "Деактивирано", + "register_status": "Състояние на регистрация", + "rename": "Преименуване", + "set_fido2": "Регистриране на FIDO2 устройство", + "set_fido2_touchid": "Регистриране на Touch ID на Apple M1", + "set_fn": "Задаване на приятелско име", + "start_fido2_validation": "Стартиране на проверка на FIDO2" + }, + "footer": { + "cancel": "Отказ", + "confirm_delete": "Потвърждаване на изтриването", + "delete_now": "Изтриване сега", + "delete_these_items": "Моля, потвърдете промените за следния идентификатор на обект", + "hibp_check": "Проверка срещу haveibeenpwned.com", + "hibp_nok": "Съвпадение! Това е потенциално опасна парола!", + "hibp_ok": "Няма съвпадение.", + "loading": "Моля, изчакайте...", + "nothing_selected": "Няма избрани елементи", + "restart_container": "Рестартиране на контейнер", + "restart_container_info": "Важно: Грациозното рестартиране може да отнеме известно време за завършване, моля, изчакайте да приключи.", + "restart_now": "Рестартиране сега", + "restarting_container": "Рестартиране на контейнера, това може да отнеме известно време" + }, + "header": { + "administration": "Конфигурация & Детайли", + "apps": "Приложения", + "debug": "Информация", + "email": "Имейл", + "mailcow_system": "Система", + "mailcow_config": "Конфигурация", + "quarantine": "Карантина", + "restart_netfilter": "Рестартиране на netfilter", + "restart_sogo": "Рестартиране на SOGo", + "user_settings": "Настройки на потребителя" + }, + "info": { + "awaiting_tfa_confirmation": "Изчакване на потвърждение за TFA", + "no_action": "Няма приложимо действие", + "session_expires": "Вашата сесия ще изтече след около 15 секунди" + }, + "login": { + "back_to_mailcow": "Обратно към mailcow", + "delayed": "Входът е забавен с %s секунди.", + "fido2_webauthn": "Вход с FIDO2/WebAuthn", + "forgot_password": "> Забравена парола?", + "invalid_pass_reset_token": "Токенът за нулиране на парола е невалиден или е изтекъл.
Моля, заявете нов линк за нулиране на парола.", + "login": "Вход", + "login_admin": "Вход на администратор", + "login_dadmin": "Вход на администратор на домейн", + "login_user": "Потребителски вход", + "mobileconfig_info": "Моля, влезте като потребител на пощенска кутия, за да изтеглите поискания Apple профил за връзка.", + "new_password": "Нова парола", + "new_password_confirm": "Потвърждаване на новата парола", + "other_logins": "или вход с", + "password": "Парола", + "request_reset_password": "Заявка за промяна на парола", + "reset_password": "Нулиране на парола", + "username": "Потребителско име" + }, + "mailbox": { + "action": "Действие", + "activate": "Активиране", + "active": "Активен", + "add": "Добавяне", + "add_alias": "Добавяне на псевдоним", + "add_alias_expand": "Разширяване на псевдоним над домейни на псевдоними", + "add_bcc_entry": "Добавяне на запис в картата BCC", + "add_domain": "Добавяне на домейн", + "add_domain_alias": "Добавяне на псевдоним на домейн", + "add_domain_record_first": "Моля, добавете първо домейн", + "add_filter": "Добавяне на филтър", + "add_mailbox": "Добавяне на пощенска кутия", + "add_recipient_map_entry": "Добавяне на запис в картата на получатели", + "add_resource": "Добавяне на ресурс", + "add_template": "Добавяне на шаблон", + "add_tls_policy_map": "Добавяне на карта на политиката на TLS", + "address_rewriting": "Презаписване на адрес", + "alias": "Псевдоним", + "alias_domain_alias_hint": "Псевдонимите не се прилагат автоматично към домейни на псевдоними. Псевдонимът my-alias@domain не покрива адреса my-alias@alias-domain (където \"alias-domain\" е имагинерен псевдоним на домейн).
Моля, използвайте филтър на Sieve, за да пренасочите имейл към външна пощенска кутия (вижте раздела \"Филтри\" или SOGo -> Пренасочвач). Използвайте \"Разширяване на псевдоним над домейни на псевдоними\", за да добавите автоматично липсващи псевдоними.", + "alias_domain_backupmx": "Псевдонимът на домейн е неактивен за домейн за реле", + "aliases": "Псевдоними", + "all_domains": "Всички домейни", + "allow_from_smtp": "Разрешаване само на тези IP адреси да използват SMTP", + "allow_from_smtp_info": "Оставете празно, за да разрешите всички изпращачи.
IPv4/IPv6 адреси и мрежи.", + "allowed_protocols": "Разрешени протоколи", + "backup_mx": "Домейн за реле", + "bcc": "BCC", + "bcc_destination": "BCC дестинация", + "bcc_destinations": "BCC дестинации", + "bcc_info": "Картите BCC се използват, за да препращат тихо копия от всички съобщения до друг адрес. Записът от тип получател на карта се използва, когато локалната дестинация действа като получател на имейл. Записът от тип изпращач на карта се използва, когато локалната дестинация действа като изпращач на имейл. Локалната дестинация няма да бъде информирана за неуспешна доставка.", + "bcc_local_dest": "Локална дестинация", + "bcc_map": "Карта BCC", + "bcc_map_type": "Тип BCC", + "bcc_maps": "Карти BCC", + "bcc_rcpt_map": "Карта на получател", + "bcc_sender_map": "Карта на изпращач", + "bcc_to_rcpt": "Превключване към карта на получател", + "bcc_to_sender": "Превключване към карта на изпращач", + "bcc_type": "Тип BCC", + "booking_null": "Винаги показване като свободен", + "booking_0_short": "Винаги свободен", + "booking_custom": "Твърдо ограничение до определен брой резервации", + "booking_custom_short": "Твърдо ограничение", + "booking_ltnull": "Неограничено, но показване като заето, когато е резервирано", + "booking_lt0_short": "Меко ограничение", + "catch_all": "Catch-All", + "created_on": "Създаден на", + "daily": "Ежедневно", + "deactivate": "Деактивиране", + "description": "Описание", + "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", + "disable_x": "Деактивиране", + "dkim_domains_selector": "Селектор", + "dkim_key_length": "Дължина на DKIM ключа (битове)", + "domain": "Домейн", + "domain_admins": "Администратори на домейн", + "domain_aliases": "Псевдоними на домейн", + "domain_templates": "Шаблони за домейн", + "domain_quota": "Квота", + "domain_quota_total": "Обща квота на домейна", + "domains": "Домейни", + "edit": "Редактиране", + "empty": "Няма резултати", + "enable_x": "Активиране", + "excludes": "Изключване", + "filter_table": "Таблица с филтри", + "filters": "Филтри", + "fname": "Пълно име", + "force_pw_update": "Принудително обновяване на парола при следващия вход", + "gal": "Глобален адресен списък", + "goto_ham": "Учен като не е спам", + "goto_spam": "Учен като спам", + "hourly": "Часово", + "iam": "Доставчик на идентичност", + "in_use": "В употреба (%)", + "inactive": "Неактивен", + "insert_preset": "Вмъкване на примерен предефиниран набор \"%s\"", + "kind": "Вид", + "last_mail_login": "Последен вход в пощата", + "last_modified": "Последно модифициране", + "last_pw_change": "Последна промяна на парола", + "last_run": "Последно изпълнение", + "last_run_reset": "Задаване на следващо", + "mailbox": "Пощенска кутия", + "mailbox_defaults": "Настройки по подразбиране", + "mailbox_defaults_info": "Дефинирайте настройки по подразбиране за нови пощенски кутии.", + "mailbox_defquota": "Размер по подразбиране на пощенска кутия", + "mailbox_templates": "Шаблони за пощенска кутия", + "mailbox_quota": "Макс. размер на пощенска кутия", + "mailboxes": "Пощенски кутии", + "max_aliases": "Макс. псевдоними", + "max_mailboxes": "Макс. възможни пощенски кутии", + "max_quota": "Макс. квота за пощенска кутия", + "mins_interval": "Интервал (мин)", + "msg_num": "Съобщение №", + "multiple_bookings": "Множествени резервации", + "never": "Никога", + "no": "✕", + "no_record": "Няма запис за обект %s", + "no_record_single": "Няма запис", + "open_logs": "Отваряне на логове", + "owner": "Собственик", + "private_comment": "Частен коментар", + "public_comment": "Публичен коментар", + "q_add_header": "при преместване в папката за нежелана поща", + "q_all": " при преместване в папката за нежелана поща и при отхвърляне", + "q_reject": "при отхвърляне", + "quarantine_category": "Категория на уведомленията за карантина", + "quarantine_notification": "Уведомления за карантина", + "quick_actions": "Действия", + "recipient": "Получател", + "recipient_map": "Карта на получател", + "recipient_map_info": "Картите на получател се използват, за да се замени адресът на дестинация на съобщението, преди да бъде доставено.", + "recipient_map_new": "Нов получател", + "recipient_map_new_info": "Дестинацията на картата на получател трябва да бъде валиден имейл адрес или име на домейн.", + "recipient_map_old": "Оригинален получател", + "recipient_map_old_info": "Оригиналната дестинация на картата на получател трябва да бъде валиден имейл адрес или име на домейн.", + "recipient_maps": "Карти на получател", + "relay_all": "Реле на всички получатели", + "relay_unknown": "Реле на несъществуващи пощенски кутии", + "remove": "Премахване", + "resources": "Ресурси", + "running": "Изпълнява се", + "sender": "Изпращач", + "set_postfilter": "Маркиране като постфилтър", + "set_prefilter": "Маркиране като префилтър", + "sieve_info": "Можете да запазите множество филтри за всеки потребител, но само един префилтър и един постфилтър могат да бъдат активни едновременно.
\r\nВсеки филтър ще бъде обработен в описания ред. Нито един неуспешен скрипт, нито издадена команда \"keep;\" няма да спре обработката на следващите скриптове. Промените в глобалните филтри на sieve ще предизвикат рестартиране на Dovecot.

Глобален префилтър на sieve • Префилтър • Потребителски скриптове • Постфилтър • Глобален постфилтър на sieve", + "sieve_preset_1": "Изтриване на съобщения с потенциално опасни типове файлове", + "sieve_preset_2": "Винаги маркиране на имейла на определен изпращач като прочетен", + "sieve_preset_3": "Тихо изтриване, спиране на всякаква допълнителна обработка на sieve филтри", + "sieve_preset_4": "Архивиране на съобщението във ВХОДНА, пропускане на допълнителна обработка от sieve филтри", + "sieve_preset_5": "Автоотговор (ваканция)", + "sieve_preset_6": "Отхвърляне на съобщение с отговор", + "sieve_preset_7": "Пренасочване и запазване/изтриване", + "sieve_preset_8": "Пренасочване на имейл от определен изпращач, маркиране като прочетен и сортиране в подпапка", + "sieve_preset_header": "Моля, вижте примерните предефинирани набори по-долу. За повече детайли вижте Wikipedia.", + "sogo_visible": "Псевдонимът е видим в SOGo", + "sogo_visible_n": "Скриване на псевдоним в SOGo", + "sogo_visible_y": "Показване на псевдоним в SOGo", + "spam_aliases": "Времеви псевдоними", + "stats": "Статистика", + "status": "Статус", + "sync_jobs": "Синхронизиращи задачи", + "syncjob_check_log": "Проверка на лога", + "syncjob_last_run_result": "Резултат от последното изпълнение", + "syncjob_EX_OK": "Успех", + "syncjob_EXIT_CONNECTION_FAILURE": "Проблем с връзката", + "syncjob_EXIT_TLS_FAILURE": "Проблем с криптираната връзка", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Проблем с удостоверяването", + "syncjob_EXIT_OVERQUOTA": "Целевата пощенска кутия е над квотата", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Не може да се свърже с отдалечен сървър", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Грешно потребителско име или парола", + "table_size": "Размер на таблицата", + "table_size_show_n": "Показване на %s елемента", + "target_address": "Адрес за пренасочване", + "target_domain": "Целеви домейн", + "templates": "Шаблони", + "template": "Шаблон", + "tls_enforce_in": "Принудително използване на TLS за входящи", + "tls_enforce_out": "Принудително използване на TLS за изходящи", + "tls_map_dest": "Дестинация", + "tls_map_dest_info": "Примери: example.org, .example.org, [mail.example.org]:25", + "tls_map_parameters": "Параметри", + "tls_map_parameters_info": "Празно или параметри, например: protocols=!SSLv2 ciphers=medium exclude=3DES", + "tls_map_policy": "Политика", + "tls_policy_maps": "Пренареждания на политиката на TLS", + "tls_policy_maps_enforced_tls": "Тези политики ще пренареждат и поведението за потребители на пощенски кутии, които принудително използват изходящи TLS връзки. Ако няма политика, съществуваща по-долу, тези потребители ще приложат стойностите по подразбиране, зададени като smtp_tls_mandatory_protocols и smtp_tls_mandatory_ciphers.", + "tls_policy_maps_info": "Тази политика за пренареждане на TLS транспортни правила е независима от настройките за политика на TLS на потребителя.
\r\n Моля, вижте документацията за \"smtp_tls_policy_maps\" за повече информация.", + "tls_policy_maps_long": "Пренареждания на политиката на TLS за изходящи", + "toggle_all": "Превключване на всички", + "username": "Потребителско име", + "waiting": "Изчакване", + "weekly": "Седмично", + "yes": "✓" + }, + "oauth2": { + "access_denied": "Моля, влезте като собственик на пощенска кутия, за да удостоверите чрез OAuth2.", + "authorize_app": "Удостоверяване на приложение", + "deny": "Отказ", + "permit": "Удостоверяване на приложение", + "profile": "Профил", + "profile_desc": "Преглед на лични данни: потребителско име, пълно име, създадено, модифицирано, активно", + "scope_ask_permission": "Приложението заявява следните разрешения", + "client_id": "Идентификатор на клиента", + "client_secret": "Тайна на клиента", + "redirect_uri": "URI за пренасочване", + "renew_secret": "Генериране на нова тайна на клиента", + "revoke_tokens": "Анулиране на всички токени на клиента" + }, + "quarantine": { + "action": "Действие", + "atts": "Прикачени файлове", + "check_hash": "Търсене на файлов хеш в VirusTotal", + "confirm": "Потвърждаване", + "confirm_delete": "Потвърждаване на изтриването на този елемент.", + "danger": "Опасност", + "deliver_inbox": "Доставяне в пощенската кутия", + "disabled_by_config": "Текущата системна конфигурация деактивира функционалността на карантината. Моля, задайте \"задържания за пощенска кутия\" и \"максимален размер\" за елементите на карантината.", + "download_eml": "Изтегляне (.eml)", + "empty": "Няма резултати", + "high_danger": "Висока", + "info": "Информация", + "junk_folder": "Папка за нежелана поща", + "learn_spam_delete": "Учен като спам и изтриване", + "low_danger": "Ниска", + "medium_danger": "Средна", + "neutral_danger": "Неутрална", + "notified": "Уведомен", + "qhandler_success": "Заявката е изпратена успешно до системата. Можете да затворите прозореца сега.", + "qid": "QID на Rspamd", + "qinfo": "Системата за карантина ще запази отхвърлените съобщения в базата данни (изпращачът няма да бъде информиран за доставеното съобщение) както и съобщенията, доставени като копие в папката за нежелана поща на пощенска кутия.

\"Учен като спам и изтриване\" ще научи съобщението като спам чрез теоремата на Бейс и също ще изчисли размити хешове, за да отхвърли подобни съобщения в бъдеще.

Моля, имайте предвид, че обучаването на множество съобщения може да бъде - в зависимост от вашата система - времеемко.
Елементите в черния списък са изключени от карантината.", + "qitem": "Елемент в карантина", + "quarantine": "Карантина", + "quick_actions": "Действия", + "quick_delete_link": "Отваряне на бърз линк за изтриване", + "quick_info_link": "Отваряне на бърз информационен линк", + "quick_release_link": "Отваряне на бърз линк за освобождане", + "rcpt": "Получател", + "received": "Получено", + "recipients": "Получатели", + "refresh": "Опресняване", + "rejected": "Отхвърлено", + "release": "Освобождане", + "release_body": "Прикаченото съобщение е добавено към това съобщение.", + "release_subject": "Потенциално вреден елемент в карантина %s", + "remove": "Премахване", + "rewrite_subject": "Презаписване на темата", + "rspamd_result": "Резултат от Rspamd", + "sender": "Изпращач (SMTP)", + "sender_header": "Изпращач (\"From\" заглавие)", + "settings_info": "Максимален брой елементи за карантиниране: %s
Максимален размер на имейл: %s MiB", + "show_item": "Показване на елемент", + "spam": "Спам", + "spam_score": "Резултат", + "subj": "Тема", + "table_size": "Размер на таблицата", + "table_size_show_n": "Показване на %s елемента", + "text_from_html_content": "Съдържание (конвертиран HTML)", + "text_plain_content": "Съдържание (обикновен текст)", + "toggle_all": "Превключване на всички", + "type": "Тип" + }, + "queue": { + "delete": "Изтриване на всички", + "flush": "Изчистване на опашката", + "info": "Опашката на имейлите съдържа всички имейли, които чакат за доставка. Ако имейлът е засечен в опашката за дълго време, той автоматично се изтрива от системата.
Съобщението за грешка на съответния имейл дава информация защо имейлът не може да бъде доставен.", + "legend": "Функции на действията в опашката на имейлите:", + "ays": "Моля, потвърдете, че искате да изтриете всички елементи от текущата опашка.", + "deliver_mail": "Доставяне", + "deliver_mail_legend": "Опит за повторно доставяне на избраните съобщения.", + "hold_mail": "Задържане", + "hold_mail_legend": "Задържа избраните съобщения. (Предотвратява допълнителни опити за доставяне)", + "queue_manager": "Мениджър на опашката", + "show_message": "Показване на съобщение", + "unban": "разблокиране на опашката", + "unhold_mail": "Освобождаване", + "unhold_mail_legend": "Освобождава избраните съобщения за доставка. (Изисква предварително задържане)" + }, + "ratelimit": { + "disabled": "Деактивирано", + "second": "съобщения/секунда", + "minute": "съобщения/минута", + "hour": "съобщения/час", + "day": "съобщения/ден" + }, + "start": { + "help": "Показване/Скриване на панела за помощ", + "imap_smtp_server_auth_info": "Моля, използвайте пълния си имейл адрес и механизма за удостоверяване PLAIN.
\r\nВашите данни за вход ще бъдат криптирани от сървърната страна чрез задължително сървърно криптиране." + }, + "success": { + "acl_saved": "ACL за обект %s е запазен", + "admin_added": "Администраторът %s е добавен", + "admin_api_modified": "Промените в API са запазени", + "admin_modified": "Промените в администратора са запазени", + "admin_removed": "Администраторът %s е премахнат", + "alias_added": "Адресът на псевдонима %s (%d) е добавен", + "alias_domain_removed": "Домейнът на псевдонима %s е премахнат", + "alias_modified": "Промените в адреса на псевдонима %s са запазени", + "alias_removed": "Псевдонимът %s е премахнат", + "aliasd_added": "Добавен домейн на псевдоним %s", + "aliasd_modified": "Промените в домейна на псевдоним %s са запазени", + "app_links": "Запазени промени в линковете на приложенията", + "app_passwd_added": "Добавена нова парола за приложение", + "app_passwd_removed": "Премахната парола за приложение с ID %s", + "bcc_deleted": "Записи в картата BCC са изтрити: %s", + "bcc_edited": "Записът в картата BCC %s е редактиран", + "bcc_saved": "Записът в картата BCC е запазен", + "cors_headers_edited": "Настройките на CORS са запазени", + "db_init_complete": "Инициализацията на базата данни е завършена", + "delete_filter": "Изтрити филтри с ID %s", + "delete_filters": "Изтрити филтри: %s", + "deleted_syncjob": "Изтрита синхронизираща задача с ID %s", + "deleted_syncjobs": "Изтрити синхронизиращи задачи: %s", + "dkim_added": "Добавен DKIM ключ %s", + "dkim_duplicated": "DKIM ключът за домейн %s е копиран в %s", + "dkim_removed": "DKIM ключът %s е премахнат", + "domain_add_dkim_available": "DKIM ключът вече съществува", + "domain_added": "Добавен домейн %s", + "domain_admin_added": "Добавен администратор на домейн %s", + "domain_admin_modified": "Промените в администратора на домейн %s са запазени", + "domain_admin_removed": "Администраторът на домейн %s е премахнат", + "domain_footer_modified": "Промените в подвала на домейн %s са запазени", + "domain_modified": "Промените в домейн %s са запазени", + "domain_removed": "Домейнът %s е премахнат", + "dovecot_restart_success": "Dovecot е рестартиран успешно", + "eas_reset": "Устройствата с ActiveSync за потребителя %s са нулирани", + "f2b_banlist_refreshed": "Списъкът с ID на блокираните е актуализиран успешно.", + "f2b_modified": "Промените в параметрите на Fail2ban са запазени", + "forwarding_host_added": "Добавен хост за препращане %s", + "forwarding_host_removed": "Премахнат хост за препращане %s", + "global_filter_written": "Филтърът е записан успешно във файл", + "hash_deleted": "Хешът е изтрит", + "iam_test_connection": "Връзката е успешна", + "ip_check_opt_in": "Оптирането за използване на услугата на трета страна е запазено успешно", + "ip_check_opt_in_modified": "Проверката на IP беше успешно запазена", + "item_deleted": "Елементът %s е изтрит успешно", + "item_released": "Елементът %s е освободен", + "items_deleted": "Елементът %s е изтрит успешно", + "items_released": "Избраните елементи са освободени", + "learned_ham": "Успешно научен ID %s като не е спам", + "license_modified": "Промените в лиценза са запазени", + "logged_in_as": "Вписан като %s", + "mailbox_added": "Пощенската кутия %s е добавена", + "mailbox_modified": "Промените в пощенската кутия %s са запазени", + "mailbox_removed": "Пощенската кутия %s е премахната", + "mailbox_renamed": "Пощенската кутия е преименувана от %s на %s", + "nginx_reloaded": "Nginx е презареден", + "object_modified": "Промените в обект %s са запазени", + "password_changed_success": "Паролата е променена успешно", + "password_policy_saved": "Политиката за парола е запазена успешно", + "pushover_settings_edited": "Настройките на Pushover са запазени успешно, моля, проверете удостоверенията.", + "qlearn_spam": "Съобщението с ID %s е научено като спам и изтрито", + "queue_command_success": "Командата на опашката е завършена успешно", + "recipient_map_entry_deleted": "Записът в картата на получател с ID %s е изтрит", + "recipient_map_entry_saved": "Записът в картата на получател \"%s\" е запазен", + "recovery_email_sent": "Изпратен имейл за възстановяване до %s", + "relayhost_added": "Записът в картата %s е добавен", + "relayhost_removed": "Записът в картата %s е премахнат", + "reset_main_logo": "Нулиране на логото по подразбиране", + "resource_added": "Ресурсът %s е добавен", + "resource_modified": "Промените в пощенската кутия %s са запазени", + "resource_removed": "Ресурсът %s е премахнат", + "rl_saved": "Ограничението на скоростта за обект %s е запазено", + "rspamd_ui_pw_set": "Паролата на UI на Rspamd е зададена успешно", + "saved_settings": "Запазени настройки", + "settings_map_added": "Добавен запис в картата с настройки", + "settings_map_removed": "Премахнат запис в картата с настройки с ID %s", + "sogo_profile_reset": "Профилът на SOGo за потребителя %s е нулиран", + "template_added": "Добавен шаблон %s", + "template_modified": "Промените в шаблон %s са запазени", + "template_removed": "Шаблонът с ID %s е премахнат", + "tls_policy_map_entry_deleted": "Записът в картата на политиката на TLS с ID %s е изтрит", + "tls_policy_map_entry_saved": "Записът в картата на политиката на TLS \"%s\" е запазен", + "ui_texts": "Запазени промени в текстовете на UI", + "upload_success": "Файлът е качен успешно", + "verified_fido2_login": "Потвърдено вход с FIDO2", + "verified_totp_login": "Потвърдено вход с TOTP", + "verified_webauthn_login": "Потвърдено вход с WebAuthn", + "verified_yotp_login": "Потвърдено вход с Yubico OTP" + }, + "tfa": { + "authenticators": "Аутентикатори", + "api_register": "%s използва облачното API на Yubico. Моля, вземете API ключ за вашия ключ тук", + "confirm": "Потвърждаване", + "confirm_totp_token": "Моля, потвърдете промените, като въведете генерирания токен", + "delete_tfa": "Деактивиране на TFA", + "disable_tfa": "Деактивиране на TFA до следващия успешен вход", + "enter_qr_code": "Вашият TOTP код, ако вашето устройство не може да сканира QR кодове", + "error_code": "Код на грешка", + "init_webauthn": "Инициализиране, моля, изчакайте...", + "key_id": "Идентификатор за вашето устройство", + "key_id_totp": "Идентификатор за вашия ключ", + "none": "Деактивиране", + "reload_retry": "- (презаредете браузъра, ако грешката продължи)", + "scan_qr_code": "Моля, сканирайте следния код с вашето приложение за аутентикация или въведете кода ръчно.", + "select": "Моля, изберете", + "set_tfa": "Задаване на метод за двуфакторно удостоверяване", + "start_webauthn_validation": "Стартиране на проверка", + "tfa": "Двуфакторно удостоверяване", + "tfa_token_invalid": "Невалиден токен за TFA", + "totp": "Временен OTP (Google Authenticator, Authy и др.)", + "u2f_deprecated": "Изглежда, че вашият ключ е регистриран с депрекирания метод U2F. Ще деактивираме двуфакторното удостоверяване за вас и ще изтрием вашия ключ.", + "u2f_deprecated_important": "Моля, регистрирайте вашия ключ в административния панел с новия метод WebAuthn.", + "webauthn": "Удостоверяване с WebAuthn", + "waiting_usb_auth": "Изчакване на USB устройство...

Моля, докоснете бутона на вашето USB устройство сега.", + "waiting_usb_register": "Изчакване на USB устройство...

Моля, въведете паролата си по-горе и потвърдете регистрацията си, като докоснете бутона на вашето USB устройство.", + "yubi_otp": "Удостоверяване с Yubico OTP" + }, + "user": { + "action": "Действие", + "active": "Активен", + "active_sieve": "Активен филтър", + "advanced_settings": "Разширени настройки", + "alias": "Псевдоним", + "alias_create_random": "Генериране на случаен псевдоним", + "alias_extend_all": "Удължаване на всички псевдоними с 1 час", + "alias_full_date": "d.m.Y, H:i:s T", + "alias_remove_all": "Премахване на всички псевдоними", + "alias_select_validity": "Период на валидност", + "alias_time_left": "Оставащо време", + "alias_valid_until": "Валиден до", + "aliases_also_send_as": "Разрешено да изпраща и като потребител", + "aliases_send_as_all": "Не проверявай достъпа на изпращач за следните домейни и техните псевдоними", + "allowed_protocols": "Разрешени протоколи", + "app_hint": "Паролите за приложения са алтернативни пароли за вашия IMAP, SMTP, CalDAV, CardDAV и EAS вход. Потребителското име остава непроменено. SOGo уеб пощата не е достъпна чрез пароли за приложения.", + "app_name": "Име на приложението", + "app_passwds": "Пароли за приложения", + "apple_connection_profile": "Профил за връзка на Apple", + "apple_connection_profile_complete": "Този профил за връзка включва настройки за IMAP и SMTP, както и пътища за CalDAV (календари) и CardDAV (контакти) за устройство на Apple.", + "apple_connection_profile_mailonly": "Този профил за връзка включва настройки за IMAP и SMTP за устройство на Apple.", + "apple_connection_profile_with_app_password": "Генерирана е нова парола за приложение и е добавена към профила, така че не е необходимо да се въвежда парола при настройката на вашето устройство. Моля, не споделяйте файла, тъй като той предоставя пълен достъп до вашата пощенска кутия.", + "attribute": "Атрибут", + "authentication": "Удостоверяване", + "change_password": "Промяна на парола", + "change_password_hint_app_passwords": "Вашият акаунт има %d пароли за приложения, които няма да бъдат променени. За управление на тях, отидете в раздела \"Пароли за приложения\".", + "clear_recent_successful_connections": "Изчистване на видимите успешни връзки", + "client_configuration": "Показване на ръководства за настройка на пощенски клиенти и смартфони", + "create_app_passwd": "Създаване на парола за приложение", + "create_syncjob": "Създаване на нова синхронизираща задача", + "created_on": "Създаден на", + "daily": "Ежедневно", + "day": "ден", + "delete_ays": "Моля, потвърдете процеса на изтриване.", + "description": "Описание", + "direct_aliases": "Директни адреси на псевдоними", + "direct_aliases_desc": "Директните адреси на псевдоними се засягат от настройките за филтър за спам и политика за TLS.", + "direct_protocol_access": "Този потребител на пощенска кутия има директен, външен достъп до следните протоколи и приложения. Тази настройка се контролира от вашия администратор. Паролите за приложения могат да бъдат създадени, за да се предостави достъп до отделни протоколи и приложения.
Бутонът \"Уеб поща\" предоставя еднократно удостоверяване към SOGo и винаги е достъпен.", + "eas_reset": "Нулиране на кеша на устройствата с ActiveSync", + "eas_reset_help": "В много случаи нулирането на кеша на устройството ще помогне за възстановяването на повреден профил на ActiveSync.
Внимание: Всички елементи ще бъдат презаредени!", + "eas_reset_now": "Нулиране сега", + "edit": "Редактиране", + "email": "Имейл", + "email_and_dav": "Имейл, календари и контакти", + "empty": "Няма резултати", + "encryption": "Криптиране", + "excludes": "Изключване", + "expire_in": "Изтича след", + "fido2_webauthn": "FIDO2/WebAuthn", + "force_pw_update": "Трябва да зададете нова парола, за да имате достъп до груповите услуги.", + "from": "от", + "generate": "генериране", + "hour": "час", + "hourly": "Часово", + "hours": "часа", + "in_use": "В употреба", + "interval": "Интервал", + "is_catch_all": "Catch-all за домейн/и", + "last_mail_login": "Последен вход в пощата", + "last_pw_change": "Последна промяна на парола", + "last_run": "Последно изпълнение", + "last_ui_login": "Последен вход в UI", + "loading": "Зареждане...", + "login_history": "История на входовете", + "mailbox": "Пощенска кутия", + "mailbox_details": "Детайли", + "mailbox_general": "Общи", + "mailbox_settings": "Настройки", + "messages": "съобщения", + "month": "месец", + "months": "месеца", + "never": "Никога", + "new_password": "Нова парола", + "new_password_repeat": "Потвърждаване на новата парола", + "no_active_filter": "Няма активен филтър", + "no_last_login": "Няма информация за последен вход в UI", + "no_record": "Няма запис", + "open_logs": "Отваряне на логове", + "open_webmail_sso": "Уеб поща", + "overview": "Преглед", + "password": "Парола", + "password_now": "Текуща парола (потвърждаване на промените)", + "password_repeat": "Парола (повторете)", + "password_reset_info": "Ако не е зададен имейл за възстановяване на парола, тази функция не може да бъде използвана.", + "protocols": "Протоколи", + "pushover_evaluate_x_prio": "Ескалиране на високоприоритетни съобщения [X-Priority: 1]", + "pushover_info": "Настройките за известия на Pushover ще се прилагат за всички чисти (не-спам) съобщения, доставени до %s, включително псевдоними (споделени, несподелени, таговани).", + "pushover_only_x_prio": "Разглеждане само на високоприоритетни съобщения [X-Priority: 1]", + "pushover_sender_array": "Разглеждане на следните адреси на изпращач (разделени с запетая)", + "pushover_sender_regex": "Съвпадение на изпращач с следния regex", + "pushover_sound": "Звук", + "pushover_text": "Текст на известието", + "pushover_title": "Заглавие на известието", + "pushover_vars": "Когато не е зададен филтър на изпращач, всички съобщения ще бъдат разглеждани.
Филтрите с регулярен израз, както и точните проверки на изпращач, могат да бъдат дефинирани индивидуално и ще бъдат разглеждани последователно. Те не зависят един от друг.
Използвайте следните променливи за текст и заглавие (моля, вземете предвид политиките за поверителност на данните)", + "pushover_verify": "Проверка на удостоверения", + "pw_recovery_email": "Имейл за възстановяване на парола", + "q_add_header": "Папка за нежелана поща", + "q_all": "Всички категории", + "q_reject": "Отхвърлени", + "quarantine_category": "Категория на уведомленията за карантина", + "quarantine_category_info": "Категорията \"Отхвърлени\" включва съобщения, които са били отхвърлени, докато категорията \"Папка за нежелана поща\" ще уведоми потребителя за съобщения, които са били поставени в папката за нежелана поща.", + "quarantine_notification": "Уведомления за карантина", + "quarantine_notification_info": "След като уведомлението е изпратено, елементите ще бъдат маркирани като \"уведомени\" и няма да бъдат изпращани допълнителни уведомления за този конкретен елемент.", + "recent_successful_connections": "Видими успешни връзки", + "remove": "Премахване", + "running": "Изпълнява се", + "save": "Запазване на промените", + "save_changes": "Запазване на промените", + "sender_acl_disabled": "Проверката на изпращач е деактивирана", + "shared_aliases": "Споделени адреси на псевдоними", + "shared_aliases_desc": "Споделените псевдоними не се засягат от настройките за филтър за спам и политика за TLS на потребителя. Съответните настройки за спам филтър могат да бъдат направени само от администратор като настройка за домейн.", + "show_sieve_filters": "Показване на активния потребителски филтър на sieve", + "sogo_profile_reset": "Нулиране на профила на SOGo", + "sogo_profile_reset_help": "Това ще унищожи профила на SOGo и ще изтрие всички данни за контакти и календар безвъзвратно.", + "sogo_profile_reset_now": "Нулиране сега", + "spam_aliases": "Временни адреси на псевдоними", + "spam_score_reset": "Нулиране до настройките на сървъра по подразбиране", + "spamfilter": "Филтър за спам", + "spamfilter_behavior": "Рейтинг", + "spamfilter_bl": "Черен списък", + "spamfilter_bl_desc": "Адресите в черния списък винаги ще бъдат класифицирани като спам и отхвърлени. Отхвърлените съобщения не ще бъдат копирани в карантина. Поддържат се уайлдкардове.
Отхвърлените съобщения няма да бъдат доставени до папката за нежелана поща.", + "spamfilter_default_score": "Стойности по подразбиране", + "spamfilter_green": "Зелено: това съобщение не е спам", + "spamfilter_hint": "Първата стойност описва \"нисък резултат за спам\", втората представлява \"висок резултат за спам\".", + "spamfilter_red": "Червено: това съобщение е спам и ще бъде отхвърлено от сървъра", + "spamfilter_table_action": "Действие", + "spamfilter_table_add": "Добавяне на елемент", + "spamfilter_table_domain_policy": "политика на домейна", + "spamfilter_table_empty": "Няма данни за показване", + "spamfilter_table_remove": "премахване", + "spamfilter_table_rule": "Правило", + "spamfilter_wl": "Бял списък", + "spamfilter_wl_desc": "Адресите в белия списък никога ще бъдат класифицирани като спам. Поддържат се уайлдкардове.
Съобщенията, които не са класифицирани като спам, ще бъдат доставени в папката за нежелана поща, ако резултатът за спам е над стойността за висок резултат за спам.", + "spamfilter_yellow": "Жълто: това съобщение може да е спам, ще бъде маркирано като спам и преместено в папката за нежелана поща", + "status": "Статус", + "sync_jobs": "Синхронизиращи задачи", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Проблем с удостоверяването", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Грешно потребителско име или парола", + "syncjob_EXIT_CONNECTION_FAILURE": "Проблем с връзката", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Не може да се свърже с отдалечен сървър", + "syncjob_EXIT_OVERQUOTA": "Целевата пощенска кутия е над квотата", + "syncjob_EXIT_TLS_FAILURE": "Проблем с криптираната връзка", + "syncjob_EX_OK": "Успех", + "syncjob_check_log": "Проверка на лога", + "syncjob_last_run_result": "Резултат от последното изпълнение", + "tag_handling": "Настройка за тагове", + "tag_help_example": "Пример за тагован имейл адрес: me+Facebook@example.org", + "tag_help_explain": "В подпапка: ще бъде създадена нова подпапка под INBOX (\"INBOX/Facebook\").
\r\nВ тема: първото име на тага ще бъде добавено към темата на съобщението, например: \"[Facebook] Моите новини\".", + "tag_in_none": "Не прави нищо", + "tag_in_subfolder": "В подпапка", + "tag_in_subject": "В тема", + "text": "Текст", + "tfa_info": "Двуфакторното удостоверяване помага за защита на вашия акаунт. Ако го активирате, ще ви трябват пароли за приложения, за да влезете в приложения или услуги, които не поддържат двуфакторно удостоверяване (напр. пощенски клиенти).", + "title": "Заглавие", + "tls_enforce_in": "Принудително използване на TLS за входящи", + "tls_enforce_out": "Принудително използване на TLS за изходящи", + "tls_policy": "Политика за криптиране", + "tls_policy_warning": "Внимание: Ако решите да принудите преноса на криптирани съобщения, може да загубите съобщения.
Съобщенията, които не удовлетворяват политиката, ще бъдат върнати с твърдо отхвърляне от системата за поща.
Тази опция засяга вашия основен адрес на пощенска кутия (логин име), всички адреси, произтичащи от домейни на псевдоними, както и адреси на псевдоними, с единствена целева пощенска кутия.", + "user_settings": "Настройки на потребителя", + "username": "Потребителско име", + "value": "Стойност", + "verify": "Проверка", + "waiting": "Изчакване", + "week": "седмица", + "weekly": "Weekly", + "weeks": "седмици", + "with_app_password": "с парола за приложение", + "year": "година", + "years": "години" + }, + "warning": { + "cannot_delete_self": "Не може да изтриете влезлия потребител", + "domain_added_sogo_failed": "Добавен домейн, но неуспешно рестартиране на SOGo, моля, проверете системните логове.", + "dovecot_restart_failed": "Dovecot не успя да рестартира, моля, проверете логовете", + "fuzzy_learn_error": "Грешка при обучение на размит хеш: %s", + "hash_not_found": "Хешът не е намерен или вече е изтрит", + "ip_invalid": "Пропуснат невалиден IP: %s", + "is_not_primary_alias": "Пропуснат неосновен псевдоним %s", + "no_active_admin": "Не може да деактивирате последния активен администратор", + "quota_exceeded_scope": "Квотата на домейна е надвишена: Само неограничени пощенски кутии могат да бъдат създадени в този домейн.", + "session_token": "Невалиден формулярен токен: Несъответствие на токена.", + "session_ua": "Невалиден формулярен токен: Грешка при проверка на User-Agent." + } +} \ No newline at end of file From 95eb350f15a3ceade4854a8c143a4624d0fbd48d Mon Sep 17 00:00:00 2001 From: Denis Evers Date: Wed, 16 Jul 2025 16:08:55 +0800 Subject: [PATCH 020/180] [netfilter] fix negative timer, no unbanning of IPs (#6575) * [netfilter] added debug logs and updated autopurge * updated "Allow/Blacklist" terms * netfilter: bumped compose version * netfilter: changed black/whitelist terms in code --------- Co-authored-by: Denis Evers Co-authored-by: DerLinkman --- data/Dockerfiles/netfilter/main.py | 163 ++++++++++++------- data/web/inc/vars.inc.php | 12 +- data/web/lang/lang.de-de.json | 23 +-- data/web/lang/lang.en-gb.json | 27 +-- data/web/templates/admin/tab-config-f2b.twig | 4 +- docker-compose.yml | 2 +- 6 files changed, 137 insertions(+), 94 deletions(-) diff --git a/data/Dockerfiles/netfilter/main.py b/data/Dockerfiles/netfilter/main.py index 2b332d205..2232d0d1d 100644 --- a/data/Dockerfiles/netfilter/main.py +++ b/data/Dockerfiles/netfilter/main.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +DEBUG = False + import re import os import sys @@ -20,10 +22,13 @@ from modules.Logger import Logger from modules.IPTables import IPTables from modules.NFTables import NFTables +def logdebug(msg): + if DEBUG: + logger.logInfo("DEBUG: %s" % msg) -# globals +# Globals WHITELIST = [] -BLACKLIST= [] +BLACKLIST = [] bans = {} quit_now = False exit_code = 0 @@ -33,12 +38,10 @@ r = None pubsub = None clear_before_quit = False - def refreshF2boptions(): global f2boptions global quit_now global exit_code - f2boptions = {} if not r.get('F2B_OPTIONS'): @@ -52,8 +55,9 @@ def refreshF2boptions(): else: try: f2boptions = json.loads(r.get('F2B_OPTIONS')) - except ValueError: - logger.logCrit('Error loading F2B options: F2B_OPTIONS is not json') + except ValueError as e: + logger.logCrit( + 'Error loading F2B options: F2B_OPTIONS is not json. Exception: %s' % e) quit_now = True exit_code = 2 @@ -61,15 +65,15 @@ def refreshF2boptions(): r.set('F2B_OPTIONS', json.dumps(f2boptions, ensure_ascii=False)) def verifyF2boptions(f2boptions): - verifyF2boption(f2boptions,'ban_time', 1800) - verifyF2boption(f2boptions,'max_ban_time', 10000) - verifyF2boption(f2boptions,'ban_time_increment', True) - verifyF2boption(f2boptions,'max_attempts', 10) - verifyF2boption(f2boptions,'retry_window', 600) - verifyF2boption(f2boptions,'netban_ipv4', 32) - verifyF2boption(f2boptions,'netban_ipv6', 128) - verifyF2boption(f2boptions,'banlist_id', str(uuid.uuid4())) - verifyF2boption(f2boptions,'manage_external', 0) + verifyF2boption(f2boptions, 'ban_time', 1800) + verifyF2boption(f2boptions, 'max_ban_time', 10000) + verifyF2boption(f2boptions, 'ban_time_increment', True) + verifyF2boption(f2boptions, 'max_attempts', 10) + verifyF2boption(f2boptions, 'retry_window', 600) + verifyF2boption(f2boptions, 'netban_ipv4', 32) + verifyF2boption(f2boptions, 'netban_ipv6', 128) + verifyF2boption(f2boptions, 'banlist_id', str(uuid.uuid4())) + verifyF2boption(f2boptions, 'manage_external', 0) def verifyF2boption(f2boptions, f2boption, 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): global f2boptions global lock - + logdebug("ban() called with address=%s" % address) refreshF2boptions() MAX_ATTEMPTS = int(f2boptions['max_attempts']) RETRY_WINDOW = int(f2boptions['retry_window']) @@ -119,31 +123,43 @@ def ban(address): NETBAN_IPV6 = '/' + str(f2boptions['netban_ipv6']) ip = get_ip(address) - if not ip: return + if not ip: + logdebug("No valid IP -- skipping ban()") + return address = str(ip) self_network = ipaddress.ip_network(address) with lock: temp_whitelist = set(WHITELIST) - if temp_whitelist: - for wl_key in temp_whitelist: - wl_net = ipaddress.ip_network(wl_key, False) - if wl_net.overlaps(self_network): - logger.logInfo('Address %s is whitelisted by rule %s' % (self_network, wl_net)) - return + logdebug("Checking if %s overlaps with any WHITELIST entries" % self_network) + if temp_whitelist: + for wl_key in temp_whitelist: + wl_net = ipaddress.ip_network(wl_key, False) + logdebug("Checking overlap between %s and %s" % (self_network, wl_net)) + 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) + logdebug("Ban net: %s" % net) if not net in bans: bans[net] = {'attempts': 0, 'last_attempt': 0, 'ban_counter': 0} + logdebug("Initing new ban counter for %s" % net) 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: bans[net]['attempts'] = 0 + logdebug("Ban counter for %s reset as window expired" % net) bans[net]['attempts'] += 1 bans[net]['last_attempt'] = current_attempt + logdebug("%s attempts now %d" % (net, bans[net]['attempts'])) if bans[net]['attempts'] >= MAX_ATTEMPTS: 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 )) if type(ip) is ipaddress.IPv4Address and int(f2boptions['manage_external']) != 1: with lock: + logdebug("Calling tables.banIPv4(%s)" % net) tables.banIPv4(net) elif int(f2boptions['manage_external']) != 1: with lock: + logdebug("Calling tables.banIPv6(%s)" % 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) 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): global lock - + logdebug("Calling unban() with net=%s" % net) if not net in bans: - logger.logInfo('%s is not banned, skipping unban and deleting from queue (if any)' % net) - r.hdel('F2B_QUEUE_UNBAN', '%s' % net) - return - + logger.logInfo( + '%s is not banned, skipping unban and deleting from queue (if any)' % net) + r.hdel('F2B_QUEUE_UNBAN', '%s' % net) + return logger.logInfo('Unbanning %s' % net) if type(ipaddress.ip_network(net)) is ipaddress.IPv4Network: with lock: + logdebug("Calling tables.unbanIPv4(%s)" % net) tables.unbanIPv4(net) else: with lock: + logdebug("Calling tables.unbanIPv6(%s)" % net) tables.unbanIPv6(net) - r.hdel('F2B_ACTIVE_BANS', '%s' % net) r.hdel('F2B_QUEUE_UNBAN', '%s' % net) if net in bans: + logdebug("Unban for %s, setting attempts=0, ban_counter+=1" % net) bans[net]['attempts'] = 0 bans[net]['ban_counter'] += 1 @@ -204,17 +227,19 @@ def permBan(net, unban=False): if is_unbanned: 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: 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(): global lock logger.logInfo('Clearing all bans') for net in bans.copy(): + logdebug("Unbanning net: %s" % net) unban(net) with lock: + logdebug("Clearing IPv4/IPv6 table") tables.clearIPv4Table() tables.clearIPv6Table() try: @@ -275,21 +300,35 @@ def snat6(snat_target): def autopurge(): global f2boptions - + logdebug("autopurge thread started") while not quit_now: + logdebug("autopurge tick") time.sleep(10) refreshF2boptions() MAX_ATTEMPTS = int(f2boptions['max_attempts']) QUEUE_UNBAN = r.hgetall('F2B_QUEUE_UNBAN') + logdebug("QUEUE_UNBAN: %s" % QUEUE_UNBAN) if QUEUE_UNBAN: for net in QUEUE_UNBAN: + logdebug("Autopurge: unbanning queued net: %s" % net) unban(str(net)) - for net in bans.copy(): - if bans[net]['attempts'] >= MAX_ATTEMPTS: - NET_BAN_TIME = calcNetBanTime(bans[net]['ban_counter']) - TIME_SINCE_LAST_ATTEMPT = time.time() - bans[net]['last_attempt'] - if TIME_SINCE_LAST_ATTEMPT > NET_BAN_TIME: - unban(net) + # Only check expiry for actively banned IPs: + active_bans = r.hgetall('F2B_ACTIVE_BANS') + now = time.time() + for net_str, expire_str in active_bans.items(): + logdebug("Checking ban expiry for (actively banned): %s" % net_str) + # 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(): global lock @@ -359,7 +398,7 @@ def whitelistUpdate(): with lock: if Counter(new_whitelist) != Counter(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)) def blacklistUpdate(): @@ -375,7 +414,7 @@ def blacklistUpdate(): addban = set(new_blacklist).difference(BLACKLIST) delban = set(BLACKLIST).difference(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: for net in addban: permBan(net=net) @@ -386,25 +425,25 @@ def blacklistUpdate(): def sigterm_quit(signum, frame): global clear_before_quit + logdebug("SIGTERM received, setting clear_before_quit to True and exiting") clear_before_quit = True 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: clear() if pubsub is not None: pubsub.unsubscribe() - 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) - # init Logger - logger = Logger() - - # init backend backend = sys.argv[1] + logdebug("Backend: %s" % backend) if backend == "nftables": logger.logInfo('Using NFTables backend') tables = NFTables(chain_name, logger) @@ -412,16 +451,12 @@ if __name__ == '__main__': logger.logInfo('Using IPTables backend') tables = IPTables(chain_name, logger) - # In case a previous session was killed without cleanup clear() - - # Reinit MAILCOW chain - # Is called before threads start, no locking logger.logInfo("Initializing mailcow netfilter chain") tables.initChainIPv4() 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") else: logger.logInfo(f"Setting {chain_name} isolation") @@ -432,23 +467,28 @@ if __name__ == '__main__': try: redis_slaveof_ip = os.getenv('REDIS_SLAVEOF_IP', '') 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): - 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: - 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() pubsub = r.pubsub() 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) else: break logger.set_redis(r) + logdebug("Redis connection established, setting up F2B keys") - # rename fail2ban to netfilter if r.exists('F2B_LOG'): + logdebug("Renaming F2B_LOG to NETFILTER_LOG") r.rename('F2B_LOG', 'NETFILTER_LOG') - # clear bans in redis r.delete('F2B_ACTIVE_BANS') r.delete('F2B_PERM_BANS') @@ -463,7 +503,7 @@ if __name__ == '__main__': snat_ip = os.getenv('SNAT_TO_SOURCE') snat_ipo = ipaddress.ip_address(snat_ip) 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.start() except ValueError: @@ -499,4 +539,5 @@ if __name__ == '__main__': while not quit_now: time.sleep(0.5) - sys.exit(exit_code) + logdebug("Exiting with code %s" % exit_code) + sys.exit(exit_code) \ No newline at end of file diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php index 802a41f95..671e20334 100644 --- a/data/web/inc/vars.inc.php +++ b/data/web/inc/vars.inc.php @@ -238,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 $RSPAMD_MAPS = array( 'regex' => array( - 'Header-From: Blacklist' => 'global_mime_from_blacklist.map', - 'Header-From: Whitelist' => 'global_mime_from_whitelist.map', - 'Envelope Sender Blacklist' => 'global_smtp_from_blacklist.map', - 'Envelope Sender Whitelist' => 'global_smtp_from_whitelist.map', - 'Recipient Blacklist' => 'global_rcpt_blacklist.map', - 'Recipient Whitelist' => 'global_rcpt_whitelist.map', + 'Header-From: Denylist' => 'global_mime_from_blacklist.map', + 'Header-From: Allowlist' => 'global_mime_from_whitelist.map', + 'Envelope Sender Denylist' => 'global_smtp_from_blacklist.map', + 'Envelope Sender Allowlist' => 'global_smtp_from_whitelist.map', + 'Recipient Denylist' => 'global_rcpt_blacklist.map', + 'Recipient Allowlist' => 'global_rcpt_whitelist.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 DE (only fired in combination with fishy TLDs)' => 'bad_words_de.map', diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index 6e1b4d4c2..df41b8946 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -25,7 +25,7 @@ "sogo_access": "Verwalten des SOGo-Zugriffsrechts erlauben", "sogo_profile_reset": "SOGo-Profil zurücksetzen", "spam_alias": "Temporäre E-Mail-Aliasse", - "spam_policy": "Blacklist/Whitelist", + "spam_policy": "Deny/Allowlist", "spam_score": "Spam-Bewertung", "syncjobs": "Sync Jobs", "tls_policy": "Verschlüsselungsrichtlinie", @@ -147,7 +147,7 @@ "arrival_time": "Ankunftszeit (Serverzeit)", "authed_user": "Auth. Benutzer", "ays": "Soll der Vorgang wirklich ausgeführt werden?", - "ban_list_info": "Übersicht ausgesperrter Netzwerke: Netzwerk (verbleibende Bannzeit) - [Aktionen].
IPs, die zum Entsperren eingereiht werden, verlassen die Liste aktiver Banns nach wenigen Sekunden.
Rote Labels sind Indikatoren für aktive Blacklist-Einträge.", + "ban_list_info": "Übersicht ausgesperrter Netzwerke: Netzwerk (verbleibende Bannzeit) - [Aktionen].
IPs, die zum Entsperren eingereiht werden, verlassen die Liste aktiver Banns nach wenigen Sekunden.
Rote Labels sind Indikatoren für aktive Allowlist-Einträge.", "change_logo": "Logo ändern", "configuration": "Konfiguration", "convert_html_to_text": "Konvertiere HTML zu reinem Text", @@ -184,9 +184,9 @@ "excludes": "Diese Empfänger ausschließen", "f2b_ban_time": "Bannzeit in Sekunden", "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_list_info": "Ein Host oder Netzwerk auf der Blacklist wird immer eine Whitelist-Einheit überwiegen. Die Aktualisierung der Liste dauert einige Sekunden.", + "f2b_list_info": "Ein Host oder Netzwerk auf der Denyliste wird immer eine Allowlist-Einheit überwiegen. Die Aktualisierung der Liste dauert einige Sekunden.", "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_max_attempts": "Max. Versuche", @@ -196,7 +196,7 @@ "f2b_parameters": "Fail2ban-Parameter", "f2b_regex_info": "Berücksichtigte Logs: SOGo, Postfix, Dovecot, PHP-FPM.", "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", "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", @@ -272,6 +272,7 @@ "message": "Nachricht", "message_size": "Nachrichtengröße", "nexthop": "Next Hop", + "needs_restart": "benötigt Neustart", "no": "✕", "no_active_bans": "Keine aktiven Banns", "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 Rspamd docs", "rspamd_global_filters": "Globale Filter-Maps", "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_regex": "Die akzeptierte Form für Einträge sind ausschließlich 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.
\r\n Das korrekte Format lautet \"/pattern/options\" (Beispiel: /.+@domain\\.tld/i).
\r\n Der Name der Map beschreibt die jeweilige Funktion.
\r\n Rspamd versucht die Maps umgehend aufzulösen. Bei Problemen sollte Rspamd manuell neugestartet werden.
Elemente auf Blacklists sind von der Quarantäne ausgeschlossen.", + "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 ausschließlich 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.
\r\n Das korrekte Format lautet \"/pattern/options\" (Beispiel: /.+@domain\\.tld/i).
\r\n Der Name der Map beschreibt die jeweilige Funktion.
\r\n Rspamd versucht die Maps umgehend aufzulösen. Bei Problemen sollte Rspamd manuell neugestartet werden.
Elemente auf Denylisten sind von der Quarantäne ausgeschlossen.", "rspamd_settings_map": "Rspamd-Settings-Map", "sal_level": "Moo-Level", "save": "Änderungen speichern", @@ -747,7 +748,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).", "spam_alias": "Anpassen temporärer Alias-Adressen", "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", "subfolder2": "Ziel-Ordner
(leer = kein Unterordner)", "syncjob": "Sync-Job bearbeiten", @@ -1037,7 +1038,7 @@ "notified": "Benachrichtigt", "qhandler_success": "Aktion wurde an das System übergeben. Sie dürfen dieses Fenster nun schließen.", "qid": "Rspamd QID", - "qinfo": "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank (dem Sender wird nicht signalisiert, dass seine E-Mail zugestellt wurde) als auch diese, die als Kopie in den Junk-Ordner der jeweiligen Mailbox zugestellt wurden.\r\n
\"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
Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.
Auf Blacklists vorkommende Elemente sind von der Quarantäne ausgeschlossen.", + "qinfo": "Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank (dem Sender wird nicht signalisiert, dass seine E-Mail zugestellt wurde) als auch diese, die als Kopie in den Junk-Ordner der jeweiligen Mailbox zugestellt wurden.\r\n
\"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
Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.
Auf Denylisten vorkommende Elemente sind von der Quarantäne ausgeschlossen.", "qitem": "Quarantäneeintrag", "quarantine": "Quarantäne", "quick_actions": "Aktionen", @@ -1326,7 +1327,7 @@ "spam_score_reset": "Auf Server-Standard zurücksetzen", "spamfilter": "Spamfilter", "spamfilter_behavior": "Bewertung", - "spamfilter_bl": "Blacklist", + "spamfilter_bl": "Denyliste", "spamfilter_bl_desc": "Für E-Mail-Adressen, die vom Spamfilter immer 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_default_score": "Standardwert", "spamfilter_green": "Grün: Die Nachricht ist kein Spam", @@ -1338,7 +1339,7 @@ "spamfilter_table_empty": "Keine Einträge vorhanden", "spamfilter_table_remove": "Entfernen", "spamfilter_table_rule": "Regel", - "spamfilter_wl": "Whitelist", + "spamfilter_wl": "Allowliste", "spamfilter_wl_desc": "Für E-Mail-Adressen, die vom Spamfilter nicht 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", "status": "Status", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 21d26d8c8..727fd687c 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -25,7 +25,7 @@ "sogo_access": "Allow management of SOGo access", "sogo_profile_reset": "Reset SOGo profile", "spam_alias": "Temporary aliases", - "spam_policy": "Blacklist/Whitelist", + "spam_policy": "Denylist/Allowlist", "spam_score": "Spam score", "syncjobs": "Sync jobs", "tls_policy": "TLS policy", @@ -151,7 +151,7 @@ "arrival_time": "Arrival time (server time)", "authed_user": "Auth. user", "ays": "Are you sure you want to proceed?", - "ban_list_info": "See a list of banned IPs below: network (remaining ban time) - [actions].
IPs queued to be unbanned will be removed from the active ban list within a few seconds.
Red labels indicate active permanent bans by blacklisting.", + "ban_list_info": "See a list of banned IPs below: network (remaining ban time) - [actions].
IPs queued to be unbanned will be removed from the active ban list within a few seconds.
Red labels indicate active permanent bans by denylisting.", "change_logo": "Change logo", "logo_normal_label": "Normal", "logo_dark_label": "Inverted for dark mode", @@ -190,9 +190,9 @@ "excludes": "Excludes these recipients", "f2b_ban_time": "Ban time (s)", "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_list_info": "A blacklisted host or network will always outweigh a whitelist entity. List updates will take a few seconds to be applied.", + "f2b_list_info": "A denylisted host or network will always outweigh a allowlist entity. List updates will take a few seconds to be applied.", "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_max_attempts": "Max. attempts", @@ -202,7 +202,7 @@ "f2b_parameters": "Fail2ban parameters", "f2b_regex_info": "Logs taken into consideration: SOGo, Postfix, Dovecot, PHP-FPM.", "f2b_retry_window": "Retry window (s) for max. attempts", - "f2b_whitelist": "Whitelisted networks/hosts", + "f2b_whitelist": "Allowlisted networks/hosts", "filter": "Filter", "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", @@ -279,6 +279,7 @@ "message": "Message", "message_size": "Message size", "nexthop": "Next hop", + "needs_restart": "needs restart", "no": "✕", "no_active_bans": "No active bans", "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 Rspamd docs", "rspamd_global_filters": "Global filter maps", "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_regex": "Their names explain their purpose. All content must contain valid regular expression in the format of \"/pattern/options\" (e.g. /.+@domain\\.tld/i).
\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.
\r\n Rspamd will try to read the map content when changed. If you experience problems, restart Rspamd to enforce a map reload.
Blacklisted elements are excluded from quarantine.", + "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. /.+@domain\\.tld/i).
\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.
\r\n Rspamd will try to read the map content when changed. If you experience problems, restart Rspamd to enforce a map reload.
Denylisted elements are excluded from quarantine.", "rspamd_settings_map": "Rspamd settings map", "sal_level": "Moo level", "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.", "spam_alias": "Create or change time limited alias addresses", "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", "subfolder2": "Sync into subfolder on destination
(empty = do not use subfolder)", "syncjob": "Edit sync job", @@ -1039,7 +1040,7 @@ "notified": "Notified", "qhandler_success": "Request successfully sent to the system. You can now close the window.", "qid": "Rspamd QID", - "qinfo": "The quarantine system will save rejected mail to the database (the sender will not 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
\"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
Please be aware that learning multiple messages can be - depending on your system - time consuming.
Blacklisted elements are excluded from the quarantine.", + "qinfo": "The quarantine system will save rejected mail to the database (the sender will not 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
\"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
Please be aware that learning multiple messages can be - depending on your system - time consuming.
Denylisted elements are excluded from the quarantine.", "qitem": "Quarantine item", "quarantine": "Quarantine", "quick_actions": "Actions", @@ -1337,8 +1338,8 @@ "spam_score_reset": "Reset to server default", "spamfilter": "Spam filter", "spamfilter_behavior": "Rating", - "spamfilter_bl": "Blacklist", - "spamfilter_bl_desc": "Blacklisted email addresses to always classify as spam and reject. Rejected mail will not 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": "Denylist", + "spamfilter_bl_desc": "Denylisted email addresses to always classify as spam and reject. Rejected mail will not 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_green": "Green: this message is not spam", "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_remove": "remove", "spamfilter_table_rule": "Rule", - "spamfilter_wl": "Whitelist", - "spamfilter_wl_desc": "Whitelisted email addresses are programmed to never 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": "Allowlist", + "spamfilter_wl_desc": "Allowlisted email addresses are programmed to never 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", "status": "Status", "sync_jobs": "Sync jobs", diff --git a/data/web/templates/admin/tab-config-f2b.twig b/data/web/templates/admin/tab-config-f2b.twig index d33c242a8..29535b723 100644 --- a/data/web/templates/admin/tab-config-f2b.twig +++ b/data/web/templates/admin/tab-config-f2b.twig @@ -118,8 +118,8 @@ - {% if active_ban.queued_for_unban == 0 %} [{{ lang.admin.queue_unban }}] - [whitelist] - [blacklist (needs restart)] + [allowlist] + [denylist ({{ lang.admin.needs_restart }})] {% else %} {{ lang.admin.unban_pending }} {% endif %} diff --git a/docker-compose.yml b/docker-compose.yml index d95241462..f447dea4a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -477,7 +477,7 @@ services: - acme netfilter-mailcow: - image: ghcr.io/mailcow/netfilter:1.61 + image: ghcr.io/mailcow/netfilter:1.62 stop_grace_period: 30s restart: always privileged: true From 3ee3d7d969aad4c13b7045821f4315561b9f36f4 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Wed, 16 Jul 2025 20:31:58 +0200 Subject: [PATCH 021/180] Translations update from Weblate (#6637) * [Web] Language file updated by 'Cleanup translation files' addon Co-authored-by: milkmaker * [Web] Updated lang.zh-tw.json Co-authored-by: Anonymous * [Web] Updated lang.ca-es.json Co-authored-by: Anonymous --------- Co-authored-by: Anonymous --- data/web/lang/lang.bg-bg.json | 2782 ++++++++++++++++----------------- data/web/lang/lang.ca-es.json | 2 +- data/web/lang/lang.zh-tw.json | 2 +- 3 files changed, 1390 insertions(+), 1396 deletions(-) diff --git a/data/web/lang/lang.bg-bg.json b/data/web/lang/lang.bg-bg.json index 0d8632859..d17c4dd2b 100644 --- a/data/web/lang/lang.bg-bg.json +++ b/data/web/lang/lang.bg-bg.json @@ -1,1397 +1,1391 @@ { - "acl": { - "alias_domains": "Добавяне на домейни за псевдоними", - "app_passwds": "Управление на пароли за приложения", - "bcc_maps": "BCC карти", - "delimiter_action": "Действие на разделител", - "domain_desc": "Промяна на описанието на домейна", - "domain_relayhost": "Промяна на релеен хост за домейн", - "eas_reset": "Нулиране на устройствата с ActiveSync", - "extend_sender_acl": "Разрешаване на разширяване на ACL на изпращащите от външни адреси", - "filters": "Филтри", - "login_as": "Вход като потребител на пощенска кутия", - "mailbox_relayhost": "Промяна на релеен хост за пощенска кутия", - "prohibited": "Забранено от ACL", - "protocol_access": "Промяна на достъпа до протоколи", - "pushover": "Pushover", - "pw_reset": "Разрешаване на нулиране на паролата на потребител на mailcow", - "quarantine": "Действия с карантина", - "quarantine_attachments": "Прикачени файлове в карантина", - "quarantine_category": "Промяна на категорията на уведомленията за карантина", - "quarantine_notification": "Промяна на уведомленията за карантина", - "ratelimit": "Ограничение на скоростта", - "recipient_maps": "Карти на получатели", - "smtp_ip_access": "Промяна на разрешените хостове за SMTP", - "sogo_access": "Разрешаване на управление на достъпа до SOGo", - "sogo_profile_reset": "Нулиране на профила на SOGo", - "spam_alias": "Временни псевдоними", - "spam_policy": "Черен/Бял списък", - "spam_score": "Резултат за спам", - "syncjobs": "Синхронизиращи задачи", - "tls_policy": "Политика за TLS", - "unlimited_quota": "Неограничена квота за пощенски кутии" - }, - "add": { - "activate_filter_warn": "Всички други филтри ще бъдат деактивирани, когато активното е отбелязано.", - "active": "Активен", - "add": "Добавяне", - "add_domain_only": "Добавяне само на домейн", - "add_domain_restart": "Добавяне на домейн и рестартиране на SOGo", - "alias_address": "Адрес/и за псевдоним", - "alias_address_info": "Пълни имейл адреси или @example.com, за да хванете всички съобщения за домейн (разделени с запетая). само домейни на mailcow.", - "alias_domain": "Домейн за псевдоним", - "alias_domain_info": "Валидни имена на домейни (разделени с запетая).", - "app_name": "Име на приложението", - "app_password": "Добавяне на парола за приложение", - "app_passwd_protocols": "Разрешени протоколи за паролата на приложението", - "automap": "Опит за автоматично картографиране на папки (\"Изпратени\", \"Изпратени\" => \"Изпратени\" и т.н.)", - "backup_mx_options": "Опции за реле", - "bcc_dest_format": "BCC дестинацията трябва да бъде един валиден имейл адрес.
Ако имате нужда да изпратите копие до множество адреси, създайте псевдоним и го използвайте тук.", - "comment_info": "Частен коментар не е видим за потребителя, докато публичен коментар се показва като подсказка при преминаване с мишката върху него в прегледа на потребителя", - "custom_params": "Персонализирани параметри", - "custom_params_hint": "Дясно: --param=xy, грешно: --param xy", - "delete1": "Изтриване от източника след завършване", - "delete2": "Изтриване на съобщенията в дестинацията, които не са в източника", - "delete2duplicates": "Изтриване на дубликати в дестинацията", - "description": "Описание", - "destination": "Дестинация", - "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", - "domain": "Домейн", - "domain_matches_hostname": "Домейнът %s съвпада с името на хоста", - "domain_quota_m": "Обща квота на домейна (MiB)", - "dry": "Симулиране на синхронизация", - "enc_method": "Метод на криптиране", - "exclude": "Изключване на обекти (regex)", - "full_name": "Пълно име", - "gal": "Глобален адресен списък", - "gal_info": "Глобалният адресен списък съдържа всички обекти на домейна и не може да бъде редактиран от нито един потребител. Липсва информация за заетост/свободно време в SOGo, ако е деактивирано! Рестартирайте SOGo, за да приложите промените.", - "generate": "генериране", - "goto_ham": "Учен като не е спам", - "goto_null": "Тихо изхвърляне на имейла", - "goto_spam": "Учен като спам", - "hostname": "Хост", - "inactive": "Неактивен", - "kind": "Вид", - "mailbox_quota_def": "Квота по подразбиране за пощенска кутия", - "mailbox_quota_m": "Макс. квота за пощенска кутия (MiB)", - "mailbox_username": "Потребителско име (лява част на имейл адрес)", - "max_aliases": "Макс. възможни псевдоними", - "max_mailboxes": "Макс. възможни пощенски кутии", - "mins_interval": "Интервал за проверка (минути)", - "multiple_bookings": "Множествени резервации", - "nexthop": "Следващ хоп", - "password": "Парола", - "password_repeat": "Потвърждаване на паролата (повторете)", - "port": "Порт", - "post_domain_add": "След добавянето на нов домейн, контейнерът на SOGo, \"sogo-mailcow\", трябва да бъде рестартиран!

Освен това, конфигурацията на DNS на домейна трябва да бъде прегледана. След като конфигурацията на DNS бъде одобрена, рестартирайте \"acme-mailcow\", за да генерирате автоматично сертификати за вашия нов домейн (autoconfig.<domain>, autodiscover.<domain>).
Тази стъпка е опционална и ще бъде повторена всеки 24 часа.", - "private_comment": "Частен коментар", - "public_comment": "Публичен коментар", - "quota_mb": "Квота (MiB)", - "relay_all": "Реле на всички получатели", - "relay_all_info": "↪ Ако изберете да не релеирате всички получатели, ще трябва да добавите (\"скрита\") пощенска кутия за всеки отделен получател, който трябва да бъде релеиран.", - "relay_domain": "Реле на този домейн", - "relay_transport_info": "
Инфо
Можете да дефинирате транспортни карти за персонализирана дестинация за този домейн. Ако не е зададено, ще бъде направен MX lookup.", - "relay_unknown_only": "Реле на несъществуващи пощенски кутии. Съществуващите пощенски кутии ще бъдат доставени локално.", - "relayhost_wrapped_tls_info": "Моля, не използвайте TLS-wrapped портове (най-често използвани на порт 465).
\r\nИзползвайте всеки не-wrapped порт и издайте STARTTLS. Политика за TLS може да бъде създадена в \"TLS политики\", за да се наложи TLS.", - "select": "Моля, изберете...", - "select_domain": "Моля, изберете първо домейн", - "sieve_desc": "Кратко описание", - "sieve_type": "Тип на филтър", - "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)", - "subscribeall": "Абониране за всички папки", - "syncjob": "Добавяне на синхронизираща задача", - "syncjob_hint": "Имайте предвид, че паролите трябва да бъдат запазени като обикновен текст!", - "tags": "Тагове", - "target_address": "Адреси за пренасочване", - "target_address_info": "Пълни имейл адреси (разделени с запетая).", - "target_domain": "Целеви домейн", - "timeout1": "Таймаут за връзка с отдалечен хост", - "timeout2": "Таймаут за връзка с локален хост", - "username": "Потребителско име", - "validate": "Валидиране", - "validation_success": "Успешно валидиране" - }, - "admin": { - "access": "Достъп", - "action": "Действие", - "activate_api": "Активиране на API", - "activate_send": "Активиране на бутона за изпращане", - "active": "Активен", - "active_rspamd_settings_map": "Активна карта с настройки", - "add": "Добавяне", - "add_admin": "Добавяне на администратор", - "add_domain_admin": "Добавяне на администратор на домейн", - "add_forwarding_host": "Добавяне на хост за препращане", - "add_relayhost": "Добавяне на транспорт, зависим от изпращач", - "add_relayhost_hint": "Имайте предвид, че данните за удостоверяване, ако има такива, ще бъдат запазени като обикновен текст.", - "add_row": "Добавяне на ред", - "add_settings_rule": "Добавяне на правило за настройки", - "add_transport": "Добавяне на транспорт", - "add_transports_hint": "Имайте предвид, че данните за удостоверяване, ако има такива, ще бъдат запазени като обикновен текст.", - "additional_rows": "добавени допълнителни редове", - "admin": "Администратор", - "admin_details": "Редактиране на детайлите на администратора", - "admin_domains": "Назначения на домейни", - "admins": "Администратори", - "admins_ldap": "LDAP администратори", - "advanced_settings": "Разширени настройки", - "allowed_methods": "Access-Control-Allow-Methods", - "allowed_origins": "Access-Control-Allow-Origin", - "api_allow_from": "Разрешаване на API достъп от тези IP адреси/CIDR мрежови нотации", - "api_info": "API е в процес на разработка. Документацията може да бъде намерена на /api", - "api_key": "API ключ", - "api_read_only": "Достъп само за четене", - "api_read_write": "Достъп за четене и писане", - "api_skip_ip_check": "Пропускане на IP проверка за API", - "app_hide": "Скриване за вход", - "app_links": "Връзки към приложения", - "app_name": "Име на приложението", - "apps_name": "Име на \"mailcow приложенията\"", - "arrival_time": "Време на пристигане (време на сървъра)", - "authed_user": "Удостоверен потребител", - "ays": "Сигурни ли сте, че искате да продължите?", - "ban_list_info": "Вижте списък с блокирани IP адреси по-долу: мрежа (оставащо време за блокиране) - [действия].
IP адресите в опашката за разблокиране ще бъдат премахнати от активния списък с блокирани в рамките на няколко секунди.
Червените етикети показват активни постоянни блокирания от черния списък.", - "change_logo": "Промяна на логото", - "logo_normal_label": "Нормално", - "logo_dark_label": "Обърнато за тъмен режим", - "configuration": "Конфигурация", - "convert_html_to_text": "Конвертиране на HTML в обикновен текст", - "copy_to_clipboard": "Текстът е копиран в клипборда!", - "cors_settings": "Настройки на CORS", - "credentials_transport_warning": "Внимание: Добавянето на нов запис в картата на транспорта ще обнови данните за удостоверяване за всички записи с съвпадаща колона за следващ хоп.", - "customer_id": "Идентификатор на клиента", - "customize": "Персонализиране", - "destination": "Дестинация", - "dkim_add_key": "Добавяне на ARC/DKIM ключ", - "dkim_domains_selector": "Селектор", - "dkim_domains_wo_keys": "Избор на домейни без ключове", - "dkim_from": "От", - "dkim_from_title": "Източник на домейн за копиране на данни", - "dkim_key_length": "Дължина на DKIM ключа (битове)", - "dkim_key_missing": "Липсващ ключ", - "dkim_key_unused": "Неизползван ключ", - "dkim_key_valid": "Валиден ключ", - "dkim_keys": "ARC/DKIM ключове", - "dkim_overwrite_key": "Презаписване на съществуващ DKIM ключ", - "dkim_private_key": "Частен ключ", - "dkim_to": "До", - "dkim_to_title": "Целеви домейн/и - ще бъде презаписан", - "domain": "Домейн", - "domain_admin": "Администратор на домейн", - "domain_admins": "Администратори на домейн", - "domain_s": "Домейн/и", - "duplicate": "Дублиране", - "duplicate_dkim": "Дублиране на DKIM запис", - "edit": "Редактиране", - "empty": "Няма резултати", - "excludes": "Изключване на тези получатели", - "f2b_ban_time": "Време за блокиране (с)", - "f2b_ban_time_increment": "Времето за блокиране се увеличава с всяко блокиране", - "f2b_blacklist": "Черни списъци/хостове", - "f2b_filter": "Филтри с регулярни изрази", - "f2b_list_info": "Черният списък на хостове или мрежи винаги ще надделява над белия списък. Актуализациите на списъка отнемат няколко секунди, за да бъдат приложени.", - "f2b_manage_external": "Управление на Fail2Ban външно", - "f2b_manage_external_info": "Fail2ban все още ще поддържа черния списък, но няма да задава правила за блокиране на трафика. Използвайте генерирания черн списък по-долу, за да блокирате трафика външно.", - "f2b_max_attempts": "Макс. опити", - "f2b_max_ban_time": "Макс. време за блокиране (с)", - "f2b_netban_ipv4": "IPv4 размер на подмрежа за прилагане на блокиране (8-32)", - "f2b_netban_ipv6": "IPv6 размер на подмрежа за прилагане на блокиране (8-128)", - "f2b_parameters": "Параметри на Fail2ban", - "f2b_regex_info": "Логовете, които се вземат предвид: SOGo, Postfix, Dovecot, PHP-FPM.", - "f2b_retry_window": "Прозорец за повторен опит (с) за макс. опити", - "f2b_whitelist": "Бели списъци/хостове", - "filter": "Филтър", - "filter_table": "Таблица с филтри", - "forwarding_hosts": "Хостове за препращане", - "forwarding_hosts_add_hint": "Можете да посочите IPv4/IPv6 адреси, мрежи в CIDR нотация, имена на хостове (които ще бъдат разрешени в IP адреси), или имена на домейни (които ще бъдат разрешени в IP адреси чрез заявки към SPF записи или, при липсата им, MX записи).", - "forwarding_hosts_hint": "Входящите съобщения се приемат безрезервно от всички хостове, изброени тук. Тези хостове след това не се проверяват срещу DNSBL или подлагат на сиво списък. Спамът, получен от тях, никога не се отхвърля, но опционално може да бъде поставен във файла за нежелана поща. Най-често използваната употреба за това е да се посочат пощенски сървъри, на които сте настроили правило, което препраща входящите имейли към вашия mailcow сървър.", - "from": "От", - "generate": "генериране", - "guid": "GUID - уникален инстанционен идентификатор", - "guid_and_license": "GUID & Лиценз", - "hash_remove_info": "Премахването на хеш за ограничение на скоростта (ако все още съществува) ще нулира неговия брояч напълно.
\r\nВсеки хеш е показан с индивидуален цвят.", - "help_text": "Презаписване на помощния текст под маската за вход (разрешен е HTML)", - "host": "Хост", - "html": "HTML", - "iam": "Доставчик на идентичност", - "iam_attribute_field": "Поле за атрибут", - "iam_authorize_url": "Крайна точка за удостоверяване", - "iam_auth_flow": "Поток за удостоверяване", - "iam_auth_flow_info": "Освен стандартния поток за удостоверяване (поток с код за удостоверяване в Keycloak), който се използва за единичен вход, mailcow поддържа и поток за удостоверяване с пряки удостоверения. Потокът за удостоверяване с пароли за поща проверява удостоверенията на потребителя, като използва Keycloak Admin REST API. mailcow извлича хешираната парола от атрибута mailcow_password, който е картиран в Keycloak.", - "iam_basedn": "Основен DN", - "iam_client_id": "Идентификатор на клиента", - "iam_client_secret": "Тайна на клиента", - "iam_client_scopes": "Обхват на клиента", - "iam_default_template": "Шаблон по подразбиране", - "iam_default_template_description": "Ако няма зададен шаблон за потребител, шаблонът по подразбиране ще бъде използван за създаване на пощенската кутия, но не и за актуализиране на пощенската кутия.", - "iam_description": "Конфигуриране на външен доставчик за удостоверяване
Потребителските пощенски кутии ще бъдат създавани автоматично при първия им вход, при условие че е зададено картиране на атрибути.", - "iam_extra_permission": "За да работят следните настройки, клиентът на mailcow в Keycloak трябва да има услуга акаунт и разрешението да вижда потребители.", - "iam_host": "Хост", - "iam_host_info": "Въведете един или повече LDAP хостове, разделени с запетаи.", - "iam_import_users": "Импортиране на потребители", - "iam_mapping": "Картиране на атрибути", - "iam_bindpass": "Парола за свързване", - "iam_periodic_full_sync": "Периодичен пълен синхрон", - "iam_port": "Порт", - "iam_realm": "Реалм", - "iam_redirect_url": "URL за пренасочване", - "iam_rest_flow": "Поток за пароли за поща", - "iam_server_url": "URL на сървъра", - "iam_sso": "Единичен вход", - "iam_sync_interval": "Интервал за синхронизиране/импортиране (мин)", - "iam_test_connection": "Тест на връзката", - "iam_token_url": "Крайна точка за токени", - "iam_userinfo_url": "Крайна точка за информация за потребителя", - "iam_username_field": "Поле за потребителско име", - "iam_binddn": "DN за свързване", - "iam_use_ssl": "Използване на SSL", - "iam_use_ssl_info": "Ако активирате SSL и портът е зададен на 389, той ще бъде автоматично променен на 636.", - "iam_use_tls": "Използване на StartTLS", - "iam_use_tls_info": "Ако активирате TLS, трябва да използвате стандартния порт за вашия LDAP сървър (389). SSL портовете не могат да бъдат използвани.", - "iam_version": "Версия", - "ignore_ssl_error": "Игнориране на SSL грешки", - "import": "Импортиране", - "import_private_key": "Импортиране на частен ключ", - "in_use_by": "Използван от", - "inactive": "Неактивен", - "include_exclude": "Включване/Изключване", - "include_exclude_info": "По подразбиране - без избор - всички пощенски кутии се адресират", - "includes": "Включване на тези получатели", - "ip_check": "Проверка на IP", - "ip_check_disabled": "Проверката на IP е деактивирана. Можете да я активирате в
Система > Конфигурация > Опции > Персонализиране", - "ip_check_opt_in": "Оптиране за използване на услугата на трета страна ipv4.mailcow.email и ipv6.mailcow.email, за да разрешавате външни IP адреси.", - "is_mx_based": "MX базиран", - "last_applied": "Последно приложено", - "license_info": "Лицензът не е задължителен, но помага за по-нататъшното развитие.
Регистрирайте вашия GUID тук или купете поддръжка за вашата инсталация на mailcow.", - "link": "Връзка", - "loading": "Моля, изчакайте...", - "login_time": "Време за вход", - "logo_info": "Вашето изображение ще бъде мащабирано до височина 40 px за горната навигационна лента и макс. ширина 250 px за началната страница. Препоръчва се използването на скалируема графика.", - "lookup_mx": "Дестинацията е регулярен израз за съвпадение с MX име (.*\\.google\\.com за пренасочване на всички съобщения, предназначени за MX, завършващ на google.com, през този хоп)", - "main_name": "Име на \"mailcow UI\"", - "merged_vars_hint": "Редовете в сиво са сляти от vars.(local.)inc.php и не могат да бъдат променени.", - "message": "Съобщение", - "message_size": "Размер на съобщението", - "nexthop": "Следващ хоп", - "no": "✕", - "no_active_bans": "Няма активни блокирания", - "no_new_rows": "Няма допълнителни редове", - "no_record": "Няма запис", - "oauth2_apps": "OAuth2 приложения", - "oauth2_add_client": "Добавяне на OAuth2 клиент", - "oauth2_client_id": "Идентификатор на клиента", - "oauth2_client_secret": "Тайна на клиента", - "oauth2_info": "Реализацията на OAuth2 поддържа типа разрешение \"Код за удостоверяване\" и издава токени за презареждане.
\r\nСървърът автоматично издава нови токени за презареждане, след като токен за презареждане е бил използван.

\r\n• Обхватът по подразбиране е профил. Само потребителите на пощенски кутии могат да бъдат удостоверени срещу OAuth2. Ако параметърът за обхват е пропуснат, той се връща към профил.
\r\n• Параметърът state трябва да бъде изпратен от клиента като част от заявката за удостоверяване.

\r\nПътища за заявки към OAuth2 API:
\r\n
    \r\n
  • Крайна точка за удостоверяване: /oauth/authorize
  • \r\n
  • Крайна точка за токени: /oauth/token
  • \r\n
  • Страница с ресурси: /oauth/profile
  • \r\n
\r\nГенерирането на нова тайна на клиента няма да анулира съществуващите кодове за удостоверяване, но те няма да могат да подновят своя токен.

\r\nАнулирането на токените на клиента ще доведе до незабавно прекратяване на всички активни сесии. Всички клиенти ще трябва да се преудостоверят.", - "oauth2_redirect_uri": "URI за пренасочване", - "oauth2_renew_secret": "Генериране на нова тайна на клиента", - "oauth2_revoke_tokens": "Анулиране на всички токени на клиента", - "optional": "опционално", - "options": "Опции", - "password": "Парола", - "password_length": "Дължина на паролата", - "password_policy": "Политика за пароли", - "password_policy_chars": "Трябва да съдържа поне една буквена буква", - "password_policy_length": "Минималната дължина на паролата е %d", - "password_policy_lowerupper": "Трябва да съдържа малки и главни букви", - "password_policy_numbers": "Трябва да съдържа поне една цифра", - "password_policy_special_chars": "Трябва да съдържа специални символи", - "password_repeat": "Потвърждаване на паролата (повторете)", - "password_reset_info": "Ако не е зададен имейл за възстановяване, тази функция не може да бъде използвана.", - "password_reset_settings": "Настройки за възстановяване на парола", - "password_reset_tmpl_html": "HTML шаблон", - "password_reset_tmpl_text": "Текстов шаблон", - "password_settings": "Настройки на паролата", - "priority": "Приоритет", - "private_key": "Частен ключ", - "quarantine": "Карантина", - "quarantine_bcc": "Изпращане на копие от всички уведомления (BCC) до този получател:
Оставете празно, за да деактивирате. Неподписано, непроверено имейл. Трябва да бъде доставено само вътрешно.", - "quarantine_exclude_domains": "Изключване на домейни и домейни на псевдоними", - "quarantine_max_age": "Максимална възраст в дни
Стойността трябва да бъде равна или по-голяма от 1 ден.", - "quarantine_max_score": "Изхвърляне на уведомление, ако резултатът за спам на имейла е по-висок от тази стойност:
По подразбиране е 9999.0", - "quarantine_max_size": "Максимален размер в MiB (по-големи елементи се изхвърлят):
0 не означава неограничен.", - "quarantine_notification_html": "Шаблон на имейл за уведомление:
Оставете празно, за да възстановите шаблона по подразбиране.", - "quarantine_notification_sender": "Изпращач на имейл за уведомление", - "quarantine_notification_subject": "Тема на имейл за уведомление", - "quarantine_redirect": "Пренасочване на всички уведомления към този получател:
Оставете празно, за да деактивирате. Неподписано, непроверено имейл. Трябва да бъде доставено само вътрешно.", - "quarantine_release_format": "Формат на освободените елементи", - "quarantine_release_format_att": "Като прикачен файл", - "quarantine_release_format_raw": "Непроменен оригинал", - "quarantine_retention_size": "Задържания за пощенска кутия:
0 показва неактивен.", - "quota_notification_html": "Шаблон на имейл за уведомление:
Оставете празно, за да възстановите шаблона по подразбиране.", - "quota_notification_sender": "Изпращач на имейл за уведомление", - "quota_notification_subject": "Тема на имейл за уведомление", - "quota_notifications": "Уведомления за квота", - "quota_notifications_info": "Уведомленията за квота се изпращат на потребителите веднъж при преминаване на 80% и веднъж при преминаване на 95% използване.", - "quota_notifications_vars": "{{percent}} е равно на текущата квота на потребителя
{{username}} е името на пощенската кутия", - "queue_unban": "разблокиране", - "r_active": "Активни ограничения", - "r_inactive": "Неактивни ограничения", - "r_info": "Елементите в сиво в списъка с активни ограничения не са известни като валидни ограничения за mailcow и не могат да бъдат преместени. Неизвестните ограничения ще бъдат зададени в реда на появяване все пак.
Можете да добавяте нови елементи в inc/vars.local.inc.php, за да можете да ги превключвате.", - "rate_name": "Име на ограничението", - "recipients": "Получатели", - "refresh": "Опресняване", - "regen_api_key": "Регенериране на API ключ", - "regex_maps": "Карти с регулярни изрази", - "relay_from": "Адрес \"From:\"", - "relay_rcpt": "Адрес \"To:\"", - "relay_run": "Изпълнение на тест", - "relayhosts": "Транспорти, зависими от изпращач", - "relayhosts_hint": "Дефинирайте транспорти, зависими от изпращач, за да можете да ги избирате в диалоговия прозорец за конфигурация на домейн.
\r\n Услугата за транспорт винаги е \"smtp:\" и ще се опита да използва TLS, ако бъде предложена. Wrapped TLS (SMTPS) не се поддържа. Политиката за TLS на потребителя ще бъде взета предвид.
\r\n Засегнатите домейни, включително домейни на псевдоними.", - "remove": "Премахване", - "remove_row": "Премахване на ред", - "reset_default": "Нулиране до подразбиране", - "reset_limit": "Премахване на хеш", - "reset_password_vars": "{{link}} Генерираната връзка за нулиране на парола
{{username}} Името на пощенската кутия на потребителя, който е поискал нулиране на парола
{{username2}} Името на пощенската кутия за възстановяване
{{date}} Датата на заявката за нулиране на парола
{{token_lifetime}} Времетраенето на токена в минути
{{hostname}} Името на хоста на mailcow", - "restore_template": "Оставете празно, за да възстановите шаблона по подразбиране.", - "routing": "Маршрутизация", - "rsetting_add_rule": "Добавяне на правило", - "rsetting_content": "Съдържание на правилото", - "rsetting_desc": "Кратко описание", - "rsetting_no_selection": "Моля, изберете правило", - "rsetting_none": "Няма налични правила", - "rsettings_insert_preset": "Вмъкване на примерен предефиниран набор \"%s\"", - "rsettings_preset_1": "Деактивиране на всичко, освен DKIM и ограничение на скоростта за удостоверени потребители", - "rsettings_preset_2": "Пощенските администратори искат спам", - "rsettings_preset_3": "Разрешаване само на определени изпращачи за пощенска кутия (напр. използване като вътрешна пощенска кутия)", - "rsettings_preset_4": "Деактивиране на Rspamd за домейн", - "rspamd_com_settings": "Името на настройката ще бъде автоматично генерирано, моля, вижте примерните предефинирани набори по-долу. За повече детайли вижте документацията на Rspamd", - "rspamd_global_filters": "Глобални карти на филтри", - "rspamd_global_filters_agree": "Ще бъда внимателен!", - "rspamd_global_filters_info": "Глобалните карти на филтри съдържат различни видове глобални черни и бели списъци.", - "rspamd_global_filters_regex": "Имената им обясняват тяхната цел. Всичкото съдържание трябва да съдържа валиден регулярен израз във формат \"/pattern/options\" (напр. /.+@domain\\.tld/i).
\r\n Въпреки че се извършват основни проверки за всеки ред с регулярен израз, функционалността на Rspamd може да бъде нарушена, ако не успява да прочете синтаксиса коректно.
\r\n Rspamd ще се опита да прочете съдържанието на картата при промяна. Ако срещнете проблеми, рестартирайте Rspamd, за да наложите презареждане на картата.
Елементите в черния списък са изключени от карантина.", - "rspamd_settings_map": "Карта с настройки на Rspamd", - "sal_level": "Ниво на Moo", - "save": "Запазване на промените", - "search_domain_da": "Търсене на домейни", - "send": "Изпращане", - "sender": "Изпращач", - "service": "Услуга", - "service_id": "Идентификатор на услугата", - "source": "Източник", - "spamfilter": "Филтър за спам", - "subject": "Тема", - "success": "Успех", - "sys_mails": "Системни имейли", - "task": "Задача", - "text": "Текст", - "time": "Време", - "title": "Заглавие", - "title_name": "Име на уеб страницата на \"mailcow UI\"", - "to_top": "Обратно нагоре", - "transport_dest_format": "Регулярен израз или синтаксис: example.org, .example.org, *, box@example.org (няколко стойности могат да бъдат разделени с запетая)", - "transport_maps": "Карти за транспорт", - "transport_test_rcpt_info": "• Използвайте null@hosted.mailcow.de, за да тествате препращането към чуждестранна дестинация.", - "transports_hint": "• Записът в картата на транспорта пренарежда запис в картата на транспорт, зависим от изпращач.
\r\n• Транспортите, базирани на MX, се използват предимно.
\r\n• Настройките за политика на TLS на потребителя се игнорират и могат да бъдат приложени само чрез записи в картите на политиката на TLS.
\r\n• Услугата за транспорт за дефинираните транспорти винаги е \"smtp:\" и ще се опита да използва TLS, ако бъде предложена. Wrapped TLS (SMTPS) не се поддържа.
\r\n• Адресите, съвпадащи с \"/localhost$/\", винаги ще бъдат транспортирани през \"local:\", следователно записът \"*\" няма да се приложи към тези адреси.
\r\n• За да определите удостоверения за следващ хоп \"[host]:25\", Postfix винаги заявява за \"host\", преди да търси за \"[host]:25\". Това поведение прави невъзможно да се използват \"host\" и \"[host]:25\" едновременно.", - "ui_footer": "Подвал (разрешен е HTML)", - "ui_header_announcement": "Обяви", - "ui_header_announcement_active": "Задаване на активна обява", - "ui_header_announcement_content": "Текст (разрешен е HTML)", - "ui_header_announcement_help": "Обявата е видима за всички влезли потребители и на екрана за вход на UI.", - "ui_header_announcement_select": "Избор на тип обява", - "ui_header_announcement_type": "Тип", - "ui_header_announcement_type_danger": "Много важно", - "ui_header_announcement_type_info": "Информация", - "ui_header_announcement_type_warning": "Важно", - "ui_texts": "Етикети и текстове на UI", - "unban_pending": "разблокиране в опашката", - "unchanged_if_empty": "Ако не е променено, оставете празно", - "upload": "Качване", - "username": "Потребителско име", - "user_link": "Връзка към потребител", - "validate_license_now": "Валидиране на GUID срещу лицензен сървър", - "verify": "Проверка", - "yes": "✓" - }, - "danger": { - "access_denied": "Достъпът е отказан или данните от формуляра са невалидни", - "alias_domain_invalid": "Домейнът на псевдонима %s е невалиден", - "alias_empty": "Адресът на псевдонима не трябва да е празен", - "alias_goto_identical": "Адресът на псевдонима и адресът за пренасочване не трябва да са идентични", - "alias_invalid": "Адресът на псевдонима %s е невалиден", - "aliasd_targetd_identical": "Домейнът на псевдонима не трябва да е равен на целевия домейн: %s", - "aliases_in_use": "Макс. псевдоними трябва да бъдат по-големи или равни на %d", - "app_name_empty": "Името на приложението не може да бъде празно", - "app_passwd_id_invalid": "Идентификаторът на паролата за приложението %s е невалиден", - "authsource_in_use": "Доставчикът на идентичност не може да бъде променен или изтрит, тъй като се използва в момента от един или повече потребители.", - "bcc_empty": "BCC дестинацията не може да бъде празна", - "bcc_exists": "Картата BCC %s съществува за тип %s", - "bcc_must_be_email": "BCC дестинацията %s не е валиден имейл адрес", - "comment_too_long": "Коментарът е твърде дълъг, разрешени са макс. 160 символа", - "cors_invalid_method": "Зададен е невалиден метод за разрешаване", - "cors_invalid_origin": "Зададен е невалиден източник за разрешаване", - "defquota_empty": "Квотата по подразбиране за пощенска кутия не трябва да бъде 0.", - "demo_mode_enabled": "Режимът на демонстрация е активиран", - "description_invalid": "Описанието на ресурса за %s е невалидно", - "dkim_domain_or_sel_exists": "Съществува DKIM ключ за \"%s\", който няма да бъде презаписан", - "dkim_domain_or_sel_invalid": "DKIM домейн или селектор е невалиден: %s", - "domain_cannot_match_hostname": "Домейнът не може да съвпада с името на хоста", - "domain_exists": "Домейнът %s вече съществува", - "domain_invalid": "Името на домейна е празно или невалидно", - "domain_not_empty": "Не може да бъде премахнат непразен домейн %s", - "domain_not_found": "Домейнът %s не е намерен", - "domain_quota_m_in_use": "Квотата на домейна трябва да бъде по-голяма или равна на %s MiB", - "extended_sender_acl_denied": "липсва ACL за задаване на външни адреси на изпращач", - "extra_acl_invalid": "Външният адрес на изпращач \"%s\" е невалиден", - "extra_acl_invalid_domain": "Външният изпращач \"%s\" използва невалиден домейн", - "fido2_verification_failed": "Проверката на FIDO2 е неуспешна: %s", - "file_open_error": "Файлът не може да бъде отворен за писане", - "filter_type": "Грешен тип на филтър", - "from_invalid": "Изпращачът не трябва да бъде празен", - "generic_server_error": "Възникна неочаквана грешка на сървъра. Моля, свържете се с вашия администратор.", - "global_filter_write_error": "Файлът с филтър не може да бъде записан: %s", - "global_map_invalid": "Идентификаторът на глобалната карта %s е невалиден", - "global_map_write_error": "Глобалният идентификатор на картата %s не може да бъде записан: %s", - "goto_empty": "Адресът на псевдоним трябва да съдържа поне един валиден адрес за пренасочване", - "goto_invalid": "Адресът за пренасочване %s е невалиден", - "ham_learn_error": "Грешка при обучение за не-спам: %s", - "iam_test_connection": "Връзката е неуспешна", - "imagick_exception": "Грешка: Грешка при четене на изображение с Imagick", - "img_dimensions_exceeded": "Изображението надхвърля максималния размер", - "img_invalid": "Не може да се валидира файл с изображение", - "img_size_exceeded": "Изображението надхвърля максималния размер на файла", - "img_tmp_missing": "Не може да се валидира файл с изображение: Липсва временен файл", - "invalid_bcc_map_type": "Невалиден тип на картата BCC", - "invalid_destination": "Форматът на дестинацията \"%s\" е невалиден", - "invalid_filter_type": "Невалиден тип на филтър", - "invalid_host": "Зададен е невалиден хост: %s", - "invalid_mime_type": "Невалиден MIME тип", - "invalid_nexthop": "Форматът на следващия хоп е невалиден", - "invalid_nexthop_authenticated": "Следващият хоп съществува с различни удостоверения, моля, актуализирайте съществуващите удостоверения за този следващ хоп първо.", - "invalid_recipient_map_new": "Зададен е невалиден нов получател: %s", - "invalid_recipient_map_old": "Зададен е невалиден оригинален получател: %s", - "invalid_reset_token": "Невалиден токен за нулиране", - "ip_list_empty": "Списъкът с разрешени IP адреси не може да бъде празен", - "is_alias": "%s вече е известен като адрес на псевдоним", - "is_alias_or_mailbox": "%s вече е известен като адрес на псевдоним, пощенска кутия или адрес на псевдоним, разширен от домейн на псевдоним.", - "is_spam_alias": "%s вече е известен като временен адрес на псевдоним (спам адрес на псевдоним)", - "last_key": "Последното ключове не може да бъде изтрито, моля, деактивирайте TFA вместо това.", - "login_failed": "Неуспешен вход", - "mailbox_defquota_exceeds_mailbox_maxquota": "Квотата по подразбиране надхвърля лимита на макс. квота", - "mailbox_invalid": "Името на пощенската кутия е невалидно", - "mailbox_quota_exceeded": "Квотата надхвърля лимита на домейна (макс. %d MiB)", - "mailbox_quota_exceeds_domain_quota": "Макс. квотата надхвърля лимита на квотата на домейна", - "mailbox_quota_left_exceeded": "Няма достатъчно място (оставащо място: %d MiB)", - "mailboxes_in_use": "Макс. пощенски кутии трябва да бъдат по-големи или равни на %d", - "malformed_username": "Неправилно формирано потребителско име", - "map_content_empty": "Съдържанието на картата не може да бъде празно", - "max_alias_exceeded": "Макс. псевдоними са надхвърлени", - "max_mailbox_exceeded": "Макс. пощенски кутии са надхвърлени (%d от %d)", - "max_quota_in_use": "Квотата на пощенската кутия трябва да бъде по-голяма или равна на %d MiB", - "maxquota_empty": "Макс. квотата за пощенска кутия не трябва да бъде 0.", - "mysql_error": "Грешка на MySQL: %s", - "network_host_invalid": "Невалидна мрежа или хост: %s", - "next_hop_interferes": "%s се намесва с nexthop %s", - "next_hop_interferes_any": "Съществуващ следващ хоп се намесва с %s", - "nginx_reload_failed": "Презареждането на Nginx е неуспешно: %s", - "no_user_defined": "Няма зададен потребител", - "object_exists": "Обектът %s вече съществува", - "object_is_not_numeric": "Стойността %s не е числова", - "password_complexity": "Паролата не отговаря на изискванията", - "password_empty": "Паролата не трябва да бъде празна", - "password_mismatch": "Паролата за потвърждение не съвпада", - "password_reset_invalid_user": "Пощенската кутия не е намерена или не е зададен имейл за възстановяване", - "password_reset_na": "Възстановяването на парола в момента е недостъпно. Моля, свържете се с вашия администратор.", - "policy_list_from_exists": "Съществува запис с даденото име", - "policy_list_from_invalid": "Записът има невалиден формат", - "private_key_error": "Грешка с частен ключ: %s", - "pushover_credentials_missing": "Липсва токен или ключ на Pushover", - "pushover_key": "Ключът на Pushover има грешен формат", - "pushover_token": "Токенът на Pushover има грешен формат", - "quota_not_0_not_numeric": "Квотата трябва да бъде числова и >= 0", - "recipient_map_entry_exists": "Съществува запис в картата на получатели \"%s\"", - "recovery_email_failed": "Не може да бъде изпратен имейл за възстановяване. Моля, свържете се с вашия администратор.", - "redis_error": "Грешка на Redis: %s", - "relayhost_invalid": "Записът в картата %s е невалиден", - "release_send_failed": "Съобщението не може да бъде освободено: %s", - "required_data_missing": "Липсват необходими данни %s", - "reset_f2b_regex": "Регулярният филтър не може да бъде нулиран навреме, моля, опитайте отново или изчакайте още няколко секунди и презаредете уеб сайта.", - "reset_token_limit_exceeded": "Лимитът на токена за нулиране е надхвърлен. Моля, опитайте по-късно.", - "resource_invalid": "Името на ресурса %s е невалидно", - "rl_timeframe": "Временният интервал за ограничение на скоростта е некоректен", - "rspamd_ui_pw_length": "Паролата на UI на Rspamd трябва да бъде поне 6 символа", - "script_empty": "Скриптът не може да бъде празен", - "sender_acl_invalid": "Стойността на ACL на изпращач %s е невалидна", - "set_acl_failed": "Неуспешно задаване на ACL", - "settings_map_invalid": "Идентификаторът на картата с настройки %s е невалиден", - "sieve_error": "Грешка при синтаксиса на Sieve: %s", - "spam_learn_error": "Грешка при обучение за спам: %s", - "subject_empty": "Темата не трябва да бъде празна", - "target_domain_invalid": "Целевият домейн %s е невалиден", - "targetd_not_found": "Целевият домейн %s не е намерен", - "targetd_relay_domain": "Целевият домейн %s е домейн за реле", - "template_exists": "Шаблонът %s вече съществува", - "template_id_invalid": "Идентификаторът на шаблона %s е невалиден", - "template_name_invalid": "Името на шаблона е невалидно", - "temp_error": "Временна грешка", - "text_empty": "Текстът не трябва да бъде празен", - "tfa_token_invalid": "Токенът за TFA е невалиден", - "tls_policy_map_dest_invalid": "Дестинацията на политиката е невалидна", - "tls_policy_map_entry_exists": "Съществува запис в картата на политиката на TLS \"%s\"", - "tls_policy_map_parameter_invalid": "Параметърът на политиката е невалиден", - "to_invalid": "Получателят не трябва да бъде празен", - "totp_verification_failed": "Проверката на TOTP е неуспешна", - "transport_dest_exists": "Дестинацията на транспорта \"%s\" съществува", - "webauthn_verification_failed": "Проверката на WebAuthn е неуспешна: %s", - "webauthn_authenticator_failed": "Избраният аутентикатор не е намерен", - "webauthn_publickey_failed": "Не е запазен публичен ключ за избрания аутентикатор", - "webauthn_username_failed": "Избраният аутентикатор принадлежи на друга сметка", - "unknown": "Възникна неизвестна грешка", - "unknown_tfa_method": "Неизвестен метод за TFA", - "unlimited_quota_acl": "Неограничената квота е забранена от ACL", - "username_invalid": "Потребителското име %s не може да бъде използвано", - "validity_missing": "Моля, задайте период на валидност", - "value_missing": "Моля, предоставете всички стойности", - "yotp_verification_failed": "Проверката на Yubico OTP е неуспешна: %s" - }, - "datatables": { - "collapse_all": "Свиване на всичко", - "decimal": ".", - "emptyTable": "Няма данни в таблицата", - "expand_all": "Разширяване на всичко", - "info": "Показване на _START_ до _END_ от _TOTAL_ записа", - "infoEmpty": "Показване на 0 до 0 от 0 записа", - "infoFiltered": "(филтрирани от общо _MAX_ записа)", - "infoPostFix": "", - "thousands": ",", - "lengthMenu": "Показване на _MENU_ записа", - "loadingRecords": "Зареждане...", - "processing": "Моля, изчакайте...", - "search": "Търсене:", - "zeroRecords": "Няма съвпадащи записи", - "paginate": { - "first": "Първи", - "last": "Последен", - "next": "Следващ", - "previous": "Предишен" + "acl": { + "alias_domains": "Добавяне на домейни за псевдоними", + "app_passwds": "Управление на пароли за приложения", + "bcc_maps": "BCC карти", + "delimiter_action": "Действие на разделител", + "domain_desc": "Промяна на описанието на домейна", + "domain_relayhost": "Промяна на релеен хост за домейн", + "eas_reset": "Нулиране на устройствата с ActiveSync", + "extend_sender_acl": "Разрешаване на разширяване на ACL на изпращащите от външни адреси", + "filters": "Филтри", + "login_as": "Вход като потребител на пощенска кутия", + "mailbox_relayhost": "Промяна на релеен хост за пощенска кутия", + "prohibited": "Забранено от ACL", + "protocol_access": "Промяна на достъпа до протоколи", + "pushover": "Pushover", + "pw_reset": "Разрешаване на нулиране на паролата на потребител на mailcow", + "quarantine": "Действия с карантина", + "quarantine_attachments": "Прикачени файлове в карантина", + "quarantine_category": "Промяна на категорията на уведомленията за карантина", + "quarantine_notification": "Промяна на уведомленията за карантина", + "ratelimit": "Ограничение на скоростта", + "recipient_maps": "Карти на получатели", + "smtp_ip_access": "Промяна на разрешените хостове за SMTP", + "sogo_access": "Разрешаване на управление на достъпа до SOGo", + "sogo_profile_reset": "Нулиране на профила на SOGo", + "spam_alias": "Временни псевдоними", + "spam_policy": "Черен/Бял списък", + "spam_score": "Резултат за спам", + "syncjobs": "Синхронизиращи задачи", + "tls_policy": "Политика за TLS", + "unlimited_quota": "Неограничена квота за пощенски кутии" }, - "aria": { - "sortAscending": ": активиране за сортиране на колоната във възходящ ред", - "sortDescending": ": активиране за сортиране на колоната в низходящ ред" + "add": { + "activate_filter_warn": "Всички други филтри ще бъдат деактивирани, когато активното е отбелязано.", + "active": "Активен", + "add": "Добавяне", + "add_domain_only": "Добавяне само на домейн", + "add_domain_restart": "Добавяне на домейн и рестартиране на SOGo", + "alias_address": "Адрес/и за псевдоним", + "alias_address_info": "Пълни имейл адреси или @example.com, за да хванете всички съобщения за домейн (разделени с запетая). само домейни на mailcow.", + "alias_domain": "Домейн за псевдоним", + "alias_domain_info": "Валидни имена на домейни (разделени с запетая).", + "app_name": "Име на приложението", + "app_password": "Добавяне на парола за приложение", + "app_passwd_protocols": "Разрешени протоколи за паролата на приложението", + "automap": "Опит за автоматично картографиране на папки (\"Изпратени\", \"Изпратени\" => \"Изпратени\" и т.н.)", + "backup_mx_options": "Опции за реле", + "bcc_dest_format": "BCC дестинацията трябва да бъде един валиден имейл адрес.
Ако имате нужда да изпратите копие до множество адреси, създайте псевдоним и го използвайте тук.", + "comment_info": "Частен коментар не е видим за потребителя, докато публичен коментар се показва като подсказка при преминаване с мишката върху него в прегледа на потребителя", + "custom_params": "Персонализирани параметри", + "custom_params_hint": "Дясно: --param=xy, грешно: --param xy", + "delete1": "Изтриване от източника след завършване", + "delete2": "Изтриване на съобщенията в дестинацията, които не са в източника", + "delete2duplicates": "Изтриване на дубликати в дестинацията", + "description": "Описание", + "destination": "Дестинация", + "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", + "domain": "Домейн", + "domain_matches_hostname": "Домейнът %s съвпада с името на хоста", + "domain_quota_m": "Обща квота на домейна (MiB)", + "dry": "Симулиране на синхронизация", + "enc_method": "Метод на криптиране", + "exclude": "Изключване на обекти (regex)", + "full_name": "Пълно име", + "gal": "Глобален адресен списък", + "gal_info": "Глобалният адресен списък съдържа всички обекти на домейна и не може да бъде редактиран от нито един потребител. Липсва информация за заетост/свободно време в SOGo, ако е деактивирано! Рестартирайте SOGo, за да приложите промените.", + "generate": "генериране", + "goto_ham": "Учен като не е спам", + "goto_null": "Тихо изхвърляне на имейла", + "goto_spam": "Учен като спам", + "hostname": "Хост", + "inactive": "Неактивен", + "kind": "Вид", + "mailbox_quota_def": "Квота по подразбиране за пощенска кутия", + "mailbox_quota_m": "Макс. квота за пощенска кутия (MiB)", + "mailbox_username": "Потребителско име (лява част на имейл адрес)", + "max_aliases": "Макс. възможни псевдоними", + "max_mailboxes": "Макс. възможни пощенски кутии", + "mins_interval": "Интервал за проверка (минути)", + "multiple_bookings": "Множествени резервации", + "nexthop": "Следващ хоп", + "password": "Парола", + "password_repeat": "Потвърждаване на паролата (повторете)", + "port": "Порт", + "post_domain_add": "След добавянето на нов домейн, контейнерът на SOGo, \"sogo-mailcow\", трябва да бъде рестартиран!

Освен това, конфигурацията на DNS на домейна трябва да бъде прегледана. След като конфигурацията на DNS бъде одобрена, рестартирайте \"acme-mailcow\", за да генерирате автоматично сертификати за вашия нов домейн (autoconfig.<domain>, autodiscover.<domain>).
Тази стъпка е опционална и ще бъде повторена всеки 24 часа.", + "private_comment": "Частен коментар", + "public_comment": "Публичен коментар", + "quota_mb": "Квота (MiB)", + "relay_all": "Реле на всички получатели", + "relay_all_info": "↪ Ако изберете да не релеирате всички получатели, ще трябва да добавите (\"скрита\") пощенска кутия за всеки отделен получател, който трябва да бъде релеиран.", + "relay_domain": "Реле на този домейн", + "relay_transport_info": "
Инфо
Можете да дефинирате транспортни карти за персонализирана дестинация за този домейн. Ако не е зададено, ще бъде направен MX lookup.", + "relay_unknown_only": "Реле на несъществуващи пощенски кутии. Съществуващите пощенски кутии ще бъдат доставени локално.", + "relayhost_wrapped_tls_info": "Моля, не използвайте TLS-wrapped портове (най-често използвани на порт 465).
\r\nИзползвайте всеки не-wrapped порт и издайте STARTTLS. Политика за TLS може да бъде създадена в \"TLS политики\", за да се наложи TLS.", + "select": "Моля, изберете...", + "select_domain": "Моля, изберете първо домейн", + "sieve_desc": "Кратко описание", + "sieve_type": "Тип на филтър", + "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)", + "subscribeall": "Абониране за всички папки", + "syncjob": "Добавяне на синхронизираща задача", + "syncjob_hint": "Имайте предвид, че паролите трябва да бъдат запазени като обикновен текст!", + "tags": "Тагове", + "target_address": "Адреси за пренасочване", + "target_address_info": "Пълни имейл адреси (разделени с запетая).", + "target_domain": "Целеви домейн", + "timeout1": "Таймаут за връзка с отдалечен хост", + "timeout2": "Таймаут за връзка с локален хост", + "username": "Потребителско име", + "validate": "Валидиране", + "validation_success": "Успешно валидиране" + }, + "admin": { + "access": "Достъп", + "action": "Действие", + "activate_api": "Активиране на API", + "activate_send": "Активиране на бутона за изпращане", + "active": "Активен", + "active_rspamd_settings_map": "Активна карта с настройки", + "add": "Добавяне", + "add_admin": "Добавяне на администратор", + "add_domain_admin": "Добавяне на администратор на домейн", + "add_forwarding_host": "Добавяне на хост за препращане", + "add_relayhost": "Добавяне на транспорт, зависим от изпращач", + "add_relayhost_hint": "Имайте предвид, че данните за удостоверяване, ако има такива, ще бъдат запазени като обикновен текст.", + "add_row": "Добавяне на ред", + "add_settings_rule": "Добавяне на правило за настройки", + "add_transport": "Добавяне на транспорт", + "add_transports_hint": "Имайте предвид, че данните за удостоверяване, ако има такива, ще бъдат запазени като обикновен текст.", + "additional_rows": "добавени допълнителни редове", + "admin": "Администратор", + "admin_details": "Редактиране на детайлите на администратора", + "admin_domains": "Назначения на домейни", + "admins": "Администратори", + "admins_ldap": "LDAP администратори", + "advanced_settings": "Разширени настройки", + "allowed_methods": "Access-Control-Allow-Methods", + "allowed_origins": "Access-Control-Allow-Origin", + "api_allow_from": "Разрешаване на API достъп от тези IP адреси/CIDR мрежови нотации", + "api_info": "API е в процес на разработка. Документацията може да бъде намерена на /api", + "api_key": "API ключ", + "api_read_only": "Достъп само за четене", + "api_read_write": "Достъп за четене и писане", + "api_skip_ip_check": "Пропускане на IP проверка за API", + "app_hide": "Скриване за вход", + "app_links": "Връзки към приложения", + "app_name": "Име на приложението", + "apps_name": "Име на \"mailcow приложенията\"", + "arrival_time": "Време на пристигане (време на сървъра)", + "authed_user": "Удостоверен потребител", + "ays": "Сигурни ли сте, че искате да продължите?", + "ban_list_info": "Вижте списък с блокирани IP адреси по-долу: мрежа (оставащо време за блокиране) - [действия].
IP адресите в опашката за разблокиране ще бъдат премахнати от активния списък с блокирани в рамките на няколко секунди.
Червените етикети показват активни постоянни блокирания от черния списък.", + "change_logo": "Промяна на логото", + "logo_normal_label": "Нормално", + "logo_dark_label": "Обърнато за тъмен режим", + "configuration": "Конфигурация", + "convert_html_to_text": "Конвертиране на HTML в обикновен текст", + "copy_to_clipboard": "Текстът е копиран в клипборда!", + "cors_settings": "Настройки на CORS", + "credentials_transport_warning": "Внимание: Добавянето на нов запис в картата на транспорта ще обнови данните за удостоверяване за всички записи с съвпадаща колона за следващ хоп.", + "customer_id": "Идентификатор на клиента", + "customize": "Персонализиране", + "destination": "Дестинация", + "dkim_add_key": "Добавяне на ARC/DKIM ключ", + "dkim_domains_selector": "Селектор", + "dkim_domains_wo_keys": "Избор на домейни без ключове", + "dkim_from": "От", + "dkim_from_title": "Източник на домейн за копиране на данни", + "dkim_key_length": "Дължина на DKIM ключа (битове)", + "dkim_key_missing": "Липсващ ключ", + "dkim_key_unused": "Неизползван ключ", + "dkim_key_valid": "Валиден ключ", + "dkim_keys": "ARC/DKIM ключове", + "dkim_overwrite_key": "Презаписване на съществуващ DKIM ключ", + "dkim_private_key": "Частен ключ", + "dkim_to": "До", + "dkim_to_title": "Целеви домейн/и - ще бъде презаписан", + "domain": "Домейн", + "domain_admin": "Администратор на домейн", + "domain_admins": "Администратори на домейн", + "domain_s": "Домейн/и", + "duplicate": "Дублиране", + "duplicate_dkim": "Дублиране на DKIM запис", + "edit": "Редактиране", + "empty": "Няма резултати", + "excludes": "Изключване на тези получатели", + "f2b_ban_time": "Време за блокиране (с)", + "f2b_ban_time_increment": "Времето за блокиране се увеличава с всяко блокиране", + "f2b_blacklist": "Черни списъци/хостове", + "f2b_filter": "Филтри с регулярни изрази", + "f2b_list_info": "Черният списък на хостове или мрежи винаги ще надделява над белия списък. Актуализациите на списъка отнемат няколко секунди, за да бъдат приложени.", + "f2b_manage_external": "Управление на Fail2Ban външно", + "f2b_manage_external_info": "Fail2ban все още ще поддържа черния списък, но няма да задава правила за блокиране на трафика. Използвайте генерирания черн списък по-долу, за да блокирате трафика външно.", + "f2b_max_attempts": "Макс. опити", + "f2b_max_ban_time": "Макс. време за блокиране (с)", + "f2b_netban_ipv4": "IPv4 размер на подмрежа за прилагане на блокиране (8-32)", + "f2b_netban_ipv6": "IPv6 размер на подмрежа за прилагане на блокиране (8-128)", + "f2b_parameters": "Параметри на Fail2ban", + "f2b_regex_info": "Логовете, които се вземат предвид: SOGo, Postfix, Dovecot, PHP-FPM.", + "f2b_retry_window": "Прозорец за повторен опит (с) за макс. опити", + "f2b_whitelist": "Бели списъци/хостове", + "filter": "Филтър", + "filter_table": "Таблица с филтри", + "forwarding_hosts": "Хостове за препращане", + "forwarding_hosts_add_hint": "Можете да посочите IPv4/IPv6 адреси, мрежи в CIDR нотация, имена на хостове (които ще бъдат разрешени в IP адреси), или имена на домейни (които ще бъдат разрешени в IP адреси чрез заявки към SPF записи или, при липсата им, MX записи).", + "forwarding_hosts_hint": "Входящите съобщения се приемат безрезервно от всички хостове, изброени тук. Тези хостове след това не се проверяват срещу DNSBL или подлагат на сиво списък. Спамът, получен от тях, никога не се отхвърля, но опционално може да бъде поставен във файла за нежелана поща. Най-често използваната употреба за това е да се посочат пощенски сървъри, на които сте настроили правило, което препраща входящите имейли към вашия mailcow сървър.", + "from": "От", + "generate": "генериране", + "guid": "GUID - уникален инстанционен идентификатор", + "guid_and_license": "GUID & Лиценз", + "hash_remove_info": "Премахването на хеш за ограничение на скоростта (ако все още съществува) ще нулира неговия брояч напълно.
\r\nВсеки хеш е показан с индивидуален цвят.", + "help_text": "Презаписване на помощния текст под маската за вход (разрешен е HTML)", + "host": "Хост", + "html": "HTML", + "iam": "Доставчик на идентичност", + "iam_attribute_field": "Поле за атрибут", + "iam_authorize_url": "Крайна точка за удостоверяване", + "iam_auth_flow": "Поток за удостоверяване", + "iam_auth_flow_info": "Освен стандартния поток за удостоверяване (поток с код за удостоверяване в Keycloak), който се използва за единичен вход, mailcow поддържа и поток за удостоверяване с пряки удостоверения. Потокът за удостоверяване с пароли за поща проверява удостоверенията на потребителя, като използва Keycloak Admin REST API. mailcow извлича хешираната парола от атрибута mailcow_password, който е картиран в Keycloak.", + "iam_basedn": "Основен DN", + "iam_client_id": "Идентификатор на клиента", + "iam_client_secret": "Тайна на клиента", + "iam_client_scopes": "Обхват на клиента", + "iam_default_template": "Шаблон по подразбиране", + "iam_default_template_description": "Ако няма зададен шаблон за потребител, шаблонът по подразбиране ще бъде използван за създаване на пощенската кутия, но не и за актуализиране на пощенската кутия.", + "iam_description": "Конфигуриране на външен доставчик за удостоверяване
Потребителските пощенски кутии ще бъдат създавани автоматично при първия им вход, при условие че е зададено картиране на атрибути.", + "iam_extra_permission": "За да работят следните настройки, клиентът на mailcow в Keycloak трябва да има услуга акаунт и разрешението да вижда потребители.", + "iam_host": "Хост", + "iam_host_info": "Въведете един или повече LDAP хостове, разделени с запетаи.", + "iam_import_users": "Импортиране на потребители", + "iam_mapping": "Картиране на атрибути", + "iam_bindpass": "Парола за свързване", + "iam_periodic_full_sync": "Периодичен пълен синхрон", + "iam_port": "Порт", + "iam_realm": "Реалм", + "iam_redirect_url": "URL за пренасочване", + "iam_rest_flow": "Поток за пароли за поща", + "iam_server_url": "URL на сървъра", + "iam_sso": "Единичен вход", + "iam_sync_interval": "Интервал за синхронизиране/импортиране (мин)", + "iam_test_connection": "Тест на връзката", + "iam_token_url": "Крайна точка за токени", + "iam_userinfo_url": "Крайна точка за информация за потребителя", + "iam_username_field": "Поле за потребителско име", + "iam_binddn": "DN за свързване", + "iam_use_ssl": "Използване на SSL", + "iam_use_ssl_info": "Ако активирате SSL и портът е зададен на 389, той ще бъде автоматично променен на 636.", + "iam_use_tls": "Използване на StartTLS", + "iam_use_tls_info": "Ако активирате TLS, трябва да използвате стандартния порт за вашия LDAP сървър (389). SSL портовете не могат да бъдат използвани.", + "iam_version": "Версия", + "ignore_ssl_error": "Игнориране на SSL грешки", + "import": "Импортиране", + "import_private_key": "Импортиране на частен ключ", + "in_use_by": "Използван от", + "inactive": "Неактивен", + "include_exclude": "Включване/Изключване", + "include_exclude_info": "По подразбиране - без избор - всички пощенски кутии се адресират", + "includes": "Включване на тези получатели", + "ip_check": "Проверка на IP", + "ip_check_disabled": "Проверката на IP е деактивирана. Можете да я активирате в
Система > Конфигурация > Опции > Персонализиране", + "ip_check_opt_in": "Оптиране за използване на услугата на трета страна ipv4.mailcow.email и ipv6.mailcow.email, за да разрешавате външни IP адреси.", + "is_mx_based": "MX базиран", + "last_applied": "Последно приложено", + "license_info": "Лицензът не е задължителен, но помага за по-нататъшното развитие.
Регистрирайте вашия GUID тук или купете поддръжка за вашата инсталация на mailcow.", + "link": "Връзка", + "loading": "Моля, изчакайте...", + "login_time": "Време за вход", + "logo_info": "Вашето изображение ще бъде мащабирано до височина 40 px за горната навигационна лента и макс. ширина 250 px за началната страница. Препоръчва се използването на скалируема графика.", + "lookup_mx": "Дестинацията е регулярен израз за съвпадение с MX име (.*\\.google\\.com за пренасочване на всички съобщения, предназначени за MX, завършващ на google.com, през този хоп)", + "main_name": "Име на \"mailcow UI\"", + "merged_vars_hint": "Редовете в сиво са сляти от vars.(local.)inc.php и не могат да бъдат променени.", + "message": "Съобщение", + "message_size": "Размер на съобщението", + "nexthop": "Следващ хоп", + "no": "✕", + "no_active_bans": "Няма активни блокирания", + "no_new_rows": "Няма допълнителни редове", + "no_record": "Няма запис", + "oauth2_apps": "OAuth2 приложения", + "oauth2_add_client": "Добавяне на OAuth2 клиент", + "oauth2_client_id": "Идентификатор на клиента", + "oauth2_client_secret": "Тайна на клиента", + "oauth2_info": "Реализацията на OAuth2 поддържа типа разрешение \"Код за удостоверяване\" и издава токени за презареждане.
\r\nСървърът автоматично издава нови токени за презареждане, след като токен за презареждане е бил използван.

\r\n• Обхватът по подразбиране е профил. Само потребителите на пощенски кутии могат да бъдат удостоверени срещу OAuth2. Ако параметърът за обхват е пропуснат, той се връща към профил.
\r\n• Параметърът state трябва да бъде изпратен от клиента като част от заявката за удостоверяване.

\r\nПътища за заявки към OAuth2 API:
\r\n
    \r\n
  • Крайна точка за удостоверяване: /oauth/authorize
  • \r\n
  • Крайна точка за токени: /oauth/token
  • \r\n
  • Страница с ресурси: /oauth/profile
  • \r\n
\r\nГенерирането на нова тайна на клиента няма да анулира съществуващите кодове за удостоверяване, но те няма да могат да подновят своя токен.

\r\nАнулирането на токените на клиента ще доведе до незабавно прекратяване на всички активни сесии. Всички клиенти ще трябва да се преудостоверят.", + "oauth2_redirect_uri": "URI за пренасочване", + "oauth2_renew_secret": "Генериране на нова тайна на клиента", + "oauth2_revoke_tokens": "Анулиране на всички токени на клиента", + "optional": "опционално", + "options": "Опции", + "password": "Парола", + "password_length": "Дължина на паролата", + "password_policy": "Политика за пароли", + "password_policy_chars": "Трябва да съдържа поне една буквена буква", + "password_policy_length": "Минималната дължина на паролата е %d", + "password_policy_lowerupper": "Трябва да съдържа малки и главни букви", + "password_policy_numbers": "Трябва да съдържа поне една цифра", + "password_policy_special_chars": "Трябва да съдържа специални символи", + "password_repeat": "Потвърждаване на паролата (повторете)", + "password_reset_info": "Ако не е зададен имейл за възстановяване, тази функция не може да бъде използвана.", + "password_reset_settings": "Настройки за възстановяване на парола", + "password_reset_tmpl_html": "HTML шаблон", + "password_reset_tmpl_text": "Текстов шаблон", + "password_settings": "Настройки на паролата", + "priority": "Приоритет", + "private_key": "Частен ключ", + "quarantine": "Карантина", + "quarantine_bcc": "Изпращане на копие от всички уведомления (BCC) до този получател:
Оставете празно, за да деактивирате. Неподписано, непроверено имейл. Трябва да бъде доставено само вътрешно.", + "quarantine_exclude_domains": "Изключване на домейни и домейни на псевдоними", + "quarantine_max_age": "Максимална възраст в дни
Стойността трябва да бъде равна или по-голяма от 1 ден.", + "quarantine_max_score": "Изхвърляне на уведомление, ако резултатът за спам на имейла е по-висок от тази стойност:
По подразбиране е 9999.0", + "quarantine_max_size": "Максимален размер в MiB (по-големи елементи се изхвърлят):
0 не означава неограничен.", + "quarantine_notification_html": "Шаблон на имейл за уведомление:
Оставете празно, за да възстановите шаблона по подразбиране.", + "quarantine_notification_sender": "Изпращач на имейл за уведомление", + "quarantine_notification_subject": "Тема на имейл за уведомление", + "quarantine_redirect": "Пренасочване на всички уведомления към този получател:
Оставете празно, за да деактивирате. Неподписано, непроверено имейл. Трябва да бъде доставено само вътрешно.", + "quarantine_release_format": "Формат на освободените елементи", + "quarantine_release_format_att": "Като прикачен файл", + "quarantine_release_format_raw": "Непроменен оригинал", + "quarantine_retention_size": "Задържания за пощенска кутия:
0 показва неактивен.", + "quota_notification_html": "Шаблон на имейл за уведомление:
Оставете празно, за да възстановите шаблона по подразбиране.", + "quota_notification_sender": "Изпращач на имейл за уведомление", + "quota_notification_subject": "Тема на имейл за уведомление", + "quota_notifications": "Уведомления за квота", + "quota_notifications_info": "Уведомленията за квота се изпращат на потребителите веднъж при преминаване на 80% и веднъж при преминаване на 95% използване.", + "quota_notifications_vars": "{{percent}} е равно на текущата квота на потребителя
{{username}} е името на пощенската кутия", + "queue_unban": "разблокиране", + "r_active": "Активни ограничения", + "r_inactive": "Неактивни ограничения", + "r_info": "Елементите в сиво в списъка с активни ограничения не са известни като валидни ограничения за mailcow и не могат да бъдат преместени. Неизвестните ограничения ще бъдат зададени в реда на появяване все пак.
Можете да добавяте нови елементи в inc/vars.local.inc.php, за да можете да ги превключвате.", + "rate_name": "Име на ограничението", + "recipients": "Получатели", + "refresh": "Опресняване", + "regen_api_key": "Регенериране на API ключ", + "regex_maps": "Карти с регулярни изрази", + "relay_from": "Адрес \"From:\"", + "relay_rcpt": "Адрес \"To:\"", + "relay_run": "Изпълнение на тест", + "relayhosts": "Транспорти, зависими от изпращач", + "relayhosts_hint": "Дефинирайте транспорти, зависими от изпращач, за да можете да ги избирате в диалоговия прозорец за конфигурация на домейн.
\r\n Услугата за транспорт винаги е \"smtp:\" и ще се опита да използва TLS, ако бъде предложена. Wrapped TLS (SMTPS) не се поддържа. Политиката за TLS на потребителя ще бъде взета предвид.
\r\n Засегнатите домейни, включително домейни на псевдоними.", + "remove": "Премахване", + "remove_row": "Премахване на ред", + "reset_default": "Нулиране до подразбиране", + "reset_limit": "Премахване на хеш", + "reset_password_vars": "{{link}} Генерираната връзка за нулиране на парола
{{username}} Името на пощенската кутия на потребителя, който е поискал нулиране на парола
{{username2}} Името на пощенската кутия за възстановяване
{{date}} Датата на заявката за нулиране на парола
{{token_lifetime}} Времетраенето на токена в минути
{{hostname}} Името на хоста на mailcow", + "restore_template": "Оставете празно, за да възстановите шаблона по подразбиране.", + "routing": "Маршрутизация", + "rsetting_add_rule": "Добавяне на правило", + "rsetting_content": "Съдържание на правилото", + "rsetting_desc": "Кратко описание", + "rsetting_no_selection": "Моля, изберете правило", + "rsetting_none": "Няма налични правила", + "rsettings_insert_preset": "Вмъкване на примерен предефиниран набор \"%s\"", + "rsettings_preset_1": "Деактивиране на всичко, освен DKIM и ограничение на скоростта за удостоверени потребители", + "rsettings_preset_2": "Пощенските администратори искат спам", + "rsettings_preset_3": "Разрешаване само на определени изпращачи за пощенска кутия (напр. използване като вътрешна пощенска кутия)", + "rsettings_preset_4": "Деактивиране на Rspamd за домейн", + "rspamd_com_settings": "Името на настройката ще бъде автоматично генерирано, моля, вижте примерните предефинирани набори по-долу. За повече детайли вижте документацията на Rspamd", + "rspamd_global_filters": "Глобални карти на филтри", + "rspamd_global_filters_agree": "Ще бъда внимателен!", + "rspamd_global_filters_info": "Глобалните карти на филтри съдържат различни видове глобални черни и бели списъци.", + "rspamd_global_filters_regex": "Имената им обясняват тяхната цел. Всичкото съдържание трябва да съдържа валиден регулярен израз във формат \"/pattern/options\" (напр. /.+@domain\\.tld/i).
\r\n Въпреки че се извършват основни проверки за всеки ред с регулярен израз, функционалността на Rspamd може да бъде нарушена, ако не успява да прочете синтаксиса коректно.
\r\n Rspamd ще се опита да прочете съдържанието на картата при промяна. Ако срещнете проблеми, рестартирайте Rspamd, за да наложите презареждане на картата.
Елементите в черния списък са изключени от карантина.", + "rspamd_settings_map": "Карта с настройки на Rspamd", + "sal_level": "Ниво на Moo", + "save": "Запазване на промените", + "search_domain_da": "Търсене на домейни", + "send": "Изпращане", + "sender": "Изпращач", + "service": "Услуга", + "service_id": "Идентификатор на услугата", + "source": "Източник", + "spamfilter": "Филтър за спам", + "subject": "Тема", + "success": "Успех", + "sys_mails": "Системни имейли", + "task": "Задача", + "text": "Текст", + "time": "Време", + "title": "Заглавие", + "title_name": "Име на уеб страницата на \"mailcow UI\"", + "to_top": "Обратно нагоре", + "transport_dest_format": "Регулярен израз или синтаксис: example.org, .example.org, *, box@example.org (няколко стойности могат да бъдат разделени с запетая)", + "transport_maps": "Карти за транспорт", + "transport_test_rcpt_info": "• Използвайте null@hosted.mailcow.de, за да тествате препращането към чуждестранна дестинация.", + "transports_hint": "• Записът в картата на транспорта пренарежда запис в картата на транспорт, зависим от изпращач.
\r\n• Транспортите, базирани на MX, се използват предимно.
\r\n• Настройките за политика на TLS на потребителя се игнорират и могат да бъдат приложени само чрез записи в картите на политиката на TLS.
\r\n• Услугата за транспорт за дефинираните транспорти винаги е \"smtp:\" и ще се опита да използва TLS, ако бъде предложена. Wrapped TLS (SMTPS) не се поддържа.
\r\n• Адресите, съвпадащи с \"/localhost$/\", винаги ще бъдат транспортирани през \"local:\", следователно записът \"*\" няма да се приложи към тези адреси.
\r\n• За да определите удостоверения за следващ хоп \"[host]:25\", Postfix винаги заявява за \"host\", преди да търси за \"[host]:25\". Това поведение прави невъзможно да се използват \"host\" и \"[host]:25\" едновременно.", + "ui_footer": "Подвал (разрешен е HTML)", + "ui_header_announcement": "Обяви", + "ui_header_announcement_active": "Задаване на активна обява", + "ui_header_announcement_content": "Текст (разрешен е HTML)", + "ui_header_announcement_help": "Обявата е видима за всички влезли потребители и на екрана за вход на UI.", + "ui_header_announcement_select": "Избор на тип обява", + "ui_header_announcement_type": "Тип", + "ui_header_announcement_type_danger": "Много важно", + "ui_header_announcement_type_info": "Информация", + "ui_header_announcement_type_warning": "Важно", + "ui_texts": "Етикети и текстове на UI", + "unban_pending": "разблокиране в опашката", + "unchanged_if_empty": "Ако не е променено, оставете празно", + "upload": "Качване", + "username": "Потребителско име", + "user_link": "Връзка към потребител", + "validate_license_now": "Валидиране на GUID срещу лицензен сървър", + "verify": "Проверка", + "yes": "✓" + }, + "danger": { + "access_denied": "Достъпът е отказан или данните от формуляра са невалидни", + "alias_domain_invalid": "Домейнът на псевдонима %s е невалиден", + "alias_empty": "Адресът на псевдонима не трябва да е празен", + "alias_goto_identical": "Адресът на псевдонима и адресът за пренасочване не трябва да са идентични", + "alias_invalid": "Адресът на псевдонима %s е невалиден", + "aliasd_targetd_identical": "Домейнът на псевдонима не трябва да е равен на целевия домейн: %s", + "aliases_in_use": "Макс. псевдоними трябва да бъдат по-големи или равни на %d", + "app_name_empty": "Името на приложението не може да бъде празно", + "app_passwd_id_invalid": "Идентификаторът на паролата за приложението %s е невалиден", + "authsource_in_use": "Доставчикът на идентичност не може да бъде променен или изтрит, тъй като се използва в момента от един или повече потребители.", + "bcc_empty": "BCC дестинацията не може да бъде празна", + "bcc_exists": "Картата BCC %s съществува за тип %s", + "bcc_must_be_email": "BCC дестинацията %s не е валиден имейл адрес", + "comment_too_long": "Коментарът е твърде дълъг, разрешени са макс. 160 символа", + "cors_invalid_method": "Зададен е невалиден метод за разрешаване", + "cors_invalid_origin": "Зададен е невалиден източник за разрешаване", + "defquota_empty": "Квотата по подразбиране за пощенска кутия не трябва да бъде 0.", + "demo_mode_enabled": "Режимът на демонстрация е активиран", + "description_invalid": "Описанието на ресурса за %s е невалидно", + "dkim_domain_or_sel_exists": "Съществува DKIM ключ за \"%s\", който няма да бъде презаписан", + "dkim_domain_or_sel_invalid": "DKIM домейн или селектор е невалиден: %s", + "domain_cannot_match_hostname": "Домейнът не може да съвпада с името на хоста", + "domain_exists": "Домейнът %s вече съществува", + "domain_invalid": "Името на домейна е празно или невалидно", + "domain_not_empty": "Не може да бъде премахнат непразен домейн %s", + "domain_not_found": "Домейнът %s не е намерен", + "domain_quota_m_in_use": "Квотата на домейна трябва да бъде по-голяма или равна на %s MiB", + "extended_sender_acl_denied": "липсва ACL за задаване на външни адреси на изпращач", + "extra_acl_invalid": "Външният адрес на изпращач \"%s\" е невалиден", + "extra_acl_invalid_domain": "Външният изпращач \"%s\" използва невалиден домейн", + "fido2_verification_failed": "Проверката на FIDO2 е неуспешна: %s", + "file_open_error": "Файлът не може да бъде отворен за писане", + "filter_type": "Грешен тип на филтър", + "from_invalid": "Изпращачът не трябва да бъде празен", + "generic_server_error": "Възникна неочаквана грешка на сървъра. Моля, свържете се с вашия администратор.", + "global_filter_write_error": "Файлът с филтър не може да бъде записан: %s", + "global_map_invalid": "Идентификаторът на глобалната карта %s е невалиден", + "global_map_write_error": "Глобалният идентификатор на картата %s не може да бъде записан: %s", + "goto_empty": "Адресът на псевдоним трябва да съдържа поне един валиден адрес за пренасочване", + "goto_invalid": "Адресът за пренасочване %s е невалиден", + "ham_learn_error": "Грешка при обучение за не-спам: %s", + "iam_test_connection": "Връзката е неуспешна", + "imagick_exception": "Грешка: Грешка при четене на изображение с Imagick", + "img_dimensions_exceeded": "Изображението надхвърля максималния размер", + "img_invalid": "Не може да се валидира файл с изображение", + "img_size_exceeded": "Изображението надхвърля максималния размер на файла", + "img_tmp_missing": "Не може да се валидира файл с изображение: Липсва временен файл", + "invalid_bcc_map_type": "Невалиден тип на картата BCC", + "invalid_destination": "Форматът на дестинацията \"%s\" е невалиден", + "invalid_filter_type": "Невалиден тип на филтър", + "invalid_host": "Зададен е невалиден хост: %s", + "invalid_mime_type": "Невалиден MIME тип", + "invalid_nexthop": "Форматът на следващия хоп е невалиден", + "invalid_nexthop_authenticated": "Следващият хоп съществува с различни удостоверения, моля, актуализирайте съществуващите удостоверения за този следващ хоп първо.", + "invalid_recipient_map_new": "Зададен е невалиден нов получател: %s", + "invalid_recipient_map_old": "Зададен е невалиден оригинален получател: %s", + "invalid_reset_token": "Невалиден токен за нулиране", + "ip_list_empty": "Списъкът с разрешени IP адреси не може да бъде празен", + "is_alias": "%s вече е известен като адрес на псевдоним", + "is_alias_or_mailbox": "%s вече е известен като адрес на псевдоним, пощенска кутия или адрес на псевдоним, разширен от домейн на псевдоним.", + "is_spam_alias": "%s вече е известен като временен адрес на псевдоним (спам адрес на псевдоним)", + "last_key": "Последното ключове не може да бъде изтрито, моля, деактивирайте TFA вместо това.", + "login_failed": "Неуспешен вход", + "mailbox_defquota_exceeds_mailbox_maxquota": "Квотата по подразбиране надхвърля лимита на макс. квота", + "mailbox_invalid": "Името на пощенската кутия е невалидно", + "mailbox_quota_exceeded": "Квотата надхвърля лимита на домейна (макс. %d MiB)", + "mailbox_quota_exceeds_domain_quota": "Макс. квотата надхвърля лимита на квотата на домейна", + "mailbox_quota_left_exceeded": "Няма достатъчно място (оставащо място: %d MiB)", + "mailboxes_in_use": "Макс. пощенски кутии трябва да бъдат по-големи или равни на %d", + "malformed_username": "Неправилно формирано потребителско име", + "map_content_empty": "Съдържанието на картата не може да бъде празно", + "max_alias_exceeded": "Макс. псевдоними са надхвърлени", + "max_mailbox_exceeded": "Макс. пощенски кутии са надхвърлени (%d от %d)", + "max_quota_in_use": "Квотата на пощенската кутия трябва да бъде по-голяма или равна на %d MiB", + "maxquota_empty": "Макс. квотата за пощенска кутия не трябва да бъде 0.", + "mysql_error": "Грешка на MySQL: %s", + "network_host_invalid": "Невалидна мрежа или хост: %s", + "next_hop_interferes": "%s се намесва с nexthop %s", + "next_hop_interferes_any": "Съществуващ следващ хоп се намесва с %s", + "nginx_reload_failed": "Презареждането на Nginx е неуспешно: %s", + "no_user_defined": "Няма зададен потребител", + "object_exists": "Обектът %s вече съществува", + "object_is_not_numeric": "Стойността %s не е числова", + "password_complexity": "Паролата не отговаря на изискванията", + "password_empty": "Паролата не трябва да бъде празна", + "password_mismatch": "Паролата за потвърждение не съвпада", + "password_reset_invalid_user": "Пощенската кутия не е намерена или не е зададен имейл за възстановяване", + "password_reset_na": "Възстановяването на парола в момента е недостъпно. Моля, свържете се с вашия администратор.", + "policy_list_from_exists": "Съществува запис с даденото име", + "policy_list_from_invalid": "Записът има невалиден формат", + "private_key_error": "Грешка с частен ключ: %s", + "pushover_credentials_missing": "Липсва токен или ключ на Pushover", + "pushover_key": "Ключът на Pushover има грешен формат", + "pushover_token": "Токенът на Pushover има грешен формат", + "quota_not_0_not_numeric": "Квотата трябва да бъде числова и >= 0", + "recipient_map_entry_exists": "Съществува запис в картата на получатели \"%s\"", + "recovery_email_failed": "Не може да бъде изпратен имейл за възстановяване. Моля, свържете се с вашия администратор.", + "redis_error": "Грешка на Redis: %s", + "relayhost_invalid": "Записът в картата %s е невалиден", + "release_send_failed": "Съобщението не може да бъде освободено: %s", + "required_data_missing": "Липсват необходими данни %s", + "reset_f2b_regex": "Регулярният филтър не може да бъде нулиран навреме, моля, опитайте отново или изчакайте още няколко секунди и презаредете уеб сайта.", + "reset_token_limit_exceeded": "Лимитът на токена за нулиране е надхвърлен. Моля, опитайте по-късно.", + "resource_invalid": "Името на ресурса %s е невалидно", + "rl_timeframe": "Временният интервал за ограничение на скоростта е некоректен", + "rspamd_ui_pw_length": "Паролата на UI на Rspamd трябва да бъде поне 6 символа", + "script_empty": "Скриптът не може да бъде празен", + "sender_acl_invalid": "Стойността на ACL на изпращач %s е невалидна", + "set_acl_failed": "Неуспешно задаване на ACL", + "settings_map_invalid": "Идентификаторът на картата с настройки %s е невалиден", + "sieve_error": "Грешка при синтаксиса на Sieve: %s", + "spam_learn_error": "Грешка при обучение за спам: %s", + "subject_empty": "Темата не трябва да бъде празна", + "target_domain_invalid": "Целевият домейн %s е невалиден", + "targetd_not_found": "Целевият домейн %s не е намерен", + "targetd_relay_domain": "Целевият домейн %s е домейн за реле", + "template_exists": "Шаблонът %s вече съществува", + "template_id_invalid": "Идентификаторът на шаблона %s е невалиден", + "template_name_invalid": "Името на шаблона е невалидно", + "temp_error": "Временна грешка", + "text_empty": "Текстът не трябва да бъде празен", + "tfa_token_invalid": "Токенът за TFA е невалиден", + "tls_policy_map_dest_invalid": "Дестинацията на политиката е невалидна", + "tls_policy_map_entry_exists": "Съществува запис в картата на политиката на TLS \"%s\"", + "tls_policy_map_parameter_invalid": "Параметърът на политиката е невалиден", + "to_invalid": "Получателят не трябва да бъде празен", + "totp_verification_failed": "Проверката на TOTP е неуспешна", + "transport_dest_exists": "Дестинацията на транспорта \"%s\" съществува", + "webauthn_verification_failed": "Проверката на WebAuthn е неуспешна: %s", + "webauthn_authenticator_failed": "Избраният аутентикатор не е намерен", + "webauthn_publickey_failed": "Не е запазен публичен ключ за избрания аутентикатор", + "webauthn_username_failed": "Избраният аутентикатор принадлежи на друга сметка", + "unknown": "Възникна неизвестна грешка", + "unknown_tfa_method": "Неизвестен метод за TFA", + "unlimited_quota_acl": "Неограничената квота е забранена от ACL", + "username_invalid": "Потребителското име %s не може да бъде използвано", + "validity_missing": "Моля, задайте период на валидност", + "value_missing": "Моля, предоставете всички стойности", + "yotp_verification_failed": "Проверката на Yubico OTP е неуспешна: %s" + }, + "datatables": { + "collapse_all": "Свиване на всичко", + "decimal": ".", + "emptyTable": "Няма данни в таблицата", + "expand_all": "Разширяване на всичко", + "info": "Показване на _START_ до _END_ от _TOTAL_ записа", + "infoEmpty": "Показване на 0 до 0 от 0 записа", + "infoFiltered": "(филтрирани от общо _MAX_ записа)", + "infoPostFix": "", + "thousands": ",", + "lengthMenu": "Показване на _MENU_ записа", + "loadingRecords": "Зареждане...", + "processing": "Моля, изчакайте...", + "search": "Търсене:", + "zeroRecords": "Няма съвпадащи записи", + "paginate": { + "first": "Първи", + "last": "Последен", + "next": "Следващ", + "previous": "Предишен" + }, + "aria": { + "sortAscending": ": активиране за сортиране на колоната във възходящ ред", + "sortDescending": ": активиране за сортиране на колоната в низходящ ред" + } + }, + "debug": { + "architecture": "Архитектура", + "chart_this_server": "Графика (този сървър)", + "containers_info": "Информация за контейнерите", + "container_running": "Изпълнява се", + "container_disabled": "Контейнерът е спрян или деактивиран", + "container_stopped": "Спрян", + "cores": "Ядра", + "current_time": "Системно време", + "disk_usage": "Използване на диска", + "docs": "Документи", + "error_show_ip": "Не може да се разреши публичния IP адрес", + "external_logs": "Външни логове", + "history_all_servers": "История (всички сървъри)", + "in_memory_logs": "Логове в паметта", + "last_modified": "Последно модифициране", + "log_info": "

Логовете на mailcow в паметта се събират в списъци на Redis и се подрязват до LOG_LINES (%d) на всяка минута, за да се намали натоварването.
Логовете в паметта не са предназначени да бъдат постоянни. Всички приложения, които записват в паметта, също записват в демона на Docker и следователно в основния драйвер за логсване.
Логовете в паметта трябва да се използват за отстраняване на леки проблеми с контейнери.

\r\n

Външните логове се събират чрез API на даденото приложение.

\r\n

Статичните логове са най-вече логове на активност, които не се записват в демона на Docker, но все още трябва да бъдат постоянни (с изключение на логовете на API).

", + "login_time": "Време", + "logs": "Логове", + "memory": "Памет", + "online_users": "Потребители онлайн", + "restart_container": "Рестартиране", + "service": "Услуга", + "show_ip": "Показване на публичен IP", + "size": "Размер", + "started_at": "Стартирано в", + "started_on": "Стартирано на", + "static_logs": "Статични логове", + "success": "Успех", + "system_containers": "Система & Контейнери", + "timezone": "Часова зона", + "uptime": "Време на работа", + "update_available": "Има налична актуализация", + "no_update_available": "Системата е на последното издание", + "update_failed": "Не може да се провери за актуализация", + "username": "Потребителско име", + "wip": "В момента се работи" + }, + "diagnostics": { + "cname_from_a": "Стойността е извлечена от A/AAAA запис. Това се поддържа, докато записът сочи към правилния ресурс.", + "dns_records": "DNS записи", + "dns_records_24hours": "Моля, имайте предвид, че промените в DNS може да отнемат до 24 часа, за да имат актуалното си състояние правилно отразено на тази страница. Тя е предназначена да ви позволи лесно да видите как да конфигурирате вашите DNS записи и да проверите дали всичките ви записи са правилно запазени в DNS.", + "dns_records_data": "Правилни данни", + "dns_records_docs": "Моля, вижте и документацията.", + "dns_records_name": "Име", + "dns_records_status": "Текущо състояние", + "dns_records_type": "Тип", + "optional": "Този запис е опционален." + }, + "edit": { + "acl": "ACL (Разрешение)", + "active": "Активен", + "admin": "Редактиране на администратор", + "advanced_settings": "Разширени настройки", + "alias": "Редактиране на псевдоним", + "allow_from_smtp": "Разрешаване само на тези IP адреси да използват SMTP", + "allow_from_smtp_info": "Оставете празно, за да разрешите всички изпращачи.
IPv4/IPv6 адреси и мрежи.", + "allowed_protocols": "Разрешени протоколи за пряк потребителски достъп (не засяга протоколите за пароли на приложения)", + "app_name": "Име на приложението", + "app_passwd": "Парола за приложение", + "app_passwd_protocols": "Разрешени протоколи за паролата на приложението", + "automap": "Опит за автоматично картографиране на папки (\"Изпратени\", \"Изпратени\" => \"Изпратени\" и т.н.)", + "backup_mx_options": "Опции за реле", + "bcc_dest_format": "BCC дестинацията трябва да бъде един валиден имейл адрес.
Ако имате нужда да изпратите копие до множество адреси, създайте псевдоним и го използвайте тук.", + "client_id": "Идентификатор на клиента", + "client_secret": "Тайна на клиента", + "comment_info": "Частен коментар не е видим за потребителя, докато публичен коментар се показва като подсказка при преминаване с мишката върху него в прегледа на потребителя", + "created_on": "Създаден на", + "custom_attributes": "Персонализирани атрибути", + "delete1": "Изтриване от източника след завършване", + "delete2": "Изтриване на съобщенията в дестинацията, които не са в източника", + "delete2duplicates": "Изтриване на дубликати в дестинацията", + "delete_ays": "Моля, потвърдете процеса на изтриване.", + "description": "Описание", + "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", + "domain": "Редактиране на домейн", + "domain_admin": "Редактиране на администратор на домейн", + "domain_footer": "Подвал за домейн", + "domain_footer_html": "HTML подвал", + "domain_footer_info": "Подвалите за домейн се добавят към всички изходящи имейли, свързани с адрес в този домейн. Следните променливи могат да бъдат използвани за подвала:", + "domain_footer_info_vars": { + "auth_user": "{= auth_user =} - Удостоверен потребител, посочен от MTA", + "from_user": "{= from_user =} - Потребителска част на обвивката, напр. за \"moo@mailcow.tld\" връща \"moo\"", + "from_name": "{= from_name =} - Име на обвивката, напр. за \"Mailcow <moo@mailcow.tld>\" връща \"Mailcow\"", + "from_addr": "{= from_addr =} - Адресна част на обвивката", + "from_domain": "{= from_domain =} - Домейна част на обвивката", + "custom": "{= foo =} - Ако пощенската кутия има персонализиран атрибут \"foo\" със стойност \"bar\", ще върне \"bar\"" + }, + "domain_footer_plain": "PLAIN подвал", + "domain_footer_skip_replies": "Игнориране на подвал в отговорни имейли", + "domain_quota": "Квота на домейна", + "domains": "Домейни", + "dont_check_sender_acl": "Деактивиране на проверката на изпращач за домейн %s (+ домейни на псевдоними)", + "edit_alias_domain": "Редактиране на домейн на псевдоним", + "encryption": "Криптиране", + "exclude": "Изключване на обекти (regex)", + "extended_sender_acl": "Външни адреси на изпращач", + "extended_sender_acl_info": "Трябва да бъде импортиран DKIM домейн ключ, ако е наличен.
\r\n Помнете да добавите този сървър към съответния SPF TXT запис.
\r\n Когато домейн или домейн на псевдоним бъде добавен към този сървър, който се припокрива с външен адрес, външният адрес ще бъде премахнат.
\r\n Използвайте @domain.tld, за да разрешите изпращане като *@domain.tld.", + "footer_exclude": "Изключване от подвал", + "force_pw_update": "Принудително обновяване на парола при следващия вход", + "force_pw_update_info": "Този потребител ще може да влезе само в %s. Паролите за приложения остават използваеми.", + "full_name": "Пълно име", + "gal": "Глобален адресен списък", + "gal_info": "Глобалният адресен списък съдържа всички обекти на домейна и не може да бъде редактиран от нито един потребител. Липсва информация за заетост/свободно време в SOGo, ако е деактивирано! Рестартирайте SOGo, за да приложите промените.", + "generate": "генериране", + "grant_types": "Типове разрешения", + "hostname": "Име на хост", + "inactive": "Неактивен", + "kind": "Вид", + "last_modified": "Последно модифициране", + "lookup_mx": "Дестинацията е регулярен израз за съвпадение с MX име (.*\\.google\\.com за пренасочване на всички съобщения, предназначени за MX, завършващ на google.com, през този хоп)", + "mailbox": "Редактиране на пощенска кутия", + "mailbox_quota_def": "Квота по подразбиране за пощенска кутия", + "mailbox_relayhost_info": "Прилага се за пощенската кутия и директните псевдоними само, пренарежда запис в картата на транспорта за домейн.", + "mailbox_rename": "Преименуване на пощенска кутия", + "mailbox_rename_agree": "Създадох резервно копие.", + "mailbox_rename_alias": "Автоматично създаване на псевдоним", + "mailbox_rename_title": "Ново локално име на пощенска кутия", + "mailbox_rename_warning": "ВНИМАНИЕ! Създайте резервно копие преди преименуване на пощенската кутия.", + "max_aliases": "Макс. псевдоними", + "max_mailboxes": "Макс. възможни пощенски кутии", + "max_quota": "Макс. квота за пощенска кутия (MiB)", + "maxage": "Максимална възраст на съобщенията в дни, които ще бъдат проверени от отдалечен
(0 = игнорирай възраст)", + "maxbytespersecond": "Макс. байтове за секунда
(0 = неограничен)", + "mbox_rl_info": "Това ограничение на скоростта се прилага върху SASL името за вход, то съвпада с всеки \"от\" адрес, използван от влезлия потребител. Ограничението на скоростта на пощенска кутия пренарежда ограничението на скоростта за домейн.", + "mins_interval": "Интервал (мин)", + "multiple_bookings": "Множествени резервации", + "nexthop": "Следващ хоп", + "none_inherit": "Без / Наследяване", + "password": "Парола", + "password_recovery_email": "Имейл за възстановяване на парола", + "password_repeat": "Потвърждаване на паролата (повторете)", + "previous": "Предишна страница", + "private_comment": "Частен коментар", + "public_comment": "Публичен коментар", + "pushover": "Pushover", + "pushover_evaluate_x_prio": "Ескалиране на високоприоритетни съобщения [X-Priority: 1]", + "pushover_info": "Настройките за известия на Pushover ще се прилагат за всички чисти (не-спам) съобщения, доставени до %s, включително псевдоними (споделени, несподелени, таговани).", + "pushover_only_x_prio": "Разглеждане само на високоприоритетни съобщения [X-Priority: 1]", + "pushover_sender_array": "Разглеждане само на следните адреси на изпращач (разделени с запетая)", + "pushover_sender_regex": "Разглеждане на следния regex на изпращач", + "pushover_sound": "Звук", + "pushover_text": "Текст на известието", + "pushover_title": "Заглавие на известието", + "pushover_vars": "Когато не е зададен филтър на изпращач, всички съобщения ще бъдат разглеждани.
Филтрите с регулярен израз, както и точните проверки на изпращач, могат да бъдат дефинирани индивидуално и ще бъдат разглеждани последователно. Те не зависят един от друг.
Използвайте следните променливи за текст и заглавие (моля, вземете предвид политиките за поверителност на данните)", + "pushover_verify": "Проверка на удостоверения", + "quota_mb": "Квота (MiB)", + "quota_warning_bcc": "Предупреждения за квота ще бъдат изпращани като отделни копия до следните получатели:", + "quota_warning_bcc_info": "Съобщенията ще бъдат изпратени с тема, допълнена с името на потребителя в скоби, например: Предупреждение за квота (user@example.com).", + "ratelimit": "Ограничение на скоростта", + "redirect_uri": "URI за пренасочване/обратно извикване", + "relay_all": "Реле на всички получатели", + "relay_all_info": "↪ Ако изберете да не релеирате всички получатели, ще трябва да добавите (\"скрита\") пощенска кутия за всеки отделен получател, който трябва да бъде релеиран.", + "relay_domain": "Реле на този домейн", + "relay_transport_info": "
Инфо
Можете да дефинирате транспортни карти за персонализирана дестинация за този домейн. Ако не е зададено, ще бъде направен MX lookup.", + "relay_unknown_only": "Реле на несъществуващи пощенски кутии. Съществуващите пощенски кутии ще бъдат доставени локално.", + "relayhost": "Транспорти, зависими от изпращач", + "remove": "Премахване", + "resource": "Ресурс", + "save": "Запазване на промените", + "scope": "Обхват", + "sender_acl": "Разрешаване на изпращане като", + "sender_acl_disabled": "Проверката на изпращач е деактивирана", + "sender_acl_info": "Ако потребителят на пощенска кутия A е разрешен да изпраща като потребителя на пощенска кутия B, адресът на изпращач не се показва автоматично като избираем \"от\" поле в SOGo.
\r\n Потребителят на пощенска кутия B трябва да създаде делегация в SOGo, за да разреши на потребителя на пощенска кутия A да избира техния адрес като изпращач. За да делегирате пощенска кутия в SOGo, използвайте менюто (три точки) вдясно от името на пощенската кутия в горния ляв ъгъл, докато сте в режим на поща. Това поведение не се прилага за адреси на псевдоними.", + "sieve_desc": "Кратко описание", + "sieve_type": "Тип на филтър", + "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)", + "sogo_access": "Директно препращане към SOGo", + "sogo_access_info": "След влизане, потребителят се пренасочва автоматично към SOGo.", + "sogo_visible": "Псевдонимът е видим в SOGo", + "sogo_visible_info": "Тази опция засяга само обекти, които могат да бъдат показани в SOGo (споделени или несподелени адреси на псевдоними, сочещи поне една локална пощенска кутия). Ако е скрит, псевдонимът няма да се появи като избираем адрес на изпращач в SOGo.", + "spam_alias": "Създаване или промяна на временни псевдоними", + "spam_filter": "Филтър за спам", + "spam_policy": "Добавяне или премахване на елементи към черния/бял списък", + "spam_score": "Задаване на персонализиран резултат за спам", + "subfolder2": "Синхронизиране в подпапка в дестинацията
(празно = не използвай подпапка)", + "syncjob": "Редактиране на синхронизираща задача", + "target_address": "Адрес/и за пренасочване (разделени с запетая)", + "target_domain": "Целеви домейн", + "timeout1": "Таймаут за връзка с отдалечен хост", + "timeout2": "Таймаут за връзка с локален хост", + "title": "Редактиране на обект", + "unchanged_if_empty": "Ако не е променено, оставете празно", + "username": "Потребителско име", + "validate_save": "Валидиране и запазване" + }, + "fido2": { + "confirm": "Потвърждаване", + "fido2_auth": "Вход с FIDO2", + "fido2_success": "Устройството е регистрирано успешно", + "fido2_validation_failed": "Проверката е неуспешна", + "fn": "Приятелско име", + "known_ids": "Известни идентификатори", + "none": "Деактивирано", + "register_status": "Състояние на регистрация", + "rename": "Преименуване", + "set_fido2": "Регистриране на FIDO2 устройство", + "set_fido2_touchid": "Регистриране на Touch ID на Apple M1", + "set_fn": "Задаване на приятелско име", + "start_fido2_validation": "Стартиране на проверка на FIDO2" + }, + "footer": { + "cancel": "Отказ", + "confirm_delete": "Потвърждаване на изтриването", + "delete_now": "Изтриване сега", + "delete_these_items": "Моля, потвърдете промените за следния идентификатор на обект", + "hibp_check": "Проверка срещу haveibeenpwned.com", + "hibp_nok": "Съвпадение! Това е потенциално опасна парола!", + "hibp_ok": "Няма съвпадение.", + "loading": "Моля, изчакайте...", + "nothing_selected": "Няма избрани елементи", + "restart_container": "Рестартиране на контейнер", + "restart_container_info": "Важно: Грациозното рестартиране може да отнеме известно време за завършване, моля, изчакайте да приключи.", + "restart_now": "Рестартиране сега", + "restarting_container": "Рестартиране на контейнера, това може да отнеме известно време" + }, + "header": { + "administration": "Конфигурация & Детайли", + "apps": "Приложения", + "debug": "Информация", + "email": "Имейл", + "mailcow_system": "Система", + "mailcow_config": "Конфигурация", + "quarantine": "Карантина", + "restart_netfilter": "Рестартиране на netfilter", + "restart_sogo": "Рестартиране на SOGo", + "user_settings": "Настройки на потребителя" + }, + "info": { + "awaiting_tfa_confirmation": "Изчакване на потвърждение за TFA", + "no_action": "Няма приложимо действие", + "session_expires": "Вашата сесия ще изтече след около 15 секунди" + }, + "login": { + "back_to_mailcow": "Обратно към mailcow", + "delayed": "Входът е забавен с %s секунди.", + "fido2_webauthn": "Вход с FIDO2/WebAuthn", + "forgot_password": "> Забравена парола?", + "invalid_pass_reset_token": "Токенът за нулиране на парола е невалиден или е изтекъл.
Моля, заявете нов линк за нулиране на парола.", + "login": "Вход", + "login_admin": "Вход на администратор", + "login_dadmin": "Вход на администратор на домейн", + "login_user": "Потребителски вход", + "mobileconfig_info": "Моля, влезте като потребител на пощенска кутия, за да изтеглите поискания Apple профил за връзка.", + "new_password": "Нова парола", + "new_password_confirm": "Потвърждаване на новата парола", + "other_logins": "или вход с", + "password": "Парола", + "request_reset_password": "Заявка за промяна на парола", + "reset_password": "Нулиране на парола", + "username": "Потребителско име" + }, + "mailbox": { + "action": "Действие", + "activate": "Активиране", + "active": "Активен", + "add": "Добавяне", + "add_alias": "Добавяне на псевдоним", + "add_alias_expand": "Разширяване на псевдоним над домейни на псевдоними", + "add_bcc_entry": "Добавяне на запис в картата BCC", + "add_domain": "Добавяне на домейн", + "add_domain_alias": "Добавяне на псевдоним на домейн", + "add_domain_record_first": "Моля, добавете първо домейн", + "add_filter": "Добавяне на филтър", + "add_mailbox": "Добавяне на пощенска кутия", + "add_recipient_map_entry": "Добавяне на запис в картата на получатели", + "add_resource": "Добавяне на ресурс", + "add_template": "Добавяне на шаблон", + "add_tls_policy_map": "Добавяне на карта на политиката на TLS", + "address_rewriting": "Презаписване на адрес", + "alias": "Псевдоним", + "alias_domain_alias_hint": "Псевдонимите не се прилагат автоматично към домейни на псевдоними. Псевдонимът my-alias@domain не покрива адреса my-alias@alias-domain (където \"alias-domain\" е имагинерен псевдоним на домейн).
Моля, използвайте филтър на Sieve, за да пренасочите имейл към външна пощенска кутия (вижте раздела \"Филтри\" или SOGo -> Пренасочвач). Използвайте \"Разширяване на псевдоним над домейни на псевдоними\", за да добавите автоматично липсващи псевдоними.", + "alias_domain_backupmx": "Псевдонимът на домейн е неактивен за домейн за реле", + "aliases": "Псевдоними", + "all_domains": "Всички домейни", + "allow_from_smtp": "Разрешаване само на тези IP адреси да използват SMTP", + "allow_from_smtp_info": "Оставете празно, за да разрешите всички изпращачи.
IPv4/IPv6 адреси и мрежи.", + "allowed_protocols": "Разрешени протоколи", + "backup_mx": "Домейн за реле", + "bcc": "BCC", + "bcc_destination": "BCC дестинация", + "bcc_destinations": "BCC дестинации", + "bcc_info": "Картите BCC се използват, за да препращат тихо копия от всички съобщения до друг адрес. Записът от тип получател на карта се използва, когато локалната дестинация действа като получател на имейл. Записът от тип изпращач на карта се използва, когато локалната дестинация действа като изпращач на имейл. Локалната дестинация няма да бъде информирана за неуспешна доставка.", + "bcc_local_dest": "Локална дестинация", + "bcc_map": "Карта BCC", + "bcc_map_type": "Тип BCC", + "bcc_maps": "Карти BCC", + "bcc_rcpt_map": "Карта на получател", + "bcc_sender_map": "Карта на изпращач", + "bcc_to_rcpt": "Превключване към карта на получател", + "bcc_to_sender": "Превключване към карта на изпращач", + "bcc_type": "Тип BCC", + "booking_null": "Винаги показване като свободен", + "booking_0_short": "Винаги свободен", + "booking_custom": "Твърдо ограничение до определен брой резервации", + "booking_custom_short": "Твърдо ограничение", + "booking_ltnull": "Неограничено, но показване като заето, когато е резервирано", + "booking_lt0_short": "Меко ограничение", + "catch_all": "Catch-All", + "created_on": "Създаден на", + "daily": "Ежедневно", + "deactivate": "Деактивиране", + "description": "Описание", + "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", + "disable_x": "Деактивиране", + "dkim_domains_selector": "Селектор", + "dkim_key_length": "Дължина на DKIM ключа (битове)", + "domain": "Домейн", + "domain_admins": "Администратори на домейн", + "domain_aliases": "Псевдоними на домейн", + "domain_templates": "Шаблони за домейн", + "domain_quota": "Квота", + "domain_quota_total": "Обща квота на домейна", + "domains": "Домейни", + "edit": "Редактиране", + "empty": "Няма резултати", + "enable_x": "Активиране", + "excludes": "Изключване", + "filter_table": "Таблица с филтри", + "filters": "Филтри", + "fname": "Пълно име", + "force_pw_update": "Принудително обновяване на парола при следващия вход", + "gal": "Глобален адресен списък", + "goto_ham": "Учен като не е спам", + "goto_spam": "Учен като спам", + "hourly": "Часово", + "iam": "Доставчик на идентичност", + "in_use": "В употреба (%)", + "inactive": "Неактивен", + "insert_preset": "Вмъкване на примерен предефиниран набор \"%s\"", + "kind": "Вид", + "last_mail_login": "Последен вход в пощата", + "last_modified": "Последно модифициране", + "last_pw_change": "Последна промяна на парола", + "last_run": "Последно изпълнение", + "last_run_reset": "Задаване на следващо", + "mailbox": "Пощенска кутия", + "mailbox_defaults": "Настройки по подразбиране", + "mailbox_defaults_info": "Дефинирайте настройки по подразбиране за нови пощенски кутии.", + "mailbox_defquota": "Размер по подразбиране на пощенска кутия", + "mailbox_templates": "Шаблони за пощенска кутия", + "mailbox_quota": "Макс. размер на пощенска кутия", + "mailboxes": "Пощенски кутии", + "max_aliases": "Макс. псевдоними", + "max_mailboxes": "Макс. възможни пощенски кутии", + "max_quota": "Макс. квота за пощенска кутия", + "mins_interval": "Интервал (мин)", + "msg_num": "Съобщение №", + "multiple_bookings": "Множествени резервации", + "never": "Никога", + "no": "✕", + "no_record": "Няма запис за обект %s", + "no_record_single": "Няма запис", + "open_logs": "Отваряне на логове", + "owner": "Собственик", + "private_comment": "Частен коментар", + "public_comment": "Публичен коментар", + "q_add_header": "при преместване в папката за нежелана поща", + "q_all": " при преместване в папката за нежелана поща и при отхвърляне", + "q_reject": "при отхвърляне", + "quarantine_category": "Категория на уведомленията за карантина", + "quarantine_notification": "Уведомления за карантина", + "quick_actions": "Действия", + "recipient": "Получател", + "recipient_map": "Карта на получател", + "recipient_map_info": "Картите на получател се използват, за да се замени адресът на дестинация на съобщението, преди да бъде доставено.", + "recipient_map_new": "Нов получател", + "recipient_map_new_info": "Дестинацията на картата на получател трябва да бъде валиден имейл адрес или име на домейн.", + "recipient_map_old": "Оригинален получател", + "recipient_map_old_info": "Оригиналната дестинация на картата на получател трябва да бъде валиден имейл адрес или име на домейн.", + "recipient_maps": "Карти на получател", + "relay_all": "Реле на всички получатели", + "relay_unknown": "Реле на несъществуващи пощенски кутии", + "remove": "Премахване", + "resources": "Ресурси", + "running": "Изпълнява се", + "sender": "Изпращач", + "set_postfilter": "Маркиране като постфилтър", + "set_prefilter": "Маркиране като префилтър", + "sieve_info": "Можете да запазите множество филтри за всеки потребител, но само един префилтър и един постфилтър могат да бъдат активни едновременно.
\r\nВсеки филтър ще бъде обработен в описания ред. Нито един неуспешен скрипт, нито издадена команда \"keep;\" няма да спре обработката на следващите скриптове. Промените в глобалните филтри на sieve ще предизвикат рестартиране на Dovecot.

Глобален префилтър на sieve • Префилтър • Потребителски скриптове • Постфилтър • Глобален постфилтър на sieve", + "sieve_preset_1": "Изтриване на съобщения с потенциално опасни типове файлове", + "sieve_preset_2": "Винаги маркиране на имейла на определен изпращач като прочетен", + "sieve_preset_3": "Тихо изтриване, спиране на всякаква допълнителна обработка на sieve филтри", + "sieve_preset_4": "Архивиране на съобщението във ВХОДНА, пропускане на допълнителна обработка от sieve филтри", + "sieve_preset_5": "Автоотговор (ваканция)", + "sieve_preset_6": "Отхвърляне на съобщение с отговор", + "sieve_preset_7": "Пренасочване и запазване/изтриване", + "sieve_preset_8": "Пренасочване на имейл от определен изпращач, маркиране като прочетен и сортиране в подпапка", + "sieve_preset_header": "Моля, вижте примерните предефинирани набори по-долу. За повече детайли вижте Wikipedia.", + "sogo_visible": "Псевдонимът е видим в SOGo", + "sogo_visible_n": "Скриване на псевдоним в SOGo", + "sogo_visible_y": "Показване на псевдоним в SOGo", + "spam_aliases": "Времеви псевдоними", + "stats": "Статистика", + "status": "Статус", + "sync_jobs": "Синхронизиращи задачи", + "syncjob_check_log": "Проверка на лога", + "syncjob_last_run_result": "Резултат от последното изпълнение", + "syncjob_EX_OK": "Успех", + "syncjob_EXIT_CONNECTION_FAILURE": "Проблем с връзката", + "syncjob_EXIT_TLS_FAILURE": "Проблем с криптираната връзка", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Проблем с удостоверяването", + "syncjob_EXIT_OVERQUOTA": "Целевата пощенска кутия е над квотата", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Не може да се свърже с отдалечен сървър", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Грешно потребителско име или парола", + "table_size": "Размер на таблицата", + "table_size_show_n": "Показване на %s елемента", + "target_address": "Адрес за пренасочване", + "target_domain": "Целеви домейн", + "templates": "Шаблони", + "template": "Шаблон", + "tls_enforce_in": "Принудително използване на TLS за входящи", + "tls_enforce_out": "Принудително използване на TLS за изходящи", + "tls_map_dest": "Дестинация", + "tls_map_dest_info": "Примери: example.org, .example.org, [mail.example.org]:25", + "tls_map_parameters": "Параметри", + "tls_map_parameters_info": "Празно или параметри, например: protocols=!SSLv2 ciphers=medium exclude=3DES", + "tls_map_policy": "Политика", + "tls_policy_maps": "Пренареждания на политиката на TLS", + "tls_policy_maps_enforced_tls": "Тези политики ще пренареждат и поведението за потребители на пощенски кутии, които принудително използват изходящи TLS връзки. Ако няма политика, съществуваща по-долу, тези потребители ще приложат стойностите по подразбиране, зададени като smtp_tls_mandatory_protocols и smtp_tls_mandatory_ciphers.", + "tls_policy_maps_info": "Тази политика за пренареждане на TLS транспортни правила е независима от настройките за политика на TLS на потребителя.
\r\n Моля, вижте документацията за \"smtp_tls_policy_maps\" за повече информация.", + "tls_policy_maps_long": "Пренареждания на политиката на TLS за изходящи", + "toggle_all": "Превключване на всички", + "username": "Потребителско име", + "waiting": "Изчакване", + "weekly": "Седмично", + "yes": "✓" + }, + "oauth2": { + "access_denied": "Моля, влезте като собственик на пощенска кутия, за да удостоверите чрез OAuth2.", + "authorize_app": "Удостоверяване на приложение", + "deny": "Отказ", + "permit": "Удостоверяване на приложение", + "profile": "Профил", + "profile_desc": "Преглед на лични данни: потребителско име, пълно име, създадено, модифицирано, активно", + "scope_ask_permission": "Приложението заявява следните разрешения" + }, + "quarantine": { + "action": "Действие", + "atts": "Прикачени файлове", + "check_hash": "Търсене на файлов хеш в VirusTotal", + "confirm": "Потвърждаване", + "confirm_delete": "Потвърждаване на изтриването на този елемент.", + "danger": "Опасност", + "deliver_inbox": "Доставяне в пощенската кутия", + "disabled_by_config": "Текущата системна конфигурация деактивира функционалността на карантината. Моля, задайте \"задържания за пощенска кутия\" и \"максимален размер\" за елементите на карантината.", + "download_eml": "Изтегляне (.eml)", + "empty": "Няма резултати", + "high_danger": "Висока", + "info": "Информация", + "junk_folder": "Папка за нежелана поща", + "learn_spam_delete": "Учен като спам и изтриване", + "low_danger": "Ниска", + "medium_danger": "Средна", + "neutral_danger": "Неутрална", + "notified": "Уведомен", + "qhandler_success": "Заявката е изпратена успешно до системата. Можете да затворите прозореца сега.", + "qid": "QID на Rspamd", + "qinfo": "Системата за карантина ще запази отхвърлените съобщения в базата данни (изпращачът няма да бъде информиран за доставеното съобщение) както и съобщенията, доставени като копие в папката за нежелана поща на пощенска кутия.

\"Учен като спам и изтриване\" ще научи съобщението като спам чрез теоремата на Бейс и също ще изчисли размити хешове, за да отхвърли подобни съобщения в бъдеще.

Моля, имайте предвид, че обучаването на множество съобщения може да бъде - в зависимост от вашата система - времеемко.
Елементите в черния списък са изключени от карантината.", + "qitem": "Елемент в карантина", + "quarantine": "Карантина", + "quick_actions": "Действия", + "quick_delete_link": "Отваряне на бърз линк за изтриване", + "quick_info_link": "Отваряне на бърз информационен линк", + "quick_release_link": "Отваряне на бърз линк за освобождане", + "rcpt": "Получател", + "received": "Получено", + "recipients": "Получатели", + "refresh": "Опресняване", + "rejected": "Отхвърлено", + "release": "Освобождане", + "release_body": "Прикаченото съобщение е добавено към това съобщение.", + "release_subject": "Потенциално вреден елемент в карантина %s", + "remove": "Премахване", + "rewrite_subject": "Презаписване на темата", + "rspamd_result": "Резултат от Rspamd", + "sender": "Изпращач (SMTP)", + "sender_header": "Изпращач (\"From\" заглавие)", + "settings_info": "Максимален брой елементи за карантиниране: %s
Максимален размер на имейл: %s MiB", + "show_item": "Показване на елемент", + "spam": "Спам", + "spam_score": "Резултат", + "subj": "Тема", + "table_size": "Размер на таблицата", + "table_size_show_n": "Показване на %s елемента", + "text_from_html_content": "Съдържание (конвертиран HTML)", + "text_plain_content": "Съдържание (обикновен текст)", + "toggle_all": "Превключване на всички", + "type": "Тип" + }, + "queue": { + "delete": "Изтриване на всички", + "flush": "Изчистване на опашката", + "info": "Опашката на имейлите съдържа всички имейли, които чакат за доставка. Ако имейлът е засечен в опашката за дълго време, той автоматично се изтрива от системата.
Съобщението за грешка на съответния имейл дава информация защо имейлът не може да бъде доставен.", + "legend": "Функции на действията в опашката на имейлите:", + "ays": "Моля, потвърдете, че искате да изтриете всички елементи от текущата опашка.", + "deliver_mail": "Доставяне", + "deliver_mail_legend": "Опит за повторно доставяне на избраните съобщения.", + "hold_mail": "Задържане", + "hold_mail_legend": "Задържа избраните съобщения. (Предотвратява допълнителни опити за доставяне)", + "queue_manager": "Мениджър на опашката", + "show_message": "Показване на съобщение", + "unban": "разблокиране на опашката", + "unhold_mail": "Освобождаване", + "unhold_mail_legend": "Освобождава избраните съобщения за доставка. (Изисква предварително задържане)" + }, + "ratelimit": { + "disabled": "Деактивирано", + "second": "съобщения/секунда", + "minute": "съобщения/минута", + "hour": "съобщения/час", + "day": "съобщения/ден" + }, + "start": { + "help": "Показване/Скриване на панела за помощ", + "imap_smtp_server_auth_info": "Моля, използвайте пълния си имейл адрес и механизма за удостоверяване PLAIN.
\r\nВашите данни за вход ще бъдат криптирани от сървърната страна чрез задължително сървърно криптиране." + }, + "success": { + "acl_saved": "ACL за обект %s е запазен", + "admin_added": "Администраторът %s е добавен", + "admin_api_modified": "Промените в API са запазени", + "admin_modified": "Промените в администратора са запазени", + "admin_removed": "Администраторът %s е премахнат", + "alias_added": "Адресът на псевдонима %s (%d) е добавен", + "alias_domain_removed": "Домейнът на псевдонима %s е премахнат", + "alias_modified": "Промените в адреса на псевдонима %s са запазени", + "alias_removed": "Псевдонимът %s е премахнат", + "aliasd_added": "Добавен домейн на псевдоним %s", + "aliasd_modified": "Промените в домейна на псевдоним %s са запазени", + "app_links": "Запазени промени в линковете на приложенията", + "app_passwd_added": "Добавена нова парола за приложение", + "app_passwd_removed": "Премахната парола за приложение с ID %s", + "bcc_deleted": "Записи в картата BCC са изтрити: %s", + "bcc_edited": "Записът в картата BCC %s е редактиран", + "bcc_saved": "Записът в картата BCC е запазен", + "cors_headers_edited": "Настройките на CORS са запазени", + "db_init_complete": "Инициализацията на базата данни е завършена", + "delete_filter": "Изтрити филтри с ID %s", + "delete_filters": "Изтрити филтри: %s", + "deleted_syncjob": "Изтрита синхронизираща задача с ID %s", + "deleted_syncjobs": "Изтрити синхронизиращи задачи: %s", + "dkim_added": "Добавен DKIM ключ %s", + "dkim_duplicated": "DKIM ключът за домейн %s е копиран в %s", + "dkim_removed": "DKIM ключът %s е премахнат", + "domain_add_dkim_available": "DKIM ключът вече съществува", + "domain_added": "Добавен домейн %s", + "domain_admin_added": "Добавен администратор на домейн %s", + "domain_admin_modified": "Промените в администратора на домейн %s са запазени", + "domain_admin_removed": "Администраторът на домейн %s е премахнат", + "domain_footer_modified": "Промените в подвала на домейн %s са запазени", + "domain_modified": "Промените в домейн %s са запазени", + "domain_removed": "Домейнът %s е премахнат", + "dovecot_restart_success": "Dovecot е рестартиран успешно", + "eas_reset": "Устройствата с ActiveSync за потребителя %s са нулирани", + "f2b_banlist_refreshed": "Списъкът с ID на блокираните е актуализиран успешно.", + "f2b_modified": "Промените в параметрите на Fail2ban са запазени", + "forwarding_host_added": "Добавен хост за препращане %s", + "forwarding_host_removed": "Премахнат хост за препращане %s", + "global_filter_written": "Филтърът е записан успешно във файл", + "hash_deleted": "Хешът е изтрит", + "iam_test_connection": "Връзката е успешна", + "ip_check_opt_in_modified": "Проверката на IP беше успешно запазена", + "item_deleted": "Елементът %s е изтрит успешно", + "item_released": "Елементът %s е освободен", + "items_deleted": "Елементът %s е изтрит успешно", + "items_released": "Избраните елементи са освободени", + "learned_ham": "Успешно научен ID %s като не е спам", + "license_modified": "Промените в лиценза са запазени", + "logged_in_as": "Вписан като %s", + "mailbox_added": "Пощенската кутия %s е добавена", + "mailbox_modified": "Промените в пощенската кутия %s са запазени", + "mailbox_removed": "Пощенската кутия %s е премахната", + "mailbox_renamed": "Пощенската кутия е преименувана от %s на %s", + "nginx_reloaded": "Nginx е презареден", + "object_modified": "Промените в обект %s са запазени", + "password_changed_success": "Паролата е променена успешно", + "password_policy_saved": "Политиката за парола е запазена успешно", + "pushover_settings_edited": "Настройките на Pushover са запазени успешно, моля, проверете удостоверенията.", + "qlearn_spam": "Съобщението с ID %s е научено като спам и изтрито", + "queue_command_success": "Командата на опашката е завършена успешно", + "recipient_map_entry_deleted": "Записът в картата на получател с ID %s е изтрит", + "recipient_map_entry_saved": "Записът в картата на получател \"%s\" е запазен", + "recovery_email_sent": "Изпратен имейл за възстановяване до %s", + "relayhost_added": "Записът в картата %s е добавен", + "relayhost_removed": "Записът в картата %s е премахнат", + "reset_main_logo": "Нулиране на логото по подразбиране", + "resource_added": "Ресурсът %s е добавен", + "resource_modified": "Промените в пощенската кутия %s са запазени", + "resource_removed": "Ресурсът %s е премахнат", + "rl_saved": "Ограничението на скоростта за обект %s е запазено", + "rspamd_ui_pw_set": "Паролата на UI на Rspamd е зададена успешно", + "saved_settings": "Запазени настройки", + "settings_map_added": "Добавен запис в картата с настройки", + "settings_map_removed": "Премахнат запис в картата с настройки с ID %s", + "sogo_profile_reset": "Профилът на SOGo за потребителя %s е нулиран", + "template_added": "Добавен шаблон %s", + "template_modified": "Промените в шаблон %s са запазени", + "template_removed": "Шаблонът с ID %s е премахнат", + "tls_policy_map_entry_deleted": "Записът в картата на политиката на TLS с ID %s е изтрит", + "tls_policy_map_entry_saved": "Записът в картата на политиката на TLS \"%s\" е запазен", + "ui_texts": "Запазени промени в текстовете на UI", + "upload_success": "Файлът е качен успешно", + "verified_fido2_login": "Потвърдено вход с FIDO2", + "verified_totp_login": "Потвърдено вход с TOTP", + "verified_webauthn_login": "Потвърдено вход с WebAuthn", + "verified_yotp_login": "Потвърдено вход с Yubico OTP" + }, + "tfa": { + "authenticators": "Аутентикатори", + "api_register": "%s използва облачното API на Yubico. Моля, вземете API ключ за вашия ключ тук", + "confirm": "Потвърждаване", + "confirm_totp_token": "Моля, потвърдете промените, като въведете генерирания токен", + "delete_tfa": "Деактивиране на TFA", + "disable_tfa": "Деактивиране на TFA до следващия успешен вход", + "enter_qr_code": "Вашият TOTP код, ако вашето устройство не може да сканира QR кодове", + "error_code": "Код на грешка", + "init_webauthn": "Инициализиране, моля, изчакайте...", + "key_id": "Идентификатор за вашето устройство", + "key_id_totp": "Идентификатор за вашия ключ", + "none": "Деактивиране", + "reload_retry": "- (презаредете браузъра, ако грешката продължи)", + "scan_qr_code": "Моля, сканирайте следния код с вашето приложение за аутентикация или въведете кода ръчно.", + "select": "Моля, изберете", + "set_tfa": "Задаване на метод за двуфакторно удостоверяване", + "start_webauthn_validation": "Стартиране на проверка", + "tfa": "Двуфакторно удостоверяване", + "tfa_token_invalid": "Невалиден токен за TFA", + "totp": "Временен OTP (Google Authenticator, Authy и др.)", + "u2f_deprecated": "Изглежда, че вашият ключ е регистриран с депрекирания метод U2F. Ще деактивираме двуфакторното удостоверяване за вас и ще изтрием вашия ключ.", + "u2f_deprecated_important": "Моля, регистрирайте вашия ключ в административния панел с новия метод WebAuthn.", + "webauthn": "Удостоверяване с WebAuthn", + "waiting_usb_auth": "Изчакване на USB устройство...

Моля, докоснете бутона на вашето USB устройство сега.", + "waiting_usb_register": "Изчакване на USB устройство...

Моля, въведете паролата си по-горе и потвърдете регистрацията си, като докоснете бутона на вашето USB устройство.", + "yubi_otp": "Удостоверяване с Yubico OTP" + }, + "user": { + "action": "Действие", + "active": "Активен", + "active_sieve": "Активен филтър", + "advanced_settings": "Разширени настройки", + "alias": "Псевдоним", + "alias_create_random": "Генериране на случаен псевдоним", + "alias_extend_all": "Удължаване на всички псевдоними с 1 час", + "alias_full_date": "d.m.Y, H:i:s T", + "alias_remove_all": "Премахване на всички псевдоними", + "alias_select_validity": "Период на валидност", + "alias_time_left": "Оставащо време", + "alias_valid_until": "Валиден до", + "aliases_also_send_as": "Разрешено да изпраща и като потребител", + "aliases_send_as_all": "Не проверявай достъпа на изпращач за следните домейни и техните псевдоними", + "allowed_protocols": "Разрешени протоколи", + "app_hint": "Паролите за приложения са алтернативни пароли за вашия IMAP, SMTP, CalDAV, CardDAV и EAS вход. Потребителското име остава непроменено. SOGo уеб пощата не е достъпна чрез пароли за приложения.", + "app_name": "Име на приложението", + "app_passwds": "Пароли за приложения", + "apple_connection_profile": "Профил за връзка на Apple", + "apple_connection_profile_complete": "Този профил за връзка включва настройки за IMAP и SMTP, както и пътища за CalDAV (календари) и CardDAV (контакти) за устройство на Apple.", + "apple_connection_profile_mailonly": "Този профил за връзка включва настройки за IMAP и SMTP за устройство на Apple.", + "apple_connection_profile_with_app_password": "Генерирана е нова парола за приложение и е добавена към профила, така че не е необходимо да се въвежда парола при настройката на вашето устройство. Моля, не споделяйте файла, тъй като той предоставя пълен достъп до вашата пощенска кутия.", + "attribute": "Атрибут", + "authentication": "Удостоверяване", + "change_password": "Промяна на парола", + "change_password_hint_app_passwords": "Вашият акаунт има %d пароли за приложения, които няма да бъдат променени. За управление на тях, отидете в раздела \"Пароли за приложения\".", + "clear_recent_successful_connections": "Изчистване на видимите успешни връзки", + "client_configuration": "Показване на ръководства за настройка на пощенски клиенти и смартфони", + "create_app_passwd": "Създаване на парола за приложение", + "create_syncjob": "Създаване на нова синхронизираща задача", + "created_on": "Създаден на", + "daily": "Ежедневно", + "day": "ден", + "delete_ays": "Моля, потвърдете процеса на изтриване.", + "description": "Описание", + "direct_aliases": "Директни адреси на псевдоними", + "direct_aliases_desc": "Директните адреси на псевдоними се засягат от настройките за филтър за спам и политика за TLS.", + "direct_protocol_access": "Този потребител на пощенска кутия има директен, външен достъп до следните протоколи и приложения. Тази настройка се контролира от вашия администратор. Паролите за приложения могат да бъдат създадени, за да се предостави достъп до отделни протоколи и приложения.
Бутонът \"Уеб поща\" предоставя еднократно удостоверяване към SOGo и винаги е достъпен.", + "eas_reset": "Нулиране на кеша на устройствата с ActiveSync", + "eas_reset_help": "В много случаи нулирането на кеша на устройството ще помогне за възстановяването на повреден профил на ActiveSync.
Внимание: Всички елементи ще бъдат презаредени!", + "eas_reset_now": "Нулиране сега", + "edit": "Редактиране", + "email": "Имейл", + "email_and_dav": "Имейл, календари и контакти", + "empty": "Няма резултати", + "encryption": "Криптиране", + "excludes": "Изключване", + "expire_in": "Изтича след", + "fido2_webauthn": "FIDO2/WebAuthn", + "force_pw_update": "Трябва да зададете нова парола, за да имате достъп до груповите услуги.", + "from": "от", + "generate": "генериране", + "hour": "час", + "hourly": "Часово", + "hours": "часа", + "in_use": "В употреба", + "interval": "Интервал", + "is_catch_all": "Catch-all за домейн/и", + "last_mail_login": "Последен вход в пощата", + "last_pw_change": "Последна промяна на парола", + "last_run": "Последно изпълнение", + "last_ui_login": "Последен вход в UI", + "loading": "Зареждане...", + "login_history": "История на входовете", + "mailbox": "Пощенска кутия", + "mailbox_details": "Детайли", + "mailbox_general": "Общи", + "mailbox_settings": "Настройки", + "messages": "съобщения", + "month": "месец", + "months": "месеца", + "never": "Никога", + "new_password": "Нова парола", + "new_password_repeat": "Потвърждаване на новата парола", + "no_active_filter": "Няма активен филтър", + "no_last_login": "Няма информация за последен вход в UI", + "no_record": "Няма запис", + "open_logs": "Отваряне на логове", + "open_webmail_sso": "Уеб поща", + "overview": "Преглед", + "password": "Парола", + "password_now": "Текуща парола (потвърждаване на промените)", + "password_repeat": "Парола (повторете)", + "password_reset_info": "Ако не е зададен имейл за възстановяване на парола, тази функция не може да бъде използвана.", + "protocols": "Протоколи", + "pushover_evaluate_x_prio": "Ескалиране на високоприоритетни съобщения [X-Priority: 1]", + "pushover_info": "Настройките за известия на Pushover ще се прилагат за всички чисти (не-спам) съобщения, доставени до %s, включително псевдоними (споделени, несподелени, таговани).", + "pushover_only_x_prio": "Разглеждане само на високоприоритетни съобщения [X-Priority: 1]", + "pushover_sender_array": "Разглеждане на следните адреси на изпращач (разделени с запетая)", + "pushover_sender_regex": "Съвпадение на изпращач с следния regex", + "pushover_sound": "Звук", + "pushover_text": "Текст на известието", + "pushover_title": "Заглавие на известието", + "pushover_vars": "Когато не е зададен филтър на изпращач, всички съобщения ще бъдат разглеждани.
Филтрите с регулярен израз, както и точните проверки на изпращач, могат да бъдат дефинирани индивидуално и ще бъдат разглеждани последователно. Те не зависят един от друг.
Използвайте следните променливи за текст и заглавие (моля, вземете предвид политиките за поверителност на данните)", + "pushover_verify": "Проверка на удостоверения", + "pw_recovery_email": "Имейл за възстановяване на парола", + "q_add_header": "Папка за нежелана поща", + "q_all": "Всички категории", + "q_reject": "Отхвърлени", + "quarantine_category": "Категория на уведомленията за карантина", + "quarantine_category_info": "Категорията \"Отхвърлени\" включва съобщения, които са били отхвърлени, докато категорията \"Папка за нежелана поща\" ще уведоми потребителя за съобщения, които са били поставени в папката за нежелана поща.", + "quarantine_notification": "Уведомления за карантина", + "quarantine_notification_info": "След като уведомлението е изпратено, елементите ще бъдат маркирани като \"уведомени\" и няма да бъдат изпращани допълнителни уведомления за този конкретен елемент.", + "recent_successful_connections": "Видими успешни връзки", + "remove": "Премахване", + "running": "Изпълнява се", + "save": "Запазване на промените", + "save_changes": "Запазване на промените", + "sender_acl_disabled": "Проверката на изпращач е деактивирана", + "shared_aliases": "Споделени адреси на псевдоними", + "shared_aliases_desc": "Споделените псевдоними не се засягат от настройките за филтър за спам и политика за TLS на потребителя. Съответните настройки за спам филтър могат да бъдат направени само от администратор като настройка за домейн.", + "show_sieve_filters": "Показване на активния потребителски филтър на sieve", + "sogo_profile_reset": "Нулиране на профила на SOGo", + "sogo_profile_reset_help": "Това ще унищожи профила на SOGo и ще изтрие всички данни за контакти и календар безвъзвратно.", + "sogo_profile_reset_now": "Нулиране сега", + "spam_aliases": "Временни адреси на псевдоними", + "spam_score_reset": "Нулиране до настройките на сървъра по подразбиране", + "spamfilter": "Филтър за спам", + "spamfilter_behavior": "Рейтинг", + "spamfilter_bl": "Черен списък", + "spamfilter_bl_desc": "Адресите в черния списък винаги ще бъдат класифицирани като спам и отхвърлени. Отхвърлените съобщения не ще бъдат копирани в карантина. Поддържат се уайлдкардове.
Отхвърлените съобщения няма да бъдат доставени до папката за нежелана поща.", + "spamfilter_default_score": "Стойности по подразбиране", + "spamfilter_green": "Зелено: това съобщение не е спам", + "spamfilter_hint": "Първата стойност описва \"нисък резултат за спам\", втората представлява \"висок резултат за спам\".", + "spamfilter_red": "Червено: това съобщение е спам и ще бъде отхвърлено от сървъра", + "spamfilter_table_action": "Действие", + "spamfilter_table_add": "Добавяне на елемент", + "spamfilter_table_domain_policy": "политика на домейна", + "spamfilter_table_empty": "Няма данни за показване", + "spamfilter_table_remove": "премахване", + "spamfilter_table_rule": "Правило", + "spamfilter_wl": "Бял списък", + "spamfilter_wl_desc": "Адресите в белия списък никога ще бъдат класифицирани като спам. Поддържат се уайлдкардове.
Съобщенията, които не са класифицирани като спам, ще бъдат доставени в папката за нежелана поща, ако резултатът за спам е над стойността за висок резултат за спам.", + "spamfilter_yellow": "Жълто: това съобщение може да е спам, ще бъде маркирано като спам и преместено в папката за нежелана поща", + "status": "Статус", + "sync_jobs": "Синхронизиращи задачи", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Проблем с удостоверяването", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Грешно потребителско име или парола", + "syncjob_EXIT_CONNECTION_FAILURE": "Проблем с връзката", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Не може да се свърже с отдалечен сървър", + "syncjob_EXIT_OVERQUOTA": "Целевата пощенска кутия е над квотата", + "syncjob_EXIT_TLS_FAILURE": "Проблем с криптираната връзка", + "syncjob_EX_OK": "Успех", + "syncjob_check_log": "Проверка на лога", + "syncjob_last_run_result": "Резултат от последното изпълнение", + "tag_handling": "Настройка за тагове", + "tag_help_example": "Пример за тагован имейл адрес: me+Facebook@example.org", + "tag_help_explain": "В подпапка: ще бъде създадена нова подпапка под INBOX (\"INBOX/Facebook\").
\r\nВ тема: първото име на тага ще бъде добавено към темата на съобщението, например: \"[Facebook] Моите новини\".", + "tag_in_none": "Не прави нищо", + "tag_in_subfolder": "В подпапка", + "tag_in_subject": "В тема", + "text": "Текст", + "tfa_info": "Двуфакторното удостоверяване помага за защита на вашия акаунт. Ако го активирате, ще ви трябват пароли за приложения, за да влезете в приложения или услуги, които не поддържат двуфакторно удостоверяване (напр. пощенски клиенти).", + "title": "Заглавие", + "tls_enforce_in": "Принудително използване на TLS за входящи", + "tls_enforce_out": "Принудително използване на TLS за изходящи", + "tls_policy": "Политика за криптиране", + "tls_policy_warning": "Внимание: Ако решите да принудите преноса на криптирани съобщения, може да загубите съобщения.
Съобщенията, които не удовлетворяват политиката, ще бъдат върнати с твърдо отхвърляне от системата за поща.
Тази опция засяга вашия основен адрес на пощенска кутия (логин име), всички адреси, произтичащи от домейни на псевдоними, както и адреси на псевдоними, с единствена целева пощенска кутия.", + "user_settings": "Настройки на потребителя", + "username": "Потребителско име", + "value": "Стойност", + "verify": "Проверка", + "waiting": "Изчакване", + "week": "седмица", + "weekly": "Weekly", + "weeks": "седмици", + "with_app_password": "с парола за приложение", + "year": "година", + "years": "години" + }, + "warning": { + "cannot_delete_self": "Не може да изтриете влезлия потребител", + "domain_added_sogo_failed": "Добавен домейн, но неуспешно рестартиране на SOGo, моля, проверете системните логове.", + "dovecot_restart_failed": "Dovecot не успя да рестартира, моля, проверете логовете", + "fuzzy_learn_error": "Грешка при обучение на размит хеш: %s", + "hash_not_found": "Хешът не е намерен или вече е изтрит", + "ip_invalid": "Пропуснат невалиден IP: %s", + "is_not_primary_alias": "Пропуснат неосновен псевдоним %s", + "no_active_admin": "Не може да деактивирате последния активен администратор", + "quota_exceeded_scope": "Квотата на домейна е надвишена: Само неограничени пощенски кутии могат да бъдат създадени в този домейн.", + "session_token": "Невалиден формулярен токен: Несъответствие на токена.", + "session_ua": "Невалиден формулярен токен: Грешка при проверка на User-Agent." } - }, - "debug": { - "architecture": "Архитектура", - "chart_this_server": "Графика (този сървър)", - "containers_info": "Информация за контейнерите", - "container_running": "Изпълнява се", - "container_disabled": "Контейнерът е спрян или деактивиран", - "container_stopped": "Спрян", - "cores": "Ядра", - "current_time": "Системно време", - "disk_usage": "Използване на диска", - "docs": "Документи", - "error_show_ip": "Не може да се разреши публичния IP адрес", - "external_logs": "Външни логове", - "history_all_servers": "История (всички сървъри)", - "in_memory_logs": "Логове в паметта", - "last_modified": "Последно модифициране", - "log_info": "

Логовете на mailcow в паметта се събират в списъци на Redis и се подрязват до LOG_LINES (%d) на всяка минута, за да се намали натоварването.
Логовете в паметта не са предназначени да бъдат постоянни. Всички приложения, които записват в паметта, също записват в демона на Docker и следователно в основния драйвер за логсване.
Логовете в паметта трябва да се използват за отстраняване на леки проблеми с контейнери.

\r\n

Външните логове се събират чрез API на даденото приложение.

\r\n

Статичните логове са най-вече логове на активност, които не се записват в демона на Docker, но все още трябва да бъдат постоянни (с изключение на логовете на API).

", - "login_time": "Време", - "logs": "Логове", - "memory": "Памет", - "online_users": "Потребители онлайн", - "restart_container": "Рестартиране", - "service": "Услуга", - "show_ip": "Показване на публичен IP", - "size": "Размер", - "started_at": "Стартирано в", - "started_on": "Стартирано на", - "static_logs": "Статични логове", - "success": "Успех", - "system_containers": "Система & Контейнери", - "timezone": "Часова зона", - "uptime": "Време на работа", - "update_available": "Има налична актуализация", - "no_update_available": "Системата е на последното издание", - "update_failed": "Не може да се провери за актуализация", - "username": "Потребителско име", - "wip": "В момента се работи" - }, - "diagnostics": { - "cname_from_a": "Стойността е извлечена от A/AAAA запис. Това се поддържа, докато записът сочи към правилния ресурс.", - "dns_records": "DNS записи", - "dns_records_24hours": "Моля, имайте предвид, че промените в DNS може да отнемат до 24 часа, за да имат актуалното си състояние правилно отразено на тази страница. Тя е предназначена да ви позволи лесно да видите как да конфигурирате вашите DNS записи и да проверите дали всичките ви записи са правилно запазени в DNS.", - "dns_records_data": "Правилни данни", - "dns_records_docs": "Моля, вижте и документацията.", - "dns_records_name": "Име", - "dns_records_status": "Текущо състояние", - "dns_records_type": "Тип", - "optional": "Този запис е опционален." - }, - "edit": { - "acl": "ACL (Разрешение)", - "active": "Активен", - "admin": "Редактиране на администратор", - "advanced_settings": "Разширени настройки", - "alias": "Редактиране на псевдоним", - "allow_from_smtp": "Разрешаване само на тези IP адреси да използват SMTP", - "allow_from_smtp_info": "Оставете празно, за да разрешите всички изпращачи.
IPv4/IPv6 адреси и мрежи.", - "allowed_protocols": "Разрешени протоколи за пряк потребителски достъп (не засяга протоколите за пароли на приложения)", - "app_name": "Име на приложението", - "app_passwd": "Парола за приложение", - "app_passwd_protocols": "Разрешени протоколи за паролата на приложението", - "automap": "Опит за автоматично картографиране на папки (\"Изпратени\", \"Изпратени\" => \"Изпратени\" и т.н.)", - "backup_mx_options": "Опции за реле", - "bcc_dest_format": "BCC дестинацията трябва да бъде един валиден имейл адрес.
Ако имате нужда да изпратите копие до множество адреси, създайте псевдоним и го използвайте тук.", - "client_id": "Идентификатор на клиента", - "client_secret": "Тайна на клиента", - "comment_info": "Частен коментар не е видим за потребителя, докато публичен коментар се показва като подсказка при преминаване с мишката върху него в прегледа на потребителя", - "created_on": "Създаден на", - "custom_attributes": "Персонализирани атрибути", - "delete1": "Изтриване от източника след завършване", - "delete2": "Изтриване на съобщенията в дестинацията, които не са в източника", - "delete2duplicates": "Изтриване на дубликати в дестинацията", - "delete_ays": "Моля, потвърдете процеса на изтриване.", - "description": "Описание", - "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", - "domain": "Редактиране на домейн", - "domain_admin": "Редактиране на администратор на домейн", - "domain_footer": "Подвал за домейн", - "domain_footer_html": "HTML подвал", - "domain_footer_info": "Подвалите за домейн се добавят към всички изходящи имейли, свързани с адрес в този домейн. Следните променливи могат да бъдат използвани за подвала:", - "domain_footer_info_vars": { - "auth_user": "{= auth_user =} - Удостоверен потребител, посочен от MTA", - "from_user": "{= from_user =} - Потребителска част на обвивката, напр. за \"moo@mailcow.tld\" връща \"moo\"", - "from_name": "{= from_name =} - Име на обвивката, напр. за \"Mailcow <moo@mailcow.tld>\" връща \"Mailcow\"", - "from_addr": "{= from_addr =} - Адресна част на обвивката", - "from_domain": "{= from_domain =} - Домейна част на обвивката", - "custom": "{= foo =} - Ако пощенската кутия има персонализиран атрибут \"foo\" със стойност \"bar\", ще върне \"bar\"" - }, - "domain_footer_plain": "PLAIN подвал", - "domain_footer_skip_replies": "Игнориране на подвал в отговорни имейли", - "domain_quota": "Квота на домейна", - "domains": "Домейни", - "dont_check_sender_acl": "Деактивиране на проверката на изпращач за домейн %s (+ домейни на псевдоними)", - "edit_alias_domain": "Редактиране на домейн на псевдоним", - "encryption": "Криптиране", - "exclude": "Изключване на обекти (regex)", - "extended_sender_acl": "Външни адреси на изпращач", - "extended_sender_acl_info": "Трябва да бъде импортиран DKIM домейн ключ, ако е наличен.
\r\n Помнете да добавите този сървър към съответния SPF TXT запис.
\r\n Когато домейн или домейн на псевдоним бъде добавен към този сървър, който се припокрива с външен адрес, външният адрес ще бъде премахнат.
\r\n Използвайте @domain.tld, за да разрешите изпращане като *@domain.tld.", - "footer_exclude": "Изключване от подвал", - "force_pw_update": "Принудително обновяване на парола при следващия вход", - "force_pw_update_info": "Този потребител ще може да влезе само в %s. Паролите за приложения остават използваеми.", - "full_name": "Пълно име", - "gal": "Глобален адресен списък", - "gal_info": "Глобалният адресен списък съдържа всички обекти на домейна и не може да бъде редактиран от нито един потребител. Липсва информация за заетост/свободно време в SOGo, ако е деактивирано! Рестартирайте SOGo, за да приложите промените.", - "generate": "генериране", - "grant_types": "Типове разрешения", - "hostname": "Име на хост", - "inactive": "Неактивен", - "kind": "Вид", - "last_modified": "Последно модифициране", - "lookup_mx": "Дестинацията е регулярен израз за съвпадение с MX име (.*\\.google\\.com за пренасочване на всички съобщения, предназначени за MX, завършващ на google.com, през този хоп)", - "mailbox": "Редактиране на пощенска кутия", - "mailbox_quota_def": "Квота по подразбиране за пощенска кутия", - "mailbox_relayhost_info": "Прилага се за пощенската кутия и директните псевдоними само, пренарежда запис в картата на транспорта за домейн.", - "mailbox_rename": "Преименуване на пощенска кутия", - "mailbox_rename_agree": "Създадох резервно копие.", - "mailbox_rename_alias": "Автоматично създаване на псевдоним", - "mailbox_rename_title": "Ново локално име на пощенска кутия", - "mailbox_rename_warning": "ВНИМАНИЕ! Създайте резервно копие преди преименуване на пощенската кутия.", - "max_aliases": "Макс. псевдоними", - "max_mailboxes": "Макс. възможни пощенски кутии", - "max_quota": "Макс. квота за пощенска кутия (MiB)", - "maxage": "Максимална възраст на съобщенията в дни, които ще бъдат проверени от отдалечен
(0 = игнорирай възраст)", - "maxbytespersecond": "Макс. байтове за секунда
(0 = неограничен)", - "mbox_rl_info": "Това ограничение на скоростта се прилага върху SASL името за вход, то съвпада с всеки \"от\" адрес, използван от влезлия потребител. Ограничението на скоростта на пощенска кутия пренарежда ограничението на скоростта за домейн.", - "mins_interval": "Интервал (мин)", - "multiple_bookings": "Множествени резервации", - "nexthop": "Следващ хоп", - "none_inherit": "Без / Наследяване", - "password": "Парола", - "password_recovery_email": "Имейл за възстановяване на парола", - "password_repeat": "Потвърждаване на паролата (повторете)", - "previous": "Предишна страница", - "private_comment": "Частен коментар", - "public_comment": "Публичен коментар", - "pushover": "Pushover", - "pushover_evaluate_x_prio": "Ескалиране на високоприоритетни съобщения [X-Priority: 1]", - "pushover_info": "Настройките за известия на Pushover ще се прилагат за всички чисти (не-спам) съобщения, доставени до %s, включително псевдоними (споделени, несподелени, таговани).", - "pushover_only_x_prio": "Разглеждане само на високоприоритетни съобщения [X-Priority: 1]", - "pushover_sender_array": "Разглеждане само на следните адреси на изпращач (разделени с запетая)", - "pushover_sender_regex": "Разглеждане на следния regex на изпращач", - "pushover_sound": "Звук", - "pushover_text": "Текст на известието", - "pushover_title": "Заглавие на известието", - "pushover_vars": "Когато не е зададен филтър на изпращач, всички съобщения ще бъдат разглеждани.
Филтрите с регулярен израз, както и точните проверки на изпращач, могат да бъдат дефинирани индивидуално и ще бъдат разглеждани последователно. Те не зависят един от друг.
Използвайте следните променливи за текст и заглавие (моля, вземете предвид политиките за поверителност на данните)", - "pushover_verify": "Проверка на удостоверения", - "quota_mb": "Квота (MiB)", - "quota_warning_bcc": "Предупреждения за квота ще бъдат изпращани като отделни копия до следните получатели:", - "quota_warning_bcc_info": "Съобщенията ще бъдат изпратени с тема, допълнена с името на потребителя в скоби, например: Предупреждение за квота (user@example.com).", - "ratelimit": "Ограничение на скоростта", - "redirect_uri": "URI за пренасочване/обратно извикване", - "relay_all": "Реле на всички получатели", - "relay_all_info": "↪ Ако изберете да не релеирате всички получатели, ще трябва да добавите (\"скрита\") пощенска кутия за всеки отделен получател, който трябва да бъде релеиран.", - "relay_domain": "Реле на този домейн", - "relay_transport_info": "
Инфо
Можете да дефинирате транспортни карти за персонализирана дестинация за този домейн. Ако не е зададено, ще бъде направен MX lookup.", - "relay_unknown_only": "Реле на несъществуващи пощенски кутии. Съществуващите пощенски кутии ще бъдат доставени локално.", - "relayhost": "Транспорти, зависими от изпращач", - "remove": "Премахване", - "resource": "Ресурс", - "save": "Запазване на промените", - "scope": "Обхват", - "sender_acl": "Разрешаване на изпращане като", - "sender_acl_disabled": "Проверката на изпращач е деактивирана", - "sender_acl_info": "Ако потребителят на пощенска кутия A е разрешен да изпраща като потребителя на пощенска кутия B, адресът на изпращач не се показва автоматично като избираем \"от\" поле в SOGo.
\r\n Потребителят на пощенска кутия B трябва да създаде делегация в SOGo, за да разреши на потребителя на пощенска кутия A да избира техния адрес като изпращач. За да делегирате пощенска кутия в SOGo, използвайте менюто (три точки) вдясно от името на пощенската кутия в горния ляв ъгъл, докато сте в режим на поща. Това поведение не се прилага за адреси на псевдоними.", - "sieve_desc": "Кратко описание", - "sieve_type": "Тип на филтър", - "skipcrossduplicates": "Пропускане на дублирани съобщения между папки (първи дошъл, първи обслужен)", - "sogo_access": "Директно препращане към SOGo", - "sogo_access_info": "След влизане, потребителят се пренасочва автоматично към SOGo.", - "sogo_visible": "Псевдонимът е видим в SOGo", - "sogo_visible_info": "Тази опция засяга само обекти, които могат да бъдат показани в SOGo (споделени или несподелени адреси на псевдоними, сочещи поне една локална пощенска кутия). Ако е скрит, псевдонимът няма да се появи като избираем адрес на изпращач в SOGo.", - "spam_alias": "Създаване или промяна на временни псевдоними", - "spam_filter": "Филтър за спам", - "spam_policy": "Добавяне или премахване на елементи към черния/бял списък", - "spam_score": "Задаване на персонализиран резултат за спам", - "subfolder2": "Синхронизиране в подпапка в дестинацията
(празно = не използвай подпапка)", - "syncjob": "Редактиране на синхронизираща задача", - "target_address": "Адрес/и за пренасочване (разделени с запетая)", - "target_domain": "Целеви домейн", - "timeout1": "Таймаут за връзка с отдалечен хост", - "timeout2": "Таймаут за връзка с локален хост", - "title": "Редактиране на обект", - "unchanged_if_empty": "Ако не е променено, оставете празно", - "username": "Потребителско име", - "validate_save": "Валидиране и запазване" - }, - "fido2": { - "confirm": "Потвърждаване", - "fido2_auth": "Вход с FIDO2", - "fido2_success": "Устройството е регистрирано успешно", - "fido2_validation_failed": "Проверката е неуспешна", - "fn": "Приятелско име", - "known_ids": "Известни идентификатори", - "none": "Деактивирано", - "register_status": "Състояние на регистрация", - "rename": "Преименуване", - "set_fido2": "Регистриране на FIDO2 устройство", - "set_fido2_touchid": "Регистриране на Touch ID на Apple M1", - "set_fn": "Задаване на приятелско име", - "start_fido2_validation": "Стартиране на проверка на FIDO2" - }, - "footer": { - "cancel": "Отказ", - "confirm_delete": "Потвърждаване на изтриването", - "delete_now": "Изтриване сега", - "delete_these_items": "Моля, потвърдете промените за следния идентификатор на обект", - "hibp_check": "Проверка срещу haveibeenpwned.com", - "hibp_nok": "Съвпадение! Това е потенциално опасна парола!", - "hibp_ok": "Няма съвпадение.", - "loading": "Моля, изчакайте...", - "nothing_selected": "Няма избрани елементи", - "restart_container": "Рестартиране на контейнер", - "restart_container_info": "Важно: Грациозното рестартиране може да отнеме известно време за завършване, моля, изчакайте да приключи.", - "restart_now": "Рестартиране сега", - "restarting_container": "Рестартиране на контейнера, това може да отнеме известно време" - }, - "header": { - "administration": "Конфигурация & Детайли", - "apps": "Приложения", - "debug": "Информация", - "email": "Имейл", - "mailcow_system": "Система", - "mailcow_config": "Конфигурация", - "quarantine": "Карантина", - "restart_netfilter": "Рестартиране на netfilter", - "restart_sogo": "Рестартиране на SOGo", - "user_settings": "Настройки на потребителя" - }, - "info": { - "awaiting_tfa_confirmation": "Изчакване на потвърждение за TFA", - "no_action": "Няма приложимо действие", - "session_expires": "Вашата сесия ще изтече след около 15 секунди" - }, - "login": { - "back_to_mailcow": "Обратно към mailcow", - "delayed": "Входът е забавен с %s секунди.", - "fido2_webauthn": "Вход с FIDO2/WebAuthn", - "forgot_password": "> Забравена парола?", - "invalid_pass_reset_token": "Токенът за нулиране на парола е невалиден или е изтекъл.
Моля, заявете нов линк за нулиране на парола.", - "login": "Вход", - "login_admin": "Вход на администратор", - "login_dadmin": "Вход на администратор на домейн", - "login_user": "Потребителски вход", - "mobileconfig_info": "Моля, влезте като потребител на пощенска кутия, за да изтеглите поискания Apple профил за връзка.", - "new_password": "Нова парола", - "new_password_confirm": "Потвърждаване на новата парола", - "other_logins": "или вход с", - "password": "Парола", - "request_reset_password": "Заявка за промяна на парола", - "reset_password": "Нулиране на парола", - "username": "Потребителско име" - }, - "mailbox": { - "action": "Действие", - "activate": "Активиране", - "active": "Активен", - "add": "Добавяне", - "add_alias": "Добавяне на псевдоним", - "add_alias_expand": "Разширяване на псевдоним над домейни на псевдоними", - "add_bcc_entry": "Добавяне на запис в картата BCC", - "add_domain": "Добавяне на домейн", - "add_domain_alias": "Добавяне на псевдоним на домейн", - "add_domain_record_first": "Моля, добавете първо домейн", - "add_filter": "Добавяне на филтър", - "add_mailbox": "Добавяне на пощенска кутия", - "add_recipient_map_entry": "Добавяне на запис в картата на получатели", - "add_resource": "Добавяне на ресурс", - "add_template": "Добавяне на шаблон", - "add_tls_policy_map": "Добавяне на карта на политиката на TLS", - "address_rewriting": "Презаписване на адрес", - "alias": "Псевдоним", - "alias_domain_alias_hint": "Псевдонимите не се прилагат автоматично към домейни на псевдоними. Псевдонимът my-alias@domain не покрива адреса my-alias@alias-domain (където \"alias-domain\" е имагинерен псевдоним на домейн).
Моля, използвайте филтър на Sieve, за да пренасочите имейл към външна пощенска кутия (вижте раздела \"Филтри\" или SOGo -> Пренасочвач). Използвайте \"Разширяване на псевдоним над домейни на псевдоними\", за да добавите автоматично липсващи псевдоними.", - "alias_domain_backupmx": "Псевдонимът на домейн е неактивен за домейн за реле", - "aliases": "Псевдоними", - "all_domains": "Всички домейни", - "allow_from_smtp": "Разрешаване само на тези IP адреси да използват SMTP", - "allow_from_smtp_info": "Оставете празно, за да разрешите всички изпращачи.
IPv4/IPv6 адреси и мрежи.", - "allowed_protocols": "Разрешени протоколи", - "backup_mx": "Домейн за реле", - "bcc": "BCC", - "bcc_destination": "BCC дестинация", - "bcc_destinations": "BCC дестинации", - "bcc_info": "Картите BCC се използват, за да препращат тихо копия от всички съобщения до друг адрес. Записът от тип получател на карта се използва, когато локалната дестинация действа като получател на имейл. Записът от тип изпращач на карта се използва, когато локалната дестинация действа като изпращач на имейл. Локалната дестинация няма да бъде информирана за неуспешна доставка.", - "bcc_local_dest": "Локална дестинация", - "bcc_map": "Карта BCC", - "bcc_map_type": "Тип BCC", - "bcc_maps": "Карти BCC", - "bcc_rcpt_map": "Карта на получател", - "bcc_sender_map": "Карта на изпращач", - "bcc_to_rcpt": "Превключване към карта на получател", - "bcc_to_sender": "Превключване към карта на изпращач", - "bcc_type": "Тип BCC", - "booking_null": "Винаги показване като свободен", - "booking_0_short": "Винаги свободен", - "booking_custom": "Твърдо ограничение до определен брой резервации", - "booking_custom_short": "Твърдо ограничение", - "booking_ltnull": "Неограничено, но показване като заето, когато е резервирано", - "booking_lt0_short": "Меко ограничение", - "catch_all": "Catch-All", - "created_on": "Създаден на", - "daily": "Ежедневно", - "deactivate": "Деактивиране", - "description": "Описание", - "disable_login": "Забраняване на вход (входящите съобщения все още се приемат)", - "disable_x": "Деактивиране", - "dkim_domains_selector": "Селектор", - "dkim_key_length": "Дължина на DKIM ключа (битове)", - "domain": "Домейн", - "domain_admins": "Администратори на домейн", - "domain_aliases": "Псевдоними на домейн", - "domain_templates": "Шаблони за домейн", - "domain_quota": "Квота", - "domain_quota_total": "Обща квота на домейна", - "domains": "Домейни", - "edit": "Редактиране", - "empty": "Няма резултати", - "enable_x": "Активиране", - "excludes": "Изключване", - "filter_table": "Таблица с филтри", - "filters": "Филтри", - "fname": "Пълно име", - "force_pw_update": "Принудително обновяване на парола при следващия вход", - "gal": "Глобален адресен списък", - "goto_ham": "Учен като не е спам", - "goto_spam": "Учен като спам", - "hourly": "Часово", - "iam": "Доставчик на идентичност", - "in_use": "В употреба (%)", - "inactive": "Неактивен", - "insert_preset": "Вмъкване на примерен предефиниран набор \"%s\"", - "kind": "Вид", - "last_mail_login": "Последен вход в пощата", - "last_modified": "Последно модифициране", - "last_pw_change": "Последна промяна на парола", - "last_run": "Последно изпълнение", - "last_run_reset": "Задаване на следващо", - "mailbox": "Пощенска кутия", - "mailbox_defaults": "Настройки по подразбиране", - "mailbox_defaults_info": "Дефинирайте настройки по подразбиране за нови пощенски кутии.", - "mailbox_defquota": "Размер по подразбиране на пощенска кутия", - "mailbox_templates": "Шаблони за пощенска кутия", - "mailbox_quota": "Макс. размер на пощенска кутия", - "mailboxes": "Пощенски кутии", - "max_aliases": "Макс. псевдоними", - "max_mailboxes": "Макс. възможни пощенски кутии", - "max_quota": "Макс. квота за пощенска кутия", - "mins_interval": "Интервал (мин)", - "msg_num": "Съобщение №", - "multiple_bookings": "Множествени резервации", - "never": "Никога", - "no": "✕", - "no_record": "Няма запис за обект %s", - "no_record_single": "Няма запис", - "open_logs": "Отваряне на логове", - "owner": "Собственик", - "private_comment": "Частен коментар", - "public_comment": "Публичен коментар", - "q_add_header": "при преместване в папката за нежелана поща", - "q_all": " при преместване в папката за нежелана поща и при отхвърляне", - "q_reject": "при отхвърляне", - "quarantine_category": "Категория на уведомленията за карантина", - "quarantine_notification": "Уведомления за карантина", - "quick_actions": "Действия", - "recipient": "Получател", - "recipient_map": "Карта на получател", - "recipient_map_info": "Картите на получател се използват, за да се замени адресът на дестинация на съобщението, преди да бъде доставено.", - "recipient_map_new": "Нов получател", - "recipient_map_new_info": "Дестинацията на картата на получател трябва да бъде валиден имейл адрес или име на домейн.", - "recipient_map_old": "Оригинален получател", - "recipient_map_old_info": "Оригиналната дестинация на картата на получател трябва да бъде валиден имейл адрес или име на домейн.", - "recipient_maps": "Карти на получател", - "relay_all": "Реле на всички получатели", - "relay_unknown": "Реле на несъществуващи пощенски кутии", - "remove": "Премахване", - "resources": "Ресурси", - "running": "Изпълнява се", - "sender": "Изпращач", - "set_postfilter": "Маркиране като постфилтър", - "set_prefilter": "Маркиране като префилтър", - "sieve_info": "Можете да запазите множество филтри за всеки потребител, но само един префилтър и един постфилтър могат да бъдат активни едновременно.
\r\nВсеки филтър ще бъде обработен в описания ред. Нито един неуспешен скрипт, нито издадена команда \"keep;\" няма да спре обработката на следващите скриптове. Промените в глобалните филтри на sieve ще предизвикат рестартиране на Dovecot.

Глобален префилтър на sieve • Префилтър • Потребителски скриптове • Постфилтър • Глобален постфилтър на sieve", - "sieve_preset_1": "Изтриване на съобщения с потенциално опасни типове файлове", - "sieve_preset_2": "Винаги маркиране на имейла на определен изпращач като прочетен", - "sieve_preset_3": "Тихо изтриване, спиране на всякаква допълнителна обработка на sieve филтри", - "sieve_preset_4": "Архивиране на съобщението във ВХОДНА, пропускане на допълнителна обработка от sieve филтри", - "sieve_preset_5": "Автоотговор (ваканция)", - "sieve_preset_6": "Отхвърляне на съобщение с отговор", - "sieve_preset_7": "Пренасочване и запазване/изтриване", - "sieve_preset_8": "Пренасочване на имейл от определен изпращач, маркиране като прочетен и сортиране в подпапка", - "sieve_preset_header": "Моля, вижте примерните предефинирани набори по-долу. За повече детайли вижте Wikipedia.", - "sogo_visible": "Псевдонимът е видим в SOGo", - "sogo_visible_n": "Скриване на псевдоним в SOGo", - "sogo_visible_y": "Показване на псевдоним в SOGo", - "spam_aliases": "Времеви псевдоними", - "stats": "Статистика", - "status": "Статус", - "sync_jobs": "Синхронизиращи задачи", - "syncjob_check_log": "Проверка на лога", - "syncjob_last_run_result": "Резултат от последното изпълнение", - "syncjob_EX_OK": "Успех", - "syncjob_EXIT_CONNECTION_FAILURE": "Проблем с връзката", - "syncjob_EXIT_TLS_FAILURE": "Проблем с криптираната връзка", - "syncjob_EXIT_AUTHENTICATION_FAILURE": "Проблем с удостоверяването", - "syncjob_EXIT_OVERQUOTA": "Целевата пощенска кутия е над квотата", - "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Не може да се свърже с отдалечен сървър", - "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Грешно потребителско име или парола", - "table_size": "Размер на таблицата", - "table_size_show_n": "Показване на %s елемента", - "target_address": "Адрес за пренасочване", - "target_domain": "Целеви домейн", - "templates": "Шаблони", - "template": "Шаблон", - "tls_enforce_in": "Принудително използване на TLS за входящи", - "tls_enforce_out": "Принудително използване на TLS за изходящи", - "tls_map_dest": "Дестинация", - "tls_map_dest_info": "Примери: example.org, .example.org, [mail.example.org]:25", - "tls_map_parameters": "Параметри", - "tls_map_parameters_info": "Празно или параметри, например: protocols=!SSLv2 ciphers=medium exclude=3DES", - "tls_map_policy": "Политика", - "tls_policy_maps": "Пренареждания на политиката на TLS", - "tls_policy_maps_enforced_tls": "Тези политики ще пренареждат и поведението за потребители на пощенски кутии, които принудително използват изходящи TLS връзки. Ако няма политика, съществуваща по-долу, тези потребители ще приложат стойностите по подразбиране, зададени като smtp_tls_mandatory_protocols и smtp_tls_mandatory_ciphers.", - "tls_policy_maps_info": "Тази политика за пренареждане на TLS транспортни правила е независима от настройките за политика на TLS на потребителя.
\r\n Моля, вижте документацията за \"smtp_tls_policy_maps\" за повече информация.", - "tls_policy_maps_long": "Пренареждания на политиката на TLS за изходящи", - "toggle_all": "Превключване на всички", - "username": "Потребителско име", - "waiting": "Изчакване", - "weekly": "Седмично", - "yes": "✓" - }, - "oauth2": { - "access_denied": "Моля, влезте като собственик на пощенска кутия, за да удостоверите чрез OAuth2.", - "authorize_app": "Удостоверяване на приложение", - "deny": "Отказ", - "permit": "Удостоверяване на приложение", - "profile": "Профил", - "profile_desc": "Преглед на лични данни: потребителско име, пълно име, създадено, модифицирано, активно", - "scope_ask_permission": "Приложението заявява следните разрешения", - "client_id": "Идентификатор на клиента", - "client_secret": "Тайна на клиента", - "redirect_uri": "URI за пренасочване", - "renew_secret": "Генериране на нова тайна на клиента", - "revoke_tokens": "Анулиране на всички токени на клиента" - }, - "quarantine": { - "action": "Действие", - "atts": "Прикачени файлове", - "check_hash": "Търсене на файлов хеш в VirusTotal", - "confirm": "Потвърждаване", - "confirm_delete": "Потвърждаване на изтриването на този елемент.", - "danger": "Опасност", - "deliver_inbox": "Доставяне в пощенската кутия", - "disabled_by_config": "Текущата системна конфигурация деактивира функционалността на карантината. Моля, задайте \"задържания за пощенска кутия\" и \"максимален размер\" за елементите на карантината.", - "download_eml": "Изтегляне (.eml)", - "empty": "Няма резултати", - "high_danger": "Висока", - "info": "Информация", - "junk_folder": "Папка за нежелана поща", - "learn_spam_delete": "Учен като спам и изтриване", - "low_danger": "Ниска", - "medium_danger": "Средна", - "neutral_danger": "Неутрална", - "notified": "Уведомен", - "qhandler_success": "Заявката е изпратена успешно до системата. Можете да затворите прозореца сега.", - "qid": "QID на Rspamd", - "qinfo": "Системата за карантина ще запази отхвърлените съобщения в базата данни (изпращачът няма да бъде информиран за доставеното съобщение) както и съобщенията, доставени като копие в папката за нежелана поща на пощенска кутия.

\"Учен като спам и изтриване\" ще научи съобщението като спам чрез теоремата на Бейс и също ще изчисли размити хешове, за да отхвърли подобни съобщения в бъдеще.

Моля, имайте предвид, че обучаването на множество съобщения може да бъде - в зависимост от вашата система - времеемко.
Елементите в черния списък са изключени от карантината.", - "qitem": "Елемент в карантина", - "quarantine": "Карантина", - "quick_actions": "Действия", - "quick_delete_link": "Отваряне на бърз линк за изтриване", - "quick_info_link": "Отваряне на бърз информационен линк", - "quick_release_link": "Отваряне на бърз линк за освобождане", - "rcpt": "Получател", - "received": "Получено", - "recipients": "Получатели", - "refresh": "Опресняване", - "rejected": "Отхвърлено", - "release": "Освобождане", - "release_body": "Прикаченото съобщение е добавено към това съобщение.", - "release_subject": "Потенциално вреден елемент в карантина %s", - "remove": "Премахване", - "rewrite_subject": "Презаписване на темата", - "rspamd_result": "Резултат от Rspamd", - "sender": "Изпращач (SMTP)", - "sender_header": "Изпращач (\"From\" заглавие)", - "settings_info": "Максимален брой елементи за карантиниране: %s
Максимален размер на имейл: %s MiB", - "show_item": "Показване на елемент", - "spam": "Спам", - "spam_score": "Резултат", - "subj": "Тема", - "table_size": "Размер на таблицата", - "table_size_show_n": "Показване на %s елемента", - "text_from_html_content": "Съдържание (конвертиран HTML)", - "text_plain_content": "Съдържание (обикновен текст)", - "toggle_all": "Превключване на всички", - "type": "Тип" - }, - "queue": { - "delete": "Изтриване на всички", - "flush": "Изчистване на опашката", - "info": "Опашката на имейлите съдържа всички имейли, които чакат за доставка. Ако имейлът е засечен в опашката за дълго време, той автоматично се изтрива от системата.
Съобщението за грешка на съответния имейл дава информация защо имейлът не може да бъде доставен.", - "legend": "Функции на действията в опашката на имейлите:", - "ays": "Моля, потвърдете, че искате да изтриете всички елементи от текущата опашка.", - "deliver_mail": "Доставяне", - "deliver_mail_legend": "Опит за повторно доставяне на избраните съобщения.", - "hold_mail": "Задържане", - "hold_mail_legend": "Задържа избраните съобщения. (Предотвратява допълнителни опити за доставяне)", - "queue_manager": "Мениджър на опашката", - "show_message": "Показване на съобщение", - "unban": "разблокиране на опашката", - "unhold_mail": "Освобождаване", - "unhold_mail_legend": "Освобождава избраните съобщения за доставка. (Изисква предварително задържане)" - }, - "ratelimit": { - "disabled": "Деактивирано", - "second": "съобщения/секунда", - "minute": "съобщения/минута", - "hour": "съобщения/час", - "day": "съобщения/ден" - }, - "start": { - "help": "Показване/Скриване на панела за помощ", - "imap_smtp_server_auth_info": "Моля, използвайте пълния си имейл адрес и механизма за удостоверяване PLAIN.
\r\nВашите данни за вход ще бъдат криптирани от сървърната страна чрез задължително сървърно криптиране." - }, - "success": { - "acl_saved": "ACL за обект %s е запазен", - "admin_added": "Администраторът %s е добавен", - "admin_api_modified": "Промените в API са запазени", - "admin_modified": "Промените в администратора са запазени", - "admin_removed": "Администраторът %s е премахнат", - "alias_added": "Адресът на псевдонима %s (%d) е добавен", - "alias_domain_removed": "Домейнът на псевдонима %s е премахнат", - "alias_modified": "Промените в адреса на псевдонима %s са запазени", - "alias_removed": "Псевдонимът %s е премахнат", - "aliasd_added": "Добавен домейн на псевдоним %s", - "aliasd_modified": "Промените в домейна на псевдоним %s са запазени", - "app_links": "Запазени промени в линковете на приложенията", - "app_passwd_added": "Добавена нова парола за приложение", - "app_passwd_removed": "Премахната парола за приложение с ID %s", - "bcc_deleted": "Записи в картата BCC са изтрити: %s", - "bcc_edited": "Записът в картата BCC %s е редактиран", - "bcc_saved": "Записът в картата BCC е запазен", - "cors_headers_edited": "Настройките на CORS са запазени", - "db_init_complete": "Инициализацията на базата данни е завършена", - "delete_filter": "Изтрити филтри с ID %s", - "delete_filters": "Изтрити филтри: %s", - "deleted_syncjob": "Изтрита синхронизираща задача с ID %s", - "deleted_syncjobs": "Изтрити синхронизиращи задачи: %s", - "dkim_added": "Добавен DKIM ключ %s", - "dkim_duplicated": "DKIM ключът за домейн %s е копиран в %s", - "dkim_removed": "DKIM ключът %s е премахнат", - "domain_add_dkim_available": "DKIM ключът вече съществува", - "domain_added": "Добавен домейн %s", - "domain_admin_added": "Добавен администратор на домейн %s", - "domain_admin_modified": "Промените в администратора на домейн %s са запазени", - "domain_admin_removed": "Администраторът на домейн %s е премахнат", - "domain_footer_modified": "Промените в подвала на домейн %s са запазени", - "domain_modified": "Промените в домейн %s са запазени", - "domain_removed": "Домейнът %s е премахнат", - "dovecot_restart_success": "Dovecot е рестартиран успешно", - "eas_reset": "Устройствата с ActiveSync за потребителя %s са нулирани", - "f2b_banlist_refreshed": "Списъкът с ID на блокираните е актуализиран успешно.", - "f2b_modified": "Промените в параметрите на Fail2ban са запазени", - "forwarding_host_added": "Добавен хост за препращане %s", - "forwarding_host_removed": "Премахнат хост за препращане %s", - "global_filter_written": "Филтърът е записан успешно във файл", - "hash_deleted": "Хешът е изтрит", - "iam_test_connection": "Връзката е успешна", - "ip_check_opt_in": "Оптирането за използване на услугата на трета страна е запазено успешно", - "ip_check_opt_in_modified": "Проверката на IP беше успешно запазена", - "item_deleted": "Елементът %s е изтрит успешно", - "item_released": "Елементът %s е освободен", - "items_deleted": "Елементът %s е изтрит успешно", - "items_released": "Избраните елементи са освободени", - "learned_ham": "Успешно научен ID %s като не е спам", - "license_modified": "Промените в лиценза са запазени", - "logged_in_as": "Вписан като %s", - "mailbox_added": "Пощенската кутия %s е добавена", - "mailbox_modified": "Промените в пощенската кутия %s са запазени", - "mailbox_removed": "Пощенската кутия %s е премахната", - "mailbox_renamed": "Пощенската кутия е преименувана от %s на %s", - "nginx_reloaded": "Nginx е презареден", - "object_modified": "Промените в обект %s са запазени", - "password_changed_success": "Паролата е променена успешно", - "password_policy_saved": "Политиката за парола е запазена успешно", - "pushover_settings_edited": "Настройките на Pushover са запазени успешно, моля, проверете удостоверенията.", - "qlearn_spam": "Съобщението с ID %s е научено като спам и изтрито", - "queue_command_success": "Командата на опашката е завършена успешно", - "recipient_map_entry_deleted": "Записът в картата на получател с ID %s е изтрит", - "recipient_map_entry_saved": "Записът в картата на получател \"%s\" е запазен", - "recovery_email_sent": "Изпратен имейл за възстановяване до %s", - "relayhost_added": "Записът в картата %s е добавен", - "relayhost_removed": "Записът в картата %s е премахнат", - "reset_main_logo": "Нулиране на логото по подразбиране", - "resource_added": "Ресурсът %s е добавен", - "resource_modified": "Промените в пощенската кутия %s са запазени", - "resource_removed": "Ресурсът %s е премахнат", - "rl_saved": "Ограничението на скоростта за обект %s е запазено", - "rspamd_ui_pw_set": "Паролата на UI на Rspamd е зададена успешно", - "saved_settings": "Запазени настройки", - "settings_map_added": "Добавен запис в картата с настройки", - "settings_map_removed": "Премахнат запис в картата с настройки с ID %s", - "sogo_profile_reset": "Профилът на SOGo за потребителя %s е нулиран", - "template_added": "Добавен шаблон %s", - "template_modified": "Промените в шаблон %s са запазени", - "template_removed": "Шаблонът с ID %s е премахнат", - "tls_policy_map_entry_deleted": "Записът в картата на политиката на TLS с ID %s е изтрит", - "tls_policy_map_entry_saved": "Записът в картата на политиката на TLS \"%s\" е запазен", - "ui_texts": "Запазени промени в текстовете на UI", - "upload_success": "Файлът е качен успешно", - "verified_fido2_login": "Потвърдено вход с FIDO2", - "verified_totp_login": "Потвърдено вход с TOTP", - "verified_webauthn_login": "Потвърдено вход с WebAuthn", - "verified_yotp_login": "Потвърдено вход с Yubico OTP" - }, - "tfa": { - "authenticators": "Аутентикатори", - "api_register": "%s използва облачното API на Yubico. Моля, вземете API ключ за вашия ключ тук", - "confirm": "Потвърждаване", - "confirm_totp_token": "Моля, потвърдете промените, като въведете генерирания токен", - "delete_tfa": "Деактивиране на TFA", - "disable_tfa": "Деактивиране на TFA до следващия успешен вход", - "enter_qr_code": "Вашият TOTP код, ако вашето устройство не може да сканира QR кодове", - "error_code": "Код на грешка", - "init_webauthn": "Инициализиране, моля, изчакайте...", - "key_id": "Идентификатор за вашето устройство", - "key_id_totp": "Идентификатор за вашия ключ", - "none": "Деактивиране", - "reload_retry": "- (презаредете браузъра, ако грешката продължи)", - "scan_qr_code": "Моля, сканирайте следния код с вашето приложение за аутентикация или въведете кода ръчно.", - "select": "Моля, изберете", - "set_tfa": "Задаване на метод за двуфакторно удостоверяване", - "start_webauthn_validation": "Стартиране на проверка", - "tfa": "Двуфакторно удостоверяване", - "tfa_token_invalid": "Невалиден токен за TFA", - "totp": "Временен OTP (Google Authenticator, Authy и др.)", - "u2f_deprecated": "Изглежда, че вашият ключ е регистриран с депрекирания метод U2F. Ще деактивираме двуфакторното удостоверяване за вас и ще изтрием вашия ключ.", - "u2f_deprecated_important": "Моля, регистрирайте вашия ключ в административния панел с новия метод WebAuthn.", - "webauthn": "Удостоверяване с WebAuthn", - "waiting_usb_auth": "Изчакване на USB устройство...

Моля, докоснете бутона на вашето USB устройство сега.", - "waiting_usb_register": "Изчакване на USB устройство...

Моля, въведете паролата си по-горе и потвърдете регистрацията си, като докоснете бутона на вашето USB устройство.", - "yubi_otp": "Удостоверяване с Yubico OTP" - }, - "user": { - "action": "Действие", - "active": "Активен", - "active_sieve": "Активен филтър", - "advanced_settings": "Разширени настройки", - "alias": "Псевдоним", - "alias_create_random": "Генериране на случаен псевдоним", - "alias_extend_all": "Удължаване на всички псевдоними с 1 час", - "alias_full_date": "d.m.Y, H:i:s T", - "alias_remove_all": "Премахване на всички псевдоними", - "alias_select_validity": "Период на валидност", - "alias_time_left": "Оставащо време", - "alias_valid_until": "Валиден до", - "aliases_also_send_as": "Разрешено да изпраща и като потребител", - "aliases_send_as_all": "Не проверявай достъпа на изпращач за следните домейни и техните псевдоними", - "allowed_protocols": "Разрешени протоколи", - "app_hint": "Паролите за приложения са алтернативни пароли за вашия IMAP, SMTP, CalDAV, CardDAV и EAS вход. Потребителското име остава непроменено. SOGo уеб пощата не е достъпна чрез пароли за приложения.", - "app_name": "Име на приложението", - "app_passwds": "Пароли за приложения", - "apple_connection_profile": "Профил за връзка на Apple", - "apple_connection_profile_complete": "Този профил за връзка включва настройки за IMAP и SMTP, както и пътища за CalDAV (календари) и CardDAV (контакти) за устройство на Apple.", - "apple_connection_profile_mailonly": "Този профил за връзка включва настройки за IMAP и SMTP за устройство на Apple.", - "apple_connection_profile_with_app_password": "Генерирана е нова парола за приложение и е добавена към профила, така че не е необходимо да се въвежда парола при настройката на вашето устройство. Моля, не споделяйте файла, тъй като той предоставя пълен достъп до вашата пощенска кутия.", - "attribute": "Атрибут", - "authentication": "Удостоверяване", - "change_password": "Промяна на парола", - "change_password_hint_app_passwords": "Вашият акаунт има %d пароли за приложения, които няма да бъдат променени. За управление на тях, отидете в раздела \"Пароли за приложения\".", - "clear_recent_successful_connections": "Изчистване на видимите успешни връзки", - "client_configuration": "Показване на ръководства за настройка на пощенски клиенти и смартфони", - "create_app_passwd": "Създаване на парола за приложение", - "create_syncjob": "Създаване на нова синхронизираща задача", - "created_on": "Създаден на", - "daily": "Ежедневно", - "day": "ден", - "delete_ays": "Моля, потвърдете процеса на изтриване.", - "description": "Описание", - "direct_aliases": "Директни адреси на псевдоними", - "direct_aliases_desc": "Директните адреси на псевдоними се засягат от настройките за филтър за спам и политика за TLS.", - "direct_protocol_access": "Този потребител на пощенска кутия има директен, външен достъп до следните протоколи и приложения. Тази настройка се контролира от вашия администратор. Паролите за приложения могат да бъдат създадени, за да се предостави достъп до отделни протоколи и приложения.
Бутонът \"Уеб поща\" предоставя еднократно удостоверяване към SOGo и винаги е достъпен.", - "eas_reset": "Нулиране на кеша на устройствата с ActiveSync", - "eas_reset_help": "В много случаи нулирането на кеша на устройството ще помогне за възстановяването на повреден профил на ActiveSync.
Внимание: Всички елементи ще бъдат презаредени!", - "eas_reset_now": "Нулиране сега", - "edit": "Редактиране", - "email": "Имейл", - "email_and_dav": "Имейл, календари и контакти", - "empty": "Няма резултати", - "encryption": "Криптиране", - "excludes": "Изключване", - "expire_in": "Изтича след", - "fido2_webauthn": "FIDO2/WebAuthn", - "force_pw_update": "Трябва да зададете нова парола, за да имате достъп до груповите услуги.", - "from": "от", - "generate": "генериране", - "hour": "час", - "hourly": "Часово", - "hours": "часа", - "in_use": "В употреба", - "interval": "Интервал", - "is_catch_all": "Catch-all за домейн/и", - "last_mail_login": "Последен вход в пощата", - "last_pw_change": "Последна промяна на парола", - "last_run": "Последно изпълнение", - "last_ui_login": "Последен вход в UI", - "loading": "Зареждане...", - "login_history": "История на входовете", - "mailbox": "Пощенска кутия", - "mailbox_details": "Детайли", - "mailbox_general": "Общи", - "mailbox_settings": "Настройки", - "messages": "съобщения", - "month": "месец", - "months": "месеца", - "never": "Никога", - "new_password": "Нова парола", - "new_password_repeat": "Потвърждаване на новата парола", - "no_active_filter": "Няма активен филтър", - "no_last_login": "Няма информация за последен вход в UI", - "no_record": "Няма запис", - "open_logs": "Отваряне на логове", - "open_webmail_sso": "Уеб поща", - "overview": "Преглед", - "password": "Парола", - "password_now": "Текуща парола (потвърждаване на промените)", - "password_repeat": "Парола (повторете)", - "password_reset_info": "Ако не е зададен имейл за възстановяване на парола, тази функция не може да бъде използвана.", - "protocols": "Протоколи", - "pushover_evaluate_x_prio": "Ескалиране на високоприоритетни съобщения [X-Priority: 1]", - "pushover_info": "Настройките за известия на Pushover ще се прилагат за всички чисти (не-спам) съобщения, доставени до %s, включително псевдоними (споделени, несподелени, таговани).", - "pushover_only_x_prio": "Разглеждане само на високоприоритетни съобщения [X-Priority: 1]", - "pushover_sender_array": "Разглеждане на следните адреси на изпращач (разделени с запетая)", - "pushover_sender_regex": "Съвпадение на изпращач с следния regex", - "pushover_sound": "Звук", - "pushover_text": "Текст на известието", - "pushover_title": "Заглавие на известието", - "pushover_vars": "Когато не е зададен филтър на изпращач, всички съобщения ще бъдат разглеждани.
Филтрите с регулярен израз, както и точните проверки на изпращач, могат да бъдат дефинирани индивидуално и ще бъдат разглеждани последователно. Те не зависят един от друг.
Използвайте следните променливи за текст и заглавие (моля, вземете предвид политиките за поверителност на данните)", - "pushover_verify": "Проверка на удостоверения", - "pw_recovery_email": "Имейл за възстановяване на парола", - "q_add_header": "Папка за нежелана поща", - "q_all": "Всички категории", - "q_reject": "Отхвърлени", - "quarantine_category": "Категория на уведомленията за карантина", - "quarantine_category_info": "Категорията \"Отхвърлени\" включва съобщения, които са били отхвърлени, докато категорията \"Папка за нежелана поща\" ще уведоми потребителя за съобщения, които са били поставени в папката за нежелана поща.", - "quarantine_notification": "Уведомления за карантина", - "quarantine_notification_info": "След като уведомлението е изпратено, елементите ще бъдат маркирани като \"уведомени\" и няма да бъдат изпращани допълнителни уведомления за този конкретен елемент.", - "recent_successful_connections": "Видими успешни връзки", - "remove": "Премахване", - "running": "Изпълнява се", - "save": "Запазване на промените", - "save_changes": "Запазване на промените", - "sender_acl_disabled": "Проверката на изпращач е деактивирана", - "shared_aliases": "Споделени адреси на псевдоними", - "shared_aliases_desc": "Споделените псевдоними не се засягат от настройките за филтър за спам и политика за TLS на потребителя. Съответните настройки за спам филтър могат да бъдат направени само от администратор като настройка за домейн.", - "show_sieve_filters": "Показване на активния потребителски филтър на sieve", - "sogo_profile_reset": "Нулиране на профила на SOGo", - "sogo_profile_reset_help": "Това ще унищожи профила на SOGo и ще изтрие всички данни за контакти и календар безвъзвратно.", - "sogo_profile_reset_now": "Нулиране сега", - "spam_aliases": "Временни адреси на псевдоними", - "spam_score_reset": "Нулиране до настройките на сървъра по подразбиране", - "spamfilter": "Филтър за спам", - "spamfilter_behavior": "Рейтинг", - "spamfilter_bl": "Черен списък", - "spamfilter_bl_desc": "Адресите в черния списък винаги ще бъдат класифицирани като спам и отхвърлени. Отхвърлените съобщения не ще бъдат копирани в карантина. Поддържат се уайлдкардове.
Отхвърлените съобщения няма да бъдат доставени до папката за нежелана поща.", - "spamfilter_default_score": "Стойности по подразбиране", - "spamfilter_green": "Зелено: това съобщение не е спам", - "spamfilter_hint": "Първата стойност описва \"нисък резултат за спам\", втората представлява \"висок резултат за спам\".", - "spamfilter_red": "Червено: това съобщение е спам и ще бъде отхвърлено от сървъра", - "spamfilter_table_action": "Действие", - "spamfilter_table_add": "Добавяне на елемент", - "spamfilter_table_domain_policy": "политика на домейна", - "spamfilter_table_empty": "Няма данни за показване", - "spamfilter_table_remove": "премахване", - "spamfilter_table_rule": "Правило", - "spamfilter_wl": "Бял списък", - "spamfilter_wl_desc": "Адресите в белия списък никога ще бъдат класифицирани като спам. Поддържат се уайлдкардове.
Съобщенията, които не са класифицирани като спам, ще бъдат доставени в папката за нежелана поща, ако резултатът за спам е над стойността за висок резултат за спам.", - "spamfilter_yellow": "Жълто: това съобщение може да е спам, ще бъде маркирано като спам и преместено в папката за нежелана поща", - "status": "Статус", - "sync_jobs": "Синхронизиращи задачи", - "syncjob_EXIT_AUTHENTICATION_FAILURE": "Проблем с удостоверяването", - "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Грешно потребителско име или парола", - "syncjob_EXIT_CONNECTION_FAILURE": "Проблем с връзката", - "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Не може да се свърже с отдалечен сървър", - "syncjob_EXIT_OVERQUOTA": "Целевата пощенска кутия е над квотата", - "syncjob_EXIT_TLS_FAILURE": "Проблем с криптираната връзка", - "syncjob_EX_OK": "Успех", - "syncjob_check_log": "Проверка на лога", - "syncjob_last_run_result": "Резултат от последното изпълнение", - "tag_handling": "Настройка за тагове", - "tag_help_example": "Пример за тагован имейл адрес: me+Facebook@example.org", - "tag_help_explain": "В подпапка: ще бъде създадена нова подпапка под INBOX (\"INBOX/Facebook\").
\r\nВ тема: първото име на тага ще бъде добавено към темата на съобщението, например: \"[Facebook] Моите новини\".", - "tag_in_none": "Не прави нищо", - "tag_in_subfolder": "В подпапка", - "tag_in_subject": "В тема", - "text": "Текст", - "tfa_info": "Двуфакторното удостоверяване помага за защита на вашия акаунт. Ако го активирате, ще ви трябват пароли за приложения, за да влезете в приложения или услуги, които не поддържат двуфакторно удостоверяване (напр. пощенски клиенти).", - "title": "Заглавие", - "tls_enforce_in": "Принудително използване на TLS за входящи", - "tls_enforce_out": "Принудително използване на TLS за изходящи", - "tls_policy": "Политика за криптиране", - "tls_policy_warning": "Внимание: Ако решите да принудите преноса на криптирани съобщения, може да загубите съобщения.
Съобщенията, които не удовлетворяват политиката, ще бъдат върнати с твърдо отхвърляне от системата за поща.
Тази опция засяга вашия основен адрес на пощенска кутия (логин име), всички адреси, произтичащи от домейни на псевдоними, както и адреси на псевдоними, с единствена целева пощенска кутия.", - "user_settings": "Настройки на потребителя", - "username": "Потребителско име", - "value": "Стойност", - "verify": "Проверка", - "waiting": "Изчакване", - "week": "седмица", - "weekly": "Weekly", - "weeks": "седмици", - "with_app_password": "с парола за приложение", - "year": "година", - "years": "години" - }, - "warning": { - "cannot_delete_self": "Не може да изтриете влезлия потребител", - "domain_added_sogo_failed": "Добавен домейн, но неуспешно рестартиране на SOGo, моля, проверете системните логове.", - "dovecot_restart_failed": "Dovecot не успя да рестартира, моля, проверете логовете", - "fuzzy_learn_error": "Грешка при обучение на размит хеш: %s", - "hash_not_found": "Хешът не е намерен или вече е изтрит", - "ip_invalid": "Пропуснат невалиден IP: %s", - "is_not_primary_alias": "Пропуснат неосновен псевдоним %s", - "no_active_admin": "Не може да деактивирате последния активен администратор", - "quota_exceeded_scope": "Квотата на домейна е надвишена: Само неограничени пощенски кутии могат да бъдат създадени в този домейн.", - "session_token": "Невалиден формулярен токен: Несъответствие на токена.", - "session_ua": "Невалиден формулярен токен: Грешка при проверка на User-Agent." - } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.ca-es.json b/data/web/lang/lang.ca-es.json index af7cbd5fb..ba84543a2 100644 --- a/data/web/lang/lang.ca-es.json +++ b/data/web/lang/lang.ca-es.json @@ -557,4 +557,4 @@ "week": "Setmana", "weeks": "Setmanes" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.zh-tw.json b/data/web/lang/lang.zh-tw.json index aaa6d756f..592efa809 100644 --- a/data/web/lang/lang.zh-tw.json +++ b/data/web/lang/lang.zh-tw.json @@ -1324,4 +1324,4 @@ "hold_mail": "保留", "unhold_mail": "取消保留" } -} \ No newline at end of file +} From 2f1eb4b004a6882f7e0875632b1b5d5498a5caca Mon Sep 17 00:00:00 2001 From: milkmaker Date: Thu, 24 Jul 2025 21:42:00 +0200 Subject: [PATCH 022/180] Translations update from Weblate (#6649) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Web] Updated lang.es-es.json Co-authored-by: sariegos * [Web] Updated lang.si-si.json Co-authored-by: Matjaž Tekavec * [Web] Updated lang.pt-br.json [Web] Updated lang.pt-br.json Co-authored-by: Bruno Zouein Pereira Co-authored-by: Peter --------- Co-authored-by: sariegos Co-authored-by: Matjaž Tekavec Co-authored-by: Bruno Zouein Pereira Co-authored-by: Peter --- data/web/lang/lang.es-es.json | 492 +++++++++++++++++++++++++++++++--- data/web/lang/lang.pt-br.json | 9 +- data/web/lang/lang.si-si.json | 29 +- 3 files changed, 478 insertions(+), 52 deletions(-) diff --git a/data/web/lang/lang.es-es.json b/data/web/lang/lang.es-es.json index 814142cc6..f357b9a80 100644 --- a/data/web/lang/lang.es-es.json +++ b/data/web/lang/lang.es-es.json @@ -10,11 +10,11 @@ "quarantine": "Acciones de cuarentena", "quarantine_attachments": "Archivos ajuntos en cuarentena", "quarantine_notification": "Notificaciones de cuarentena", - "ratelimit": "Rate limit", + "ratelimit": "Límite de peticiones", "recipient_maps": "Rutas del destinatario", "sogo_profile_reset": "Resetear perfil SOGo", "spam_alias": "Aliases temporales", - "spam_policy": "Lista blanca/negra", + "spam_policy": "Lista de bloqueo/desbloqueo", "spam_score": "Puntuación de spam", "syncjobs": "Trabajos de sincronización", "tls_policy": "Póliza de TLS", @@ -25,8 +25,10 @@ "quarantine_category": "Cambiar categoría de las notificaciones de cuarentena", "domain_relayhost": "Cambiar relayhost por un dominio", "extend_sender_acl": "Permitir extender la ACL del remitente por direcciones externas", - "pw_reset": "Permitir el reset de la contraseña del usario mailcow", - "sogo_access": "Permitir la gestión del acceso a SOGo" + "pw_reset": "Permitir el restablecimiento de la contraseña del usuario mailcow", + "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": { "activate_filter_warn": "Todos los demás filtros se desactivarán cuando este filtro se active.", @@ -34,7 +36,7 @@ "add": "Agregar", "add_domain_only": "Agregar dominio solamente", "add_domain_restart": "Agregar dominio y reiniciar SOGo", - "alias_address": "Dirección(es) alias:", + "alias_address": "Dirección(es) alias", "alias_address_info": "Dirección(es) de correo completa(s) ó @dominio.com, para atrapar todos los mensajes para un dominio (separado por coma). Dominios que existan en mailcow solamente.", "alias_domain": "Dominio alias", "alias_domain_info": "Nombres de dominio válidos solamente (separado por coma).", @@ -45,13 +47,13 @@ "delete1": "Eliminar de la fuente cuando se complete", "delete2": "Eliminar mensajes en el destino que no están en la fuente", "delete2duplicates": "Eliminar duplicados en el destino", - "description": "Descripción:", + "description": "Descripción", "destination": "Destino", "domain": "Dominio", - "domain_quota_m": "Cuota total del dominio (MiB):", + "domain_quota_m": "Cuota total del dominio (MiB)", "enc_method": "Método de cifrado", "exclude": "Excluir objectos (regex)", - "full_name": "Nombre completo:", + "full_name": "Nombre completo", "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. Reinicia SOGo para aplicar los cambios.", "generate": "Generar", @@ -61,20 +63,20 @@ "hostname": "Host", "kind": "Tipo", "mailbox_quota_def": "Cuota de buzón predeterminada", - "mailbox_quota_m": "Máx. cuota por buzón (MiB):", - "mailbox_username": "Nombre de usuario (parte izquierda de una dirección de correo):", - "max_aliases": "Máx. alias posibles:", - "max_mailboxes": "Máx. buzones posibles:", + "mailbox_quota_m": "Máx. cuota por buzón (MiB)", + "mailbox_username": "Nombre de usuario (parte izquierda de una dirección de correo)", + "max_aliases": "Máx. alias posibles", + "max_mailboxes": "Máx. buzones posibles", "mins_interval": "Intervalo de sondeo (minutos)", "multiple_bookings": "Múltiples reservas", "nexthop": "Siguiente destino", - "password": "Constraseña:", - "password_repeat": "Confirmación de contraseña (repetir):", + "password": "Contraseña", + "password_repeat": "Confirmación de contraseña (repetir)", "port": "Puerto", - "post_domain_add": "Nota: Necesitarás reiniciar el contenedor del servicio SOGo despues de agregar un nuevo dominio", - "quota_mb": "Cuota (MiB):", + "post_domain_add": "Es necesario reiniciar el contenedor del servicio SOGo, \"sogo-mailcow\", tras agregar un nuevo dominio.

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>).
Este paso es opcional y se reintentará cada 24 horas.", + "quota_mb": "Cuota (MiB)", "relay_all": "Retransmitir todos los destinatarios", - "relay_all_info": "Si eliges no retransmitir a todos los destinatarios, necesitas agregar un buzón \"ciego\" por cada destinatario que debe ser retransmitido.", + "relay_all_info": "↪ Si se elige no retransmitir todos los destinatarios, será necesario agregar un buzón \"ciego\" por cada destinatario que deba ser retransmitido.", "relay_domain": "Retransmitir este dominio", "select": "Por favor selecciona...", "select_domain": "Por favor elige un dominio primero", @@ -83,7 +85,7 @@ "skipcrossduplicates": "Omitir mensajes duplicados en carpetas (orden de llegada)", "subscribeall": "Suscribirse a todas las carpetas", "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_info": "Dirección(es) de correo completa(s) (separado por coma).", "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", "dry": "Simular la sincronización", "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": "
Información
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.
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).
Utilice cualquier puerto no cifrado y emita STARTTLS. Se puede crear una política para imponer TLS en \"TLS policy maps\".", + "tags": "Etiquetas" }, "admin": { "access": "Acceso", @@ -129,7 +137,7 @@ "app_name": "Nombre de la app", "apps_name": "Nombre \"mailcow Apps\"", "arrival_time": "Tiempo de llegada (hora del servidor)", - "ban_list_info": "Lista de IPs bloqueadas: red (tiempo de prohibición restante) - [acciones].
Las IPs en cola para ser desbloqueadas se eliminarán de la lista de bloqueos en unos pocos segundos.
Las etiquetas rojas indican bloqueos permanentes mediante la inclusión en la lista negra.", + "ban_list_info": "Lista de direcciones IP bloqueadas: red (tiempo de prohibición restante) - [acciones].
Las direcciones IP en cola para ser desbloqueadas se eliminarán de la lista de bloqueos en unos segundos.
Las etiquetas rojas indican bloqueos permanentes por inclusión en la lista de bloqueo.", "change_logo": "Cambiar logo", "configuration": "Configuración", "credentials_transport_warning": "Advertencia: 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", "f2b_ban_time": "Tiempo de restricción (s)", "f2b_ban_time_increment": "Tiempo de restricción se incrementa con cada restricción", - "f2b_blacklist": "Redes y hosts en lista negra", - "f2b_list_info": "Un host o red en lista negra siempre superará a una entidad de la lista blanca. Las actualizaciones de la lista tardarán unos segundos en aplicarse.", + "f2b_blacklist": "Redes y hosts en lista de bloqueo", + "f2b_list_info": "Un host o red en lista de bloqueo siempre tendrá prioridad sobre una entidad de la lista de desbloqueo. Las actualizaciones de la lista tardarán unos segundos en aplicarse.", "f2b_max_attempts": "Max num. de intentos", "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_ipv6": "Tamaño de subred IPv6 para aplicar la restricción (8-128)", "f2b_parameters": "Parametros Fail2ban", "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", "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)", @@ -253,7 +261,146 @@ "unban_pending": "Desbloqueo pendiente", "unchanged_if_empty": "Si no hay cambios déjalo en blanco", "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": "{{link}} El enlace generado para el restablecimiento de contraseña
{{username}} El buzón del usuario que ha solicitado el restablecimiento de contraseña
{{username2}} La dirección del buzón de recuperación de contraseña
{{date}} La fecha en que se realizó la solicitud de restablecimiento de contraseña
{{token_lifetime}} El periodo de vigencia del token en minutos
{{hostname}} El servidor Mailcow", + "api_info": "La API es un trabajo en curso. La documentación se puede encontrar en /api", + "iam_description": "Configurar un proveedor de autenticación externo
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:
Dejar en blanco para desactivar. Correo sin firmar y sin comprobar. Debe entregarse solo internamente.", + "quarantine_redirect": "Redirigir todas las notificaciones a este destinatario:
Dejar en blanco para desactivar. Correo sin firmar y sin comprobar. Debe entregarse sólo internamente.", + "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, /.+@domain\\.tld/i).
\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.
\n Rspamd intentará leer el contenido del mapa cuando éste se modifique. En caso de de problemas, reinicie Rspamd para forzar una recarga del mapa.
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
Sistema > Configuración > Opciones > Personalizar.", + "ip_check_opt_in": "Aceptar utilizar el servicio de terceros ipv4.mailcow.email y ipv6.mailcow.email 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.
Indique aquí su GUID o adquiera servicios de soporte para su instalación de Mailcow.", + "login_time": "Hora de inicio de sesión", + "lookup_mx": "Destino es una expresión regular con la que contrastar el nombre MX (.*\\.google\\.com 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.
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:
Por defecto 9999.0", + "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": { "access_denied": "Acceso denegado o datos del formulario inválidos", @@ -341,7 +488,60 @@ "username_invalid": "Nombre de usuario no se puede utilizar", "validity_missing": "Por favor asigna un periodo de validez", "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": { "containers_info": "Información de los contenedores", @@ -357,7 +557,29 @@ "started_at": "Iniciado el", "uptime": "Uptime", "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": { "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_status": "Información actual", "dns_records_type": "Tipo", - "optional": "Este récord es opcional." + "optional": "Este récord es opcional.", + "dns_records_docs": "Consulte también la documentación." }, "edit": { "active": "Activo", @@ -435,13 +658,79 @@ "title": "Editar objeto", "unchanged_if_empty": "Si no hay cambios dejalo en blanco", "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.
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.
\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: Aviso de cuota (usuario@ejemplo.com).", + "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.
\n Recuerde añadir este servidor al registro SPF correspondiente.
\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.
\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 %s 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": "Comprobación de remitente desactivada", + "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 SMTP", + "allow_from_smtp_info": "Dejar en blanco para permitir cualquier remitente.
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 (.*\\.google\\.com 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 [X-Priority: 1]", + "pushover_sender_array": "Tener en cuenta únicamente las siguientes direcciones de correo de remitente (separados por comas)", + "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": "
Información
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": { "hibp_nok": "¡Se encontró coincidencia - esta es una contraseña no segura, selecciona otra!", "hibp_ok": "No se encontraron coincidencias", "loading": "Espera por favor...", - "restart_now": "Reiniciar ahora" + "restart_now": "Reiniciar ahora", + "restart_container": "Reiniciar contenedor", + "restart_container_info": "Importante: 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": { "administration": "Administración", @@ -450,17 +739,38 @@ "mailcow_config": "Configuración", "quarantine": "Cuarentena", "restart_sogo": "Reiniciar SOGo", - "user_settings": "Configuraciones de usuario" + "user_settings": "Configuraciones de usuario", + "mailcow_system": "Sistema", + "apps": "Aplicaciones", + "restart_netfilter": "Reiniciar netfilter" }, "info": { "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": { "delayed": "El inicio de sesión ha sido retrasado %s segundos.", "login": "Inicio de sesión", "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.
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": { "action": "Acción", @@ -572,7 +882,67 @@ "toggle_all": "Selecionar todo", "username": "Nombre de usuario", "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 correo no deseado", + "sieve_preset_header": "Vea los preajustes de ejemplo más abajo. Para más detalles, consulte Wikipedia.", + "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 smtp_tls_mandatory_protocols y smtp_tls_mandatory_ciphers.", + "alias_domain_alias_hint": "Los alias no se aplican a dominios de alias automáticamente. Una dirección alias mi-alias@dominio no cubre la dirección mi-alias@dominio-alias (donde \"dominio-alias\" es un hipotético alias para el dominio \"dominio\").
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 SMTP", + "allow_from_smtp_info": "Dejar vacío para permitir cualquier remitente.
Direcciones y redes IPv4/IPv6.", + "allowed_protocols": "Protocolos permitidos", + "goto_ham": "Aprender como correo deseado", + "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": { "access_denied": "Inicie sesión como propietario del buzón para otorgar acceso a través de OAuth2.", @@ -614,7 +984,13 @@ "subj": "Asunto", "text_from_html_content": "Contenido (html convertido)", "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_manager": "Administrador de cola" @@ -773,11 +1149,55 @@ "waiting": "Esperando", "week": "Semana", "weekly": "Cada semana", - "weeks": "Semanas" + "weeks": "Semanas", + "with_app_password": "con contraseña de aplicación", + "year": "año", + "years": "años" }, "warning": { "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", - "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" } } diff --git a/data/web/lang/lang.pt-br.json b/data/web/lang/lang.pt-br.json index 57a4abd3d..f9c08ef02 100644 --- a/data/web/lang/lang.pt-br.json +++ b/data/web/lang/lang.pt-br.json @@ -359,7 +359,12 @@ "username": "Nome de usuário", "validate_license_now": "Valide o GUID em relação ao servidor de licenças", "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": { "access_denied": "Acesso negado ou dados de formulário inválidos", @@ -508,7 +513,7 @@ "infoFiltered": "(filtrado do total de entradas _MAX_)", "infoPostFix": "", "thousands": ",", - "lengthMenu": "Mostrar _ MENU_ entradas", + "lengthMenu": "Mostrar _MENU_ entradas", "loadingRecords": "Carregando...", "processing": "Por favor, aguarde...", "search": "Pesquisa:", diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json index 474328e38..35c4eaa96 100644 --- a/data/web/lang/lang.si-si.json +++ b/data/web/lang/lang.si-si.json @@ -20,7 +20,7 @@ "sogo_access": "Dovoli upravljanje SOGo dostopa", "sogo_profile_reset": "Ponastavi SOGo profil", "spam_alias": "Začasni vzdevki", - "spam_policy": "Črna lista/Bela lista", + "spam_policy": "Seznam zavrnjenih/dovoljenih", "spam_score": "Ocena neželene pošte", "tls_policy": "Politika TLS", "unlimited_quota": "Neomejena kvota za poštne predale", @@ -172,7 +172,7 @@ "excludes": "Izključuje te prejemnike", "f2b_ban_time": "Čas blokade (s)", "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_max_attempts": "Največ poskusov", "f2b_max_ban_time": "Maksimalno trajanje blokade (s)", @@ -181,7 +181,7 @@ "f2b_parameters": "Fail2ban parametri", "f2b_regex_info": "Upoštevajo se dnevniki SOGo, Postfix, Dovecot, PHP-FPM.", "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", "from": "Od", "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 dokumentacijo Rspamd", "rspamd_global_filters": "Globalne preslikave filtrov", "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_relayhost_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v golo besedilo.", "admin": "Skrbnik", "api_allow_from": "Dovoli API dostop s teh IP naslovov / CIDR mrežnih zapisov", "apps_name": "Ime aplikacije v mailcow", - "ban_list_info": "Oglejte si seznam blokiranih IP naslovov spodaj: network (remaining ban time) - [actions].
. IPji v vrsti za odstranitev blokade bodo odstranjeni iz aktivnega seznama blokad v nekaj sekundah.
Rdeče oznake prikazujejo trajne blokade z blacklisto.", + "ban_list_info": "Spodaj si oglejte seznam prepovedanih IP-jev: omrežje (preostali čas prepovedi) - [dejanja].
IP-ji, ki so v čakalni vrsti za odpravo prepovedi, bodo v nekaj sekundah odstranjeni s seznama aktivnih prepovedi.
Rdeče oznake označujejo aktivne trajne prepovedi s seznama zavrnjenih.", "dkim_key_length": "Dolžina DKIM ključa (v bitih)", "dkim_to_title": "Ciljne domene bodo prepisane", - "f2b_list_info": "Gostitelj ali omrežje na blacklisti bo vedno prevladal zapis na whitelisti. Apliciranje sprememb seznama traja nekaj sekund.", + "f2b_list_info": "Gostitelj ali omrežje na seznamu zavrnjenih bo vedno imelo prednost pred entiteto na seznamu dovoljenih. Posodobitve seznama bodo trajale nekaj sekund, da se uporabijo.", "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_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.
\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.
\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_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. /.+@domain\\.tld/i).
\nČeprav se v vsaki vrstici regexa izvedejo osnovni pregledi, je lahko funkcionalnost programa Rspamd motena, če sintaksa ni pravilna.
\nRspamd bo poskušal prebrati vsebino preslikave, ko bo spremenjena. Če imate težave, ponovno zaženite Rspamd, da prisilite ponovno nalaganje preslikav.
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. /.+@domain\\.tld/i).
\nČeprav se v vsaki vrstici regexa izvedejo osnovni pregledi, je lahko funkcionalnost programa Rspamd motena, če sintaksa ni pravilna.
\nRspamd bo poskušal prebrati vsebino preslikave, ko bo spremenjena. Če imate težave, ponovno zaženite Rspamd, da prisilite ponovno nalaganje preslikav.
Elementi na seznamu zavrnjenih so izključeni iz karantene.", "rspamd_settings_map": "Preslikava nastavitev Rspamd", "sal_level": "Moo stopnja", "save": "Shrani spremembe", @@ -408,7 +408,8 @@ "restore_template": "Za obnovitev privzete predloge pustite polje prazno.", "task": "Naloga", "user_link": "Uporabniška povezava", - "iam_realm": "Realm" + "iam_realm": "Realm", + "needs_restart": "potreben je ponovni zagon" }, "danger": { "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.", "spam_alias": "Ustvarjanje ali spreminjanje časovno omejenih vzdevkovnih naslovov", "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", "subfolder2": "Sinhroniziraj v podmapo na cilju
(prazno = ne uporabi podmape)", "syncjob": "Urejanje sinhronizacijskega opravila", @@ -1013,7 +1014,7 @@ "medium_danger": "Srednje", "notified": "Obveščen", "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
»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
Upoštevajte, da je učenje več sporočil lahko – odvisno od vašega sistema – zamudno.
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
»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
Upoštevajte, da je učenje več sporočil lahko – odvisno od vašega sistema – zamudno.
Elementi na seznamu zavrnjenih so izključeni iz karantene.", "junk_folder": "Mapa z neželeno pošto", "action": "Dejanje", "atts": "Priloge", @@ -1232,8 +1233,8 @@ "pushover_vars": "Če filter pošiljatelja ni definiran, bodo upoštevana vsa e-poštna sporočila.
Filtre regularnih izrazov in natančna preverjanja pošiljateljev je mogoče definirati posamično in bodo obravnavana zaporedno. Niso odvisna drug od drugega.
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.", "verify": "Preveri", - "spamfilter_bl_desc": "E-poštni naslovi na črnem seznamu, ki jih vedno razvrstite kot neželeno pošto in zavrnete. Zavrnjena pošta ne 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 nikoli 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_bl_desc": "E-poštni naslovi na seznamu zavrnjenih, ki bodo vedno razvrščeni kot neželena pošta in zavrnjeni. Zavrnjena pošta ne 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 seznamu dovoljenih so programirani tako, da se nikoli 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": "Opozorilo: Če se odločite za uveljavitev šifriranega prenosa pošte, lahko izgubite e-pošto.
Sporočila, ki ne ustrezajo pravilniku, bo poštni sistem zavrnil s popolno napako.
Ta možnost velja za vaš primarni e-poštni naslov (prijavno ime), vse naslove, izpeljane iz vzdevkov domen, in vzdevke, ki imajo samo ta en poštni predal kot cilj.", "allowed_protocols": "Dovoljeni protokoli", "title": "Naslov", @@ -1341,7 +1342,7 @@ "spam_score_reset": "Ponastavi na privzete nastavitve strežnika", "spamfilter": "Filter neželene pošte", "spamfilter_behavior": "Ocena", - "spamfilter_bl": "Črna lista", + "spamfilter_bl": "Seznam zavrnjenih", "spamfilter_default_score": "Privzete vrednosti", "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«.", @@ -1352,7 +1353,7 @@ "spamfilter_table_empty": "Ni podatkov za prikaz", "spamfilter_table_remove": "odstrani", "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", "status": "Stanje", "sync_jobs": "Sinhronizacija opravil", From 6b8e981bdc4e647c9c39638c259d4ff7b1945e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20S=C3=BCtterlin?= Date: Sat, 26 Jul 2025 01:06:24 +0000 Subject: [PATCH 023/180] fix: Only use HTTP_ORIGIN if it is sent. --- data/web/inc/functions.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php index edf428d5a..55329e73a 100644 --- a/data/web/inc/functions.inc.php +++ b/data/web/inc/functions.inc.php @@ -2211,7 +2211,7 @@ function cors($action, $data = null) { $cors_settings['allowed_origins'] = $allowed_origins[0]; if (in_array('*', $allowed_origins)){ $cors_settings['allowed_origins'] = '*'; - } else if (in_array($_SERVER['HTTP_ORIGIN'], $allowed_origins)) { + } else if (array_key_exists('HTTP_ORIGIN', $_SERVER) && in_array($_SERVER['HTTP_ORIGIN'], $allowed_origins)) { $cors_settings['allowed_origins'] = $_SERVER['HTTP_ORIGIN']; } // always allow OPTIONS for preflight request From 3d5b57889a3169dbe835febd4a832701684af44b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20S=C3=BCtterlin?= Date: Sat, 26 Jul 2025 01:08:16 +0000 Subject: [PATCH 024/180] fix: Empty App Links The return value of the function caused a warning in header.inc.php:42 if no additional links were set. header.inc.php is the only caller of this function, thus it is safe to return an empty array here. --- data/web/inc/functions.customize.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/web/inc/functions.customize.inc.php b/data/web/inc/functions.customize.inc.php index 1d19066d2..56527ff96 100644 --- a/data/web/inc/functions.customize.inc.php +++ b/data/web/inc/functions.customize.inc.php @@ -293,7 +293,7 @@ function customize($_action, $_item, $_data = null) { } if (empty($app_links)){ - return false; + return []; } // convert from old style From ad9b328ed56316efbfb8606088897194ba2bb20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20S=C3=BCtterlin?= Date: Sat, 26 Jul 2025 01:12:48 +0000 Subject: [PATCH 025/180] fix: Undefined array key "pending_tfa_methods" in /web/inc/footer.inc.php on line 29 --- data/web/inc/footer.inc.php | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/data/web/inc/footer.inc.php b/data/web/inc/footer.inc.php index ac1bff033..ecc4ddce1 100644 --- a/data/web/inc/footer.inc.php +++ b/data/web/inc/footer.inc.php @@ -26,23 +26,25 @@ if (is_array($alertbox_log_parser)) { // map tfa details for twig $pending_tfa_authmechs = []; -foreach($_SESSION['pending_tfa_methods'] as $authdata){ - $pending_tfa_authmechs[$authdata['authmech']] = false; -} -if (isset($pending_tfa_authmechs['webauthn'])) { - $pending_tfa_authmechs['webauthn'] = true; -} -if (!isset($pending_tfa_authmechs['webauthn']) - && isset($pending_tfa_authmechs['yubi_otp'])) { - $pending_tfa_authmechs['yubi_otp'] = true; -} -if (!isset($pending_tfa_authmechs['webauthn']) - && !isset($pending_tfa_authmechs['yubi_otp']) - && isset($pending_tfa_authmechs['totp'])) { - $pending_tfa_authmechs['totp'] = true; -} -if (isset($pending_tfa_authmechs['u2f'])) { - $pending_tfa_authmechs['u2f'] = true; +if (array_key_exists('pending_tfa_methods', $_SESSION)) { + foreach($_SESSION['pending_tfa_methods'] as $authdata){ + $pending_tfa_authmechs[$authdata['authmech']] = false; + } + if (isset($pending_tfa_authmechs['webauthn'])) { + $pending_tfa_authmechs['webauthn'] = true; + } + if (!isset($pending_tfa_authmechs['webauthn']) + && isset($pending_tfa_authmechs['yubi_otp'])) { + $pending_tfa_authmechs['yubi_otp'] = true; + } + if (!isset($pending_tfa_authmechs['webauthn']) + && !isset($pending_tfa_authmechs['yubi_otp']) + && isset($pending_tfa_authmechs['totp'])) { + $pending_tfa_authmechs['totp'] = true; + } + if (isset($pending_tfa_authmechs['u2f'])) { + $pending_tfa_authmechs['u2f'] = true; + } } // globals From 795bcdc5d225f69eb64793adedb10041f46953a2 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Sun, 27 Jul 2025 19:30:10 +0200 Subject: [PATCH 026/180] [Web] Updated lang.ru-ru.json (#6654) --- data/web/lang/lang.ru-ru.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/data/web/lang/lang.ru-ru.json b/data/web/lang/lang.ru-ru.json index e17327978..b0180256d 100644 --- a/data/web/lang/lang.ru-ru.json +++ b/data/web/lang/lang.ru-ru.json @@ -184,7 +184,7 @@ "excludes": "Исключает этих получателей", "f2b_ban_time": "Время бана (в секундах)", "f2b_ban_time_increment": "Время бана увеличивается с каждым баном", - "f2b_blacklist": "Черный список подсетей/хостов", + "f2b_blacklist": "Черный список сетей/хостов", "f2b_filter": "Правила фильтрации с помощью регулярных выражений", "f2b_list_info": "Хосты или подсети, занесенные в черный список, всегда будут перевешивать объекты из белого списка. Обновление списка займет несколько секунд.", "f2b_manage_external": "Внешнее управление Fail2Ban", @@ -196,7 +196,7 @@ "f2b_parameters": "Настройки Fail2ban", "f2b_regex_info": "Журналы которые принимаются во внимание: SOGo, Postfix, Dovecot, PHP-FPM.", "f2b_retry_window": "Промежуток времени для следующего бана (в секундах)", - "f2b_whitelist": "Белый список подсетей/хостов", + "f2b_whitelist": "Белый список сетей/хостов", "filter_table": "Поиск", "forwarding_hosts": "Переадресация хостов", "forwarding_hosts_add_hint": "Можно указывать: IPv4/IPv6 подсети в нотации CIDR, имена хостов (которые будут разрешаться в IP-адреса) или доменные имена (которые будут решаться с IP-адресами путем запроса SPF записей или, в случае их отсутствия - запросом MX записей).", @@ -319,7 +319,7 @@ "rspamd_global_filters": "Глобальные правила фильтрации", "rspamd_global_filters_agree": "Я понимаю, что я делаю, и буду осторожен!", "rspamd_global_filters_info": "Глобальные правила фильтрации содержат различные виды глобальных черных и белых списков.", - "rspamd_global_filters_regex": "Названия фильтров отражают их предназначение. Все правила должены состоять из регулярных выражений в формате \"/pattern/options\" (например: /.+@domain\\.tld/i).
\r\nНесмотря на то, что перед сохранением правил выполняется проверка регулярных выражений, функциональность Rspamds может быть нарушена, если будет использован
\r\n некорректный синтаксис. Будьте внимательны при написании правил.
Электронные письма от адресов электронной почты, проходящие по регулярным выражениям черных списков, будут отклонены без сохранения в карантин.
\r\n Rspamd попытается прочитать содержимое правил при их изменении. Но, если что, вы можете перезапустить Rspamd, чтобы принять последние изменения принудительно.", + "rspamd_global_filters_regex": "Названия фильтров отражают их предназначение. Все правила должны состоять из регулярных выражений в формате \"/pattern/options\" (например: /.+@domain\\.tld/i).
\nНесмотря на то, что перед сохранением правил выполняется проверка регулярных выражений, функциональность Rspamds может быть нарушена, если будет использован
\n некорректный синтаксис. Будьте внимательны при написании правил.
Электронные письма от адресов электронной почты, проходящие по регулярным выражениям черных списков, будут отклонены без сохранения в карантин.
\n Rspamd попытается прочитать содержимое правил при их изменении. Но, если что, вы можете перезапустить Rspamd, чтобы принять последние изменения принудительно.", "rspamd_settings_map": "Правила Rspamd", "sal_level": "Уровень Муу", "save": "Сохранить изменения", @@ -408,7 +408,8 @@ "iam_host": "Хост", "iam_host_info": "Укажите один или несколько LDAP-хостов через запятую.", "iam_import_users": "Импорт пользователей", - "admin_quicklink": "Скрыть ссылку на вход для администраторов" + "admin_quicklink": "Скрыть ссылку на вход для администраторов", + "needs_restart": "необходим перезапуск" }, "danger": { "access_denied": "Доступ запрещён, или указаны неверные данные", @@ -750,7 +751,7 @@ "sogo_visible_info": "Влияет только на объекты, которые могут отображаться в SOGo (персональные или общие псевдонимы, указывающие как минимум на один локальный почтовый аккаунт). Учтите, что если функция отключена, у пользователей не будет возможности выбрать адрес псевдонима в качестве отправителя в SOGo.", "spam_alias": "Создать или изменить временные (спам) псевдонимы", "spam_filter": "Спам фильтр", - "spam_policy": "Добавление или удаление элементов в белом/черном списке", + "spam_policy": "Добавить или удалить элементы белого/черного списка", "spam_score": "Задать индивидуальное определение спама", "subfolder2": "Синхронизировать в подпапку
(пусто = в корень)", "syncjob": "Изменить задание синхронизации", @@ -1039,7 +1040,7 @@ "notified": "Увед.", "qhandler_success": "Запрос успешно отправлен в систему. Теперь вы можете закрыть окно.", "qid": "Rspamd QID", - "qinfo": "Карантин сохраняет входящие сообщения, классифицированные как нежелательные, в базу данных.\r\n
Отправители писем, которые помечены как отвергнутые, будут уверены что их письма не были доставлены вам.\r\n
\"Освободить из карантина\" изучит сообщение как полезную почту; по теореме Байеса и доставит его вам в Inbox.\r\n
\"Запомнить как спам и удалить\" изучит сообщение как спам по теореме Байеса, а также вычислит нечёткие хэши, чтобы лучше блокировать подобные сообщения в дальнейшем.\r\n
Учтите, что в зависимости от технических характеристик вашей системы, изучение большого количества сообщений может занять много времени.", + "qinfo": "Карантин сохраняет входящие сообщения, классифицированные как нежелательные, в базу данных.\n
Отправители писем, которые помечены как отвергнутые, будут уверены что их письма не были доставлены вам.\n
\"Освободить из карантина\" изучит сообщение как полезную почту; по теореме Байеса и доставит его вам в Inbox.\n
\"Запомнить как спам и удалить\" изучит сообщение как спам по теореме Байеса, а также вычислит нечёткие хэши, чтобы лучше блокировать подобные сообщения в дальнейшем.\n
Учтите, что в зависимости от технических характеристик вашей системы, изучение большого количества сообщений может занять много времени.", "qitem": "Обьект карантина", "quarantine": "Карантин", "quick_actions": "Действия", From 2e9ba1e9b31deec42b0cbdde4889bce3fb4a91b1 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Tue, 5 Aug 2025 00:37:47 +0200 Subject: [PATCH 027/180] update postscreen_access.cidr (#6660) --- data/conf/postfix/postscreen_access.cidr | 38 ++++++++++++++++-------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr index 259bd062b..4453feca3 100644 --- a/data/conf/postfix/postscreen_access.cidr +++ b/data/conf/postfix/postscreen_access.cidr @@ -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/ -# 2105 total rules +# 2166 total rules 2a00:1450:4000::/36 permit 2a01:111:f400::/48 permit 2a01:111:f403:8000::/50 permit @@ -42,7 +42,7 @@ 8.40.222.0/23 permit 8.40.222.250/31 permit 12.130.86.238 permit -13.107.246.51 permit +13.107.253.40 permit 13.110.208.0/21 permit 13.110.209.0/24 permit 13.110.216.0/22 permit @@ -120,7 +120,6 @@ 27.123.206.56/29 permit 27.123.206.76/30 permit 27.123.206.80/28 permit -31.25.48.222 permit 31.47.251.17 permit 31.186.239.0/24 permit 34.2.64.0/22 permit @@ -156,6 +155,7 @@ 34.218.115.239 permit 34.218.116.3 permit 34.225.212.172 permit +34.241.242.183 permit 35.83.148.184 permit 35.155.198.111 permit 35.158.23.94 permit @@ -256,6 +256,7 @@ 50.112.246.219 permit 52.1.14.157 permit 52.5.230.59 permit +52.6.74.205 permit 52.12.53.23 permit 52.13.214.179 permit 52.26.1.71 permit @@ -329,7 +330,6 @@ 62.13.144.0/21 permit 62.13.152.0/21 permit 62.17.146.128/26 permit -62.179.121.0/24 permit 62.201.172.0/27 permit 62.201.172.32/27 permit 62.253.227.114 permit @@ -352,6 +352,7 @@ 64.127.115.252 permit 64.132.88.0/23 permit 64.132.92.0/24 permit +64.181.194.190 permit 64.207.219.7 permit 64.207.219.8 permit 64.207.219.9 permit @@ -408,7 +409,6 @@ 65.154.166.0/24 permit 65.212.180.36 permit 66.102.0.0/20 permit -66.102.0.0/21 permit 66.119.150.192/26 permit 66.163.184.0/24 permit 66.163.185.0/24 permit @@ -658,9 +658,6 @@ 82.165.159.45 permit 82.165.159.130 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 86.61.88.25 permit 87.238.80.0/21 permit @@ -701,12 +698,13 @@ 87.248.117.205 permit 87.253.232.0/21 permit 89.22.108.0/24 permit +91.198.2.0/24 permit 91.211.240.0/22 permit -94.169.2.0/23 permit 94.236.119.0/26 permit 94.245.112.0/27 permit 94.245.112.10/31 permit 95.131.104.0/21 permit +95.217.114.154 permit 96.43.144.0/20 permit 96.43.144.64/28 permit 96.43.144.64/31 permit @@ -1344,7 +1342,7 @@ 108.174.6.215 permit 108.175.18.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.179.144.0/20 permit 109.237.142.0/24 permit @@ -1429,6 +1427,8 @@ 132.226.26.225 permit 132.226.49.32 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.113.0/26 permit 134.170.141.64/26 permit @@ -1618,10 +1618,14 @@ 168.245.127.231 permit 169.148.129.0/24 permit 169.148.131.0/24 permit +169.148.138.0/24 permit 169.148.142.10 permit 169.148.144.0/25 permit 169.148.144.10 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 170.10.128.0/24 permit 170.10.129.0/24 permit @@ -1662,6 +1666,8 @@ 182.50.78.64/28 permit 183.240.219.64/29 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.28.196.0/22 permit 185.58.84.93 permit @@ -1672,6 +1678,8 @@ 185.138.56.128/25 permit 185.189.236.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.239.148 permit 185.250.239.168 permit @@ -1746,6 +1754,9 @@ 193.109.254.0/23 permit 193.122.128.100 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.64.234.129 permit 194.97.196.0/24 permit @@ -1865,6 +1876,8 @@ 204.92.114.187 permit 204.92.114.203 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.220.160.0/21 permit 204.220.168.0/21 permit @@ -2039,7 +2052,8 @@ 212.227.126.225 permit 212.227.126.226 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.145 permit 213.199.138.181 permit From 7557802933e3f454acae79fcd684441695c7b376 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Tue, 5 Aug 2025 06:37:55 +0200 Subject: [PATCH 028/180] [Web] Updated lang.de-de.json (#6661) Co-authored-by: whitehotaru --- data/web/lang/lang.de-de.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index df41b8946..5887499b3 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -198,8 +198,8 @@ "f2b_retry_window": "Wiederholungen im Zeitraum von (s)", "f2b_whitelist": "Allowliste für Netzwerke und Hosts", "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": "mailcow Login deaktivieren und nur Single Sign-On anzeigen", + "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", "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_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.", @@ -548,7 +548,8 @@ "yotp_verification_failed": "Yubico OTP-Verifizierung fehlgeschlagen: %s", "template_exists": "Vorlage %s existiert bereits", "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": { "collapse_all": "Alle Einklappen", @@ -942,7 +943,7 @@ "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_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", "relay_all": "Alle Empfänger-Adressen relayen", "relay_unknown": "Unbekannte Mailboxen relayen", @@ -1328,7 +1329,7 @@ "spamfilter": "Spamfilter", "spamfilter_behavior": "Bewertung", "spamfilter_bl": "Denyliste", - "spamfilter_bl_desc": "Für E-Mail-Adressen, die vom Spamfilter immer 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 immer 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_default_score": "Standardwert", "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\".", @@ -1340,7 +1341,7 @@ "spamfilter_table_remove": "Entfernen", "spamfilter_table_rule": "Regel", "spamfilter_wl": "Allowliste", - "spamfilter_wl_desc": "Für E-Mail-Adressen, die vom Spamfilter nicht 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 nicht 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", "status": "Status", "sync_jobs": "Sync Jobs", From 360fe0349734098bd9da75841c8cd221fbf8c32f Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 5 Aug 2025 16:01:47 +0200 Subject: [PATCH 029/180] sogo: update to 5.12.3 --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index f447dea4a..02ca8f9a2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -200,7 +200,7 @@ services: - phpfpm sogo-mailcow: - image: ghcr.io/mailcow/sogo:1.133 + image: ghcr.io/mailcow/sogo:1.134 environment: - DBNAME=${DBNAME} - DBUSER=${DBUSER} From 69420113f74bacf3264fd5bbb5c93202e4f43be8 Mon Sep 17 00:00:00 2001 From: Markus Machatschek Date: Wed, 6 Aug 2025 08:33:11 +0200 Subject: [PATCH 030/180] rspamd: update rspamd to 3.12.1 (#6643) * rspamd: update rspamd to 3.12.1 * compose: correct rspamd tag + pushed image --------- Co-authored-by: DerLinkman --- data/Dockerfiles/rspamd/Dockerfile | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/Dockerfiles/rspamd/Dockerfile b/data/Dockerfiles/rspamd/Dockerfile index 68b38d3a7..e46981aa4 100644 --- a/data/Dockerfiles/rspamd/Dockerfile +++ b/data/Dockerfiles/rspamd/Dockerfile @@ -2,7 +2,7 @@ FROM debian:bookworm-slim LABEL maintainer="The Infrastructure Company GmbH " ARG DEBIAN_FRONTEND=noninteractive -ARG RSPAMD_VER=rspamd_3.11.1-1~ab0b44951 +ARG RSPAMD_VER=rspamd_3.12.1-1~6dbfca2fa ARG CODENAME=bookworm ENV LC_ALL=C diff --git a/docker-compose.yml b/docker-compose.yml index 02ca8f9a2..e6b5dc20d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -84,7 +84,7 @@ services: - clamd rspamd-mailcow: - image: ghcr.io/mailcow/rspamd:2.2 + image: ghcr.io/mailcow/rspamd:2.3 stop_grace_period: 30s depends_on: - dovecot-mailcow From 1fc36263dce6312b0b7e403089d3880411cb1e1a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:33:41 +0200 Subject: [PATCH 031/180] chore(deps): update dependency krakjoe/apcu to v5.1.26 (#6656) Signed-off-by: milkmaker Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- data/Dockerfiles/phpfpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile index ff333f5b3..6d0cfdd36 100644 --- a/data/Dockerfiles/phpfpm/Dockerfile +++ b/data/Dockerfiles/phpfpm/Dockerfile @@ -3,7 +3,7 @@ FROM php:8.2-fpm-alpine3.21 LABEL maintainer = "The Infrastructure Company GmbH " # renovate: datasource=github-tags depName=krakjoe/apcu versioning=semver-coerced extractVersion=^v(?.*)$ -ARG APCU_PECL_VERSION=5.1.24 +ARG APCU_PECL_VERSION=5.1.26 # renovate: datasource=github-tags depName=Imagick/imagick versioning=semver-coerced extractVersion=(?.*)$ ARG IMAGICK_PECL_VERSION=3.8.0 # renovate: datasource=github-tags depName=php/pecl-mail-mailparse versioning=semver-coerced extractVersion=^v(?.*)$ From 728fcdb37537eab42bd7f00da30ec35f3a2f1805 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:34:30 +0200 Subject: [PATCH 032/180] Update dependency tianon/gosu to v1.17 (#6640) Signed-off-by: milkmaker Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- data/Dockerfiles/dovecot/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Dockerfiles/dovecot/Dockerfile b/data/Dockerfiles/dovecot/Dockerfile index 9e49d88cc..10e141ab8 100644 --- a/data/Dockerfiles/dovecot/Dockerfile +++ b/data/Dockerfiles/dovecot/Dockerfile @@ -3,7 +3,7 @@ FROM alpine:3.21 LABEL maintainer="The Infrastructure Company GmbH " # renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced extractVersion=^(?.*)$ -ARG GOSU_VERSION=1.16 +ARG GOSU_VERSION=1.17 ENV LANG=C.UTF-8 ENV LC_ALL=C.UTF-8 From 14d58c8163b2b8d210e08adc1d1b32e294f6ebcc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:34:53 +0200 Subject: [PATCH 033/180] Update dependency phpredis/phpredis to v6.2.0 (#6639) Signed-off-by: milkmaker Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- data/Dockerfiles/phpfpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile index 6d0cfdd36..483b90fcb 100644 --- a/data/Dockerfiles/phpfpm/Dockerfile +++ b/data/Dockerfiles/phpfpm/Dockerfile @@ -11,7 +11,7 @@ ARG MAILPARSE_PECL_VERSION=3.1.8 # renovate: datasource=github-tags depName=php-memcached-dev/php-memcached versioning=semver-coerced extractVersion=^v(?.*)$ ARG MEMCACHED_PECL_VERSION=3.2.0 # renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced extractVersion=(?.*)$ -ARG REDIS_PECL_VERSION=6.1.0 +ARG REDIS_PECL_VERSION=6.2.0 # renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced extractVersion=(?.*)$ ARG COMPOSER_VERSION=2.8.6 From 3803b5d3513ed64177bcef067b768408dab10fc2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:35:14 +0200 Subject: [PATCH 034/180] Update dependency php-memcached-dev/php-memcached to v3.3.0 (#6638) Signed-off-by: milkmaker Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- data/Dockerfiles/phpfpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile index 483b90fcb..e7b43790b 100644 --- a/data/Dockerfiles/phpfpm/Dockerfile +++ b/data/Dockerfiles/phpfpm/Dockerfile @@ -9,7 +9,7 @@ ARG IMAGICK_PECL_VERSION=3.8.0 # renovate: datasource=github-tags depName=php/pecl-mail-mailparse versioning=semver-coerced extractVersion=^v(?.*)$ ARG MAILPARSE_PECL_VERSION=3.1.8 # renovate: datasource=github-tags depName=php-memcached-dev/php-memcached versioning=semver-coerced extractVersion=^v(?.*)$ -ARG MEMCACHED_PECL_VERSION=3.2.0 +ARG MEMCACHED_PECL_VERSION=3.3.0 # renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced extractVersion=(?.*)$ ARG REDIS_PECL_VERSION=6.2.0 # renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced extractVersion=(?.*)$ From 88bf9b02e112bced1d37c69a885d8dbad4cd657a Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Wed, 6 Aug 2025 08:36:40 +0200 Subject: [PATCH 035/180] core: modules splitting + ipv6 nat rewrite (#6634) * ipv6: added ipv6 detection + removed ip6 nat container * nginx: renamed DISABLE_IPv6 to ENABLE_IPV6 to align * initial commit for script overhauls * rewrite to scripts after testing (improved error handling) * fixed missing fi in update.sh * fixed/added comments for modules * fix broken EXIT_CODE var handling * added jq as dependancy * fixed docker version check for daemon * improved _modules handling while running * reintegrated module loading (update.sh) * added error handling for blank daemon.json * adapted removal of ACME_CONTACT for nightly * move detect_major_update func to core submodule * removed unnecessary message on every call of function * Update _modules/scripts/new_options.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update _modules/scripts/core.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * improve ENABLE_IPV6 check in nginx bootstrap * improve detection of ENABLE_IPV6 * ip6_controller: moved docker major detection upwards * Update _modules/scripts/new_options.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update _modules/scripts/new_options.sh Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * reuse DOCKER_MAJOR Variable in ip6_controller * fix some smaller typos in update.sh * smaller bugfixes in submodules * completely remove ACME_CONTACT Variable --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- _modules/scripts/core.sh | 223 +++++ _modules/scripts/ipv6_controller.sh | 168 ++++ _modules/scripts/migrate_options.sh | 96 +++ _modules/scripts/new_options.sh | 299 +++++++ data/Dockerfiles/nginx/bootstrap.py | 4 +- docker-compose.yml | 35 +- generate_config.sh | 104 +-- update.sh | 1227 ++------------------------- 8 files changed, 869 insertions(+), 1287 deletions(-) create mode 100644 _modules/scripts/core.sh create mode 100644 _modules/scripts/ipv6_controller.sh create mode 100644 _modules/scripts/migrate_options.sh create mode 100644 _modules/scripts/new_options.sh diff --git a/_modules/scripts/core.sh b/_modules/scripts/core.sh new file mode 100644 index 000000000..42133aa6b --- /dev/null +++ b/_modules/scripts/core.sh @@ -0,0 +1,223 @@ +#!/usr/bin/env bash +# _modules/scripts/core.sh +# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY! +# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!! + +# ANSI color for red errors +RED='\e[31m' +GREEN='\e[32m' +YELLOW='\e[33m' +BLUE='\e[34m' +MAGENTA='\e[35m' +LIGHT_RED='\e[91m' +LIGHT_GREEN='\e[92m' +NC='\e[0m' + +caller="${BASH_SOURCE[1]##*/}" + +get_installed_tools(){ + for bin in openssl curl docker git awk sha1sum grep cut jq; do + if [[ -z $(command -v ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi + 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 + # This will also cover sort + if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo -e "${LIGHT_RED}BusyBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\"${NC}"; exit 1; fi + if sed --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo -e "${LIGHT_RED}BusyBox sed detected, please install gnu sed, \"apk add --no-cache --upgrade sed\"${NC}"; exit 1; fi +} + +get_docker_version(){ + # Check Docker Version (need at least 24.X) + docker_version=$(docker version --format '{{.Server.Version}}' | cut -d '.' -f 1) +} + +get_compose_type(){ + if docker compose > /dev/null 2>&1; then + if docker compose version --short | grep -e "^2." -e "^v2." > /dev/null 2>&1; then + COMPOSE_VERSION=native + COMPOSE_COMMAND="docker compose" + if [[ "$caller" == "update.sh" ]]; then + sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=native/' "$SCRIPT_DIR/mailcow.conf" + fi + echo -e "\e[33mFound Docker Compose Plugin (native).\e[0m" + echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to native\e[0m" + sleep 2 + echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m" + else + echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" + echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m" + exit 1 + fi + elif docker-compose > /dev/null 2>&1; then + if ! [[ $(alias docker-compose 2> /dev/null) ]] ; then + if docker-compose version --short | grep "^2." > /dev/null 2>&1; then + COMPOSE_VERSION=standalone + COMPOSE_COMMAND="docker-compose" + if [[ "$caller" == "update.sh" ]]; then + sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=standalone/' "$SCRIPT_DIR/mailcow.conf" + fi + echo -e "\e[33mFound Docker Compose Standalone.\e[0m" + echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m" + sleep 2 + echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m" + else + echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" + echo -e "\e[31mPlease update/install manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m" + exit 1 + fi + fi + else + echo -e "\e[31mCannot find Docker Compose.\e[0m" + echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/install/\e[0m" + exit 1 + fi +} + +detect_bad_asn() { + echo -e "\e[33mDetecting if your IP is listed on Spamhaus Bad ASN List...\e[0m" + response=$(curl --connect-timeout 15 --max-time 30 -s -o /dev/null -w "%{http_code}" "https://asn-check.mailcow.email") + if [ "$response" -eq 503 ]; then + if [ -z "$SPAMHAUS_DQS_KEY" ]; then + echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m" + echo -e "\e[33mmailcow did not detected a value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf!\e[0m" + sleep 2 + echo "" + echo -e "\e[33mTo use the Spamhaus DNS Blocklists again, you will need to create a FREE account for their Data Query Service (DQS) at: https://www.spamhaus.com/free-trial/sign-up-for-a-free-data-query-service-account\e[0m" + echo -e "\e[33mOnce done, enter your DQS API key in mailcow.conf and mailcow will do the rest for you!\e[0m" + echo "" + sleep 2 + else + echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m" + echo -e "\e[32mmailcow detected a Value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf. Postfix will use DQS with the given API key...\e[0m" + fi + elif [ "$response" -eq 200 ]; then + echo -e "\e[33mCheck completed! Your IP is \e[32mclean\e[0m" + elif [ "$response" -eq 429 ]; then + echo -e "\e[33mCheck completed! \e[31mYour IP seems to be rate limited on the ASN Check service... please try again later!\e[0m" + else + echo -e "\e[31mCheck failed! \e[0mMaybe a DNS or Network problem?\e[0m" + fi +} + +check_online_status() { + CHECK_ONLINE_DOMAINS=('https://github.com' 'https://hub.docker.com') + for domain in "${CHECK_ONLINE_DOMAINS[@]}"; do + if timeout 6 curl --head --silent --output /dev/null ${domain}; then + return 0 + fi + done + return 1 +} + +prefetch_images() { + [[ -z ${BRANCH} ]] && { echo -e "\e[33m\nUnknown branch...\e[0m"; exit 1; } + git fetch origin #${BRANCH} + while read image; do + RET_C=0 + until docker pull "${image}"; do + RET_C=$((RET_C + 1)) + echo -e "\e[33m\nError pulling $image, retrying...\e[0m" + [ ${RET_C} -gt 3 ] && { echo -e "\e[31m\nToo many failed retries, exiting\e[0m"; exit 1; } + sleep 1 + done + done < <(git show "origin/${BRANCH}:docker-compose.yml" | grep "image:" | awk '{ gsub("image:","", $3); print $2 }') +} + +docker_garbage() { + SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )" + IMGS_TO_DELETE=() + + declare -A IMAGES_INFO + COMPOSE_IMAGES=($(grep -oP "image: \K(ghcr\.io/)?mailcow.+" "${SCRIPT_DIR}/docker-compose.yml")) + + for existing_image in $(docker images --format "{{.ID}}:{{.Repository}}:{{.Tag}}" | grep -E '(mailcow/|ghcr\.io/mailcow/)'); do + ID=$(echo "$existing_image" | cut -d ':' -f 1) + REPOSITORY=$(echo "$existing_image" | cut -d ':' -f 2) + TAG=$(echo "$existing_image" | cut -d ':' -f 3) + + if [[ "$REPOSITORY" == "mailcow/backup" || "$REPOSITORY" == "ghcr.io/mailcow/backup" ]]; then + if [[ "$TAG" != "" ]]; then + continue + fi + fi + + if [[ " ${COMPOSE_IMAGES[@]} " =~ " ${REPOSITORY}:${TAG} " ]]; then + continue + else + IMGS_TO_DELETE+=("$ID") + IMAGES_INFO["$ID"]="$REPOSITORY:$TAG" + fi + done + + if [[ ! -z ${IMGS_TO_DELETE[*]} ]]; then + echo "The following unused mailcow images were found:" + for id in "${IMGS_TO_DELETE[@]}"; do + echo " ${IMAGES_INFO[$id]} ($id)" + done + + if [ -z "$FORCE" ]; then + read -r -p "Do you want to delete them to free up some space? [y/N] " response + if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then + docker rmi ${IMGS_TO_DELETE[*]} + else + echo "OK, skipped." + fi + else + echo "Running in forced mode! Force removing old mailcow images..." + docker rmi ${IMGS_TO_DELETE[*]} + fi + echo -e "\e[32mFurther cleanup...\e[0m" + echo "If you want to cleanup further garbage collected by Docker, please make sure all containers are up and running before cleaning your system by executing \"docker system prune\"" + fi +} + +in_array() { + local e match="$1" + shift + for e; do [[ "$e" == "$match" ]] && return 0; done + 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 +} \ No newline at end of file diff --git a/_modules/scripts/ipv6_controller.sh b/_modules/scripts/ipv6_controller.sh new file mode 100644 index 000000000..7fe7d3cbd --- /dev/null +++ b/_modules/scripts/ipv6_controller.sh @@ -0,0 +1,168 @@ +#!/usr/bin/env bash +# _modules/scripts/ipv6_controller.sh +# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY! +# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!! + +# 1) Check if the host supports IPv6 +get_ipv6_support() { + if grep -qs '^1' /proc/sys/net/ipv6/conf/all/disable_ipv6 2>/dev/null \ + || ! ip -6 route show default &>/dev/null; then + DETECTED_IPV6=false + echo -e "${YELLOW}IPv6 not detected on host – ${LIGHT_RED}disabling IPv6 support${YELLOW}.${NC}" + else + DETECTED_IPV6=true + echo -e "IPv6 detected on host – ${LIGHT_GREEN}leaving IPv6 support enabled${YELLOW}.${NC}" + fi +} + +# 2) Ensure Docker daemon.json has (or create) the required IPv6 settings +docker_daemon_edit(){ + DOCKER_DAEMON_CONFIG="/etc/docker/daemon.json" + DOCKER_MAJOR=$(docker version --format '{{.Server.Version}}' 2>/dev/null | cut -d. -f1) + MISSING=() + + _has_kv() { grep -Eq "\"$1\"\s*:\s*$2" "$DOCKER_DAEMON_CONFIG" 2>/dev/null; } + + if [[ -f "$DOCKER_DAEMON_CONFIG" ]]; then + + # reject empty or whitespace-only file immediately + if [[ ! -s "$DOCKER_DAEMON_CONFIG" ]] || ! grep -Eq '[{}]' "$DOCKER_DAEMON_CONFIG"; then + echo -e "${RED}ERROR: $DOCKER_DAEMON_CONFIG exists but is empty or contains no JSON braces – please initialize it with valid JSON (e.g. {}).${NC}" + exit 1 + fi + + # Validate JSON if jq is present + if command -v jq &>/dev/null && ! jq empty "$DOCKER_DAEMON_CONFIG" &>/dev/null; then + echo -e "${RED}ERROR: Invalid JSON in $DOCKER_DAEMON_CONFIG – please correct manually.${NC}" + exit 1 + fi + + # Gather missing keys + ! _has_kv ipv6 true && MISSING+=("ipv6: true") + ! grep -Eq '"fixed-cidr-v6"\s*:\s*".+"' "$DOCKER_DAEMON_CONFIG" \ + && MISSING+=('fixed-cidr-v6: "fd00:dead:beef:c0::/80"') + if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -ge 27 ]]; then + _has_kv ipv6 true && ! _has_kv ip6tables true && MISSING+=("ip6tables: true") + ! _has_kv experimental true && MISSING+=("experimental: true") + fi + + # Fix if needed + if ((${#MISSING[@]}>0)); then + echo -e "${MAGENTA}Your daemon.json is missing: ${YELLOW}${MISSING[*]}${NC}" + if [[ -n "$FORCE" ]]; then + ans=Y + else + read -p "Would you like to update $DOCKER_DAEMON_CONFIG now? [Y/n] " ans + ans=${ans:-Y} + fi + + if [[ $ans =~ ^[Yy]$ ]]; then + cp "$DOCKER_DAEMON_CONFIG" "${DOCKER_DAEMON_CONFIG}.bak" + if command -v jq &>/dev/null; then + TMP=$(mktemp) + JQ_FILTER='.ipv6 = true | .["fixed-cidr-v6"] = "fd00:dead:beef:c0::/80"' + [[ "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]] \ + && JQ_FILTER+=' | .ip6tables = true | .experimental = true' + jq "$JQ_FILTER" "$DOCKER_DAEMON_CONFIG" >"$TMP" && mv "$TMP" "$DOCKER_DAEMON_CONFIG" + echo -e "${LIGHT_GREEN}daemon.json updated. Restarting Docker...${NC}" + (command -v systemctl &>/dev/null && systemctl restart docker) || service docker restart + echo -e "${YELLOW}Docker restarted.${NC}" + else + echo -e "${RED}Please install jq or manually update daemon.json and restart Docker.${NC}" + exit 1 + fi + else + echo -e "${YELLOW}User declined Docker update – please insert these changes manually:${NC}" + echo "${MISSING[*]}" + exit 1 + fi + fi + + else + # Create new daemon.json if missing + if [[ -n "$FORCE" ]]; then + ans=Y + else + read -p "$DOCKER_DAEMON_CONFIG not found. Create it with IPv6 settings? [Y/n] " ans + ans=${ans:-Y} + fi + + if [[ $ans =~ ^[Yy]$ ]]; then + if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -lt 27 ]]; then + cat > "$DOCKER_DAEMON_CONFIG" < "$DOCKER_DAEMON_CONFIG" </dev/null && systemctl restart docker) || service docker restart + echo "Docker restarted." + else + echo "User declined to create daemon.json – please manually merge the docker daemon with these configs:" + echo "${MISSING[*]}" + exit 1 + fi + fi +} + +# 3) Main wrapper for generate_config.sh and update.sh +configure_ipv6() { + # detect manual override if mailcow.conf is present + if [[ -n "$MAILCOW_CONF" && -f "$MAILCOW_CONF" ]] && grep -q '^ENABLE_IPV6=' "$MAILCOW_CONF"; then + MANUAL_SETTING=$(grep '^ENABLE_IPV6=' "$MAILCOW_CONF" | cut -d= -f2) + elif [[ -z "$MAILCOW_CONF" ]] && [[ ! -z "${ENABLE_IPV6:-}" ]]; then + MANUAL_SETTING="$ENABLE_IPV6" + else + MANUAL_SETTING="" + fi + + get_ipv6_support + + # if user manually set it, check for mismatch + if [[ -n "$MANUAL_SETTING" ]]; then + if [[ "$MANUAL_SETTING" == "false" && "$DETECTED_IPV6" == "true" ]]; then + echo -e "${RED}ERROR: You have ENABLE_IPV6=false but your host and Docker support IPv6.${NC}" + echo -e "${RED}This can create an open relay. Please set ENABLE_IPV6=true in your mailcow.conf and re-run.${NC}" + exit 1 + elif [[ "$MANUAL_SETTING" == "true" && "$DETECTED_IPV6" == "false" ]]; then + echo -e "${RED}ERROR: You have ENABLE_IPV6=true but your host does not support IPv6.${NC}" + echo -e "${RED}Please disable or fix your host/Docker IPv6 support, or set ENABLE_IPV6=false.${NC}" + exit 1 + else + return + fi + fi + + # no manual override: proceed to set or export + if [[ "$DETECTED_IPV6" == "true" ]]; then + docker_daemon_edit + else + echo "Skipping Docker IPv6 configuration because host does not support IPv6." + fi + + # now write into mailcow.conf or export + if [[ -n "$MAILCOW_CONF" && -f "$MAILCOW_CONF" ]]; then + LINE="ENABLE_IPV6=$DETECTED_IPV6" + if grep -q '^ENABLE_IPV6=' "$MAILCOW_CONF"; then + sed -i "s/^ENABLE_IPV6=.*/$LINE/" "$MAILCOW_CONF" + else + echo "$LINE" >> "$MAILCOW_CONF" + fi + else + export IPV6_BOOL="$DETECTED_IPV6" + fi + + echo "IPv6 configuration complete: ENABLE_IPV6=$DETECTED_IPV6" +} \ No newline at end of file diff --git a/_modules/scripts/migrate_options.sh b/_modules/scripts/migrate_options.sh new file mode 100644 index 000000000..6a584b9f7 --- /dev/null +++ b/_modules/scripts/migrate_options.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +# _modules/scripts/migrate_options.sh +# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY! +# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!! + +migrate_config_options() { + + sed -i --follow-symlinks '$a\' mailcow.conf + + KEYS=( + SOLR_HEAP + SKIP_SOLR + SOLR_PORT + FLATCURVE_EXPERIMENTAL + DISABLE_IPv6 + ACME_CONTACT + ) + + for key in "${KEYS[@]}"; do + if grep -q "${key}" mailcow.conf; then + case "${key}" in + SOLR_HEAP) + echo "Removing ${key} in mailcow.conf" + sed -i '/# Solr heap size in MB\b/d' mailcow.conf + sed -i '/# Solr is a prone to run\b/d' mailcow.conf + sed -i '/SOLR_HEAP\b/d' mailcow.conf + ;; + SKIP_SOLR) + echo "Removing ${key} in mailcow.conf" + sed -i '/\bSkip Solr on low-memory\b/d' mailcow.conf + sed -i '/\bSolr is disabled by default\b/d' mailcow.conf + sed -i '/\bDisable Solr or\b/d' mailcow.conf + sed -i '/\bSKIP_SOLR\b/d' mailcow.conf + ;; + SOLR_PORT) + echo "Removing ${key} in mailcow.conf" + sed -i '/\bSOLR_PORT\b/d' mailcow.conf + ;; + FLATCURVE_EXPERIMENTAL) + echo "Removing ${key} in mailcow.conf" + sed -i '/\bFLATCURVE_EXPERIMENTAL\b/d' mailcow.conf + ;; + DISABLE_IPv6) + echo "Migrating ${key} to ENABLE_IPv6 in mailcow.conf" + local old=$(grep '^DISABLE_IPv6=' "mailcow.conf" | cut -d'=' -f2) + local new + if [[ "$old" == "y" ]]; then + new="false" + else + new="true" + fi + sed -i '/^DISABLE_IPv6=/d' "mailcow.conf" + echo "ENABLE_IPV6=$new" >> "mailcow.conf" + ;; + ACME_CONTACT) + echo "Deleting obsoleted ${key} in mailcow.conf" + sed -i '/^# Lets 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 + ;; + esac + fi + done + + solr_volume=$(docker volume ls -qf name=^${COMPOSE_PROJECT_NAME}_solr-vol-1) + if [[ -n $solr_volume ]]; then + echo -e "\e[34mSolr has been replaced within mailcow since 2025-01.\nThe volume $solr_volume is unused.\e[0m" + sleep 1 + if [ ! "$FORCE" ]; then + read -r -p "Remove $solr_volume? [y/N] " response + if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then + echo -e "\e[33mRemoving $solr_volume...\e[0m" + docker volume rm $solr_volume || echo -e "\e[31mFailed to remove. Remove it manually!\e[0m" + echo -e "\e[32mSuccessfully removed $solr_volume!\e[0m" + else + echo -e "Not removing $solr_volume. Run \`docker volume rm $solr_volume\` manually if needed." + fi + else + echo -e "\e[33mForce removing $solr_volume...\e[0m" + docker volume rm $solr_volume || echo -e "\e[31mFailed to remove. Remove it manually!\e[0m" + echo -e "\e[32mSuccessfully removed $solr_volume!\e[0m" + fi + fi + + # Delete old fts.conf before forced switch to flatcurve to ensure update is working properly + FTS_CONF_PATH="${SCRIPT_DIR}/data/conf/dovecot/conf.d/fts.conf" + if [[ -f "$FTS_CONF_PATH" ]]; then + if grep -q "Autogenerated by mailcow" "$FTS_CONF_PATH"; then + rm -rf $FTS_CONF_PATH + fi + fi +} \ No newline at end of file diff --git a/_modules/scripts/new_options.sh b/_modules/scripts/new_options.sh new file mode 100644 index 000000000..a3f47dc61 --- /dev/null +++ b/_modules/scripts/new_options.sh @@ -0,0 +1,299 @@ +#!/usr/bin/env bash +# _modules/scripts/new_options.sh +# THIS SCRIPT IS DESIGNED TO BE RUNNING BY MAILCOW SCRIPTS ONLY! +# DO NOT, AGAIN, NOT TRY TO RUN THIS SCRIPT STANDALONE!!!!!! + +adapt_new_options() { + + CONFIG_ARRAY=( + "AUTODISCOVER_SAN" + "SKIP_LETS_ENCRYPT" + "SKIP_SOGO" + "USE_WATCHDOG" + "WATCHDOG_NOTIFY_EMAIL" + "WATCHDOG_NOTIFY_WEBHOOK" + "WATCHDOG_NOTIFY_WEBHOOK_BODY" + "WATCHDOG_NOTIFY_BAN" + "WATCHDOG_NOTIFY_START" + "WATCHDOG_EXTERNAL_CHECKS" + "WATCHDOG_SUBJECT" + "SKIP_CLAMD" + "SKIP_OLEFY" + "SKIP_IP_CHECK" + "ADDITIONAL_SAN" + "DOVEADM_PORT" + "IPV4_NETWORK" + "IPV6_NETWORK" + "LOG_LINES" + "SNAT_TO_SOURCE" + "SNAT6_TO_SOURCE" + "COMPOSE_PROJECT_NAME" + "DOCKER_COMPOSE_VERSION" + "SQL_PORT" + "API_KEY" + "API_KEY_READ_ONLY" + "API_ALLOW_FROM" + "MAILDIR_GC_TIME" + "MAILDIR_SUB" + "ACL_ANYONE" + "FTS_HEAP" + "FTS_PROCS" + "SKIP_FTS" + "ENABLE_SSL_SNI" + "ALLOW_ADMIN_EMAIL_LOGIN" + "SKIP_HTTP_VERIFICATION" + "SOGO_EXPIRE_SESSION" + "REDIS_PORT" + "REDISPASS" + "DOVECOT_MASTER_USER" + "DOVECOT_MASTER_PASS" + "MAILCOW_PASS_SCHEME" + "ADDITIONAL_SERVER_NAMES" + "WATCHDOG_VERBOSE" + "WEBAUTHN_ONLY_TRUSTED_VENDORS" + "SPAMHAUS_DQS_KEY" + "SKIP_UNBOUND_HEALTHCHECK" + "DISABLE_NETFILTER_ISOLATION_RULE" + "HTTP_REDIRECT" + "ENABLE_IPV6" + ) + + sed -i --follow-symlinks '$a\' mailcow.conf + for option in ${CONFIG_ARRAY[@]}; do + if grep -q "${option}" mailcow.conf; then + continue + fi + + echo "Adding new option \"${option}\" to mailcow.conf" + + case "${option}" in + AUTODISCOVER_SAN) + echo '# Obtain certificates for autodiscover.* and autoconfig.* domains.' >> mailcow.conf + echo '# This can be useful to switch off in case you are in a scenario where a reverse proxy already handles those.' >> mailcow.conf + echo '# There are mixed scenarios where ports 80,443 are occupied and you do not want to share certs' >> mailcow.conf + echo '# between services. So acme-mailcow obtains for maildomains and all web-things get handled' >> mailcow.conf + echo '# in the reverse proxy.' >> mailcow.conf + echo 'AUTODISCOVER_SAN=y' >> mailcow.conf + ;; + + DOCKER_COMPOSE_VERSION) + echo "# Used Docker Compose version" >> 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 "# 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 machine or mailcow will fail." >> mailcow.conf + echo "" >> mailcow.conf + echo "DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION}" >> mailcow.conf + ;; + + DOVEADM_PORT) + echo "DOVEADM_PORT=127.0.0.1:19991" >> mailcow.conf + ;; + + LOG_LINES) + echo '# Max log lines per service to keep in Redis logs' >> mailcow.conf + echo "LOG_LINES=9999" >> mailcow.conf + ;; + + IPV4_NETWORK) + echo '# Internal IPv4 /24 subnet, format n.n.n. (expands to n.n.n.0/24)' >> mailcow.conf + echo "IPV4_NETWORK=172.22.1" >> mailcow.conf + ;; + IPV6_NETWORK) + echo '# Internal IPv6 subnet in fc00::/7' >> mailcow.conf + echo "IPV6_NETWORK=fd4d:6169:6c63:6f77::/64" >> mailcow.conf + ;; + SQL_PORT) + echo '# Bind SQL to 127.0.0.1 on port 13306' >> mailcow.conf + echo "SQL_PORT=127.0.0.1:13306" >> mailcow.conf + ;; + API_KEY) + echo '# Create or override API key for web UI' >> mailcow.conf + echo "#API_KEY=" >> mailcow.conf + ;; + API_KEY_READ_ONLY) + echo '# Create or override read-only API key for web UI' >> mailcow.conf + echo "#API_KEY_READ_ONLY=" >> mailcow.conf + ;; + API_ALLOW_FROM) + echo '# Must be set for API_KEY to be active' >> mailcow.conf + echo '# IPs only, no networks (networks can be set via UI)' >> mailcow.conf + echo "#API_ALLOW_FROM=" >> mailcow.conf + ;; + SNAT_TO_SOURCE) + echo '# Use this IPv4 for outgoing connections (SNAT)' >> mailcow.conf + echo "#SNAT_TO_SOURCE=" >> mailcow.conf + ;; + SNAT6_TO_SOURCE) + echo '# Use this IPv6 for outgoing connections (SNAT)' >> mailcow.conf + echo "#SNAT6_TO_SOURCE=" >> mailcow.conf + ;; + MAILDIR_GC_TIME) + echo '# Garbage collector cleanup' >> mailcow.conf + echo '# Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring' >> mailcow.conf + echo '# How long should objects remain in the garbage until they are being deleted? (value in minutes)' >> mailcow.conf + echo '# Check interval is hourly' >> mailcow.conf + echo 'MAILDIR_GC_TIME=1440' >> mailcow.conf + ;; + ACL_ANYONE) + 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 '# 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 'ACL_ANYONE=disallow' >> mailcow.conf + ;; + FTS_HEAP) + echo '# Dovecot Indexing (FTS) Process maximum heap size in MB, there is no recommendation, please see Dovecot docs.' >> mailcow.conf + echo '# Flatcurve is used as FTS Engine. It is supposed to be pretty efficient in CPU and RAM consumption.' >> mailcow.conf + echo '# Please always monitor your Resource consumption!' >> mailcow.conf + echo "FTS_HEAP=128" >> mailcow.conf + ;; + SKIP_FTS) + echo '# Skip FTS (Fulltext Search) for Dovecot on low-memory, low-threaded systems or if you simply want to disable it.' >> mailcow.conf + echo "# Dovecot inside mailcow use Flatcurve as FTS Backend." >> mailcow.conf + echo "SKIP_FTS=y" >> mailcow.conf + ;; + FTS_PROCS) + echo '# Controls how many processes the Dovecot indexing process can spawn at max.' >> mailcow.conf + echo '# Too many indexing processes can use a lot of CPU and Disk I/O' >> mailcow.conf + echo '# Please visit: https://doc.dovecot.org/configuration_manual/service_configuration/#indexer-worker for more informations' >> mailcow.conf + echo "FTS_PROCS=1" >> mailcow.conf + ;; + ENABLE_SSL_SNI) + echo '# Create seperate certificates for all domains - y/n' >> mailcow.conf + echo '# this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames' >> mailcow.conf + echo '# see https://wiki.dovecot.org/SSL/SNIClientSupport' >> mailcow.conf + echo "ENABLE_SSL_SNI=n" >> mailcow.conf + ;; + SKIP_SOGO) + echo '# Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n' >> mailcow.conf + echo "SKIP_SOGO=n" >> mailcow.conf + ;; + MAILDIR_SUB) + echo '# MAILDIR_SUB defines a path in a users virtual home to keep the maildir in. Leave empty for updated setups.' >> mailcow.conf + echo "#MAILDIR_SUB=Maildir" >> mailcow.conf + echo "MAILDIR_SUB=" >> mailcow.conf + ;; + WATCHDOG_NOTIFY_WEBHOOK) + echo '# Send notifications to a webhook URL that receives a POST request with the content type "application/json".' >> mailcow.conf + echo '# You can use this to send notifications to services like Discord, Slack and others.' >> mailcow.conf + echo '#WATCHDOG_NOTIFY_WEBHOOK=https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' >> mailcow.conf + ;; + WATCHDOG_NOTIFY_WEBHOOK_BODY) + echo '# JSON body included in the webhook POST request. Needs to be in single quotes.' >> mailcow.conf + echo '# Following variables are available: SUBJECT, BODY' >> mailcow.conf + WEBHOOK_BODY='{"username": "mailcow Watchdog", "content": "**${SUBJECT}**\n${BODY}"}' + echo "#WATCHDOG_NOTIFY_WEBHOOK_BODY='${WEBHOOK_BODY}'" >> mailcow.conf + ;; + WATCHDOG_NOTIFY_BAN) + echo '# Notify about banned IP. Includes whois lookup.' >> mailcow.conf + echo "WATCHDOG_NOTIFY_BAN=y" >> mailcow.conf + ;; + WATCHDOG_NOTIFY_START) + echo '# Send a notification when the watchdog is started.' >> mailcow.conf + echo "WATCHDOG_NOTIFY_START=y" >> mailcow.conf + ;; + WATCHDOG_SUBJECT) + echo '# Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message.' >> mailcow.conf + echo "#WATCHDOG_SUBJECT=" >> mailcow.conf + ;; + WATCHDOG_EXTERNAL_CHECKS) + echo '# Checks if mailcow is an open relay. Requires a SAL. More checks will follow.' >> mailcow.conf + echo '# No data is collected. Opt-in and anonymous.' >> mailcow.conf + echo '# Will only work with unmodified mailcow setups.' >> mailcow.conf + echo "WATCHDOG_EXTERNAL_CHECKS=n" >> mailcow.conf + ;; + SOGO_EXPIRE_SESSION) + echo '# SOGo session timeout in minutes' >> mailcow.conf + echo "SOGO_EXPIRE_SESSION=480" >> mailcow.conf + ;; + REDIS_PORT) + echo "REDIS_PORT=127.0.0.1:7654" >> mailcow.conf + ;; + DOVECOT_MASTER_USER) + echo '# DOVECOT_MASTER_USER and _PASS must _both_ be provided. No special chars.' >> mailcow.conf + echo '# Empty by default to auto-generate master user and password on start.' >> mailcow.conf + echo '# User expands to DOVECOT_MASTER_USER@mailcow.local' >> mailcow.conf + echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf + echo "DOVECOT_MASTER_USER=" >> mailcow.conf + ;; + DOVECOT_MASTER_PASS) + echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf + echo "DOVECOT_MASTER_PASS=" >> mailcow.conf + ;; + MAILCOW_PASS_SCHEME) + echo '# Password hash algorithm' >> mailcow.conf + echo '# Only certain password hash algorithm are supported. For a fully list of supported schemes,' >> mailcow.conf + echo '# see https://docs.mailcow.email/models/model-passwd/' >> mailcow.conf + echo "MAILCOW_PASS_SCHEME=BLF-CRYPT" >> mailcow.conf + ;; + ADDITIONAL_SERVER_NAMES) + echo '# Additional server names for mailcow UI' >> mailcow.conf + echo '#' >> mailcow.conf + echo '# Specify alternative addresses for the mailcow UI to respond to' >> mailcow.conf + echo '# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.' >> mailcow.conf + echo '# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.' >> mailcow.conf + echo '# You can understand this as server_name directive in Nginx.' >> mailcow.conf + echo '# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f' >> mailcow.conf + echo 'ADDITIONAL_SERVER_NAMES=' >> mailcow.conf + ;; + WEBAUTHN_ONLY_TRUSTED_VENDORS) + echo "# WebAuthn device manufacturer verification" >> mailcow.conf + echo '# After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed' >> mailcow.conf + echo '# root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates' >> mailcow.conf + echo 'WEBAUTHN_ONLY_TRUSTED_VENDORS=n' >> mailcow.conf + ;; + SPAMHAUS_DQS_KEY) + echo "# Spamhaus Data Query Service Key" >> mailcow.conf + echo '# Optional: Leave empty for none' >> mailcow.conf + echo '# Enter your key here if you are using a blocked ASN (OVH, AWS, Cloudflare e.g) for the unregistered Spamhaus Blocklist.' >> mailcow.conf + echo '# If empty, it will completely disable Spamhaus blocklists if it detects that you are running on a server using a blocked AS.' >> mailcow.conf + echo '# Otherwise it will work as usual.' >> mailcow.conf + echo 'SPAMHAUS_DQS_KEY=' >> mailcow.conf + ;; + WATCHDOG_VERBOSE) + echo '# Enable watchdog verbose logging' >> mailcow.conf + echo 'WATCHDOG_VERBOSE=n' >> mailcow.conf + ;; + SKIP_UNBOUND_HEALTHCHECK) + echo '# Skip Unbound (DNS Resolver) Healthchecks (NOT Recommended!) - y/n' >> mailcow.conf + echo 'SKIP_UNBOUND_HEALTHCHECK=n' >> mailcow.conf + ;; + DISABLE_NETFILTER_ISOLATION_RULE) + echo '# Prevent netfilter from setting an iptables/nftables rule to isolate the mailcow docker network - y/n' >> mailcow.conf + echo '# CAUTION: Disabling this may expose container ports to other neighbors on the same subnet, even if the ports are bound to localhost' >> mailcow.conf + echo 'DISABLE_NETFILTER_ISOLATION_RULE=n' >> mailcow.conf + ;; + HTTP_REDIRECT) + echo '# Redirect HTTP connections to HTTPS - y/n' >> mailcow.conf + echo 'HTTP_REDIRECT=n' >> mailcow.conf + ;; + ENABLE_IPV6) + echo '# IPv6 Controller Section' >> mailcow.conf + echo '# This variable controls the usage of IPv6 within mailcow.' >> mailcow.conf + echo '# Can either be true or false | Defaults to true' >> mailcow.conf + echo '# WARNING: MAKE SURE TO PROPERLY CONFIGURE IPv6 ON YOUR HOST FIRST BEFORE ENABLING THIS AS FAULTY CONFIGURATIONS CAN LEAD TO OPEN RELAYS!' >> mailcow.conf + echo '# A COMPLETE DOCKER STACK REBUILD (compose down && compose up -d) IS NEEDED TO APPLY THIS.' >> mailcow.conf + echo ENABLE_IPV6=${IPV6_BOOL} >> mailcow.conf + ;; + + SKIP_CLAMD) + echo '# Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n' >> mailcow.conf + echo 'SKIP_CLAMD=n' >> mailcow.conf + ;; + + SKIP_OLEFY) + echo '# Skip Olefy (olefy-mailcow) anti-virus for Office documents (Rspamd will auto-detect a missing Olefy container) - y/n' >> mailcow.conf + echo 'SKIP_OLEFY=n' >> mailcow.conf + ;; + + REDISPASS) + echo "REDISPASS=$(LC_ALL=C /dev/null | head -c 28)" >> mailcow.conf + ;; + + *) + echo "${option}=" >> mailcow.conf + ;; + esac + done +} \ No newline at end of file diff --git a/data/Dockerfiles/nginx/bootstrap.py b/data/Dockerfiles/nginx/bootstrap.py index 11e6fc202..d2d01c0b9 100644 --- a/data/Dockerfiles/nginx/bootstrap.py +++ b/data/Dockerfiles/nginx/bootstrap.py @@ -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'])};" listen_plain_config = f"listen {template_vars['HTTP_PORT']};" listen_ssl_config = f"listen {template_vars['HTTPS_PORT']};" - if not template_vars['DISABLE_IPv6']: + if not template_vars['ENABLE_IPV6']: listen_plain_config += f"\nlisten [::]:{template_vars['HTTP_PORT']};" listen_ssl_config += f"\nlisten [::]:{template_vars['HTTPS_PORT']} ssl;" listen_ssl_config += "\nhttp2 on;" @@ -58,7 +58,7 @@ def prepare_template_vars(): 'SOGOHOST': os.getenv("SOGOHOST", ipv4_network + ".248"), 'RSPAMDHOST': os.getenv("RSPAMDHOST", "rspamd-mailcow"), 'PHPFPMHOST': os.getenv("PHPFPMHOST", "php-fpm-mailcow"), - 'DISABLE_IPv6': os.getenv("DISABLE_IPv6", "n").lower() in ("y", "yes"), + 'ENABLE_IPV6': os.getenv("ENABLE_IPV6", "true").lower() != "false", 'HTTP_REDIRECT': os.getenv("HTTP_REDIRECT", "n").lower() in ("y", "yes"), } diff --git a/docker-compose.yml b/docker-compose.yml index e6b5dc20d..c55158dbb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -394,7 +394,7 @@ services: - php-fpm-mailcow - sogo-mailcow - rspamd-mailcow - image: ghcr.io/mailcow/nginx:1.03 + image: ghcr.io/mailcow/nginx:1.04 dns: - ${IPV4_NETWORK:-172.22.1}.254 environment: @@ -405,7 +405,7 @@ services: - TZ=${TZ} - SKIP_SOGO=${SKIP_SOGO:-n} - SKIP_RSPAMD=${SKIP_RSPAMD:-n} - - DISABLE_IPv6=${DISABLE_IPv6:-n} + - ENABLE_IPV6=${ENABLE_IPV6:-true} - HTTP_REDIRECT=${HTTP_REDIRECT:-n} - PHPFPMHOST=${PHPFPMHOST:-} - SOGOHOST=${SOGOHOST:-} @@ -629,41 +629,12 @@ services: aliases: - ofelia - ipv6nat-mailcow: - depends_on: - - unbound-mailcow - - mysql-mailcow - - redis-mailcow - - clamd-mailcow - - rspamd-mailcow - - php-fpm-mailcow - - sogo-mailcow - - dovecot-mailcow - - postfix-mailcow - - memcached-mailcow - - nginx-mailcow - - acme-mailcow - - netfilter-mailcow - - watchdog-mailcow - - dockerapi-mailcow - environment: - - TZ=${TZ} - image: robbertkl/ipv6nat - security_opt: - - label=disable - restart: always - privileged: true - network_mode: "host" - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - /lib/modules:/lib/modules:ro - networks: mailcow-network: driver: bridge driver_opts: com.docker.network.bridge.name: br-mailcow - enable_ipv6: true + enable_ipv6: ${ENABLE_IPV6:-true} ipam: driver: default config: diff --git a/generate_config.sh b/generate_config.sh index 61b72109c..9610bf18d 100755 --- a/generate_config.sh +++ b/generate_config.sh @@ -1,32 +1,13 @@ #!/usr/bin/env bash +# Load mailcow Generic Scripts +source _modules/scripts/core.sh +source _modules/scripts/ipv6_controller.sh + set -o pipefail -if [[ "$(uname -r)" =~ ^4\.15\.0-60 ]]; then - echo "DO NOT RUN mailcow ON THIS UBUNTU KERNEL!"; - echo "Please update to 5.x or use another distribution." - exit 1 -fi - -if [[ "$(uname -r)" =~ ^4\.4\. ]]; then - if grep -q Ubuntu <<< "$(uname -a)"; then - echo "DO NOT RUN mailcow ON THIS UBUNTU KERNEL!"; - echo "Please update to linux-generic-hwe-16.04 by running \"apt-get install --install-recommends linux-generic-hwe-16.04\"" - exit 1 - fi -fi - -if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\""; exit 1; fi -# This will also cover sort -if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\""; exit 1; fi -if sed --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox sed detected, please install gnu sed, \"apk add --no-cache --upgrade sed\""; exit 1; fi - -for bin in openssl curl docker git awk sha1sum grep cut; do - if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi -done - -# Check Docker Version (need at least 24.X) -docker_version=$(docker version --format '{{.Server.Version}}' | cut -d '.' -f 1) +get_installed_tools +get_docker_version if [[ $docker_version -lt 24 ]]; then echo -e "\e[31mCannot find Docker with a Version higher or equals 24.0.0\e[0m" @@ -35,65 +16,7 @@ if [[ $docker_version -lt 24 ]]; then exit 1 fi -if docker compose > /dev/null 2>&1; then - if docker compose version --short | grep -e "^2." -e "^v2." > /dev/null 2>&1; then - COMPOSE_VERSION=native - echo -e "\e[33mFound Docker Compose Plugin (native).\e[0m" - echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to native\e[0m" - sleep 2 - echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m" - else - echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" - echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 - fi -elif docker-compose > /dev/null 2>&1; then - if ! [[ $(alias docker-compose 2> /dev/null) ]] ; then - if docker-compose version --short | grep "^2." > /dev/null 2>&1; then - COMPOSE_VERSION=standalone - echo -e "\e[33mFound Docker Compose Standalone.\e[0m" - echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m" - sleep 2 - echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m" - else - echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" - echo -e "\e[31mPlease update/install manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 - fi - fi - -else - echo -e "\e[31mCannot find Docker Compose.\e[0m" - echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 -fi - -detect_bad_asn() { - echo -e "\e[33mDetecting if your IP is listed on Spamhaus Bad ASN List...\e[0m" - response=$(curl --connect-timeout 15 --max-time 30 -s -o /dev/null -w "%{http_code}" "https://asn-check.mailcow.email") - if [ "$response" -eq 503 ]; then - if [ -z "$SPAMHAUS_DQS_KEY" ]; then - echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m" - echo -e "\e[33mmailcow did not detected a value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf!\e[0m" - sleep 2 - echo "" - echo -e "\e[33mTo use the Spamhaus DNS Blocklists again, you will need to create a FREE account for their Data Query Service (DQS) at: https://www.spamhaus.com/free-trial/sign-up-for-a-free-data-query-service-account\e[0m" - echo -e "\e[33mOnce done, enter your DQS API key in mailcow.conf and mailcow will do the rest for you!\e[0m" - echo "" - sleep 2 - - else - echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m" - echo -e "\e[32mmailcow detected a Value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf. Postfix will use DQS with the given API key...\e[0m" - fi - elif [ "$response" -eq 200 ]; then - echo -e "\e[33mCheck completed! Your IP is \e[32mclean\e[0m" - elif [ "$response" -eq 429 ]; then - echo -e "\e[33mCheck completed! \e[31mYour IP seems to be rate limited on the ASN Check service... please try again later!\e[0m" - else - echo -e "\e[31mCheck failed! \e[0mMaybe a DNS or Network problem?\e[0m" - fi -} +detect_bad_asn ### If generate_config.sh is started with --dev or -d it will not check out nightly or master branch and will keep on the current branch if [[ ${1} == "--dev" || ${1} == "-d" ]]; then @@ -217,6 +140,8 @@ if [ ! -z "${MAILCOW_BRANCH}" ]; then git_branch=${MAILCOW_BRANCH} fi +configure_ipv6 + [ ! -f ./data/conf/rspamd/override.d/worker-controller-password.inc ] && echo '# Placeholder' > ./data/conf/rspamd/override.d/worker-controller-password.inc cat << EOF > mailcow.conf @@ -510,6 +435,13 @@ WEBAUTHN_ONLY_TRUSTED_VENDORS=n # Otherwise it will work normally. SPAMHAUS_DQS_KEY= +# IPv6 Controller Section +# This variable controls the usage of IPv6 within mailcow. +# Can either be true or false | Defaults to true +# WARNING: MAKE SURE TO PROPERLY CONFIGURE IPv6 ON YOUR HOST FIRST BEFORE ENABLING THIS AS FAULTY CONFIGURATIONS CAN LEAD TO OPEN RELAYS! +# A COMPLETE DOCKER STACK REBUILD (compose down && compose up -d) IS NEEDED TO APPLY THIS. +ENABLE_IPV6=${IPV6_BOOL} + # Prevent netfilter from setting an iptables/nftables rule to isolate the mailcow docker network - y/n # CAUTION: Disabling this may expose container ports to other neighbors on the same subnet, even if the ports are bound to localhost DISABLE_NETFILTER_ISOLATION_RULE=n @@ -588,6 +520,4 @@ else echo ' $MAILCOW_UPDATEDAT='$(date +%s)';' >> data/web/inc/app_info.inc.php echo '?>' >> data/web/inc/app_info.inc.php echo -e "\e[33mCannot determine current git repository version...\e[0m" -fi - -detect_bad_asn +fi \ No newline at end of file diff --git a/update.sh b/update.sh index b7d22bf8a..89dec3e66 100755 --- a/update.sh +++ b/update.sh @@ -2,775 +2,23 @@ ############## Begin Function Section ############## -check_online_status() { - CHECK_ONLINE_DOMAINS=('https://github.com' 'https://hub.docker.com') - for domain in "${CHECK_ONLINE_DOMAINS[@]}"; do - if timeout 6 curl --head --silent --output /dev/null ${domain}; then - return 0 - fi - done - return 1 -} +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +BRANCH="$(cd "${SCRIPT_DIR}" && git rev-parse --abbrev-ref HEAD)" -prefetch_images() { - [[ -z ${BRANCH} ]] && { echo -e "\e[33m\nUnknown branch...\e[0m"; exit 1; } - git fetch origin #${BRANCH} - while read image; do - if [[ "${image}" == "robbertkl/ipv6nat" ]]; then - if ! grep -qi "ipv6nat-mailcow" docker-compose.yml || grep -qi "enable_ipv6: false" docker-compose.yml; then - continue - fi - fi - RET_C=0 - until docker pull "${image}"; do - RET_C=$((RET_C + 1)) - echo -e "\e[33m\nError pulling $image, retrying...\e[0m" - [ ${RET_C} -gt 3 ] && { echo -e "\e[31m\nToo many failed retries, exiting\e[0m"; exit 1; } - sleep 1 - done - done < <(git show "origin/${BRANCH}:docker-compose.yml" | grep "image:" | awk '{ gsub("image:","", $3); print $2 }') -} - -docker_garbage() { - SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - IMGS_TO_DELETE=() - - declare -A IMAGES_INFO - COMPOSE_IMAGES=($(grep -oP "image: \K(ghcr\.io/)?mailcow.+" "${SCRIPT_DIR}/docker-compose.yml")) - - for existing_image in $(docker images --format "{{.ID}}:{{.Repository}}:{{.Tag}}" | grep -E '(mailcow/|ghcr\.io/mailcow/)'); do - ID=$(echo "$existing_image" | cut -d ':' -f 1) - REPOSITORY=$(echo "$existing_image" | cut -d ':' -f 2) - TAG=$(echo "$existing_image" | cut -d ':' -f 3) - - if [[ "$REPOSITORY" == "mailcow/backup" || "$REPOSITORY" == "ghcr.io/mailcow/backup" ]]; then - if [[ "$TAG" != "" ]]; then - continue - fi - fi - - if [[ " ${COMPOSE_IMAGES[@]} " =~ " ${REPOSITORY}:${TAG} " ]]; then - continue - else - IMGS_TO_DELETE+=("$ID") - IMAGES_INFO["$ID"]="$REPOSITORY:$TAG" - fi - done - - if [[ ! -z ${IMGS_TO_DELETE[*]} ]]; then - echo "The following unused mailcow images were found:" - for id in "${IMGS_TO_DELETE[@]}"; do - echo " ${IMAGES_INFO[$id]} ($id)" - done - - if [ -z "$FORCE" ]; then - read -r -p "Do you want to delete them to free up some space? [y/N] " response - if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - docker rmi ${IMGS_TO_DELETE[*]} - else - echo "OK, skipped." - fi - else - echo "Running in forced mode! Force removing old mailcow images..." - docker rmi ${IMGS_TO_DELETE[*]} - fi - echo -e "\e[32mFurther cleanup...\e[0m" - echo "If you want to cleanup further garbage collected by Docker, please make sure all containers are up and running before cleaning your system by executing \"docker system prune\"" - fi -} - -in_array() { - local e match="$1" - shift - for e; do [[ "$e" == "$match" ]] && return 0; done - return 1 -} - -migrate_docker_nat() { - NAT_CONFIG='{"ipv6":true,"fixed-cidr-v6":"fd00:dead:beef:c0::/80","experimental":true,"ip6tables":true}' - # Min Docker version - DOCKERV_REQ=20.10.2 - # Current Docker version - DOCKERV_CUR=$(docker version -f '{{.Server.Version}}') - if grep -qi "ipv6nat-mailcow" docker-compose.yml && grep -qi "enable_ipv6: true" docker-compose.yml; then - echo -e "\e[32mNative IPv6 implementation available.\e[0m" - echo "This will enable experimental features in the Docker daemon and configure Docker to do the IPv6 NATing instead of ipv6nat-mailcow." - echo '!!! This step is recommended !!!' - echo "mailcow will try to roll back the changes if starting Docker fails after modifying the daemon.json configuration file." - read -r -p "Should we try to enable the native IPv6 implementation in Docker now (recommended)? [y/N] " dockernatresponse - if [[ ! "${dockernatresponse}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - echo "OK, skipping this step." - return 0 - fi - fi - # Sort versions and check if we are running a newer or equal version to req - if [ $(printf "${DOCKERV_REQ}\n${DOCKERV_CUR}" | sort -V | tail -n1) == "${DOCKERV_CUR}" ]; then - # If Dockerd daemon json exists - if [ -s /etc/docker/daemon.json ]; then - IFS=',' read -r -a dockerconfig <<< $(cat /etc/docker/daemon.json | tr -cd '[:alnum:],') - if ! in_array ipv6true "${dockerconfig[@]}" || \ - ! in_array experimentaltrue "${dockerconfig[@]}" || \ - ! in_array ip6tablestrue "${dockerconfig[@]}" || \ - ! grep -qi "fixed-cidr-v6" /etc/docker/daemon.json; then - echo -e "\e[33mWarning:\e[0m You seem to have modified the /etc/docker/daemon.json configuration by yourself and not fully/correctly activated the native IPv6 NAT implementation." - echo "You will need to merge your existing configuration manually or fix/delete the existing daemon.json configuration before trying the update process again." - echo -e "Please merge the following content and restart the Docker daemon:\n" - echo "${NAT_CONFIG}" - return 1 - fi - else - echo "Working on IPv6 NAT, please wait..." - echo "${NAT_CONFIG}" > /etc/docker/daemon.json - ip6tables -F -t nat - [[ -e /etc/rc.conf ]] && rc-service docker restart || systemctl restart docker.service - if [[ $? -ne 0 ]]; then - echo -e "\e[31mError:\e[0m Failed to activate IPv6 NAT! Reverting and exiting." - rm /etc/docker/daemon.json - if [[ -e /etc/rc.conf ]]; then - rc-service docker restart - else - systemctl reset-failed docker.service - systemctl restart docker.service - fi - return 1 - fi - fi - # Removing legacy container - sed -i '/ipv6nat-mailcow:$/,/^$/d' docker-compose.yml - if [ -s docker-compose.override.yml ]; then - sed -i '/ipv6nat-mailcow:$/,/^$/d' docker-compose.override.yml - if [[ "$(cat docker-compose.override.yml | sed '/^\s*$/d' | wc -l)" == "2" ]]; then - mv docker-compose.override.yml docker-compose.override.yml_backup - fi - fi - echo -e "\e[32mGreat! \e[0mNative IPv6 NAT is active.\e[0m" - else - echo -e "\e[31mPlease upgrade Docker to version ${DOCKERV_REQ} or above.\e[0m" - return 0 - fi -} - -remove_obsolete_nginx_ports() { - # Removing obsolete docker-compose.override.yml - for override in docker-compose.override.yml docker-compose.override.yaml; do - if [ -s $override ] ; then - if cat $override | grep nginx-mailcow > /dev/null 2>&1; then - if cat $override | grep -E '(\[::])' > /dev/null 2>&1; then - if cat $override | grep -w 80:80 > /dev/null 2>&1 && cat $override | grep -w 443:443 > /dev/null 2>&1 ; then - echo -e "\e[33mBacking up ${override} to preserve custom changes...\e[0m" - echo -e "\e[33m!!! Manual Merge needed (if other overrides are set) !!!\e[0m" - sleep 3 - cp $override ${override}_backup - sed -i '/nginx-mailcow:$/,/^$/d' $override - echo -e "\e[33mRemoved obsolete NGINX IPv6 Bind from original override File.\e[0m" - if [[ "$(cat $override | sed '/^\s*$/d' | wc -l)" == "2" ]]; then - mv $override ${override}_empty - echo -e "\e[31m${override} is empty. Renamed it to ensure mailcow is startable.\e[0m" - fi - fi - fi - fi - fi - done -} - -detect_docker_compose_command(){ -if ! [[ "${DOCKER_COMPOSE_VERSION}" =~ ^(native|standalone)$ ]]; then - if docker compose > /dev/null 2>&1; then - if docker compose version --short | grep -e "^2." -e "^v2." > /dev/null 2>&1; then - DOCKER_COMPOSE_VERSION=native - COMPOSE_COMMAND="docker compose" - echo -e "\e[33mFound Docker Compose Plugin (native).\e[0m" - echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to native\e[0m" - sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=native/' "$SCRIPT_DIR/mailcow.conf" - sleep 2 - echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m" - else - echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" - echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 - fi - elif docker-compose > /dev/null 2>&1; then - if ! [[ $(alias docker-compose 2> /dev/null) ]] ; then - if docker-compose version --short | grep "^2." > /dev/null 2>&1; then - DOCKER_COMPOSE_VERSION=standalone - COMPOSE_COMMAND="docker-compose" - echo -e "\e[33mFound Docker Compose Standalone.\e[0m" - echo -e "\e[33mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m" - sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=standalone/' "$SCRIPT_DIR/mailcow.conf" - sleep 2 - echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m" - else - echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" - echo -e "\e[31mPlease update/install regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 - fi - fi - - else - echo -e "\e[31mCannot find Docker Compose.\e[0m" - echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 - fi - -elif [ "${DOCKER_COMPOSE_VERSION}" == "native" ]; then - COMPOSE_COMMAND="docker compose" - # Check if Native Compose works and has not been deleted - if ! $COMPOSE_COMMAND > /dev/null 2>&1; then - # IF it not exists/work anymore try the other command - COMPOSE_COMMAND="docker-compose" - if ! $COMPOSE_COMMAND > /dev/null 2>&1 || ! $COMPOSE_COMMAND --version | grep "^2." > /dev/null 2>&1; then - # IF it cannot find Standalone in > 2.X, then script stops - echo -e "\e[31mCannot find Docker Compose or the Version is lower then 2.X.X.\e[0m" - echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 - fi - # If it finds the standalone Plugin it will use this instead and change the mailcow.conf Variable accordingly - echo -e "\e[31mFound different Docker Compose Version then declared in mailcow.conf!\e[0m" - echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable from native to standalone\e[0m" - sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=standalone/' "$SCRIPT_DIR/mailcow.conf" - sleep 2 - fi - - -elif [ "${DOCKER_COMPOSE_VERSION}" == "standalone" ]; then - COMPOSE_COMMAND="docker-compose" - # Check if Standalone Compose works and has not been deleted - if ! $COMPOSE_COMMAND > /dev/null 2>&1 && ! $COMPOSE_COMMAND --version > /dev/null 2>&1 | grep "^2." > /dev/null 2>&1; then - # IF it not exists/work anymore try the other command - COMPOSE_COMMAND="docker compose" - if ! $COMPOSE_COMMAND > /dev/null 2>&1; then - # IF it cannot find Native in > 2.X, then script stops - echo -e "\e[31mCannot find Docker Compose.\e[0m" - echo -e "\e[31mPlease install it regarding to this doc site: https://docs.mailcow.email/install/\e[0m" - exit 1 - fi - # If it finds the native Plugin it will use this instead and change the mailcow.conf Variable accordingly - echo -e "\e[31mFound different Docker Compose Version then declared in mailcow.conf!\e[0m" - echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable from standalone to native\e[0m" - sed -i 's/^DOCKER_COMPOSE_VERSION=.*/DOCKER_COMPOSE_VERSION=native/' "$SCRIPT_DIR/mailcow.conf" - sleep 2 - fi +MODULE_DIR="${SCRIPT_DIR}/_modules" +if [[ ! -d "${MODULE_DIR}" || -z "$(ls -A "${MODULE_DIR}")" ]]; then + echo -e "\e[33m_modules is missing or empty – fetching all Modules from origin/${BRANCH}…\e[0m" + git fetch origin "${BRANCH}" + git checkout "origin/${BRANCH}" -- _modules + echo -e "\e[33mDone. Please restart the script...\e[0m" + exit 2 fi -} -detect_bad_asn() { - echo -e "\e[33mDetecting if your IP is listed on Spamhaus Bad ASN List...\e[0m" - response=$(curl --connect-timeout 15 --max-time 30 -s -o /dev/null -w "%{http_code}" "https://asn-check.mailcow.email") - if [ "$response" -eq 503 ]; then - if [ -z "$SPAMHAUS_DQS_KEY" ]; then - echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m" - echo -e "\e[33mmailcow did not detected a value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf!\e[0m" - sleep 2 - echo "" - echo -e "\e[33mTo use the Spamhaus DNS Blocklists again, you will need to create a FREE account for their Data Query Service (DQS) at: https://www.spamhaus.com/free-trial/sign-up-for-a-free-data-query-service-account\e[0m" - echo -e "\e[33mOnce done, enter your DQS API key in mailcow.conf and mailcow will do the rest for you!\e[0m" - echo "" - sleep 2 +source _modules/scripts/core.sh +source _modules/scripts/ipv6_controller.sh +source _modules/scripts/new_options.sh +source _modules/scripts/migrate_options.sh - else - echo -e "\e[33mYour server's public IP uses an AS that is blocked by Spamhaus to use their DNS public blocklists for Postfix.\e[0m" - echo -e "\e[32mmailcow detected a Value for the variable SPAMHAUS_DQS_KEY inside mailcow.conf. Postfix will use DQS with the given API key...\e[0m" - fi - elif [ "$response" -eq 200 ]; then - echo -e "\e[33mCheck completed! Your IP is \e[32mclean\e[0m" - elif [ "$response" -eq 429 ]; then - echo -e "\e[33mCheck completed! \e[31mYour IP seems to be rate limited on the ASN Check service... please try again later!\e[0m" - else - echo -e "\e[31mCheck failed! \e[0mMaybe a DNS or Network problem?\e[0m" - fi -} - -fix_broken_dnslist_conf() { - -# Fixing issue: #6143. To be removed in a later patch - - local file="${SCRIPT_DIR}/data/conf/postfix/dns_blocklists.cf" - # Check if the file exists - if [[ ! -f "$file" ]]; then - return 1 - fi - - # Check if the file contains the autogenerated comment - if grep -q "# Autogenerated by mailcow" "$file"; then - # Ask the user if custom changes were made - echo -e "\e[91mWARNING!!! \e[31mAn old version of dns_blocklists.cf has been detected which may cause a broken postfix upon startup (see: https://github.com/mailcow/mailcow-dockerized/issues/6143)...\e[0m" - echo -e "\e[31mIf you have any custom settings in there you might copy it away and adapt the changes after the file is regenerated...\e[0m" - read -p "Do you want to delete the file now and let mailcow regenerate it properly? [y/n]" response - if [[ "${response}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - rm "$file" - echo -e "\e[32mdns_blocklists.cf has been deleted and will be properly regenerated" - return 0 - else - echo -e "\e[35mOk, not deleting it! Please make sure you take a look at postfix upon start then..." - return 2 - fi - fi - -} - -adapt_new_options() { - - CONFIG_ARRAY=( - "SKIP_LETS_ENCRYPT" - "SKIP_SOGO" - "USE_WATCHDOG" - "WATCHDOG_NOTIFY_EMAIL" - "WATCHDOG_NOTIFY_WEBHOOK" - "WATCHDOG_NOTIFY_WEBHOOK_BODY" - "WATCHDOG_NOTIFY_BAN" - "WATCHDOG_NOTIFY_START" - "WATCHDOG_EXTERNAL_CHECKS" - "WATCHDOG_SUBJECT" - "SKIP_CLAMD" - "SKIP_OLEFY" - "SKIP_IP_CHECK" - "ADDITIONAL_SAN" - "DOVEADM_PORT" - "IPV4_NETWORK" - "IPV6_NETWORK" - "LOG_LINES" - "SNAT_TO_SOURCE" - "SNAT6_TO_SOURCE" - "COMPOSE_PROJECT_NAME" - "DOCKER_COMPOSE_VERSION" - "SQL_PORT" - "API_KEY" - "API_KEY_READ_ONLY" - "API_ALLOW_FROM" - "MAILDIR_GC_TIME" - "MAILDIR_SUB" - "ACL_ANYONE" - "FTS_HEAP" - "FTS_PROCS" - "SKIP_FTS" - "ENABLE_SSL_SNI" - "ALLOW_ADMIN_EMAIL_LOGIN" - "SKIP_HTTP_VERIFICATION" - "SOGO_EXPIRE_SESSION" - "REDIS_PORT" - "DOVECOT_MASTER_USER" - "DOVECOT_MASTER_PASS" - "MAILCOW_PASS_SCHEME" - "ADDITIONAL_SERVER_NAMES" - "WATCHDOG_VERBOSE" - "WEBAUTHN_ONLY_TRUSTED_VENDORS" - "SPAMHAUS_DQS_KEY" - "SKIP_UNBOUND_HEALTHCHECK" - "DISABLE_NETFILTER_ISOLATION_RULE" - "HTTP_REDIRECT" - ) - - sed -i --follow-symlinks '$a\' mailcow.conf - for option in ${CONFIG_ARRAY[@]}; do - if [[ ${option} == "ADDITIONAL_SAN" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "${option}=" >> mailcow.conf - fi - elif [[ ${option} == "COMPOSE_PROJECT_NAME" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "COMPOSE_PROJECT_NAME=mailcowdockerized" >> mailcow.conf - fi - elif [[ ${option} == "DOCKER_COMPOSE_VERSION" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "# Used Docker Compose version" >> 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 "# 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 "" >> mailcow.conf - echo "DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION}" >> mailcow.conf - fi - elif [[ ${option} == "DOVEADM_PORT" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "DOVEADM_PORT=127.0.0.1:19991" >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_NOTIFY_EMAIL" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "WATCHDOG_NOTIFY_EMAIL=" >> mailcow.conf - fi - elif [[ ${option} == "LOG_LINES" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Max log lines per service to keep in Redis logs' >> mailcow.conf - echo "LOG_LINES=9999" >> mailcow.conf - fi - elif [[ ${option} == "IPV4_NETWORK" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Internal IPv4 /24 subnet, format n.n.n. (expands to n.n.n.0/24)' >> mailcow.conf - echo "IPV4_NETWORK=172.22.1" >> mailcow.conf - fi - elif [[ ${option} == "IPV6_NETWORK" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Internal IPv6 subnet in fc00::/7' >> mailcow.conf - echo "IPV6_NETWORK=fd4d:6169:6c63:6f77::/64" >> mailcow.conf - fi - elif [[ ${option} == "SQL_PORT" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Bind SQL to 127.0.0.1 on port 13306' >> mailcow.conf - echo "SQL_PORT=127.0.0.1:13306" >> mailcow.conf - fi - elif [[ ${option} == "API_KEY" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Create or override API key for web UI' >> mailcow.conf - echo "#API_KEY=" >> mailcow.conf - fi - elif [[ ${option} == "API_KEY_READ_ONLY" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Create or override read-only API key for web UI' >> mailcow.conf - echo "#API_KEY_READ_ONLY=" >> mailcow.conf - fi - elif [[ ${option} == "API_ALLOW_FROM" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Must be set for API_KEY to be active' >> mailcow.conf - echo '# IPs only, no networks (networks can be set via UI)' >> mailcow.conf - echo "#API_ALLOW_FROM=" >> mailcow.conf - fi - elif [[ ${option} == "SNAT_TO_SOURCE" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Use this IPv4 for outgoing connections (SNAT)' >> mailcow.conf - echo "#SNAT_TO_SOURCE=" >> mailcow.conf - fi - elif [[ ${option} == "SNAT6_TO_SOURCE" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Use this IPv6 for outgoing connections (SNAT)' >> mailcow.conf - echo "#SNAT6_TO_SOURCE=" >> mailcow.conf - fi - elif [[ ${option} == "MAILDIR_GC_TIME" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Garbage collector cleanup' >> mailcow.conf - echo '# Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring' >> mailcow.conf - echo '# How long should objects remain in the garbage until they are being deleted? (value in minutes)' >> mailcow.conf - echo '# Check interval is hourly' >> mailcow.conf - echo 'MAILDIR_GC_TIME=1440' >> mailcow.conf - fi - elif [[ ${option} == "ACL_ANYONE" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to 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 '# This should probably only be activated on mail hosts, that are used exclusivly by one organisation.' >> mailcow.conf - echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf - echo 'ACL_ANYONE=disallow' >> mailcow.conf - fi - elif [[ ${option} == "FTS_HEAP" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Dovecot Indexing (FTS) Process maximum heap size in MB, there is no recommendation, please see Dovecot docs.' >> mailcow.conf - echo '# Flatcurve is used as FTS Engine. It is supposed to be pretty efficient in CPU and RAM consumption.' >> mailcow.conf - echo '# Please always monitor your Resource consumption!' >> mailcow.conf - echo "FTS_HEAP=128" >> mailcow.conf - fi - elif [[ ${option} == "SKIP_FTS" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Skip FTS (Fulltext Search) for Dovecot on low-memory, low-threaded systems or if you simply want to disable it.' >> mailcow.conf - echo "# Dovecot inside mailcow use Flatcurve as FTS Backend." >> mailcow.conf - echo "SKIP_FTS=y" >> mailcow.conf - fi - elif [[ ${option} == "FTS_PROCS" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Controls how many processes the Dovecot indexing process can spawn at max.' >> mailcow.conf - echo '# Too many indexing processes can use a lot of CPU and Disk I/O' >> mailcow.conf - echo '# Please visit: https://doc.dovecot.org/configuration_manual/service_configuration/#indexer-worker for more informations' >> mailcow.conf - echo "FTS_PROCS=1" >> mailcow.conf - fi - elif [[ ${option} == "ENABLE_SSL_SNI" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Create seperate certificates for all domains - y/n' >> mailcow.conf - echo '# this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames' >> mailcow.conf - echo '# see https://wiki.dovecot.org/SSL/SNIClientSupport' >> mailcow.conf - echo "ENABLE_SSL_SNI=n" >> mailcow.conf - fi - elif [[ ${option} == "SKIP_SOGO" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n' >> mailcow.conf - echo "SKIP_SOGO=n" >> mailcow.conf - fi - elif [[ ${option} == "MAILDIR_SUB" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# MAILDIR_SUB defines a path in a users virtual home to keep the maildir in. Leave empty for updated setups.' >> mailcow.conf - echo "#MAILDIR_SUB=Maildir" >> mailcow.conf - echo "MAILDIR_SUB=" >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_NOTIFY_WEBHOOK" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Send notifications to a webhook URL that receives a POST request with the content type "application/json".' >> mailcow.conf - echo '# You can use this to send notifications to services like Discord, Slack and others.' >> mailcow.conf - echo '#WATCHDOG_NOTIFY_WEBHOOK=https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_NOTIFY_WEBHOOK_BODY" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# JSON body included in the webhook POST request. Needs to be in single quotes.' >> mailcow.conf - echo '# Following variables are available: SUBJECT, BODY' >> mailcow.conf - WEBHOOK_BODY='{"username": "mailcow Watchdog", "content": "**${SUBJECT}**\n${BODY}"}' - echo "#WATCHDOG_NOTIFY_WEBHOOK_BODY='${WEBHOOK_BODY}'" >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_NOTIFY_BAN" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Notify about banned IP. Includes whois lookup.' >> mailcow.conf - echo "WATCHDOG_NOTIFY_BAN=y" >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_NOTIFY_START" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Send a notification when the watchdog is started.' >> mailcow.conf - echo "WATCHDOG_NOTIFY_START=y" >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_SUBJECT" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message.' >> mailcow.conf - echo "#WATCHDOG_SUBJECT=" >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_EXTERNAL_CHECKS" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Checks if mailcow is an open relay. Requires a SAL. More checks will follow.' >> mailcow.conf - echo '# No data is collected. Opt-in and anonymous.' >> mailcow.conf - echo '# Will only work with unmodified mailcow setups.' >> mailcow.conf - echo "WATCHDOG_EXTERNAL_CHECKS=n" >> mailcow.conf - fi - elif [[ ${option} == "SOGO_EXPIRE_SESSION" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# SOGo session timeout in minutes' >> mailcow.conf - echo "SOGO_EXPIRE_SESSION=480" >> mailcow.conf - fi - elif [[ ${option} == "REDIS_PORT" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "REDIS_PORT=127.0.0.1:7654" >> mailcow.conf - fi - elif [[ ${option} == "DOVECOT_MASTER_USER" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# DOVECOT_MASTER_USER and _PASS must _both_ be provided. No special chars.' >> mailcow.conf - echo '# Empty by default to auto-generate master user and password on start.' >> mailcow.conf - echo '# User expands to DOVECOT_MASTER_USER@mailcow.local' >> mailcow.conf - echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf - echo "DOVECOT_MASTER_USER=" >> mailcow.conf - fi - elif [[ ${option} == "DOVECOT_MASTER_PASS" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf - echo "DOVECOT_MASTER_PASS=" >> mailcow.conf - fi - elif [[ ${option} == "MAILCOW_PASS_SCHEME" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Password hash algorithm' >> mailcow.conf - echo '# Only certain password hash algorithm are supported. For a fully list of supported schemes,' >> mailcow.conf - echo '# see https://docs.mailcow.email/models/model-passwd/' >> mailcow.conf - echo "MAILCOW_PASS_SCHEME=BLF-CRYPT" >> mailcow.conf - fi - elif [[ ${option} == "ADDITIONAL_SERVER_NAMES" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Additional server names for mailcow UI' >> mailcow.conf - echo '#' >> mailcow.conf - echo '# Specify alternative addresses for the mailcow UI to respond to' >> mailcow.conf - echo '# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.' >> mailcow.conf - echo '# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.' >> mailcow.conf - echo '# You can understand this as server_name directive in Nginx.' >> mailcow.conf - echo '# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f' >> mailcow.conf - echo 'ADDITIONAL_SERVER_NAMES=' >> mailcow.conf - fi - elif [[ ${option} == "WEBAUTHN_ONLY_TRUSTED_VENDORS" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "# WebAuthn device manufacturer verification" >> mailcow.conf - echo '# After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed' >> mailcow.conf - echo '# root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates' >> mailcow.conf - echo 'WEBAUTHN_ONLY_TRUSTED_VENDORS=n' >> mailcow.conf - fi - elif [[ ${option} == "SPAMHAUS_DQS_KEY" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "# Spamhaus Data Query Service Key" >> mailcow.conf - echo '# Optional: Leave empty for none' >> mailcow.conf - echo '# Enter your key here if you are using a blocked ASN (OVH, AWS, Cloudflare e.g) for the unregistered Spamhaus Blocklist.' >> mailcow.conf - echo '# If empty, it will completely disable Spamhaus blocklists if it detects that you are running on a server using a blocked AS.' >> mailcow.conf - echo '# Otherwise it will work as usual.' >> mailcow.conf - echo 'SPAMHAUS_DQS_KEY=' >> mailcow.conf - fi - elif [[ ${option} == "WATCHDOG_VERBOSE" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Enable watchdog verbose logging' >> mailcow.conf - echo 'WATCHDOG_VERBOSE=n' >> mailcow.conf - fi - elif [[ ${option} == "SKIP_UNBOUND_HEALTHCHECK" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Skip Unbound (DNS Resolver) Healthchecks (NOT Recommended!) - y/n' >> mailcow.conf - echo 'SKIP_UNBOUND_HEALTHCHECK=n' >> mailcow.conf - fi - elif [[ ${option} == "DISABLE_NETFILTER_ISOLATION_RULE" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Prevent netfilter from setting an iptables/nftables rule to isolate the mailcow docker network - y/n' >> mailcow.conf - echo '# CAUTION: Disabling this may expose container ports to other neighbors on the same subnet, even if the ports are bound to localhost' >> mailcow.conf - echo 'DISABLE_NETFILTER_ISOLATION_RULE=n' >> mailcow.conf - fi - elif [[ ${option} == "HTTP_REDIRECT" ]]; then - if ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Redirect HTTP connections to HTTPS - y/n' >> mailcow.conf - echo 'HTTP_REDIRECT=n' >> mailcow.conf - fi - elif ! grep -q ${option} mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "${option}=n" >> mailcow.conf - fi - done -} - -migrate_solr_config_options() { - - sed -i --follow-symlinks '$a\' mailcow.conf - - if grep -q "SOLR_HEAP" mailcow.conf; then - echo "Removing SOLR_HEAP in mailcow.conf" - sed -i '/# Solr heap size in MB\b/d' mailcow.conf - sed -i '/# Solr is a prone to run\b/d' mailcow.conf - sed -i '/SOLR_HEAP\b/d' mailcow.conf - fi - - if grep -q "SKIP_SOLR" mailcow.conf; then - echo "Removing SKIP_SOLR in mailcow.conf" - sed -i '/\bSkip Solr on low-memory\b/d' mailcow.conf - sed -i '/\bSolr is disabled by default\b/d' mailcow.conf - sed -i '/\bDisable Solr or\b/d' mailcow.conf - sed -i '/\bSKIP_SOLR\b/d' mailcow.conf - fi - - if grep -q "SOLR_PORT" mailcow.conf; then - echo "Removing SOLR_PORT in mailcow.conf" - sed -i '/\bSOLR_PORT\b/d' mailcow.conf - fi - - if grep -q "FLATCURVE_EXPERIMENTAL" mailcow.conf; then - echo "Removing FLATCURVE_EXPERIMENTAL in mailcow.conf" - sed -i '/\bFLATCURVE_EXPERIMENTAL\b/d' mailcow.conf - fi - - solr_volume=$(docker volume ls -qf name=^${COMPOSE_PROJECT_NAME}_solr-vol-1) - if [[ -n $solr_volume ]]; then - echo -e "\e[34mSolr has been replaced within mailcow since 2025-01.\nThe volume $solr_volume is unused.\e[0m" - sleep 1 - if [ ! "$FORCE" ]; then - read -r -p "Remove $solr_volume? [y/N] " response - if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - echo -e "\e[33mRemoving $solr_volume...\e[0m" - docker volume rm $solr_volume || echo -e "\e[31mFailed to remove. Remove it manually!\e[0m" - echo -e "\e[32mSuccessfully removed $solr_volume!\e[0m" - else - echo -e "Not removing $solr_volume. Run \`docker volume rm $solr_volume\` manually if needed." - fi - else - echo -e "\e[33mForce removing $solr_volume...\e[0m" - docker volume rm $solr_volume || echo -e "\e[31mFailed to remove. Remove it manually!\e[0m" - echo -e "\e[32mSuccessfully removed $solr_volume!\e[0m" - fi - fi - - # Delete old fts.conf before forced switch to flatcurve to ensure update is working properly - FTS_CONF_PATH="${SCRIPT_DIR}/data/conf/dovecot/conf.d/fts.conf" - if [[ -f "$FTS_CONF_PATH" ]]; then - if grep -q "Autogenerated by mailcow" "$FTS_CONF_PATH"; then - rm -rf $FTS_CONF_PATH - fi - fi -} - -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 ############## # Check permissions @@ -786,22 +34,6 @@ if [ -f "${SCRIPT_DIR}/pre_update_hook.sh" ]; then bash "${SCRIPT_DIR}/pre_update_hook.sh" fi -if [[ "$(uname -r)" =~ ^4\.15\.0-60 ]]; then - echo "DO NOT RUN mailcow ON THIS UBUNTU KERNEL!"; - echo "Please update to 5.x or use another distribution." - exit 1 -fi - -if [[ "$(uname -r)" =~ ^4\.4\. ]]; then - if grep -q Ubuntu <<< "$(uname -a)"; then - echo "DO NOT RUN mailcow ON THIS UBUNTU KERNEL!" - echo "Please update to linux-generic-hwe-16.04 by running \"apt-get install --install-recommends linux-generic-hwe-16.04\"" - exit 1 - fi - echo "mailcow on a 4.4.x kernel is not supported. It may or may not work, please upgrade your kernel or continue at your own risk." - read -p "Press any key to continue..." < /dev/tty -fi - # Exit on error and pipefail set -o pipefail @@ -817,22 +49,9 @@ umask 0022 unset COMPOSE_COMMAND unset DOCKER_COMPOSE_VERSION -for bin in curl docker git awk sha1sum grep cut; do - if [[ -z $(command -v ${bin}) ]]; then - echo "Cannot find ${bin}, exiting..." - exit 1; - fi -done +get_installed_tools -# Check Docker Version (need at least 24.X) -docker_version=$(docker -v | grep -oP '\d+\.\d+\.\d+' | cut -d '.' -f 1 | head -1) - -if [[ $docker_version -lt 24 ]]; then - echo -e "\e[31mCannot find Docker with a Version higher or equals 24.0.0\e[0m" - echo -e "\e[33mmailcow needs a newer Docker version to work properly... continuing on your own risk!\e[0m" - echo -e "\e[31mPlease update your Docker installation... sleeping 10s\e[0m" - sleep 10 -fi +get_docker_version export LC_ALL=C DATE=$(date +%Y-%m-%d_%H_%M_%S) @@ -936,9 +155,7 @@ done chmod 600 mailcow.conf source mailcow.conf -detect_docker_compose_command - -fix_broken_dnslist_conf +get_compose_type DOTS=${MAILCOW_HOSTNAME//[^.]}; if [ ${#DOTS} -lt 1 ]; then @@ -961,349 +178,8 @@ elif [ ${#DOTS} -eq 1 ]; then fi fi -if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox grep detected, please install gnu grep, \"apk add --no-cache --upgrade grep\""; exit 1; fi -# This will also cover sort -if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\""; exit 1; fi -if sed --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox sed detected, please install gnu sed, \"apk add --no-cache --upgrade sed\""; exit 1; fi - -CONFIG_ARRAY=( - "SKIP_LETS_ENCRYPT" - "SKIP_SOGO" - "USE_WATCHDOG" - "WATCHDOG_NOTIFY_EMAIL" - "WATCHDOG_NOTIFY_WEBHOOK" - "WATCHDOG_NOTIFY_WEBHOOK_BODY" - "WATCHDOG_NOTIFY_BAN" - "WATCHDOG_NOTIFY_START" - "WATCHDOG_EXTERNAL_CHECKS" - "WATCHDOG_SUBJECT" - "SKIP_CLAMD" - "SKIP_OLEFY" - "SKIP_IP_CHECK" - "ADDITIONAL_SAN" - "AUTODISCOVER_SAN" - "DOVEADM_PORT" - "IPV4_NETWORK" - "IPV6_NETWORK" - "LOG_LINES" - "SNAT_TO_SOURCE" - "SNAT6_TO_SOURCE" - "COMPOSE_PROJECT_NAME" - "DOCKER_COMPOSE_VERSION" - "SQL_PORT" - "API_KEY" - "API_KEY_READ_ONLY" - "API_ALLOW_FROM" - "MAILDIR_GC_TIME" - "MAILDIR_SUB" - "ACL_ANYONE" - "ENABLE_SSL_SNI" - "ALLOW_ADMIN_EMAIL_LOGIN" - "SKIP_HTTP_VERIFICATION" - "SOGO_EXPIRE_SESSION" - "REDIS_PORT" - "DOVECOT_MASTER_USER" - "DOVECOT_MASTER_PASS" - "MAILCOW_PASS_SCHEME" - "ADDITIONAL_SERVER_NAMES" - "WATCHDOG_VERBOSE" - "WEBAUTHN_ONLY_TRUSTED_VENDORS" - "SPAMHAUS_DQS_KEY" - "SKIP_UNBOUND_HEALTHCHECK" - "DISABLE_NETFILTER_ISOLATION_RULE" - "REDISPASS" -) - detect_bad_asn -sed -i --follow-symlinks '$a\' mailcow.conf -for option in "${CONFIG_ARRAY[@]}"; do - if [[ ${option} == "ADDITIONAL_SAN" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "${option}=" >> mailcow.conf - fi - elif [[ "${option}" == "COMPOSE_PROJECT_NAME" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "COMPOSE_PROJECT_NAME=mailcowdockerized" >> mailcow.conf - fi - elif [[ "${option}" == "DOCKER_COMPOSE_VERSION" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "# Used Docker Compose version" >> 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 "# 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 "" >> mailcow.conf - echo "DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION}" >> mailcow.conf - fi - elif [[ "${option}" == "DOVEADM_PORT" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "DOVEADM_PORT=127.0.0.1:19991" >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_NOTIFY_EMAIL" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "WATCHDOG_NOTIFY_EMAIL=" >> mailcow.conf - fi - elif [[ "${option}" == "LOG_LINES" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Max log lines per service to keep in Redis logs' >> mailcow.conf - echo "LOG_LINES=9999" >> mailcow.conf - fi - elif [[ "${option}" == "IPV4_NETWORK" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Internal IPv4 /24 subnet, format n.n.n. (expands to n.n.n.0/24)' >> mailcow.conf - echo "IPV4_NETWORK=172.22.1" >> mailcow.conf - fi - elif [[ "${option}" == "IPV6_NETWORK" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Internal IPv6 subnet in fc00::/7' >> mailcow.conf - echo "IPV6_NETWORK=fd4d:6169:6c63:6f77::/64" >> mailcow.conf - fi - elif [[ "${option}" == "SQL_PORT" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Bind SQL to 127.0.0.1 on port 13306' >> mailcow.conf - echo "SQL_PORT=127.0.0.1:13306" >> mailcow.conf - fi - elif [[ "${option}" == "API_KEY" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Create or override API key for web UI' >> mailcow.conf - echo "#API_KEY=" >> mailcow.conf - fi - elif [[ "${option}" == "API_KEY_READ_ONLY" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Create or override read-only API key for web UI' >> mailcow.conf - echo "#API_KEY_READ_ONLY=" >> mailcow.conf - fi - elif [[ "${option}" == "API_ALLOW_FROM" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Must be set for API_KEY to be active' >> mailcow.conf - echo '# IPs only, no networks (networks can be set via UI)' >> mailcow.conf - echo "#API_ALLOW_FROM=" >> mailcow.conf - fi - elif [[ "${option}" == "SNAT_TO_SOURCE" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Use this IPv4 for outgoing connections (SNAT)' >> mailcow.conf - echo "#SNAT_TO_SOURCE=" >> mailcow.conf - fi - elif [[ "${option}" == "SNAT6_TO_SOURCE" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Use this IPv6 for outgoing connections (SNAT)' >> mailcow.conf - echo "#SNAT6_TO_SOURCE=" >> mailcow.conf - fi - elif [[ "${option}" == "MAILDIR_GC_TIME" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Garbage collector cleanup' >> mailcow.conf - echo '# Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring' >> mailcow.conf - echo '# How long should objects remain in the garbage until they are being deleted? (value in minutes)' >> mailcow.conf - echo '# Check interval is hourly' >> mailcow.conf - echo 'MAILDIR_GC_TIME=1440' >> mailcow.conf - fi - elif [[ "${option}" == "ACL_ANYONE" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to 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 '# This should probably only be activated on mail hosts, that are used exclusivly by one organisation.' >> mailcow.conf - echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf - echo 'ACL_ANYONE=disallow' >> mailcow.conf - fi - elif [[ "${option}" == "ENABLE_SSL_SNI" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Create seperate certificates for all domains - y/n' >> mailcow.conf - echo '# this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames' >> mailcow.conf - echo '# see https://wiki.dovecot.org/SSL/SNIClientSupport' >> mailcow.conf - echo "ENABLE_SSL_SNI=n" >> mailcow.conf - fi - elif [[ "${option}" == "SKIP_SOGO" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n' >> mailcow.conf - echo "SKIP_SOGO=n" >> mailcow.conf - fi - elif [[ "${option}" == "MAILDIR_SUB" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# MAILDIR_SUB defines a path in a users virtual home to keep the maildir in. Leave empty for updated setups.' >> mailcow.conf - echo "#MAILDIR_SUB=Maildir" >> mailcow.conf - echo "MAILDIR_SUB=" >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_NOTIFY_WEBHOOK" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Send notifications to a webhook URL that receives a POST request with the content type "application/json".' >> mailcow.conf - echo '# You can use this to send notifications to services like Discord, Slack and others.' >> mailcow.conf - echo '#WATCHDOG_NOTIFY_WEBHOOK=https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_NOTIFY_WEBHOOK_BODY" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# JSON body included in the webhook POST request. Needs to be in single quotes.' >> mailcow.conf - echo '# Following variables are available: SUBJECT, BODY' >> mailcow.conf - WEBHOOK_BODY='{"username": "mailcow Watchdog", "content": "**${SUBJECT}**\n${BODY}"}' - echo "#WATCHDOG_NOTIFY_WEBHOOK_BODY='${WEBHOOK_BODY}'" >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_NOTIFY_BAN" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Notify about banned IP. Includes whois lookup.' >> mailcow.conf - echo "WATCHDOG_NOTIFY_BAN=y" >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_NOTIFY_START" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Send a notification when the watchdog is started.' >> mailcow.conf - echo "WATCHDOG_NOTIFY_START=y" >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_SUBJECT" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message.' >> mailcow.conf - echo "#WATCHDOG_SUBJECT=" >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_EXTERNAL_CHECKS" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Checks if mailcow is an open relay. Requires a SAL. More checks will follow.' >> mailcow.conf - echo '# No data is collected. Opt-in and anonymous.' >> mailcow.conf - echo '# Will only work with unmodified mailcow setups.' >> mailcow.conf - echo "WATCHDOG_EXTERNAL_CHECKS=n" >> mailcow.conf - fi - elif [[ "${option}" == "SOGO_EXPIRE_SESSION" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# SOGo session timeout in minutes' >> mailcow.conf - echo "SOGO_EXPIRE_SESSION=480" >> mailcow.conf - fi - elif [[ "${option}" == "REDIS_PORT" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "REDIS_PORT=127.0.0.1:7654" >> mailcow.conf - fi - elif [[ "${option}" == "DOVECOT_MASTER_USER" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# DOVECOT_MASTER_USER and _PASS must _both_ be provided. No special chars.' >> mailcow.conf - echo '# Empty by default to auto-generate master user and password on start.' >> mailcow.conf - echo '# User expands to DOVECOT_MASTER_USER@mailcow.local' >> mailcow.conf - echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf - echo "DOVECOT_MASTER_USER=" >> mailcow.conf - fi - elif [[ "${option}" == "DOVECOT_MASTER_PASS" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf - echo "DOVECOT_MASTER_PASS=" >> mailcow.conf - fi - elif [[ "${option}" == "MAILCOW_PASS_SCHEME" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Password hash algorithm' >> mailcow.conf - echo '# Only certain password hash algorithm are supported. For a fully list of supported schemes,' >> mailcow.conf - echo '# see https://docs.mailcow.email/models/model-passwd/' >> mailcow.conf - echo "MAILCOW_PASS_SCHEME=BLF-CRYPT" >> mailcow.conf - fi - elif [[ "${option}" == "ADDITIONAL_SERVER_NAMES" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Additional server names for mailcow UI' >> mailcow.conf - echo '#' >> mailcow.conf - echo '# Specify alternative addresses for the mailcow UI to respond to' >> mailcow.conf - echo '# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.' >> mailcow.conf - echo '# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.' >> mailcow.conf - echo '# You can understand this as server_name directive in Nginx.' >> mailcow.conf - echo '# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f' >> mailcow.conf - echo 'ADDITIONAL_SERVER_NAMES=' >> mailcow.conf - fi - - elif [[ "${option}" == "AUTODISCOVER_SAN" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Obtain certificates for autodiscover.* and autoconfig.* domains.' >> mailcow.conf - echo '# This can be useful to switch off in case you are in a scenario where a reverse proxy already handles those.' >> mailcow.conf - echo '# There are mixed scenarios where ports 80,443 are occupied and you do not want to share certs' >> mailcow.conf - echo '# between services. So acme-mailcow obtains for maildomains and all web-things get handled' >> mailcow.conf - echo '# in the reverse proxy.' >> mailcow.conf - echo 'AUTODISCOVER_SAN=y' >> mailcow.conf - fi - elif [[ "${option}" == "WEBAUTHN_ONLY_TRUSTED_VENDORS" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "# WebAuthn device manufacturer verification" >> mailcow.conf - echo '# After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed' >> mailcow.conf - echo '# root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates' >> mailcow.conf - echo 'WEBAUTHN_ONLY_TRUSTED_VENDORS=n' >> mailcow.conf - fi - elif [[ "${option}" == "SPAMHAUS_DQS_KEY" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "# Spamhaus Data Query Service Key" >> mailcow.conf - echo '# Optional: Leave empty for none' >> mailcow.conf - echo '# Enter your key here if you are using a blocked ASN (OVH, AWS, Cloudflare e.g) for the unregistered Spamhaus Blocklist.' >> mailcow.conf - echo '# If empty, it will completely disable Spamhaus blocklists if it detects that you are running on a server using a blocked AS.' >> mailcow.conf - echo '# Otherwise it will work as usual.' >> mailcow.conf - echo 'SPAMHAUS_DQS_KEY=' >> mailcow.conf - fi - elif [[ "${option}" == "WATCHDOG_VERBOSE" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Enable watchdog verbose logging' >> mailcow.conf - echo 'WATCHDOG_VERBOSE=n' >> mailcow.conf - fi - elif [[ "${option}" == "SKIP_UNBOUND_HEALTHCHECK" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Skip Unbound (DNS Resolver) Healthchecks (NOT Recommended!) - y/n' >> mailcow.conf - echo 'SKIP_UNBOUND_HEALTHCHECK=n' >> mailcow.conf - fi - elif [[ "${option}" == "DISABLE_NETFILTER_ISOLATION_RULE" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Prevent netfilter from setting an iptables/nftables rule to isolate the mailcow docker network - y/n' >> mailcow.conf - echo '# CAUTION: Disabling this may expose container ports to other neighbors on the same subnet, even if the ports are bound to localhost' >> mailcow.conf - echo 'DISABLE_NETFILTER_ISOLATION_RULE=n' >> mailcow.conf - fi - elif [[ "${option}" == "SKIP_CLAMD" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n' >> mailcow.conf - echo 'SKIP_CLAMD=n' >> mailcow.conf - fi - elif [[ "${option}" == "SKIP_OLEFY" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo '# Skip Olefy (olefy-mailcow) anti-virus for Office documents (Rspamd will auto-detect a missing Olefy container) - y/n' >> mailcow.conf - echo 'SKIP_OLEFY=n' >> mailcow.conf - fi - elif [[ "${option}" == "REDISPASS" ]]; then - if ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo -e '\n# ------------------------------' >> mailcow.conf - echo '# REDIS configuration' >> mailcow.conf - echo -e '# ------------------------------\n' >> mailcow.conf - echo "REDISPASS=$(LC_ALL=C /dev/null | head -c 28)" >> mailcow.conf - fi - elif ! grep -q "${option}" mailcow.conf; then - echo "Adding new option \"${option}\" to mailcow.conf" - echo "${option}=n" >> mailcow.conf - fi -done - if [[ ("${SKIP_PING_CHECK}" == "y") ]]; then echo -e "\e[32mSkipping Ping Check...\e[0m" @@ -1422,16 +298,38 @@ elif [ "$NEW_BRANCH" == "legacy" ] && [ "$CURRENT_BRANCH" != "legacy" ]; then fi if [ ! "$DEV" ]; then + EXIT_COUNT=0 echo -e "\e[32mChecking for newer update script...\e[0m" SHA1_1="$(sha1sum update.sh)" - git fetch origin #${BRANCH} - git checkout "origin/${BRANCH}" update.sh - SHA1_2=$(sha1sum update.sh) + git fetch origin + git checkout "origin/${BRANCH}" -- update.sh + SHA1_2="$(sha1sum update.sh)" if [[ "${SHA1_1}" != "${SHA1_2}" ]]; then - echo "update.sh changed, please run this script again, exiting." chmod +x update.sh + EXIT_COUNT+=1 + fi + + MODULE_DIR="$(dirname "$0")/_modules" + echo -e "\e[32mChecking for updates in _modules...\e[0m" + if [ ! -d "${MODULE_DIR}" ] || [ -z "$(ls -A "${MODULE_DIR}")" ]; then + echo -e "\e[33m_modules missing or empty — fetching from origin...\e[0m" + git checkout "origin/${BRANCH}" -- _modules + else + OLD_SUM="$(find "${MODULE_DIR}" -type f -exec sha1sum {} \; | sort | sha1sum)" + git fetch origin + git checkout "origin/${BRANCH}" -- _modules + NEW_SUM="$(find "${MODULE_DIR}" -type f -exec sha1sum {} \; | sort | sha1sum)" + + if [[ "${OLD_SUM}" != "${NEW_SUM}" ]]; then + EXIT_COUNT+=1 + fi + fi + + if [ ${EXIT_COUNT} -ge 1 ]; then + echo "Changes for the update Script, please run this script again, exiting!" exit 2 fi + fi if [ ! "$FORCE" ]; then @@ -1441,11 +339,8 @@ if [ ! "$FORCE" ]; then exit 0 fi detect_major_update - migrate_docker_nat fi -remove_obsolete_nginx_ports - echo -e "\e[32mValidating docker-compose stack configuration...\e[0m" sed -i 's/HTTPS_BIND:-:/HTTPS_BIND:-/g' docker-compose.yml sed -i 's/HTTP_BIND:-:/HTTP_BIND:-/g' docker-compose.yml @@ -1483,28 +378,28 @@ for container in "${MAILCOW_CONTAINERS[@]}"; do docker rm -f "$container" 2> /dev/null done +configure_ipv6 + [[ -f data/conf/nginx/ZZZ-ejabberd.conf ]] && rm data/conf/nginx/ZZZ-ejabberd.conf -migrate_solr_config_options +migrate_config_options adapt_new_options -remove_obsolete_options -# Silently fixing remote url from andryyy to mailcow -# git remote set-url origin https://github.com/mailcow/mailcow-dockerized - -DEFAULT_REPO="https://github.com/mailcow/mailcow-dockerized" -CURRENT_REPO=$(git config --get remote.origin.url) -if [ "$CURRENT_REPO" != "$DEFAULT_REPO" ]; then - echo "The Repository currently used is not the default Mailcow Repository." - echo "Currently Repository: $CURRENT_REPO" - echo "Default Repository: $DEFAULT_REPO" - if [ ! "$FORCE" ]; then - read -r -p "Should it be changed back to default? [y/N] " repo_response - if [[ "$repo_response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - git remote set-url origin $DEFAULT_REPO +if [ ! "$DEV" ]; then + DEFAULT_REPO="https://github.com/mailcow/mailcow-dockerized" + CURRENT_REPO=$(git config --get remote.origin.url) + if [ "$CURRENT_REPO" != "$DEFAULT_REPO" ]; then + echo "The Repository currently used is not the default mailcow Repository." + echo "Currently Repository: $CURRENT_REPO" + echo "Default Repository: $DEFAULT_REPO" + if [ ! "$FORCE" ]; then + read -r -p "Should it be changed back to default? [y/N] " repo_response + if [[ "$repo_response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then + git remote set-url origin $DEFAULT_REPO + fi + else + echo "Running in forced mode... setting Repo to default!" + git remote set-url origin $DEFAULT_REPO fi - else - echo "Running in forced mode... setting Repo to default!" - git remote set-url origin $DEFAULT_REPO fi fi @@ -1538,7 +433,7 @@ if [ ! "$DEV" ]; then echo "Run $COMPOSE_COMMAND up -d to restart your stack without updates or try again after fixing the mentioned errors." exit 1 fi -elif [ "$DEV" ]; then +else echo -e "\e[33mDEVELOPER MODE: Not creating a git diff and commiting it to prevent development stuff within a backup diff...\e[0m" fi From ef5739c32fcf2607d19255fd9ca820e136e975a7 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Wed, 6 Aug 2025 08:39:21 +0200 Subject: [PATCH 036/180] add 2025-08 as breaking major release --- _modules/scripts/core.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/_modules/scripts/core.sh b/_modules/scripts/core.sh index 42133aa6b..ab67f25c6 100644 --- a/_modules/scripts/core.sh +++ b/_modules/scripts/core.sh @@ -185,6 +185,7 @@ detect_major_update() { MAJOR_VERSIONS=( "2025-02" "2025-03" + "2025-08" ) current_version="" From e91d678bd16156ca80e63c16b559a5acd0946830 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Wed, 6 Aug 2025 09:36:05 +0200 Subject: [PATCH 037/180] fix docker version detection --- _modules/scripts/ipv6_controller.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_modules/scripts/ipv6_controller.sh b/_modules/scripts/ipv6_controller.sh index 7fe7d3cbd..de5272048 100644 --- a/_modules/scripts/ipv6_controller.sh +++ b/_modules/scripts/ipv6_controller.sh @@ -41,7 +41,7 @@ docker_daemon_edit(){ ! _has_kv ipv6 true && MISSING+=("ipv6: true") ! grep -Eq '"fixed-cidr-v6"\s*:\s*".+"' "$DOCKER_DAEMON_CONFIG" \ && MISSING+=('fixed-cidr-v6: "fd00:dead:beef:c0::/80"') - if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -ge 27 ]]; then + if [[ -n "$DOCKER_MAJOR" && "$DOCKER_MAJOR" -le 27 ]]; then _has_kv ipv6 true && ! _has_kv ip6tables true && MISSING+=("ip6tables: true") ! _has_kv experimental true && MISSING+=("experimental: true") fi From 842cb235b610c54f7eb5ae9337ca36cfe997fb40 Mon Sep 17 00:00:00 2001 From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com> Date: Wed, 6 Aug 2025 09:38:22 +0200 Subject: [PATCH 038/180] [Rspamd] Fill module name for set_pre_result actions (#6630) * [Rspamd] Fill module name for postmaster handler * Update rspamd.local.lua --- data/conf/rspamd/lua/rspamd.local.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/conf/rspamd/lua/rspamd.local.lua b/data/conf/rspamd/lua/rspamd.local.lua index 5f23ef6b8..5fe66f75f 100644 --- a/data/conf/rspamd/lua/rspamd.local.lua +++ b/data/conf/rspamd/lua/rspamd.local.lua @@ -102,7 +102,7 @@ rspamd_config:register_symbol({ local rcpt_split = rspamd_str_split(rcpt['addr'], '@') if #rcpt_split == 2 then if rcpt_split[1] == 'postmaster' then - task:set_pre_result('accept', 'whitelisting postmaster smtp rcpt') + task:set_pre_result('accept', 'whitelisting postmaster smtp rcpt', 'postmaster') return end end @@ -167,7 +167,7 @@ rspamd_config:register_symbol({ for k,v in pairs(data) do if (v and v ~= userdata and v == '1') then rspamd_logger.infox(rspamd_config, "found ip in keep_spam map, setting pre-result") - task:set_pre_result('accept', 'ip matched with forward hosts') + task:set_pre_result('accept', 'ip matched with forward hosts', 'keep_spam') end end end From 1e42b8dd21fb021e1ddcbb2cae94f79146fe4d39 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> Date: Wed, 6 Aug 2025 09:40:47 +0200 Subject: [PATCH 039/180] [Web] Add delimiter_action to mailbox and mailbox_template add/edit admin forms (#6620) --- data/web/edit.php | 1 + data/web/inc/functions.mailbox.inc.php | 17 ++ data/web/inc/vars.inc.php | 148 +++++++++--------- data/web/js/site/mailbox.js | 18 +++ .../web/templates/edit/mailbox-templates.twig | 17 ++ data/web/templates/edit/mailbox.twig | 31 +++- data/web/templates/modals/mailbox.twig | 34 ++++ 7 files changed, 193 insertions(+), 73 deletions(-) diff --git a/data/web/edit.php b/data/web/edit.php index 9a1e5a5c1..7ce4d0c6a 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -125,6 +125,7 @@ if (isset($_SESSION['mailcow_cc_role'])) { 'mailbox' => $mailbox, 'rl' => $rl, 'pushover_data' => $pushover_data, + 'get_tagging_options' => mailbox('get', 'delimiter_action', $mailbox), 'quarantine_notification' => $quarantine_notification, 'quarantine_category' => $quarantine_category, 'get_tls_policy' => $get_tls_policy, diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index d5daeddcd..6ea4f5717 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -1223,6 +1223,14 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $stmt->execute(array( ':username' => $username )); + // save delimiter_action + if (isset($_data['tagged_mail_handler'])) { + mailbox('edit', 'delimiter_action', array( + 'username' => $username, + 'tagged_mail_handler' => $_data['tagged_mail_handler'] + )); + } + // save tags foreach($tags as $index => $tag){ if (empty($tag)) continue; @@ -1613,6 +1621,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $attr = array(); $attr["quota"] = isset($_data['quota']) ? intval($_data['quota']) * 1048576 : 0; $attr['tags'] = (isset($_data['tags'])) ? $_data['tags'] : array(); + $attr["tagged_mail_handler"] = (!empty($_data['tagged_mail_handler'])) ? $_data['tagged_mail_handler'] : strval($MAILBOX_DEFAULT_ATTRIBUTES['tagged_mail_handler']); $attr["quarantine_notification"] = (!empty($_data['quarantine_notification'])) ? $_data['quarantine_notification'] : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification']); $attr["quarantine_category"] = (!empty($_data['quarantine_category'])) ? $_data['quarantine_category'] : strval($MAILBOX_DEFAULT_ATTRIBUTES['quarantine_category']); $attr["rl_frame"] = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : "s"; @@ -3259,6 +3268,13 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ); return false; } + // save delimiter_action + if (isset($_data['tagged_mail_handler'])) { + mailbox('edit', 'delimiter_action', array( + 'username' => $username, + 'tagged_mail_handler' => $_data['tagged_mail_handler'] + )); + } // save tags foreach($tags as $index => $tag){ if (empty($tag)) continue; @@ -3604,6 +3620,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $attr = array(); $attr["quota"] = isset($_data['quota']) ? intval($_data['quota']) * 1048576 : 0; $attr['tags'] = (isset($_data['tags'])) ? $_data['tags'] : $is_now['tags']; + $attr["tagged_mail_handler"] = (!empty($_data['tagged_mail_handler'])) ? $_data['tagged_mail_handler'] : $is_now['tagged_mail_handler']; $attr["quarantine_notification"] = (!empty($_data['quarantine_notification'])) ? $_data['quarantine_notification'] : $is_now['quarantine_notification']; $attr["quarantine_category"] = (!empty($_data['quarantine_category'])) ? $_data['quarantine_category'] : $is_now['quarantine_category']; $attr["rl_frame"] = (!empty($_data['rl_frame'])) ? $_data['rl_frame'] : $is_now['rl_frame']; diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php index 671e20334..568105308 100644 --- a/data/web/inc/vars.inc.php +++ b/data/web/inc/vars.inc.php @@ -186,6 +186,12 @@ $MAILBOX_DEFAULT_ATTRIBUTES['force_pw_update'] = false; // Enable SOGo access - Users will be redirected to SOGo after login (set to false to disable redirect by default) $MAILBOX_DEFAULT_ATTRIBUTES['sogo_access'] = true; +// How to handle tagged emails +// none - No special handling +// subfolder - Create subfolder under INBOX (e.g. "INBOX/Facebook") +// subject - Add tag to subject (e.g. "[Facebook] Subject") +$MAILBOX_DEFAULT_ATTRIBUTES['tagged_mail_handler'] = "none"; + // Send notification when quarantine is not empty (never, hourly, daily, weekly) $MAILBOX_DEFAULT_ATTRIBUTES['quarantine_notification'] = 'hourly'; @@ -257,57 +263,57 @@ $RSPAMD_MAPS = array( $IMAPSYNC_OPTIONS = array( 'whitelist' => array( - 'abort', - 'authmd51', - 'authmd52', + 'abort', + 'authmd51', + 'authmd52', 'authmech1', 'authmech2', - 'authuser1', - 'authuser2', - 'debug', - 'debugcontent', - 'debugcrossduplicates', - 'debugflags', - 'debugfolders', - 'debugimap', - 'debugimap1', - 'debugimap2', - 'debugmemory', - 'debugssl', + 'authuser1', + 'authuser2', + 'debug', + 'debugcontent', + 'debugcrossduplicates', + 'debugflags', + 'debugfolders', + 'debugimap', + 'debugimap1', + 'debugimap2', + 'debugmemory', + 'debugssl', 'delete1emptyfolders', - 'delete2folders', - 'disarmreadreceipts', + 'delete2folders', + 'disarmreadreceipts', 'domain1', 'domain2', - 'domino1', - 'domino2', + 'domino1', + 'domino2', 'dry', 'errorsmax', - 'exchange1', - 'exchange2', + 'exchange1', + 'exchange2', 'exitwhenover', 'expunge1', - 'f1f2', - 'filterbuggyflags', + 'f1f2', + 'filterbuggyflags', 'folder', 'folderfirst', 'folderlast', 'folderrec', - 'gmail1', - 'gmail2', - 'idatefromheader', + 'gmail1', + 'gmail2', + 'idatefromheader', 'include', 'inet4', 'inet6', - 'justconnect', - 'justfolders', - 'justfoldersizes', - 'justlogin', - 'keepalive1', - 'keepalive2', + 'justconnect', + 'justfolders', + 'justfoldersizes', + 'justlogin', + 'keepalive1', + 'keepalive2', 'log', 'logdir', - 'logfile', + 'logfile', 'maxbytesafter', 'maxlinelength', 'maxmessagespersecond', @@ -315,62 +321,62 @@ $IMAPSYNC_OPTIONS = array( 'maxsleep', 'minage', 'minsize', - 'noabletosearch', - 'noabletosearch1', - 'noabletosearch2', - 'noexpunge1', - 'noexpunge2', + 'noabletosearch', + 'noabletosearch1', + 'noabletosearch2', + 'noexpunge1', + 'noexpunge2', 'nofoldersizesatend', - 'noid', - 'nolog', - 'nomixfolders', - 'noresyncflags', - 'nossl1', - 'nossl2', - 'nosyncacls', - 'notls1', - 'notls2', - 'nouidexpunge2', - 'nousecache', + 'noid', + 'nolog', + 'nomixfolders', + 'noresyncflags', + 'nossl1', + 'nossl2', + 'nosyncacls', + 'notls1', + 'notls2', + 'nouidexpunge2', + 'nousecache', 'oauthaccesstoken1', 'oauthaccesstoken2', 'oauthdirect1', 'oauthdirect2', - 'office1', - 'office2', - 'pidfile', - 'pidfilelocking', + 'office1', + 'office2', + 'pidfile', + 'pidfilelocking', 'prefix1', 'prefix2', - 'proxyauth1', - 'proxyauth2', - 'resyncflags', - 'resynclabels', - 'search', + 'proxyauth1', + 'proxyauth2', + 'resyncflags', + 'resynclabels', + 'search', 'search1', - 'search2', + 'search2', 'sep1', 'sep2', 'showpasswords', 'skipemptyfolders', - 'ssl2', + 'ssl2', 'sslargs1', - 'sslargs2', + 'sslargs2', 'subfolder1', - 'subscribe', + 'subscribe', 'subscribed', 'syncacls', 'syncduplicates', 'syncinternaldates', - 'synclabels', - 'tests', - 'testslive', - 'testslive6', - 'tls2', - 'truncmess', - 'usecache', - 'useheader', - 'useuid' + 'synclabels', + 'tests', + 'testslive', + 'testslive6', + 'tls2', + 'truncmess', + 'usecache', + 'useheader', + 'useuid' ), 'blacklist' => array( 'skipmess', diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index 28e6fd284..135ec764a 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -269,6 +269,24 @@ $(document).ready(function() { function setMailboxTemplateData(template){ $("#addInputQuota").val(template.quota / 1048576); + if (template.tagged_mail_handler === "subfolder"){ + $('#tagged_mail_handler_subfolder').prop('checked', true); + $('#tagged_mail_handler_subject').prop('checked', false); + $('#tagged_mail_handler_none').prop('checked', false); + } else if(template.tagged_mail_handler === "subject"){ + $('#tagged_mail_handler_subfolder').prop('checked', false); + $('#tagged_mail_handler_subject').prop('checked', true); + $('#tagged_mail_handler_none').prop('checked', false); + } else if(template.tagged_mail_handler === "none"){ + $('#tagged_mail_handler_subfolder').prop('checked', false); + $('#tagged_mail_handler_subject').prop('checked', false); + $('#tagged_mail_handler_none').prop('checked', true); + } else { + $('#tagged_mail_handler_subfolder').prop('checked', false); + $('#tagged_mail_handler_subject').prop('checked', false); + $('#tagged_mail_handler_none').prop('checked', true); + } + if (template.quarantine_notification === "never"){ $('#quarantine_notification_never').prop('checked', true); $('#quarantine_notification_hourly').prop('checked', false); diff --git a/data/web/templates/edit/mailbox-templates.twig b/data/web/templates/edit/mailbox-templates.twig index 6d150b263..65a83cd2a 100644 --- a/data/web/templates/edit/mailbox-templates.twig +++ b/data/web/templates/edit/mailbox-templates.twig @@ -36,6 +36,23 @@ 0 = ∞ +
+ +
+
+ + + + + + + + +
+

{{ lang.user.tag_help_explain|raw }}

+

{{ lang.user.tag_help_example|raw }}

+
+
diff --git a/data/web/templates/edit/mailbox.twig b/data/web/templates/edit/mailbox.twig index 32a3706c1..12c1f3b93 100644 --- a/data/web/templates/edit/mailbox.twig +++ b/data/web/templates/edit/mailbox.twig @@ -117,7 +117,7 @@
- {% for rlyhost in rlyhosts %}
+
+
+ +
+
+ + + +
+

{{ lang.user.tag_help_explain|raw }}

+

{{ lang.user.tag_help_example|raw }}

diff --git a/data/web/templates/modals/mailbox.twig b/data/web/templates/modals/mailbox.twig index 85091da41..0c164332b 100644 --- a/data/web/templates/modals/mailbox.twig +++ b/data/web/templates/modals/mailbox.twig @@ -76,6 +76,23 @@
+
+ +
+
+ + + + + + + + +
+

{{ lang.user.tag_help_explain|raw }}

+

{{ lang.user.tag_help_example|raw }}

+
+
@@ -246,6 +263,23 @@ 0 = ∞
+
+ +
+
+ + + + + + + + +
+

{{ lang.user.tag_help_explain|raw }}

+

{{ lang.user.tag_help_example|raw }}

+
+
From 8cdb0b869e4a239ba760c5b294343f5cad44b043 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Wed, 6 Aug 2025 09:42:43 +0200 Subject: [PATCH 040/180] fixed favicon.png (#6570) --- data/web/favicon.png | Bin 15428 -> 17611 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/web/favicon.png b/data/web/favicon.png index 69eb2fcd1f25c33001a6e67f9b2a257a5fc5c8d9..5413613598da70cb968f7597c796422a6f3b9fa4 100644 GIT binary patch literal 17611 zcmdsf`9G9h`2Rgpgz!{CNGgiSk|ax(l7tWj*_D0Ep507O;Yp|nWiKRSD{IzK9($H# ztl8H{b_QeSdri;h^ZNV`-+rmr%W>{=pL4G3dN0@AliS*AhnS8tAqa9v{pNK&1fhd} z(jklo;IDPRo*np$-u|lARRsAM9ki<(iy$Wv_3KwLe#wi&j?ei9UXN_e+KdRgEe4`$ zmUe6JxfW%8%T<_XO(yHcR@>CwDFA<^}HF~{37hM<{8`9 z$uGjD?x<`=9#<~3al2FX@V-?1f!oYZDh4y=lFyWWh@^9#-?ACbt8AlkerA-u?KU%{ zY*f?PKFxa&*7g6%AF&Hb!*z+T)1p~krLMNiTDujcR;YGIX-M6T5{i_%XWJBY>qCnx z9pdg|_%X7>)X}6j_418bm$y2RUp*$zo+T&Bj_gjyc{MiQw@czVf&9{JZ4XpnQxCXx zgROa9vE|3vpK{hFXP+a;b8ctO{I3G1`AUiyY`>aDcoB|=Jh&T@VbcHnp*;2J#G-WC zu6$8|;SDyPCpxPL5)@HdB)R$i!i+(~PW@+bQL1sg(LqUOWRt&Dp6b$Rxprl3OK{KN zw7+o*GlJ8$wpIG@WcwXH6sx$(-!3Y(OVVOPT67G|<`%byBzG8Y%%s}!^CP%|dy8)) zw`)w2gMxnzEMtmUhe{AD>=|rG(JUeUE7dOYzEiIU3c;PpIX~dGUAx`1C!dhr8~EWJ zJuXz?^MfSP=*xA7i_r`SQt)p_TO!qG`NwMc*HOLX&2tM($fn@*%-#sK{wDR&8LUDR z+~%m_-dZ!vs^w;ou-xl+iayAzKu7oH03v^2W036P1q4wJ=p7vR*AHvG{+c<^+*yA= z?jm+j{;!w6(zstUeDBGgnYJY>OUiN=hJ5}!cwGa}GYG*UnHrf;NX0ta#zwrv*v1yw zTy~G*&+WRidzpbyy?QZ0au#u)(IJ|$1Z?@;c=oB+q9!)Ey8Cgpm7Wk+f)Q`5Fl!r{ zrDcl2#o#hZKMZP8vuasGnS#)98UT%_{PTsduO>iC;Gzcn=~jgRcP zu90!617-DFJb)5+VMfU}fA_2U+TLn_+so0wjOtXL>5Y+-;;&w^XzoW4xwQQA=Zs~u z{I)Y=reie>wM7nQXKv*0dI@n3HSMID%MLYj%J0Wj5azb!8((1)3kpjw?uZOi*`~He z%L?idr0YUVgyG1ps~~zIuzl2I*IuPFj~sWykllrJdh4rZ7Ek0iuZ8(rF)n#?d!w=W zF8!WO2vQ=EJJ-)&5J=LDxiEA2*ycKU_(pBnI5HMEQ!aS%d2PO?i>>zfo5IU`Cm0cA z@f~@EpzAub@s6+4WG`bofg!wb!{^YSRr!DATC>a}(ocs~HWMYIW;6`RB zZ~b!Pwt1q`dR(v81u*(uEvuZuFd)iRB3QDU9t(DIxh(l-aajP-9#!Cfrn7DD^1IKr zAvIq<1e8$(xd}a1k9=BI4~8JNFtsT7DAZ@hf{NRp zEr%c`Ne0^){Fz*o)W1KTja#T$nNZ?9u;d|=yLGv6J<#Y7()iudZT(E>n<^#KBs8&* zerlIT;c+IB-F+;#C{Fgz6tM=|{rvcVO~G=>NntLmNk!^{(pp=^2+#3arjyQvGEIdP z796oSigy&v(uNLNxvMhCxnM-cq!PtD^Y%=lp5K`NF=jfXq=GoEH2ujqZN=dDXn~ny z+jNNjc5RqgM_cQU@{)4j2~UD=17c;Vr!6^jT=r`1(hQnnp+NuZ7B^k$qy~bdD-3wo zkG@LQI5ISyASPcf=(rJIS8B9&`9`CV-RyM8QUq$OI$-HVkJqAMmRVx2=q4A(U6^il z�b1ey`icy6Mtp(Hc1db@HRS3aUyc2VOrJ0u?0yL|NosfvY( zA@3*$KZ=R@X6Zxp0mQm}G3rv6U-8DiT@fv_pP$3f#nWp{Y(c8({aw-!KQ8A@_17uB zKf($8J)?`2H*U$}%r4G)!Ey zzP(s_|A69}Ejh^`qV?M|#5Sb#(;L;TNKEqR<>k;_CZk%qlYtv&cYA9)JQ@g^p$S;R ziiwNQ3w8u?;B&6W{x;8+j71YI<8&^P`=VdCxg2QnAcwvViSt3emKHAZST?p@_Fir4 z3uJ0c!xU^C$S!&+V6|33i@xmZ%;Kd~*^uwu zNXhCeLMfXZLhbXdoVQft<;aA>)`H`Brh{ zhvK#$4M^=r=9tPVdtTIAIz2*8s)xSW?GDAA9>uu+u5n4EL%d5gpLW1=7L3oi?JH45 zo_B}g65nnSwBP|UIc(I~xX1R%^Mke|P1mCcqyP!;G}CV;j55@PKfis{^tI`*SEDOw zx8YkEH$^XLKcX(eGLrwLYwy0Qy4JVdQ3Kaaqd%))Ob8OWqVO|veR1`c^El)rY+g8TZeD9sZQ=ZY zQs-MiMER-amy1kW*iv*jp=YKXQ4}4;R@nr_*^kEC@D!l2>xJ_hrnSjh)(9>>_OboZ z6MhzDm2;Scg#o(P3{mQ5By4uDI@8jjdQEpUR0h5to0w8?aVJK;_rAV zI_mFEi>3NDisE$IwubX2<}zX;RpJb`Nd&{`_0D1^W~7TQX8H&dTW!|{EVT|fNmNmm zpk)5IhQr9NSi@!Xe!sI!O>}V`$Pw!ceDwE9w!9NblkYfkM!3%_c!%A6b=2c_KFa+-rzn+_m9^#$rKlp1L7$s1^sb#IuX5NW+??_1yAaN0VfwS6GF z%fl_>JAq`DvX6!QeCN57jZZ#9k0{Gm$&e?TbHqk{HPzU#Im~ppGt(NTaMARYVCl~! z=b4b_S$^a0d#TunaZBv0>S7=w9x=KZ!D1!9!u8==_*JH;viCNR~TSe4t z9|IVv#HGVY*Fn*nw#J@=9Vsao{89BYocduQW_2-tfeu%4oKDDB&TaHg%Ah7Af;(oA z6lesQ@MhTz#)zvrcOi_>lLhfMR4?nwNUF7orQN4b_!O-C^fJK|BIqJ4$;XwpB$*gV z`d|9q>stp=a4=5AZXy9ni^~M@i~AiBjyTZLD;JnG)unXk>}F%|8n~rKt9C`e&zWYMqS>6NQ%=nT6~0ja55J-*${jd zpeHdWSU8-zPlQDReznftFI0dA7A84U=AFEj&dIF?0$%7xVAMwVN50W!k?1RVU+Pi@ zq=;dRNZRD|?m{O$B%<_bv!EmBhULz!(ReL=*9gR&JK>sgOHP6GR`eH@(dRKvH&Rf_ zTlmyq;fCeQFv*u?0t;Oohu?NcT-mSqmWoiE-+0%&2nL?!5I;YVfT7GWL>t`rJZIgy zHJYfdvlxxIb66CVhX~@JRwUUe)GPJ*>I*6O(9zXh$_qsR-C#JydG-9}7CMG*(;;Fx z$&`xS<;yod_fN7=olhcCb!{8?5!XnhIc7^y@LG@w z4@rgyn={^#y8$^%ZDX8zr2K8^_^4N~w3ZJS9qthTw;L8Abva@da_{EG`fQxhv|Ucg z@LYYS&w|zYO#04(WuQmY8rc9DKsFK!%7j!5FZL;-^-0=$&v~665xrqpM`xJt9Gx;# zqxd@}6yQ2IPP41i|LS05_b!&deOiyzgaHzC${LO0y=e!}vB(ky+s+<6LBhNE2xoL4 z>3c7qQ6(Cdw+s^dKQHS%K|ZiHq5+(JSD?>JHuPKehxu;8&E99wN$$>XCW+9nL8Se6 z4ChHC@4E@(GIPDQPfP1rSeSW7Z#Z=zAsHW;U`@J=LZu&!G`cNOp&8=QlOtxleSMrV z8lV5wwuc)j5y@TsxRlLB@!x+$o|~ejj5r*goIZN%mpdEkTM3kyBTxcf00t}V%)u*? zeVfIh02%oTAX48N*x4iD6~18<=wEi))8=AK%H*Z&55va(g(T*MxH*NBt-j=lJ$YB+ zIfmAF`xBxBr)76Ul|M+FxGb*q`yS~sH|ivFqmkpiBrnDfG|Zx?!-#bG8-`*tIJkF_ZM`p6jO!3FyBX|3-sAk8;v@WAvp+|lC71(A9sXL?-Jy({~z zbuyVz3~5G1L6RAbNP5fvp^vXq0gybsYPc_j>6}Jf&c%w+_r!CY2ztnlq;KROqK4LM z+p}lD#zBiCD%PtIXj*5Q(;!6^ef55;CH+VA}u|>&g z7HY2w;&2sG=?@j0IWy{h+kHCa3>VwG!S$nUaM!v|A|>ww7(X@TH}@Xp+m2r=Fh$%& z%Otax>x`1a36{Keq;d#FW;Dxi?jNWjZ9MFo1bZ(#Ur&_>hr!X6I*1n|uTXOB3ywQl0olW&eG$gOUt6%@$6Pd zrpqbQ5O!VBF>(4#Y#}M*qpBnxXY1|SBm>@HOpFH}%};$Hl8sG;R~ytW3i?}zV*U@I zR5}3&P>r?YN4}DOYsI z_Xwm1k=3|;_FEMj}cSaIOm4~z2}`jL`~ zJOKHOV$t;kmA??VI|U`GSx**)uhoekL@6^E^H4NIw0*W8%42x_&tw#Q7+^&BI@lV& zhvV3&S!RaZ^j!fH6z!4f%lYrOuj6UQ_gz1zySDv0`5&~qsq$%A3 z=h}{ur#@&M$CfjxY{Ak2*r&IdF`@jkE9ZL@Rn-V;jEIRDq)64J?A<9#u1bItT@j3k zIb>%Vn{PzR5Q%mpm_M*X`6<4=HfL_%R=NdO2#$8XNLN<%mvq1#dXI6JVegqu`j+`W zU4%JWVUD~LbPrlds@atQG9sdb+O`j$#<^g!H$?)dRUP$&=H(?PdYl*#iuv+=WGI@8 zM;eht^kR}6kd!!klJ6xt1ayam@_jI~sd3-(5ir8nkf@xH)urKZ!Ud+r6ZWJ@W=7=GdGWs7?szGIv47sGh##iI3FRhJUbpg7 zmF}xH0<+WuNL%d4zOBIUnew#2C{;9yp(It$pF#Tfy z5Z>XfIZEmm$O=#;E|5J8=n=En70nHMy48K!J}cc9LK#vM@>N+L2*K57s=lw=#b<*G(9gV!o}x8MhC9rHf1hcSaExoN$5c{ zn^2J>6W}A1Q3lnVA%eF>)#kg^?i0Y{@{llM9f_lMm}57 z4@FF0>jUAthE&$iFBi7g{=__RB(d4`a8({cA?>A=TgSy z%qo)il(R%TCCJ|}Fi+ab(MY8@N%|`~jLP;!G;onWxLuyy8p)q0R=-##!09eZkJy}c zWqdDon6AtJKLJI0D^;Jnp5OQsa#FrgUxHHNS#wz?ZU6wto~3S4(5Z|@+@Y74qbGLG z;@fK$Fm|2_8*LO8tj%Kt=fa&~_3Pjk`)yM|fXQhvpB=i2)E%HHjuR*7CT{+L(hkg=;nePMnpU9$T7?Z+572&^DvUEdgxV{YH!x>G zF$3{pzN2JnYUsTjdbA#^oYi8_Md`l{OQFk{XjaL&rtC-J=}0hm80Eh5Aa3#^dSjfR z*(h%Joy&bc3`&GCz+a{fU#{jjoz!%$S29-oNfRmz28)u$pMgPC_fCXmxbQ!4KvRNb z2u6o&#=9#ygu|#)+T4ZDb?xhje<2@!LYB;t@Gdmf)iXCYj$+5P$3B?WAjlNSk=Gy) z&3I6V=o<;YXH4~5pn8ZF22d73n<)5VIHS)>)!om6EdhVZ))S$ZkjT$e7r2kV*K-L+;tEp zLL9GU9faLyfM=c^#hUK0OYAv8b&QE|Fd2V1+kJ?-0;T-oJd3*;qO1v2=$+NNhx)sf zQ%UFKb~oY7^655~ftVNi<86Wg(_c0a`_UsMQ9Jb*D5NX=IglT@eL}Tgo=TbALF$T_J3%B$uyz1cK`ce)_^FIO-X?{V|0xi>><0VhFjdaKwiRl zkUoQKP^5w=53N30!6e}^+SEvPT<1Rt(Y@hV02@$)Jw^$14u8S=FA-$kTHRB_vqOGl zfb~BB#GnUZmlH-L?KB40b zToi{udc>Q)P~v^}RDrj^SpSwPsZ z=V~wJh9gNfJ=`W*i)8tTXmYBJvo=lrgTk7j!j5$5R+E+YG?XLQ*@KrAt|@cAZ?Aqc zx90}@?b$iFZJ@~TJVS8NG#W2(vTqV&loafBiKZHawHqe+n}7Q@>dO*v14NU!CBmiR zT3ov_qO4|O#3(aC`N^JNC|9cXjR9B=SKzJfTGJvY=6)%7lRq_bO3c5)0zko!DgXs) z8jPrvw=jCzntDx}E%3Mwu=3W85x8u1cBhc^3>Zt30TLFx{-@q6y@=7ck#aW!(@FlL zx@?V8Ga(Dw^>We>)|_9Xcuq+Jyjiuo-v*z@HRURN>UL;r6L#*7?R-69wi5I=ll>^f z{IigOann{!7Lon=y*L?{+SZ&jJYYa!k^Hp~keT4wlY*tpOr48yTHETB384!f{Zk#! z<7mTx&g=Ch%#P@9d|8>fL|<|eHa{^xG@@hCeCsU9@8>I^gKfR>Nj=;}da^6j0%ua8 za3`eq)f^#j`Vt`+9Us-kl)ZV*v3vT5&Gz-Z2Z%tr>cGyj(q6WfyoJ;*n)v0SmfVRh z6L_JU(mCgn2Xiw6-sCiC#p|2{(laoBPygA|jUp(lkAzsMrS(D)??!L)YF*y?q|AI0 z7T%wUcW_FJX}u=Yr1RzC#t@3=63u3`F>a}_JIl?dXehOZpICK~ZeoxIv4gL{f_ztD z*3cm+Tbwo;jVhSE>SdfeH^={p4ckO;OX@kQRr5Aea_PZ|^w7VME?Jki4)X>LU}e0v zOvEg0U{x*df+F|i9k5dEg9+i6!=pI(_U!Rmgb9pYWMTKetQ=}5Jmk&w4E*jtJA9v- zPP>2Hc?L4D3WwI5ue9*2)%v4}2-5IC8m*qQ(@7^salqXq+F5vsT(q$GJf*$;`PJ%P zdBJJ=^Rh%#{yzwA(?0+0>&r*OXOmmWR<}T2iOIq8^!)hxZVHt0KfM6q^{lh(R%kC; z(gLe4dH%Vcp1${#DZZToPxhl}6-sMcNlOHShH-}EXzR(MFJ6Ih%hHU4ypTCML=yK( zozU4Sc-r*;vcB#dW|kJp?xro}u_-4}6|5MeqA!7yuQf!NMyX{$PGxCcO!w6N?S^r2 zvPH;P$5DZk81MVfT%sD@bk#zlvCgf>Za>zKv*b0DsNG|(r=FV31;seTu{%F$UT^OK z&RWUgHi!gsJQ3!=Kl7HDjJc{O`lc9uWA4sbls|AnGj-P7VpJZ28|n&jbjBd9X5Pz= zOsLx7JZ_n_;@Z05;v-j^pMUNO>FXoB;(7N zf_9UR6YVZGH`->)rE|c^#JA3l>iYaVoqfDe;u93UC=M{)uMKfB;NS^Ncc8Lg{4M=PQ?THpk+<<-wEm>FqGz1DMai=cfv7K3X1Y z45uCkBQNlazoj3K8mvnToR9Lg@ry35#!%Rf%2R@~xhc*}^=#*q+{5*?^vv<$NLlm^ z9!Q$`m>Jgh^M3xrZCiz`)N8H9$M;)5Ly!7CH8qCYMee^7^l zY3hrF1@++H6U&dFO3q;P*-$@yQ|P4u*0^R!`YOjYY^69=2aU?Xx-y__z@T}zvN595F)llSlqpn z^~7A#;^R*R4mEzCkOODL(u|}^6WDR_Hvkjlik;B9K-Sz~sO$A$BbflUktawBC7s(D zOUscfJ)87y(Co05@Rel_LEEMpUZ#2=2rpNXl*kM7ow!f6hYlxnq7y?@i#%=wqZXj- zwc*A1^auREB`Cu~U$as#g}w+2qY?b?6Hp^hmRF>&i zRsUL7V&~IZCA)`IhI<4%uJ<~ujW*Xdxk~%ehN@+E%}$)*-7#&zOx}4W!vxA#amk-K z!)MUhkWj9c6^&tL877&8%GzEzpP%nJ@4RqLCL9M;-sCVqqwIijYtZh%YVH5{rXH&m zGR8V9eUXO&dCt=&FV7EcG~PPg3Cpnj4+674c7oqw4oU8d1Jb z#|Lv|!CYXOc;a*1);%{$M~dTVdEr~r8Sd;#U{!k4|2`{r#5XiNRfC0Dl$C*T0G>-X z>3etFrf2iupv7O&0_n$61?khX;NDA$9l{Q|N3E>FzV`Qw6NE;6i~s(3RA6kq(?F4; zQb7(Zukxd$zpWQM*voZf*|PW;9dCJbL8v_=%7Gie#N)x$7EHa;tA63a z0PyqF z8y-6f$5`sPCHQFtQtGotnnk#ZM4htEe|WPHwixV7RK)RA&v2T~1qh3I#QK zK^G&=dzRj+9;SRVv20d3uC$rynI$@KDgMGAsF=MQQ!1@HJ;jf{vi^2W!#}A}2%k)G z+~cF-13PJf##MRwQKNKY1N-v@AAHqOI$RXcny@Dsj-dthmbn0IcE0Wmo(u8#RIBjO z$h{zHmd$B;n5qw0QF1QN-^Jf>{4*yw8frQ5wfRdWbDvuDm?cBhfs%a>#mSZ%NIWco z-Dm$Pt$Km!2LHl8u3;v~N(mhjiJ#X-{K_Z{c^15iB4?0**oNtK!%EWFCt1hqq zO<*vIKl*1bgs4M_er*QMPUT$f!DG)MHNMs?7oDG9UaArPwXxN#_9ERy#4@49jfW$gyur0HH{qI5b$)%D^82bn++b zy&yP2AJV8#p~ew;Tk>0dbKCKMMApK=F?=rVhZgmY%`8fHaI%aTr+xsGVcTP{AQ1w& z+8)3U{?nDDc`o2S5v*915UOjd<(AP)o)DR}EYH}u?*K3_8f05092a?YQ-Qm!VQBSVC|Hy1HZuyZ|I z?=Yi9G}O*k)UIBCGjVz}UYJE#saC7vMbp&AaHd^;sy&(+h<*OxdTvC5qS@BUtpa|dN`@GPTH63^c&CBqoKJJ-E%z6t$>w9` z+&;t;P=COE#9vu+9`G?Uv9w07;oGYV2EQ&OgnVmjo7xeh-Zs&T%eQzQRqvCws{wMu zdzqL$*9gNIjxeZ%w*f?bU;Mbb?R&=hp`)SQ#xsy8m!hxYTbD7 zTP3z%W|*h`8>XyGk2+=PwYz?Y>ytkC2H*-S(3&X96my|sCk<=p`)#8(T(%|asb2HB zD!-p6Z$9}DVHX1UzUAxAwJnk%O(qd>h zpO3dj}I9DK>N<|@;pq+#u$*do z<2|$TLA;UK6A?gimX9IH1DTa_WbluHuSt-T>cpd))B4|K23#d(S>r|1+$~%`%0`l{ z%t9XyO_!76o;-Mgb~OO(02rURT*;g(kS_JnJVfG!BX;gQ{hywZnw&7K#O7lzN;?o$ z(An<*ipMZ_;>%W_OgP9*hg~@&nM$7c2iDQLVU`e}a@x$8<~784G5+(;LSN!z4LaWN zh8Gm;4^QhySNK-V9H0LEtqIKPe^%laDku|WE$Tk%0MXQabk%)~rCAqpcLj+%bSg$e zSG)Wq8xtbMCpn=5)1tr#Uf$yF&5*lYD^GkfUo6yIRprUOvKxQ=5URHqG6*OX^>AC8 z2iX!Z^;oiFD*dRkMJ@HX^Dk^b`l~kbMU$(+e2lqJcs!X<-wQ>c*b`)u9kC8rGN$p8 zv8lfI{j{}cpAd8rXDi(fQG;D z6{Ip&0mMidshc(rBKWoDN+4yu^>tEd#I# z(x^0V{LeqIsSW~^Nh$${4RYj98b%LH_FcR_dkV3NGXShYjMtGh@ZWw&9Jg$KFODSW zbA>2F;YoIyH}xglV#J-HLkx-GRQ2rR;-iJY&%%^Gs7KVZ72M|-{*+m!$Ax`+N+M$FX<$fJXvQUzymzmJG>B&#_Hx6U$(d2ypqa zr$V2sfnZ!Hk^Of2d-0M}bjk@i=Xnin$AhyI!OWiCfwHCioeL!07L35j#6dO2xl>@K z=o!o8wUPz0k56(MB>wok%rN)_WM&0ng49pUu>`Q-D;Z&77|v(V|5G(J%|M&QE;75D zROT&UwPVoI2rjcBcw%(Kh76I;npuo>bv2YrZi=$JDKqNxCw*hyc2FbWY3}qmRwMHr ziQ(n6AHszau)BzK<3J`x$7o49u_Q$yU7zus(YZkszU)NJdaO)F0pcQM z?McJ);?Z)%2Ivj=*~f_DivXvMHV}eFzkQGmq|YvYn)9}_By&ZRaqc!e4`ZsB0}-Nq zsc{Mlf;$CFuwX8zxA*Mv?CkB;!p2Fu_Wdj{P#*?5%oxS+*6K!C64aWP8RSMx7~O*# zv&%e9AhSKjv0g*wPL{^$=pCX;=^WhWV7Xx*{2+@NRUEBk-Bkom-P7Ne^MmQ+#*x#DZ@!I#|OHjs*Mfho~Q$Qnr{Gy0&i>r~$6{d9CgT1tipXM#S}; zSf_}_M{Qq;omVs|3@-MA+5Aw1CIpIwq_;x!RbDfMaWmZyQZ8jzPBfox-57oeM<%B_ z$bQ?{&oXZN5vY{s*^$AUdard9$ZLD$v{|%iSvB!T+$nlqUEA@S5F#M4xt_{_zD^o+ zk)uHu8`3`andx1K6#<%ed z!?NyAavY%18g4qp*7xW#_a~){e_v)1)=Cz3ww$ z?gUBmxC+v50~)?h3$4X21Kdqo)239TxGSWa$2PYnRi$;M_7Z_nJct@kWJHphg*X83 z!L7FX<)O|x>W(~r0f>mHG1Z$DHNNf~k@54_@p=Pj&Um6F0@|j5-fLfc+lE=wGDDXq zAx*}c524czN}9njR(T@q%a{p# za*+KJ?dpNo5b=t5XYr!6G;(Ji_`F(N0~_WwoUxY&X%?CynGm_hH2+j|^aB0A)5h0u zr=k09enQt^W>cQX1p@59tnfIgRzHy_B|#-FUy-L7+^YJ8H>Eq?f9!y?a~t$ccvUa_ z1&ga$Eh(!^DztFtYo)cq>2T2fsYr*QGcdh!{RM350~kkBJz&nv(qnWHr?qW8{O(_( zKf`^gmzxpkyKSoY28cHoS?63D4G8b3Xyt8vDy&ZV*e1N@r^}bYz_J^^-X0n9AaRX}^6U6MB(K(_=KD5r9;ga2w-Ow5(#su{(?7!q3#|qS&U^l8?xMzDblNh6 zZ$vP~a_0-9s^>``ng@&G?mHXpLwcJ?R~6`G#0pbqN`GssB3;>>(e8W{9T_(>6ygx= z6N)q$n9J+-G2py4)e2atBRrA|%!s?IP#<)yoe$~S5J=D6r);K}c5jW5CbdFDIs7Hm zmtp0Z9cc*-2Y-qc*lbS0<~+#6YVzAZ_2YEw)^M`1C4%?@&dzEvmkb%h7#Yho+?%< z$T`*W5PFF5>L1zFn+;X$mK!kcC#_ZbJemzrceV8)seuRhxe7*}rH$nIjAj9`PQcnz z+h=;998=?d3OavP)EE$um6-!cg|^QAn?MRb|7lGgrt-+MG$B*%|?{B}6XWw&iHA9{4DbetI7cS_buZe}rSH`67^B(@%rzqA{uS zKlIcSikGxz(|!b$`_4tM$vtUqD;^NVpDo%CHiiOyKd{FIK2AD05d`>x6G-E3_elGc z6P7h&p%T4}tYi+v!<&HpmDf6v>tF1-2!`Oz;fCIyv%$gd)Hs6Iw9iD za^ZQXkpTskd=#OiMrcMvgS-edZCYxdOP)K;iMnMM?E12d4Ux_fNgPbLN3t~1!NT2| zGx=jpLx-lr4oAcE04QXPu6#&dzHs7T_NSnc95JK8qJW>_<7~+A|CCobV*i<8vZLT4 z50o%)xn`Aupcx!G$I5pV!48dw{>tsU%cbma=`PNTm@dlhcZDTz0E*Rr%^#U7RT~A9 zk^bIU7-N$s_M}}M8j2T4-xGSHbySOxdXMx>_>~oDA5w5082#Gc?$S9uoN2jYc0C5t zgU-hXuYX&2#)sOcK+$r*`=q0g;q2NoA`e3bMx2%e-hh8G78ZK zvqg4^(Uc9f`?4n!^|NNk>uluErAhk|t;yp_3hcb{_oLzbnA)Xd*))9ypwPgl zWG(%Lo+4B_5CMY(MNj<7YA^`n@hgvLQRAHp+2FT8dcf83iUd;7kkRgK1 z(>`HasQH{Dlp_W@)#X_B=Z2d5aX^s_j*a-@FMz;Dt6r(JHH>|S>T?!)raE#&a=sRZ z;Y@A>S2(^#ZX3(IZT)f=aKrLw18kRz1h6i3Xp@u!g66NPziV=ezT`Uc{yYt7Uj^#L zF<-9){l7-gv>i%gUxNR!FMG&Ru`bEF)=|br$Oma--+eUM^Zb+Du1(E_3097(a1veV_ox|+tX`Hazrk1OMXh|XP*=vP}wAE;bXKZhDoSK zQl-b~dROksJw>cCowa?Pzcb+GL!SYXwYtXu+ty_g39@7ofFWRTTEdAT3OxE&)oyankFq?cr;K3XO7P~?XkbdYRTGJe)et@dh*1zTzqTG>5w|R_e!~C(5en%BLFKiyG&Q_ z1G7HA*9hLzrikI8MS`=l=Ao3TW2rtA&Z>29LE7sn&b#F}+Jo7$Ms}XXAuVPa->(dqAjnQZC^jWAxj(82z&p|d*$-kX+|zl{pHkW|tV=2CC%VDlU2 z@zCLNSA#Fh65;bcZCVGV2995b2v9D!$o;2b zi0k%s>(Is%zXKmk7Zq+;Dj;Vz?co#6#urZGXEj8ab2jC~;Cqoj7ASl+1D~Mgc29|M z69DGCR(jt$!BC{GRXQDeh#2EOpX3*jxpr9CJ8{ybm3?n1U@h zIf|_U?JG-^0a`(}KY!9VvcQbGv57q~_z^z!wCr<7xc2nCySetZauQcoTQ@#@WJ8d? zd!E6oPf!1h$lq%i6R#h2p1V@el)B5Npd=-UZL7)ML9_Y-&l}n3-*NI^jbt)aRl1yzWi*+%JVlDT8bZaJ}$guGQo?SaU3tDd^@8NayRmX zwm!DOj{G)~zlUn?8MC6q!{l<_Ip1bD{`djpq*r5tjo8KVd%`&_LL37!dWY2(csA4Q zIa=r4Sc3hxN99YCHiMW8H=Yfi+YU{HW+_DZksd3yWn7@HlP4&^u@_TKIPWZ8)qWB| znxjh}bO`M%IEE2QqS1(R%$9+f%+T)J7nGrm6U^{2gs z5v0yu(9mr*a(j1Qr&<3{)^7d%{I{y*a=$oA;f&Hyy%lgjq)VAEk z-?JjI$Ok(Qw^0QT(e1z(O4$WFnKm!@B<$)v=Z);tgrMDRC1&c>WvsqdklP2b@5l$C z?VN};g)G86_ma|!ZH0K8@!H+{=@{ki{y@AtR+hqBFeUFWr(=Q)pat{6*mLjm6Hya<8_oH9Co8bQ$T zEgIq81Yec|zOKO+PB#NH0|a@K$j7+I1wZrLG&<*lAc9Tof2ger#sv7Kr0w=`7`_@ zD~rkUOPJ%jD}0oD=l}cf|GPO5X{)1cSWDEiPR?|gI`uUF4*x3uPNi`DbeZW&A=AG` z|Ion!l6omCm=kw1;or)i2h1HfzO~cIYsBFd#@YuPryjf+jTYiD6Q3o~?^TfXnLpFl znz@oy{>Yx{6Tgs}`C?FlalPK4bU?2(YHe^C&m!44&1ApJo)LJC_$Gug(m5W}{gI&; zW%Bt`qpxXko=!c5x6f6%&8)P_Yo5Fk@{rjsbm0ZQN+lg@$Ew`p$&W}IqL8L$#;%um zHH?W+fujlWL5<4W9+4ONj?|@j;+Lf)44pK{Jh65W4?}(1}WdV}>1`cV8KqJR-P8KIwG^P3au)eo#F9gnf#XC{U>OPQC*T^rW zgk&BmAh?1@{TsR}QyK-251#a*B}+1>U2BmZ+1|%ccXx0h(Ro=#zD_fmT`HsTY9p%w z^V9Pd^#xwNZ+>VBkF0ukO|m2eP|U&um{jT3A2~kr`Tcq1V&a zgS|ZNPyUS3@jZ`>R*8l`rpJ~>^>vuzb5g~nt59};%xn9PbdI50vLF^V5Ec3S#`-S1+CmVdWf%8H( ztFJ7IDda7HBJym^Su!PcL zUCj7bxO{RgR!_KI?#6M%;{*z+$+M$BFRoi(FV+r0`^|U|EJ{<5l)3r*i zG$J0u#7Z>e>T|@|OiW9(2%vMCVe++X9Ibx5O8w~5zgf4CrAJlgej+MduwI|MC7SeA zXlZ)`t)ih~3*svXD;~b0s2`N7rSg=2nPKnZyIJ(7A~TL2zaxEc{rWSaxCSR7As0a| zoYA7+)snwpwnD4Rz?=;+b_uBz*JYHYG@L4VJFJ|~iTpec_7-a`+}FaM|CYK|-p1{< z|2H#>C`vRy6i_$`Sk%(1!&KVxFZ(cY=i>QeO3xXYzrCCvFs8(Rc$Cy7ni@%Q2cl94*Yw4f_MO z78Mt@ZJ#A>Se(&be(9;`7Q-5qs|~!Tj3NnZ$PjQ~fnaYlp0z=#D?b2V>&snd-(X9x zGtUtkvUKAg%&EXk;>9E~Kh*uxU*GgCP}Z5gV`28jj4UCU3&q|kL!GzjDyO$@-0pKY zWL)d@kmwm%)bQ29N9wf6c9;6rl*H|N&+|%OQgd}?};?3qj1BP2;pB* zjR32&@sjOfDnZL4QJv_Z8T^;<2REM_|7Fx+6t8>xUPV%Y-?ZeyCi64ebtfk@o+^da z$5)Sd9ikly97nqga3SuAGuIX8=idccxLOLa-bA$=K4R^;v`X2oZnpBQ;rq6~U9!5p z>n|&MO@ENfTczX{j2kB>C`U9NAvtESW2u=@ti9NfC#8~I_&u+u=C|k9SMT^czq&gx zS9I&iQZcXZnQ~6Ovd;Ia9t+4K?i{>`@JsPX{B4F+pl5gPfqyww-}Z&-21~(Zrtmy@ z<%7opmjxFh&zY6luI`tJo&9k+vd3!RkJCpfX#yU6h}OUv+pwNj6vo?6H?+)bh4hqr zOr$pWZmZ98q|I2Qux~W2LJtRf2Nn!}NoimQMP7UFl|{ID;mkxzGHboWryj>IQN7&P zLbQ*?nS0!)ttQXS|BzKaaO^L2i4uP;b}#C@iumBWTuuZ9C+L-rH1k+taAA+cluPoh z^UA`5S-&^JzfQz2=;4|aGYSEUj$zAqeT(#C)+s zIWf?}W%RYgFRJDx8-(8)tt>&zjt`WVl|`sAXoOA?U_B^lIegh=@=9+rDf%4hg_70{ zXJcec6!y=Pb*fWw6sw%_^1AIlJ_7kPx^L1Zc77u_U<#EMjz$hXvs+8(@H{WuBOT`_ zh~NF5tI>T;I-%bRO_+o|9C%oWMfMpw!iYaBf#g>$*)Oc0PZy!ixwUGG;yAdF*Tq|j zfAtvW4_i4VUvfhDD@9(PO(Ct`4=6jUIDVostE*P^Wrxlycpi#l&UdK@XsZzdVppj2aPJ%zmz z2O4+TG8g7!{WX%#iXmg1qf}CzL)LEb6*BQ;=DEL*s?g4sXaWM33mx~MOU3L%BG2=j zePQesdb(~Yyam=g>)PCvlpnsOI-2`x4m09g#F6}pDe;B(KUPko5m4c;Q7r0#i+0~9 zG|DX7<(!1wtPA(lAltfS$GR+{wK&LP z!J%+>Y|EXj(&J59e>jUiCVN>T+l_<0`YTKPzx~Y=l0{-ppm0a41zC)5DY=r&Op?wQ+zdufFv;Rcpd?YA+nxBlqgFGi3YF~%8hm0ua;)8-RC4;Gjn z+IZN(zkiDx!E9R;(EugLv88^gKt zFXhcoImKpD4sx*QElY3y4z91~lJz#c%}6!jV?HAD9PIp<66APy{VMCX0-|Rls554V zZZqXMtAAadV^=(yunkoDTqT(}uITM~SCXqyeoEvuE3Dqf3N5@Fo@2WDRAOZz^i2SN zWekO?selM7x(F3_<}{lh<-uiIBEq{%n~7CRyD6E`XkJ2o$M<6ivSWIoV`DTieeeCn3Ho^^1eWG~ zOSEvH7;-#wiAuU1p(T_Ti54b&Gj61{NQ-jo@*=xlLdY=^$(jq`$48)rg~8@^@lcsi z+Yy6sOBi;Zu@^H^k9ovl_6jYYvY=nAfS`&oAr4nGG8LJ1;JS~Ca3NcM9buRRFMHc- z%^6B^$v8hk_H2URS_dtOt_6Ii>L;LkH?4@=tfBi1|MFwrIbyeZ-n*UaXcU^j4SO*y zVC3EGKr_p3K?}QCjG$3uu2Xb?y>Q#$9^@m8&%yJ;iSyntFfi5Sd@G$wUQ=)2mI(RP2TQn4a-SbT8`NF^k$1!h;e8 z6t@a5a`dHEwYg5IeL9&que_jzF%%;R=5osTDInZ?Bk?{8h_sFN@_lA?YV2^cT;&F@ zt*TreIq7qYX7N=rod%D!vvDf&Y_OnLw2lV|Qq9U0%}?h49`*h7afpUafu$RfLw4j#(4&$SH(jJGkt^? zskv6)PwnAXcBN}t!YBO#;yXN!Sd5r!{OI~@`-&<+4oCSST*!s|C>C?QWjxQ!m3rA$ zGT2B*P<{)S%$^aGMqXp2CIU?;b*68=hZf%D$n!m5}lCmkPS58|{fk=|25^eI}Ycp_fIm42ojo03?`V~FC0 z<;x?$9WK%TC(*vw2&Qbw!*HmZtllEbzZp<{ZyjQDYg)EV#1Q7ywmYk>C zm>!0xXtXu@{e@kghEipm1;l;&RRlXLq*poRjE(1DJjJ_9PTe=M*j#5X)=-U)OXk40 z>J&n*Yz=3~sjwu}s~jXpx|2!@d>Wurev!TocM~&4j^0HRa?}{wv1sALvo;skuTV7J zsmbQtTIO4f5WH!C!V%a?IFfL^Wjxi)Z`#y0Bfwb8?vkDu!RXdLl$3csr;L^u!r3Cl z+=M*j2s2ia#E6O|7R%X{h_ z<=^}5Ih>6sE=2F$L57gN3TA060WExNPIm0Xf&pK&0z%ETqsukxUsgcWY<;yd?1G$g z6D;SHf7&i6I9+gwnGMqgdM) zzDGJ+BA2?WIqNotDG`!%*s4n}CW(`J40%cB-;*dKq)?=nRKj*h^qfsPV#rw=AC;0$ z>H+fiOYL6Fr^ir6(S2FxTh>1$h#-8t$mEy~L-T*Sn0S#J!v#`f(x}hUUNA_wn~&fu zyO>0;ksE|dsqo|C9X{((PdY+T1rFKoNiOr00x#i3LFjh4@Lf$kaRNEK#aiYvme!ZYGb9z z0O2`?BG^Idc;J{xi_1NMX5uS{BdB*ut zREXDzn-`a7+mD~oW8hyTN;kdXetH5$Xs_lp)!B{Nk%Wj5T8ejU)OA1zt0VVamC<|; zO%MWw{rhy&*%~6a2A&frqdik(VrYt9H~blPujnHh$%F?7elBMGf5MokIjzi#xO(qL z-CJmHiP&^07M-M!LeqnVDWbTLBFR`sF(i6M*7-pI>4#VwcB>F3dM7XLQW`lMqjMsp zb6D(Tsc@nS_hy)Oo5NH@7V*hP_S}IXdA|#AFbJ?joF^R6f;t64m{~VzQxHVL_ma9L z$w>TtD@0Yr8hwBxu66y(a}dl>;atuZaW0u}9rJZBJ`N z$-H-n!h28MrYvxfkE3w?;JHGB&eq9c+=VZS5zZ>Ie)T6bv+NhD!l`*kV`>nO*10+h zkH!3wy(oYW(N7l>@rFY9s3ih51HZ=#89NU-#04~isHUJFBrhvtu7JFu=zw2Qz{m@S zi6L6KoCLHmmY;PQ?so1rV@siW#DqWTWmJ0!C7gT9QB?H3zKrbNL=%<-T1kzuI}uHI zY$K#M=XX)qn61vcdIIV5)hBc?GWOuHBxPlC;cT~2H*+E3FH#Bpt?NT_m9v{}zg&zB zARPS&pD%&UxVA9mPp3g5d%m?@KQ9JNXta^fvPs_=CGvVnLIGuU92H&A_rPfjHp;KQ zxQ-^c;GH-P;gsbg0%tCAT(BA24{D-ijeZOJZT+WQ<&r&HB6V)=ybBLMy+$T(#roTE z1kp2+19%dBj$^qH4=e5Eit{|%s$)fjw}LNHFfSFwdfBaDkmT6!$wyOFw12!&rzFTOCwL)jG+5+irQ4LLiC@-JCwai*r|F zeBtLsjR~Oj(sYItddSYegLdG^sf2(2s>ddwxdS|$Q<8ng&cLRSNub?2+8~oariOH zxX34P{%5SvyY8cVukhn5B0)(@%w|Mh2i~j7{vIGJ!%A%m-y&^*n$DWJUi^CAal!jy zvZT%l+jcB0qY;J|X}Y+`1#yI=HlddR!C!o%zD9~AKL{Bi+MzF z&qaJO%~%vHx&z<}#^V%IpRzRM*KEGwp&`)i3g7y&RFUZ7+TOmVDY*~z5FaJ+DVM9{C zqb@`I$}KBnqkx3_V3<;pOe&nP=r6L)zZAW*-vUJl#w%ca$NH_;!b!Xa|w^xz?xHEwueg#<-jC zjGGu{^JkmCR3C~9hdacv59~$)Usd7H0ayf=q=30k=HSY?@;|w}dj=Mzj-G}*flc`9 zP_1aTvopj3wqk_GAQ2fZFV~tjvjkyM^|bm}<{t197{CLh-G~w*tztty3 zNG}yoo(f0*Dp5I?l8v1il}0F z3AUi{vUBG(MyV`v&AD|o;e))0NN(LcWW`B1v!eLu=C%^4Xz#6|d zQpkzj5X`G7uFv0A1Q89zi3={q7@~x2`&EiMdnG9imtB-^@BdqggE4_tZP0#;yfzw< z_fSBgc^mh2H{*X9d*iu=z;m_~?FeXm#knKMQD<6SoNJ6TB|qC=im6>HPP5MWsel;m z`JeuT_CE)989=qz!`ry|zogPT`_0}zRVPRE!_C2#H;}Lufmfg~uO8!Z&p`qd4OuN$ z=@R~q@^h)ULNLRYZ-g7yJ~E2bKMGNAOG$!$u}R}zO4v2j+)@^@ZnaUlB};r(UQ_k>`d0Ny#T#)a)YR9 zm72HGMJz+jc8I-s+>5qk#*9-*K5IXk;ljxr9j-+TbO(* z<==?noEJ_L7^7sJ$QU(nE{KPorKNRg??tX0#y>A@ewL%{P;f?7HtHuZ4Nf@9KaCsb zGFF^JY{AKqt)buL-1Md{1fJNT@a6#lZMpWPESgr9BFS8z6Q{|`m;!#$ znUQT|siWSgpwv{5$10=6(x?Puw36oyV+5)udf}X1H={94BZ$l}7dL1Zn>41Wp=%d}N;B3ACu~m%T3I zO!RuOndfJ&Vqmo?(t3uBU@2=fTTRGfTvp1+z6P29D-yvyaBE%ZZ*J>OgYu2mg zvd+y#qpi>NzS9WGAVfcwsXboxXGaV@I!(AHWg~uHACMcYN+HCX*dAJ%T71o0t{_h6 zC{ZM?%PoYxE)rrzSyU0@`{txt@obT*@qZeVejW7`a-2KA$wZHoD*TX9GmB$%otr^? zl=LMr>e}Sz#a`Z$7h4G(N{Ukl85UN6W+&Fq`|L$cGDIeIMEipNJBXG+bT9vH%#6oH zL*zqELH%j4>mS~!X50i6rBm0WV9eFX&ypUD9sb!C+%bB9k$C+d?#R>X22NRa5d*gi zc(X9gBx8+=cXaT2{OO${_{6G&_`N7_9jQ@gzaK9^()v}WPL_&SR>mLZ@?9AdUEEMo zn5#2)Xm88B(UIwEY%k=l34X3n_13d0i=i}8jzhYPM0Hu`VOdI$hAY)3ff=LKc~ln7 zm7~YlAdyDP)$}4+-mTJu(X&6&Ty}yXAf}2Pv6O=W( zh{6|(+Syy8&MVxlLekXtyH>8@|2<>!TM4jV8xRS&);S+oIdZ=t}{)o_p9gW`Kv1fnJti& zH@3G9|NfkG*yQ{=OrtVZ(u4-la|TgakXXuX1(!1OJG2}Uce+IqNf!QeS7QQ;wmVJK zJl)6m<8|~a2uL0q2YZUsw55pI>z=k>$o#h)d9)VQyt(}xjCgT}mfV8q+52xO)vifO zYcHRFKOVUARz|8dx>o~CHWy<*v*+}-XOIMH@oOt`ay3dZ*Us+p*e#`gR$GIS2uVMr z$k8dlPg^&-TpN7qD>FXZPTZ%E-%%|8q$x`fX1-MVzt=T>VwmmKBYyer-LfkD?FrMDP%r9O@}uP%eHw4nh~fSl zl~<=koISN=5eU;{!~ySp3ZnNkv|O)zWY~3RW+RnwXRqqJmGa2T!?%kNo6(Jz7-nJY zaFZNyC6CH)X^q~YEN#YvO9F%I7N@V(TdZQ4eJej}U)9Yk&+o?fdA#4dgZ@JDBc<_1 zhO!u8QClUb@YLh?;qj{qS%I1j6f)Q#*4wbEMeO z-+a+6Vp-~JxIF;1D#vZ%$ztv#-3v)5HQ}W8%vL&p0HLYLSWcbj1 z$aRb8KHn|Ty}Uq43+q^pETVJ0k%7uA>NwZb<#_I>1*Jy z-p<}O^jK)8S3awJU2^i^=RUvtcOYxEW>iD|&PGa?wd$2UBUuf#Eh~8~A(uWBak@jv zIGAW=67gOZ0 zE^K4Ar;CcGi%NXbFL`?Sf+s{8$x)>x1ojC{Rjh0#8^;JtR&@0F#q9zd3^-dCcNB%2 zP9Oa6G?F!{4JLFdp#(%U`5p&wz^e z7hQJih<7LgzAnVf-U2zm`G+MLaDO5a{2IA!_67{kV#SQXLzP3T;#i>02VVc$~PxxlMZdkla^WJw-#hAb_9=7ao>DEzYix-{p~gLcz6 zi&yMkh`0|2=Ic35x_<81-Olp&Te=lWTE&+?!H!OiREw1s-`8%?be(@i2{Hoyb2Qvv zdvkt}CF|SYn{tOGtV4AT3-pCX8h7c|d5Ypk3vMxeJKaO{)le+RrE7*-tj)34l}=Ja z=AT+-IOOBcH<*sN8q6F=sZO<(CFsjBGf%lGU;XPFcK^!&JOJ|Bn&PlF^(de0#G7s9 ztH7wnmmeCJ51mJXX1Njz8Lu+ClYT$NXfv_dEev?Vb{ZM~tP10*o|=AWSm~oCMS8Fl z?L0c|HoBm^p_BIN)>xSC*9|A>WDx{zofkHs&XRwtX5rxj-*g6ZES^^ut1K$X;UgTT zg$6F0FZ^pRtz%&dMTA>TF7E~e>zlcLyGN4w>VOyKv)8$zO1Ie_ZcbaI^G#!LGS-4t zc~=A>f*A@+k19SxTvK}-uiLDzFu6N*@);^MFv`| zFMQc@>d3nTGw?uefOQi`v$oI4_{g1HQhP(`P7EmArs4Hby{s$PEjwdjdC`V-ADzP* z&CDl-EXrtyyzlU+ZVZ0>A@g2$-Li8>!WRAn9VN7kJoqIS3tI$9=TmluPTR3-k`Kq_zb{t z6CtQM#BIvi>+UfUworZzR_%sDYBfPld=}P;J6Ad$2c6f_6|Z{z$2RQ z?mh!qj6k!#2GH*@8?;8&Cl{?v3dqgLgN&%hFNQdYx-G!O#5+v_N?O`W0A8)ZA1VLV zb~fv~0%RoHqXV!OkJtn<++R2!z`9b%L;0%!)m#6nw-lDlaAxmJ0L(gKIwR6pts?@Z zndgUU%T3#DHMFY@{ z>!)JRzJzo+c6R4`;M|u+M^c9?OhXvMmguH9Hh?xfGrL~s|83(6++!avuBqxV0T%o= z&sq7>n7LeJj6=CuU-z|xm%&9qV)7XmQO{5*|*Q zNH{vla`Gz?@{!?ZYqNV%7Y$GZ43jo}vB9z~d$NEPdW97VE{LBOcPCI5hiz{ik2rC0 zU2$XO5kVE$yF(zW-n^Nl<0A7a>Ub`)C$oCT>*{^412SJL+#s4d2mx_7dfgGeUSGKI zY~9VAAJ5?DLgoNK8GGwO2bD~2W+Wb8rkFUow>0WFKw=l=m8X(Nj%m4mw?fy%p_6cv zyMsNO@$bM=7`>3q1(QZ753Te9YrCt~tgl{mw$9>42h=$SkL6h*H_>IBY?>eWUCcl1 zxP#DNczP1V4Cc+miYYs9-8~pCq#OV<`7FA0>)^3^EcBEa<)7`?tZ$ zK`1Q}jVKL@SPuD=S7Gj)Kt-z!k}Wt40T-s7spqV!V;J#3YJ)Q!AVrU>GJt-RZsrEh zVZ0&mv2OF;8*mnEo(7y2V)eKF1%w!70r0--73VU$DXVp*_Xsbp6WCZ&LP_fiyG#>O z1hHiQsgDY%zXnj5g6=9s?TX_gqZ<5pEtpD8Fl5v}wF)z0gmSP5-Hy-{TNlt`z zi(ZjJ5ohI7r9^XkAtoGc=$o3VyiiOG`}uMO$%c`n2ioiF_9|gYCJRh(|Lq)iC?Dlr zi^{f!>R5}%^=7Ie0VMY>v}+V7ZpOf}`G6byrNgLnEFfl)6C1(9q(S5ynwiJxE5apn z=~~p_3#flVrSOy2g`xyASU1ic5D&fR8`WN3=y2lsm?on7FR2RihwTor%&C~+emM|< zNd2L3K>z8pLa3#^P`MS-1TzA4TX&bN{m%6KE*NtO1+wt* z3<24kKrw=9hQn-qn2LwKlscnpovYK6{sEKD4*4P}RiAv1N zo)v!vEte%W$iXFZcNvObF;!hRwlSyC!23IjIQgF%@T9??Y<5Jk+MbQxM*TVz{yrDU z83(T$({3PTOt_C0-acEWw0vr~0~QweLynSzG0ty1eeLXOMU~@eAoL$@(=()>kP}Pc z!s~2z-F`yKxG_cn*=f10`t-<2jUTzPe?CrYK>YBLLGeuw2&o`T6lMcjKX);z+4>wm z{w_2QT>#G+@cU~H;%jxWeSlrG=YQIraZXrV47p2K{l45vS?B`>7L_gf%>?R&sa2tw z_sEHskbCXfVbVx_dmJC~1X=)EpANKI$HIXJ%rLr2Go$#uE^_*|xW!vn21ie4hN*OTPwo_nz35|Bm`7HChV8k^Bg352$W65F6B*B>k2^_ zY#cG=`R-d9kogX<)VsweYDZD-`HR!iYi@s^u0Ti|#fqQ=;XcBS4uTR$rZJ&bCJ2a2XcA zzf*Ro>+q(6Lu|o&4WM{M)nAfHgOj@xz)t~mm6@yzwwHmWXq!?0#Ad3~i;ngAt#F$J zxQ&_w>cEnr4(9x?%2y(Taj?;GfQXkOtC!2WKS?oZ(X%M_c=rql>W*-JiqVk?&n z0?v~-7~F=l7mDVFgzmEv>X^x0m+}jl#xRrx(wb3^&Y7-!)MS z=m%gUnG*tBIb5!Ew@u=4`lOL<%xD3)iOMHg0($HP6ejzrDu3%QI0!|{K$`x+;hJta z*_WK=afV$vaI~>RcBJ($yKb@&$Cp;8lkpi<7-1_m?+0vD!tW66z677MA zHLZC|bf+xo*-8@t`+_y9MVmS5An@TKF2X|hz;A1;SnfJxx%JVCIvd&(PHW1(yf5X@{yp90ozES^_6-7Y7|G|~Zc%XDh&d${njGN8q_Z5Xk^ z*@6~v!qBhn(9kt;RF^RrdmRlWe58UcVu9>Zp-{~1ZQ}!cjlcL5D+8+oYHvV8r!$>H zA3n65y$aPAUCh;QD66Tw8szz;gp@Wr;o&T@y9d&qLld8O*!MJ(PX7|lJtfFA$}_7e z)icoy3Ou7GnZU0v=d@*^rqI11~P$dT`k!lnL+CHlTirqUi z{+wLuTlS#@y;AtwaEcM8ej*QH2SyA>c6X6{7VH^kXnzh-_cA9Q&oqQ#_@Gr#Z}uXd z*h;Nr&T~?ThcxKNZ($BN=?Q&PpUwU-$@=sRTNC@JFoBoxuwQ zw_Q6tOrQSPHoxRnT;^6^@zIoBKax6R4FPvhnu^$9S~8OcwL1t+*>zHPQHXpU6nixJ ze6~7Vtv?6--mEaDQ*l?u+5lFCzRI>Yo%vOw;GXM&c^q_vA1sAL@M#5x01+2K>f1|7a~O*R#l^638LM2RVcl zpnczUQt@4vo~{1Vz$jwHsP~HI*UwJDcN)I3uHFAPd1+Kt2D-^zZ@y{RdCLUK7AGi! zT_868Y_p-OY8vr*XI}`Y?3%Z3bDfP$XqTz=Mo}uef&Iot_Z@sb@x`9~8rBnyhHgJq zmmcVnnu$(qnQ?o?mE)m+;G)u?=6~cuTBzToVs&58WRO-LG5cyUk(Lgo>p@%h;ImfO zCqFDZshU0fMl3(i`r?YpYE3aTH>4rcIe^)MZq_~`%$lEV4?$b3`Lp}&!=B*lr(U+5 zh3lDF`VYl3KUE~TB(J2RipLYR_*su=_HD~pL7XAXn_x*QVKOW@yE~J{qHn+VK&ch4 z-fx5NafkOFOxEI)OH;)kr49b=(iZ8u7gRv3R2$?>Yw$*V*$+qi96IlFB=oA>P+G~< zlX8J4<>SV9{r)cvS!Eh0YlsT(#-^6h$?6i1E^B5@XfeFRH3bO?Iq)(G#U9Pbyhh(> z5F+($`^`+AGYLIse~_CUVoGu0+QBU4V&aWCR_c_T^a0{W&9-V*fs<3ktz!KZm8Pcs z>Nf>C@D%!?_W$eRB9S8rXyk5mzof5Q+RW_X zCm4I*Yw)&97HwTGq*NJo_;PwxYwIS9Ben3RPvTHbj{MKmA;l0Er?*l)%cYkuo1+}0 z@!z$}A5>T&6{s57`v%dm7L)U4JkyfG zUSfn^@WEfM=*?-a1kH4}8O?=+9eF=?3=YY>k)|N73e@h!%#W1cP66I7V*Z-H8@?`C zZ|Kf{(iFpOgTJ|}xlIg||C5>&SdCwhN~o*f`EHMHQqT!fW1|X&Qzifw@<_tJXD8oo z)K_Yp^wjcM#s-&~)1EOmpFp^w2qzr2=3QeU#Jauz!cb-ZC(r468xpnby5Tb{FAk_Q zq4&shd<;`RJv@e_QUi|nZo3V>xFCwj z8X*3~A0QUN8RL#Wb0C6G<AeuT(H#HHjh%8!4Asw#$ohY8c>e$Jf~&~$eP^jGlsvk?CIb<0 Sgg1VXQzy)immYP#^M3$sTufvD From 2b2da1679e7f05a61c268db208c5e1fbacb70a78 Mon Sep 17 00:00:00 2001 From: Christoph Lechleitner Date: Wed, 6 Aug 2025 16:02:25 +0200 Subject: [PATCH 041/180] [DB][Web] optimize qhandler by keeping SHA2 in new column qhash (#6556) * [DB][Web] optimize qhandler by keeping SHA2(id+qid) in new column quarantine.qhash, for feature #6555, might also help with #6361 * rspamd: only add qhash to new entries while passing rspamd not all existing * compose: bump dovecot image + push to registry --------- Co-authored-by: DerLinkman --- data/Dockerfiles/dovecot/quarantine_notify.py | 2 +- data/conf/rspamd/meta_exporter/pipe.php | 3 +++ data/web/inc/functions.quarantine.inc.php | 6 +++--- data/web/inc/init_db.inc.php | 10 +++++++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/data/Dockerfiles/dovecot/quarantine_notify.py b/data/Dockerfiles/dovecot/quarantine_notify.py index 824d4092f..a681c1fda 100755 --- a/data/Dockerfiles/dovecot/quarantine_notify.py +++ b/data/Dockerfiles/dovecot/quarantine_notify.py @@ -76,7 +76,7 @@ try: def notify_rcpt(rcpt, msg_count, quarantine_acl, category): if category == "add_header": category = "add header" - meta_query = query_mysql('SELECT SHA2(CONCAT(id, qid), 256) AS qhash, id, subject, score, sender, created, action FROM quarantine WHERE notified = 0 AND rcpt = "%s" AND score < %f AND (action = "%s" OR "all" = "%s")' % (rcpt, max_score, category, category)) + meta_query = query_mysql('SELECT `qhash`, id, subject, score, sender, created, action FROM quarantine WHERE notified = 0 AND rcpt = "%s" AND score < %f AND (action = "%s" OR "all" = "%s")' % (rcpt, max_score, category, category)) print("%s: %d of %d messages qualify for notification" % (rcpt, len(meta_query), msg_count)) if len(meta_query) == 0: return diff --git a/data/conf/rspamd/meta_exporter/pipe.php b/data/conf/rspamd/meta_exporter/pipe.php index 4d8e2a132..bd5d875bd 100644 --- a/data/conf/rspamd/meta_exporter/pipe.php +++ b/data/conf/rspamd/meta_exporter/pipe.php @@ -236,6 +236,9 @@ foreach ($rcpt_final_mailboxes as $rcpt_final) { ':action' => $action, ':fuzzy_hashes' => $fuzzy )); + $lastId = $pdo->lastInsertId(); + $stmt_update = $pdo->prepare("UPDATE `quarantine` SET `qhash` = SHA2(CONCAT(`id`, `qid`), 256) WHERE `id` = :id"); + $stmt_update->execute(array(':id' => $lastId)); $stmt = $pdo->prepare('DELETE FROM `quarantine` WHERE `rcpt` = :rcpt AND `id` NOT IN ( SELECT `id` FROM ( diff --git a/data/web/inc/functions.quarantine.inc.php b/data/web/inc/functions.quarantine.inc.php index 39606f271..5df86ef33 100644 --- a/data/web/inc/functions.quarantine.inc.php +++ b/data/web/inc/functions.quarantine.inc.php @@ -22,7 +22,7 @@ function quarantine($_action, $_data = null) { return false; } $stmt = $pdo->prepare('SELECT `id` FROM `quarantine` LEFT OUTER JOIN `user_acl` ON `user_acl`.`username` = `rcpt` - WHERE SHA2(CONCAT(`id`, `qid`), 256) = :hash + WHERE `qhash` = :hash AND user_acl.quarantine = 1 AND rcpt IN (SELECT username FROM mailbox)'); $stmt->execute(array(':hash' => $hash)); @@ -65,7 +65,7 @@ function quarantine($_action, $_data = null) { return false; } $stmt = $pdo->prepare('SELECT `id` FROM `quarantine` LEFT OUTER JOIN `user_acl` ON `user_acl`.`username` = `rcpt` - WHERE SHA2(CONCAT(`id`, `qid`), 256) = :hash + WHERE `qhash` = :hash AND `user_acl`.`quarantine` = 1 AND `username` IN (SELECT `username` FROM `mailbox`)'); $stmt->execute(array(':hash' => $hash)); @@ -833,7 +833,7 @@ function quarantine($_action, $_data = null) { ))); return false; } - $stmt = $pdo->prepare('SELECT * FROM `quarantine` WHERE SHA2(CONCAT(`id`, `qid`), 256) = :hash'); + $stmt = $pdo->prepare('SELECT * FROM `quarantine` WHERE `qhash` = :hash'); $stmt->execute(array(':hash' => $hash)); return $stmt->fetch(PDO::FETCH_ASSOC); break; diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index 767a0024e..422c3f1aa 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -4,7 +4,7 @@ function init_db_schema() try { global $pdo; - $db_version = "27012025_1555"; + $db_version = "21052025_2215"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -345,10 +345,14 @@ function init_db_schema() "notified" => "TINYINT(1) NOT NULL DEFAULT '0'", "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", "user" => "VARCHAR(255) NOT NULL DEFAULT 'unknown'", + "qhash" => "VARCHAR(255)", ), "keys" => array( "primary" => array( "" => array("id") + ), + "key" => array( + "qhash" => array("qhash") ) ), "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" @@ -1482,6 +1486,10 @@ function init_db_schema() 'msg' => 'db_init_complete' ); } + + // fill quarantine.qhash + $pdo->query("UPDATE `quarantine` SET `qhash` = SHA2(CONCAT(`id`, `qid`), 256) WHERE ISNULL(`qhash`)"); + } catch (PDOException $e) { if (php_sapi_name() == "cli") { echo "DB initialization failed: " . print_r($e, true) . PHP_EOL; From 2b93b59cdd006b973b52cdace418b139b72d6940 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Wed, 6 Aug 2025 16:11:23 +0200 Subject: [PATCH 042/180] db: change qhash varchar to 64 instead of 255 --- data/web/inc/init_db.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index 422c3f1aa..6a9d042a9 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -4,7 +4,7 @@ function init_db_schema() try { global $pdo; - $db_version = "21052025_2215"; + $db_version = "06082025_1611"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -345,7 +345,7 @@ function init_db_schema() "notified" => "TINYINT(1) NOT NULL DEFAULT '0'", "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", "user" => "VARCHAR(255) NOT NULL DEFAULT 'unknown'", - "qhash" => "VARCHAR(255)", + "qhash" => "VARCHAR(64)", ), "keys" => array( "primary" => array( From af871fdacbff1464668f8e45982e98bfe7ece112 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 18:47:28 +0200 Subject: [PATCH 043/180] chore(deps): update devops-infra/action-pull-request action to v0.6.1 (#6676) Signed-off-by: milkmaker Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/pr_to_nightly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml index 0cf59eeac..51df14f6e 100644 --- a/.github/workflows/pr_to_nightly.yml +++ b/.github/workflows/pr_to_nightly.yml @@ -12,7 +12,7 @@ jobs: with: fetch-depth: 0 - name: Run the Action - uses: devops-infra/action-pull-request@v0.6.0 + uses: devops-infra/action-pull-request@v0.6.1 with: github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }} title: Automatic PR to nightly from ${{ github.event.repository.updated_at}} From 53c35493a5c673968db35e8eb47463f673cfe3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20S=C3=BCtterlin?= Date: Thu, 21 Aug 2025 18:36:01 +0000 Subject: [PATCH 044/180] fix: imapsync gets correct timeouts Previously imapsync only attached the timeout1 / timeout2 arguments if the argument was negative (which is not even possible). Now the argument is added for every positive number. Fixes #6590 --- data/Dockerfiles/dovecot/imapsync_runner.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/Dockerfiles/dovecot/imapsync_runner.pl b/data/Dockerfiles/dovecot/imapsync_runner.pl index 9eaf5f431..1030603ce 100644 --- a/data/Dockerfiles/dovecot/imapsync_runner.pl +++ b/data/Dockerfiles/dovecot/imapsync_runner.pl @@ -132,8 +132,8 @@ while ($row = $sth->fetchrow_arrayref()) { "--tmpdir", "/tmp", "--nofoldersizes", "--addheader", - ($timeout1 gt "0" ? () : ('--timeout1', $timeout1)), - ($timeout2 gt "0" ? () : ('--timeout2', $timeout2)), + ($timeout1 le "0" ? () : ('--timeout1', $timeout1)), + ($timeout2 le "0" ? () : ('--timeout2', $timeout2)), ($exclude eq "" ? () : ("--exclude", $exclude)), ($subfolder2 eq "" ? () : ('--subfolder2', $subfolder2)), ($maxage eq "0" ? () : ('--maxage', $maxage)), From c39712af671cc150595e6aadc7c31868eef14408 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 26 Aug 2025 09:57:05 +0200 Subject: [PATCH 045/180] pf/php: add mta-sts support (outbound) (#6686) * added mta-sts-resolver into postfix config + daemon * [Web] Add MTA-STS support * [Web] Fix mta-sts server_name * updated .gitignore * [ACME] fetch cert for mta-sts subdomain * [Web] change MTA-STS id to human-readable timestamp * [Web] Remove MTA-STS version STSv2 * [Web] Fix MTA-STS DNS check * [Web] add max_age limit for MTA-STS policy * Added tooltips and info texts to mta-sts webui page * postfix: replace mta-sts-resolver with postfix-tlspol --------- Co-authored-by: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> --- .gitignore | 1 + data/Dockerfiles/acme/acme.sh | 2 +- data/Dockerfiles/postfix/Dockerfile | 15 +- data/Dockerfiles/postfix/postfix.sh | 24 +- data/Dockerfiles/postfix/supervisord.conf | 9 + data/conf/nginx/templates/nginx.conf.j2 | 12 +- .../nginx/templates/sites-default.conf.j2 | 8 + data/conf/postfix/main.cf | 2 +- data/web/edit.php | 7 + data/web/inc/ajax/dns_diagnostics.php | 46 +++- data/web/inc/functions.mailbox.inc.php | 211 ++++++++++++++++++ data/web/inc/init_db.inc.php | 19 +- data/web/json_api.php | 6 + data/web/lang/lang.de-de.json | 19 +- data/web/lang/lang.en-gb.json | 15 ++ data/web/mta-sts.php | 30 +++ data/web/templates/edit/domain.twig | 77 +++++++ docker-compose.yml | 4 +- 18 files changed, 488 insertions(+), 19 deletions(-) create mode 100644 data/web/mta-sts.php diff --git a/.gitignore b/.gitignore index c225dc090..8d0fe16fd 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ refresh_images.sh update_diffs/ create_cold_standby.sh !data/conf/nginx/mailcow_auth.conf +data/conf/postfix/mta-sts-resolver \ No newline at end of file diff --git a/data/Dockerfiles/acme/acme.sh b/data/Dockerfiles/acme/acme.sh index 15b757ff9..69b18bc1f 100755 --- a/data/Dockerfiles/acme/acme.sh +++ b/data/Dockerfiles/acme/acme.sh @@ -206,7 +206,7 @@ while true; do if [[ ${AUTODISCOVER_SAN} == "y" ]]; then # Fetch certs for autoconfig and autodiscover subdomains - ADDITIONAL_WC_ARR+=('autodiscover' 'autoconfig') + ADDITIONAL_WC_ARR+=('autodiscover' 'autoconfig' 'mta-sts') fi if [[ ${SKIP_IP_CHECK} != "y" ]]; then diff --git a/data/Dockerfiles/postfix/Dockerfile b/data/Dockerfiles/postfix/Dockerfile index 5449360b3..d1a32917d 100644 --- a/data/Dockerfiles/postfix/Dockerfile +++ b/data/Dockerfiles/postfix/Dockerfile @@ -1,9 +1,19 @@ +FROM golang:1.25-bookworm AS builder +WORKDIR /src + +ENV CGO_ENABLED=0 \ + GO111MODULE=on + +RUN git clone https://github.com/Zuplu/postfix-tlspol.git && \ + cd postfix-tlspol && \ + scripts/build.sh build-only + FROM debian:bookworm-slim -LABEL maintainer = "The Infrastructure Company GmbH " +LABEL maintainer="The Infrastructure Company GmbH " ARG DEBIAN_FRONTEND=noninteractive -ENV LC_ALL C +ENV LC_ALL=C RUN dpkg-divert --local --rename --add /sbin/initctl \ && ln -sf /bin/true /sbin/initctl \ @@ -48,6 +58,7 @@ COPY rspamd-pipe-spam /usr/local/bin/rspamd-pipe-spam COPY whitelist_forwardinghosts.sh /usr/local/bin/whitelist_forwardinghosts.sh COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh COPY docker-entrypoint.sh /docker-entrypoint.sh +COPY --from=builder /src/postfix-tlspol/build/postfix-tlspol /usr/local/bin/postfix-tlspol RUN chmod +x /opt/postfix.sh \ /usr/local/bin/rspamd-pipe-ham \ diff --git a/data/Dockerfiles/postfix/postfix.sh b/data/Dockerfiles/postfix/postfix.sh index e5dbf88fc..fcb6c26a2 100755 --- a/data/Dockerfiles/postfix/postfix.sh +++ b/data/Dockerfiles/postfix/postfix.sh @@ -3,6 +3,8 @@ trap "postfix stop" EXIT [[ ! -d /opt/postfix/conf/sql/ ]] && mkdir -p /opt/postfix/conf/sql/ +[[ ! -d /etc/postfix-tlspol ]] && mkdir -p /etc/postfix-tlspol +[[ ! -d /var/lib/postfix-tlspol ]] && mkdir -p /var/lib/postfix-tlspol # Wait for MySQL to warm-up while ! mariadb-admin status --ssl=false --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do @@ -503,6 +505,26 @@ if [[ ! -f /opt/postfix/conf/custom_postscreen_whitelist.cidr ]]; then EOF fi +cat < /opt/postfix/conf/postfix-tlspol/config.yaml +server: + address: 127.0.0.1:8642 + + log-level: info + + prefetch: true + + cache-file: /var/lib/postfix-tlspol/cache.db + +dns: + # must support DNSSEC + address: 127.0.0.11:53 +EOF + +# Fixing local command execution of postfix-tlspol with symlink to config +if [ ! -L /etc/postfix-tlspol/config.yaml ]; then + ln -s /opt/postfix/conf/postfix-tlspol/config.yaml /etc/postfix-tlspol/config.yaml +fi + # Fix Postfix permissions chown -R root:postfix /opt/postfix/conf/sql/ /opt/postfix/conf/custom_transport.pcre chmod 640 /opt/postfix/conf/sql/*.cf /opt/postfix/conf/custom_transport.pcre @@ -524,4 +546,4 @@ if [[ $? != 0 ]]; then else postfix -c /opt/postfix/conf start sleep 126144000 -fi +fi \ No newline at end of file diff --git a/data/Dockerfiles/postfix/supervisord.conf b/data/Dockerfiles/postfix/supervisord.conf index ba70f8edf..26fec862c 100644 --- a/data/Dockerfiles/postfix/supervisord.conf +++ b/data/Dockerfiles/postfix/supervisord.conf @@ -11,6 +11,15 @@ stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 autostart=true +[program:postfix-tlspol] +startsecs=10 +autorestart=true +command=/usr/local/bin/postfix-tlspol -config /opt/postfix/conf/postfix-tlspol/config.yaml +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + [program:postfix] command=/opt/postfix.sh stdout_logfile=/dev/stdout diff --git a/data/conf/nginx/templates/nginx.conf.j2 b/data/conf/nginx/templates/nginx.conf.j2 index ff5f8f184..d71d63e56 100644 --- a/data/conf/nginx/templates/nginx.conf.j2 +++ b/data/conf/nginx/templates/nginx.conf.j2 @@ -48,13 +48,21 @@ http { listen {{ HTTP_PORT }} default_server; listen [::]:{{ HTTP_PORT }} default_server; - server_name {{ MAILCOW_HOSTNAME }} autodiscover.* autoconfig.* {{ ADDITIONAL_SERVER_NAMES | join(' ') }}; + server_name {{ MAILCOW_HOSTNAME }} autodiscover.* autoconfig.* mta-sts.* {{ ADDITIONAL_SERVER_NAMES | join(' ') }}; if ( $request_uri ~* "%0A|%0D" ) { return 403; } location ^~ /.well-known/acme-challenge/ { allow all; default_type "text/plain"; } + location ^~ /.well-known/mta-sts.txt { + allow all; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass {{ PHPFPMHOST }}:9002; + include /etc/nginx/fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/mta-sts.php; + fastcgi_param PATH_INFO $fastcgi_path_info; + } location / { return 301 https://$host$uri$is_args$args; } @@ -82,7 +90,7 @@ http { ssl_certificate /etc/ssl/mail/cert.pem; ssl_certificate_key /etc/ssl/mail/key.pem; - server_name {{ MAILCOW_HOSTNAME }} autodiscover.* autoconfig.*; + server_name {{ MAILCOW_HOSTNAME }} autodiscover.* autoconfig.* mta-sts.*; include /etc/nginx/includes/sites-default.conf; } diff --git a/data/conf/nginx/templates/sites-default.conf.j2 b/data/conf/nginx/templates/sites-default.conf.j2 index 574bdb052..23fe7b788 100644 --- a/data/conf/nginx/templates/sites-default.conf.j2 +++ b/data/conf/nginx/templates/sites-default.conf.j2 @@ -76,6 +76,14 @@ location ^~ /.well-known/acme-challenge/ { allow all; default_type "text/plain"; } +location ^~ /.well-known/mta-sts.txt { + allow all; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass {{ PHPFPMHOST }}:9002; + include /etc/nginx/fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/mta-sts.php; + fastcgi_param PATH_INFO $fastcgi_path_info; +} rewrite ^/.well-known/caldav$ /SOGo/dav/ permanent; rewrite ^/.well-known/carddav$ /SOGo/dav/ permanent; diff --git a/data/conf/postfix/main.cf b/data/conf/postfix/main.cf index 07065f045..e4354c40c 100644 --- a/data/conf/postfix/main.cf +++ b/data/conf/postfix/main.cf @@ -152,7 +152,7 @@ smtp_sasl_auth_enable = yes smtp_sasl_password_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_sasl_passwd_maps_sender_dependent.cf smtp_sasl_security_options = smtp_sasl_mechanism_filter = plain, login -smtp_tls_policy_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_tls_policy_override_maps.cf +smtp_tls_policy_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_tls_policy_override_maps.cf socketmap:inet:127.0.0.1:8642:QUERY smtp_header_checks = pcre:/opt/postfix/conf/anonymize_headers.pcre mail_name = Postcow # local_transport map catches local destinations and prevents routing local dests when the next map would route "*" diff --git a/data/web/edit.php b/data/web/edit.php index 7ce4d0c6a..57cf24bd2 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -48,6 +48,12 @@ if (isset($_SESSION['mailcow_cc_role'])) { $rl = ratelimit('get', 'domain', $domain); $rlyhosts = relayhost('get'); $domain_footer = mailbox('get', 'domain_wide_footer', $domain); + $mta_sts = mailbox('get', 'mta_sts', $domain); + if (count($mta_sts) == 0) { + $mta_sts = false; + } elseif (isset($mta_sts['mx'])) { + $mta_sts['mx'] = implode(',', $mta_sts['mx']); + } $template = 'edit/domain.twig'; $template_data = [ 'acl' => $_SESSION['acl'], @@ -58,6 +64,7 @@ if (isset($_SESSION['mailcow_cc_role'])) { 'dkim' => dkim('details', $domain), 'domain_details' => $result, 'domain_footer' => $domain_footer, + 'mta_sts' => $mta_sts, 'mailboxes' => mailbox('get', 'mailboxes', $_GET["domain"]), 'aliases' => mailbox('get', 'aliases', $_GET["domain"], 'address'), 'alias_domains' => mailbox('get', 'alias_domains', $_GET["domain"]) diff --git a/data/web/inc/ajax/dns_diagnostics.php b/data/web/inc/ajax/dns_diagnostics.php index 15cb3a30f..b48239e10 100644 --- a/data/web/inc/ajax/dns_diagnostics.php +++ b/data/web/inc/ajax/dns_diagnostics.php @@ -71,6 +71,7 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm // Init records array $spf_link = 'SPF Record Syntax
'; $dmarc_link = 'DMARC Assistant'; + $mtasts_report_link = 'TLS Report Record Syntax'; $records = array(); @@ -128,6 +129,27 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm ); } + $mta_sts = mailbox('get', 'mta_sts', $domain); + if (count($mta_sts) > 0 && $mta_sts['active'] == 1) { + if (!in_array($domain, $alias_domains)) { + $records[] = array( + 'mta-sts.' . $domain, + 'CNAME', + $mailcow_hostname + ); + } + $records[] = array( + '_mta-sts.' . $domain, + 'TXT', + "v={$mta_sts['version']};id={$mta_sts['id']};", + ); + $records[] = array( + '_smtp._tls.' . $domain, + 'TXT', + $mtasts_report_link, + ); + } + $records[] = array( $domain, 'TXT', @@ -341,15 +363,25 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm } foreach ($currents as &$current) { + if ($current['type'] == "TXT" && + stripos(strtolower($current['txt']), 'v=sts') === 0) { + if (strtolower($current[$data_field[$current['type']]]) == strtolower($record[2])) { + $state = state_good; + } + else { + $state = state_nomatch; + } + $state .= '
' . $current[$data_field[$current['type']]]; + } if ($current['type'] == 'TXT' && - stripos($current['txt'], 'v=dmarc') === 0 && - $record[2] == $dmarc_link) { + stripos($current['txt'], 'v=dmarc') === 0 && + $record[2] == $dmarc_link) { $current['txt'] = str_replace(' ', '', $current['txt']); $state = $current[$data_field[$current['type']]] . state_optional; } elseif ($current['type'] == 'TXT' && - stripos($current['txt'], 'v=spf') === 0 && - $record[2] == $spf_link) { + stripos($current['txt'], 'v=spf') === 0 && + $record[2] == $spf_link) { $state = state_nomatch; $rslt = get_spf_allowed_hosts($record[0], true); if (in_array($ip, $rslt) && in_array(expand_ipv6($ip6), $rslt)) { @@ -358,8 +390,8 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm $state .= '
' . $current[$data_field[$current['type']]] . state_optional; } elseif ($current['type'] == 'TXT' && - stripos($current['txt'], 'v=dkim') === 0 && - stripos($record[2], 'v=dkim') === 0) { + stripos($current['txt'], 'v=dkim') === 0 && + stripos($record[2], 'v=dkim') === 0) { preg_match('/v=DKIM1;.*k=rsa;.*p=([^;]*).*/i', $current[$data_field[$current['type']]], $dkim_matches_current); preg_match('/v=DKIM1;.*k=rsa;.*p=([^;]*).*/i', $record[2], $dkim_matches_good); if ($dkim_matches_current[1] == $dkim_matches_good[1]) { @@ -367,7 +399,7 @@ if (isset($_SESSION['mailcow_cc_role']) && ($_SESSION['mailcow_cc_role'] == "adm } } elseif ($current['type'] != 'TXT' && - isset($data_field[$current['type']]) && $state != state_good) { + isset($data_field[$current['type']]) && $state != state_good) { $state = state_nomatch; if ($current[$data_field[$current['type']]] == $record[2]) { $state = state_good; diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index 6ea4f5717..a74d182cf 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -1400,6 +1400,80 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { return mailbox('add', 'mailbox', $mailbox_attributes); break; + case 'mta_sts': + $domain = idn_to_ascii(strtolower(trim($_data['domain'])), 0, INTL_IDNA_VARIANT_UTS46); + $version = strtolower($_data['version']); + $mode = strtolower($_data['mode']); + $mx = explode(",", preg_replace('/\s+/', '', $_data['mx'])); + $max_age = intval($_data['max_age']); + $active = (intval($_data['active']) == 1) ? 1 : 0; + $id = date('YmdHis'); + + if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => 'access_denied' + ); + return false; + } + if (empty($version) || !in_array($version, array('stsv1'))) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('version_invalid', htmlspecialchars($domain)) + ); + return false; + } + if (empty($mode) || !in_array($mode, array('enforce', 'testing', 'none'))) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('mode_invalid', htmlspecialchars($domain)) + ); + return false; + } + if (empty($max_age) || $max_age < 0 || $max_age > 31536000) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('max_age_invalid', htmlspecialchars($domain)) + ); + return false; + } + foreach ($mx as $index => $mx_domain) { + $mx_domain = idn_to_ascii(strtolower(trim($mx_domain)), 0, INTL_IDNA_VARIANT_UTS46); + if (!is_valid_domain_name($mx_domain)) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('mx_invalid', htmlspecialchars($mx_domain)) + ); + return false; + } + } + + try { + $stmt = $pdo->prepare("INSERT INTO `mta_sts` (`id`, `domain`, `version`, `mode`, `mx`, `max_age`, `active`) + VALUES (:id, :domain, :version, :mode, :mx, :max_age, :active)"); + $stmt->execute(array( + ':id' => $id, + ':domain' => $domain, + ':version' => $version, + ':mode' => $mode, + ':mx' => implode(",", $mx), + ':max_age' => $max_age, + ':active' => $active + )); + } catch (PDOException $e) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data), + 'msg' => $e->getMessage() + ); + return false; + } + break; case 'resource': $domain = idn_to_ascii(strtolower(trim($_data['domain'])), 0, INTL_IDNA_VARIANT_UTS46); $description = $_data['description']; @@ -3741,6 +3815,125 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { return true; break; + case 'mta_sts': + if (!is_array($_data['domains'])) { + $domains = array(); + $domains[] = $_data['domains']; + } + else { + $domains = $_data['domains']; + } + + foreach ($domains as $domain) { + $domain = idn_to_ascii(strtolower(trim($domain)), 0, INTL_IDNA_VARIANT_UTS46); + + if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => 'access_denied' + ); + continue; + } + + $is_now = mailbox('get', 'mta_sts', $domain); + if (!empty($is_now)) { + $version = (isset($_data['version'])) ? strtolower($_data['version']) : $is_now['version']; + $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; + $active = ($active == 1) ? 1 : 0; + $mode = (isset($_data['mode'])) ? strtolower($_data['mode']) : $is_now['mode']; + $mx = (isset($_data['mx'])) ? explode(",", preg_replace('/\s+/', '', $_data['mx'])) : $is_now['mx']; + $max_age = (isset($_data['max_age'])) ? intval($_data['max_age']) : $is_now['max_age']; + + // Update ID if neccesary + if ($version != strtolower($is_now['version']) || + $mode != strtolower($is_now['mode']) || + $mx != $is_now['mx'] || + $max_age != $is_now['max_age']) { + $id = date('YmdHis'); + } else { + $id = $is_now['id']; + } + + } else { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr), + 'msg' => 'access_denied' + ); + continue; + } + + if (empty($version) || !in_array($version, array('stsv1'))) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('version_invalid', htmlspecialchars($version)) + ); + continue; + } + if (empty($mode) || !in_array($mode, array('enforce', 'testing', 'none'))) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('mode_invalid', htmlspecialchars($domain)) + ); + continue; + } + if (empty($max_age) || $max_age < 0 || $max_age > 31557600) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('max_age_invalid', htmlspecialchars($domain)) + ); + continue; + } + foreach ($mx as $index => $mx_domain) { + $mx_domain = idn_to_ascii(strtolower(trim($mx_domain)), 0, INTL_IDNA_VARIANT_UTS46); + $invalid_mx = false; + if (!is_valid_domain_name($mx_domain)) { + $invalid_mx = $mx_domain; + break; + } + } + if ($invalid_mx) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('mx_invalid', htmlspecialchars($invalid_mx)) + ); + continue; + } + + try { + $stmt = $pdo->prepare("UPDATE `mta_sts` SET `id` = :id, `version` = :version, `mode` = :mode, `mx` = :mx, `max_age` = :max_age, `active` = :active WHERE `domain` = :domain"); + $stmt->execute(array( + ':id' => $id, + ':domain' => $domain, + ':version' => $version, + ':mode' => $mode, + ':mx' => implode(",", $mx), + ':max_age' => $max_age, + ':active' => $active + )); + } catch (PDOException $e) { + $_SESSION['return'][] = array( + 'type' => 'danger', + 'log' => array(__FUNCTION__, $_action, $_type, $_data), + 'msg' => $e->getMessage() + ); + continue; + } + + $_SESSION['return'][] = array( + 'type' => 'success', + 'log' => array(__FUNCTION__, $_action, $_type, $_data, $_attr), + 'msg' => array('object_modified', $domain) + ); + } + + return true; + break; case 'resource': if (!is_array($_data['name'])) { $names = array(); @@ -5029,6 +5222,20 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { return $rows; } break; + case 'mta_sts': + $stmt = $pdo->prepare("SELECT * FROM `mta_sts` WHERE `domain` = :domain"); + $stmt->execute(array( + ':domain' => $_data, + )); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + if (empty($row)){ + return []; + } + $row['mx'] = explode(',', $row['mx']); + $row['version'] = strtoupper(substr($row['version'], 0, 3)) . substr($row['version'], 3); + + return $row; + break; case 'resource_details': $resourcedata = array(); if (!hasMailboxObjectAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $_data)) { @@ -5414,6 +5621,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $stmt->execute(array( ':domain' => $domain, )); + $stmt = $pdo->prepare("DELETE FROM `mta_sts` WHERE `domain` = :domain"); + $stmt->execute(array( + ':domain' => $domain, + )); $stmt = $pdo->query("DELETE FROM `admin` WHERE `superadmin` = 0 AND `username` NOT IN (SELECT `username`FROM `domain_admins`);"); $stmt = $pdo->query("DELETE FROM `da_acl` WHERE `username` NOT IN (SELECT `username`FROM `domain_admins`);"); try { diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index 6a9d042a9..ecb87c380 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -4,7 +4,7 @@ function init_db_schema() try { global $pdo; - $db_version = "06082025_1611"; + $db_version = "19082025_1436"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -475,6 +475,23 @@ function init_db_schema() ), "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" ), + "mta_sts" => array( + "cols" => array( + "id" => "BIGINT NOT NULL", + "domain" => "VARCHAR(255) NOT NULL", + "version" => "VARCHAR(255) NOT NULL", + "mode" => "VARCHAR(255) NOT NULL", + "mx" => "VARCHAR(255) NOT NULL", + "max_age" => "VARCHAR(255) NOT NULL", + "active" => "TINYINT(1) NOT NULL DEFAULT '1'" + ), + "keys" => array( + "primary" => array( + "" => array("domain") + ) + ), + "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" + ), "user_acl" => array( "cols" => array( "username" => "VARCHAR(255) NOT NULL", diff --git a/data/web/json_api.php b/data/web/json_api.php index a480b0ae0..4d7159ad2 100644 --- a/data/web/json_api.php +++ b/data/web/json_api.php @@ -324,6 +324,9 @@ if (isset($_GET['query'])) { case "app-passwd": process_add_return(app_passwd('add', $attr)); break; + case "mta-sts": + process_add_return(mailbox('add', 'mta_sts', $attr)); + break; // return no route found if no case is matched default: http_response_code(404); @@ -2001,6 +2004,9 @@ if (isset($_GET['query'])) { case "reset-password-notification": process_edit_return(reset_password('edit_notification', $attr)); break; + case "mta-sts": + process_edit_return(mailbox('edit', 'mta_sts', array_merge(array('domains' => $items), $attr))); + break; // return no route found if no case is matched default: http_response_code(404); diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index 5887499b3..1d2edc1b4 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -482,10 +482,13 @@ "mailboxes_in_use": "Maximale Anzahl an Mailboxen muss größer oder gleich %d sein", "malformed_username": "Benutzername hat ein falsches Format", "map_content_empty": "Inhalt darf nicht leer sein", + "max_age_invalid": "Maximales Alter %s ist ungültig", "max_alias_exceeded": "Anzahl an Alias-Adressen überschritten", "max_mailbox_exceeded": "Anzahl an Mailboxen überschritten (%d von %d)", "max_quota_in_use": "Mailbox-Speicherplatzlimit muss größer oder gleich %d MiB sein", "maxquota_empty": "Max. Speicherplatz pro Mailbox darf nicht 0 sein.", + "mode_invalid": "Modus %s ist ungültig", + "mx_invalid": "MX-Eintrag %s ist ungültig", "mysql_error": "MySQL-Fehler: %s", "network_host_invalid": "Netzwerk oder Host ungültig: %s", "next_hop_interferes": "%s verhindert das Hinzufügen von Next Hop %s", @@ -545,6 +548,7 @@ "username_invalid": "Benutzername %s kann nicht verwendet werden", "validity_missing": "Bitte geben Sie eine Gültigkeitsdauer an", "value_missing": "Bitte alle Felder ausfüllen", + "version_invalid": "Version %s ist ungültig", "yotp_verification_failed": "Yubico OTP-Verifizierung fehlgeschlagen: %s", "template_exists": "Vorlage %s existiert bereits", "template_id_invalid": "Vorlagen-ID %s ungültig", @@ -703,6 +707,17 @@ "maxbytespersecond": "Max. Übertragungsrate in Bytes/s (0 für unlimitiert)", "mbox_rl_info": "Dieses Limit wird auf den SASL Loginnamen angewendet und betrifft daher alle Absenderadressen, die der eingeloggte Benutzer verwendet. Bei Mailbox Ratelimit überwiegt ein Domain-weites Ratelimit.", "mins_interval": "Intervall (min)", + "mta_sts": "MTA-STS", + "mta_sts_info": "MTA-STS ist ein Standard, der den E-Mail-Versand zwischen Mailservern zwingt, TLS mit gültigen Zertifikaten zu verwenden.
Er wird verwendet, wenn DANE aufgrund fehlender oder nicht unterstützter DNSSEC nicht möglich ist.
Hinweis: Wenn die empfangende Domain DANE mit DNSSEC unterstützt, wird DANE immer bevorzugt – MTA-STS fungiert nur als Fallback.", + "mta_sts_version": "Version", + "mta_sts_version_info": "Definiert die Version des MTA-STS-Standards – derzeit ist nur STSv1 gültig.", + "mta_sts_mode": "Modus", + "mta_sts_mode_info": "Es gibt drei Modi zur Auswahl:
  • testing – Die Richtlinie wird nur überwacht, Verstöße haben keine Auswirkungen.
  • enforce – Die Richtlinie wird strikt durchgesetzt, Verbindungen ohne gültiges TLS werden abgelehnt.
  • none – Die Richtlinie wird veröffentlicht, aber nicht angewendet.
", + "mta_sts_max_age": "Maximales Alter", + "mta_sts_max_age_info": "Zeit in Sekunden, die empfangende Mailserver diese Richtlinie zwischenspeichern dürfen, bevor sie erneut abgerufen wird.", + "mta_sts_mx": "MX-Server", + "mta_sts_mx_info": "Erlaubt das Senden nur an explizit aufgeführte Mailserver-Hostnamen; der sendende MTA überprüft, ob der DNS-MX-Hostname mit der Richtlinienliste übereinstimmt, und erlaubt die Zustellung nur mit einem gültigen TLS-Zertifikat (schützt vor MITM).", + "mta_sts_mx_notice": "Es können mehrere MX-Server angegeben werden (durch Kommas getrennt).", "multiple_bookings": "Mehrfaches Buchen", "nexthop": "Next Hop", "none_inherit": "Keine Auswahl / Erben", @@ -852,7 +867,7 @@ "add_tls_policy_map": "TLS-Richtlinieneintrag hinzufügen", "address_rewriting": "Adressumschreibung", "alias": "Alias", - "alias_domain_alias_hint": "Alias-Adressen werden nicht automatisch auch auf Domain-Alias Adressen angewendet. Eine Alias-Adresse mein-alias@domain bildet demnach nicht die Adresse mein-alias@alias-domain ab.
E-Mail-Weiterleitungen an externe Postfächer sollten über Sieve (SOGo Weiterleitung oder im Reiter \"Filter\") angelegt werden. Der Button \"Alias über Alias-Domains expandieren\" erstellt fehlende Alias-Adressen in Alias-Domains.", + "alias_domain_alias_hint": "Alias-Adressen werden nicht automatisch auch auf Domain-Alias Adressen angewendet. Eine Alias-Adresse mein-alias@domain bildet demnach nicht die Adresse mein-alias@alias-domain ab.
E-Mail-Weiterleitungen an externe Postfächer sollten über Sieve (SOGo Weiterleitung oder im Reiter Filter) angelegt werden. Der Button Alias über Alias-Domains expandieren erstellt fehlende Alias-Adressen in Alias-Domains.", "alias_domain_backupmx": "Alias-Domain für Relay-Domain inaktiv", "aliases": "Aliasse", "allow_from_smtp": "Nur folgende IPs für SMTP erlauben", @@ -1248,7 +1263,7 @@ "delete_ays": "Soll der Löschvorgang wirklich ausgeführt werden?", "direct_aliases": "Direkte Alias-Adressen", "direct_aliases_desc": "Nur direkte Alias-Adressen werden für benutzerdefinierte Einstellungen berücksichtigt.", - "direct_protocol_access": "Der Hauptbenutzer hat direkten, externen Zugriff auf folgende Protokolle und Anwendungen. Diese Einstellung wird vom Administrator gesteuert. App-Passwörter können verwendet werden, um individuelle Zugänge für Protokolle und Anwendungen zu erstellen.
Der Button \"Webmail\" kann unabhängig der Einstellung immer verwendet werden.", + "direct_protocol_access": "Der Hauptbenutzer hat direkten, externen Zugriff auf folgende Protokolle und Anwendungen. Diese Einstellung wird vom Administrator gesteuert. App-Passwörter können verwendet werden, um individuelle Zugänge für Protokolle und Anwendungen zu erstellen.
Der Button Webmail kann unabhängig der Einstellung immer verwendet werden.", "eas_reset": "ActiveSync-Geräte-Cache zurücksetzen", "eas_reset_help": "In vielen Fällen kann ein ActiveSync-Profil durch das Zurücksetzen des Caches repariert werden.
Vorsicht: Alle Elemente werden erneut heruntergeladen!", "eas_reset_now": "Jetzt zurücksetzen", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 727fd687c..78059c0b8 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -483,10 +483,13 @@ "mailboxes_in_use": "Max. mailboxes must be greater or equal to %d", "malformed_username": "Malformed username", "map_content_empty": "Map content cannot be empty", + "max_age_invalid": "Max age %s is invalid", "max_alias_exceeded": "Max. aliases exceeded", "max_mailbox_exceeded": "Max. mailboxes exceeded (%d of %d)", "max_quota_in_use": "Mailbox quota must be greater or equal to %d MiB", "maxquota_empty": "Max. quota per mailbox must not be 0.", + "mode_invalid": "Mode %s is invalid", + "mx_invalid": "MX record %s is invalid", "mysql_error": "MySQL error: %s", "network_host_invalid": "Invalid network or host: %s", "next_hop_interferes": "%s interferes with nexthop %s", @@ -550,6 +553,7 @@ "username_invalid": "Username %s cannot be used", "validity_missing": "Please assign a period of validity", "value_missing": "Please provide all values", + "version_invalid": "Version %s is invalid", "yotp_verification_failed": "Yubico OTP verification failed: %s" }, "datatables": { @@ -704,6 +708,17 @@ "maxbytespersecond": "Max. bytes per second
(0 = unlimited)", "mbox_rl_info": "This rate limit is applied on the SASL login name, it matches any \"from\" address used by the logged-in user. A mailbox rate limit overrides a domain-wide rate limit.", "mins_interval": "Interval (min)", + "mta_sts": "MTA-STS", + "mta_sts_info": "MTA-STS is a standard that enforces email delivery between mail servers to use TLS with valid certificates.
It is used when DANE is not possible due to missing or unsupported DNSSEC.
Note: If the receiving domain supports DANE with DNSSEC, DANE is always preferred – MTA-STS only acts as a fallback.", + "mta_sts_version": "Version", + "mta_sts_version_info": "Defines the version of the MTA-STS standard – currently only STSv1 is valid." , + "mta_sts_mode": "Mode", + "mta_sts_mode_info": "There are three modes to choose from:
  • testing – policy is only monitored, violations have no impact.
  • enforce – policy is strictly enforced, connections without valid TLS are rejected.
  • none – policy is published but not applied.
", + "mta_sts_max_age": "Max age", + "mta_sts_max_age_info": "Time in seconds that receiving mail servers may cache this policy until refetching.", + "mta_sts_mx": "MX server", + "mta_sts_mx_info": "Allows sending only to explicitly listed mail server hostnames; the sending MTA checks if the DNS MX hostname matches the policy list, and only allows delivery with a valid TLS certificate (guards against MITM).", + "mta_sts_mx_notice": "Multiple MX servers can be specified (separated by commas).", "multiple_bookings": "Multiple bookings", "none_inherit": "None / Inherit", "nexthop": "Next hop", diff --git a/data/web/mta-sts.php b/data/web/mta-sts.php new file mode 100644 index 000000000..51c39eb2f --- /dev/null +++ b/data/web/mta-sts.php @@ -0,0 +1,30 @@ + diff --git a/data/web/templates/edit/domain.twig b/data/web/templates/edit/domain.twig index 6d1d85c73..774b30996 100644 --- a/data/web/templates/edit/domain.twig +++ b/data/web/templates/edit/domain.twig @@ -8,6 +8,7 @@ +
@@ -278,6 +279,82 @@
+
+
+
+ +
+
+

{{ lang.edit.mta_sts }}

+

{{ lang.edit.mta_sts_info|raw }}

+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + {{ lang.edit.mta_sts_mx_notice|raw }} +
+
+
+
+
+ +
+
+
+
+
+ {% if mta_sts == false %} + + {% else %} + + {% endif %} +
+
+
+
+
+
diff --git a/docker-compose.yml b/docker-compose.yml index c55158dbb..cbccbcde4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -338,7 +338,7 @@ services: - dovecot postfix-mailcow: - image: ghcr.io/mailcow/postfix:1.80 + image: ghcr.io/mailcow/postfix:1.81 depends_on: mysql-mailcow: condition: service_started @@ -440,7 +440,7 @@ services: condition: service_started unbound-mailcow: condition: service_healthy - image: ghcr.io/mailcow/acme:1.93 + image: ghcr.io/mailcow/acme:1.94 dns: - ${IPV4_NETWORK:-172.22.1}.254 environment: From e1410baaebbf3a67dc0e558a8cc2cd0b1652b45d Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 26 Aug 2025 09:58:18 +0200 Subject: [PATCH 046/180] fix gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8d0fe16fd..a06c3da7f 100644 --- a/.gitignore +++ b/.gitignore @@ -75,4 +75,4 @@ refresh_images.sh update_diffs/ create_cold_standby.sh !data/conf/nginx/mailcow_auth.conf -data/conf/postfix/mta-sts-resolver \ No newline at end of file +data/conf/postfix/postfix-tlspol \ No newline at end of file From 3826c4b5be9d04805a807b922dc96b41128814af Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 26 Aug 2025 10:10:16 +0200 Subject: [PATCH 047/180] fix postfix tlspol missing folders for config --- data/Dockerfiles/postfix/postfix.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/data/Dockerfiles/postfix/postfix.sh b/data/Dockerfiles/postfix/postfix.sh index fcb6c26a2..44b7d7d39 100755 --- a/data/Dockerfiles/postfix/postfix.sh +++ b/data/Dockerfiles/postfix/postfix.sh @@ -3,6 +3,7 @@ trap "postfix stop" EXIT [[ ! -d /opt/postfix/conf/sql/ ]] && mkdir -p /opt/postfix/conf/sql/ +[[ ! -d /opt/postfix/conf/postfix-tlspol ]] && mkdir -p /opt/postfix/conf/postfix-tlspol [[ ! -d /etc/postfix-tlspol ]] && mkdir -p /etc/postfix-tlspol [[ ! -d /var/lib/postfix-tlspol ]] && mkdir -p /var/lib/postfix-tlspol From 169aafec505ca1fd69e303c7eab6c53d63d14867 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Wed, 27 Aug 2025 14:09:29 +0200 Subject: [PATCH 048/180] compose: fix dovecot image tag --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index cbccbcde4..5878a8b49 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -251,7 +251,7 @@ services: - sogo dovecot-mailcow: - image: ghcr.io/mailcow/dovecot:2.34 + image: ghcr.io/mailcow/dovecot:2.35 depends_on: - mysql-mailcow - netfilter-mailcow From 1cb38bacdb0d652781007175fc37eb0361da6aa4 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Thu, 28 Aug 2025 10:18:18 +0200 Subject: [PATCH 049/180] Postfix: Split TLSPol companion app into separate container (#6688) * postfix: split postfix-tlspol service into new container * postfix-tls-pol: added debug mode * pf-tlspol: removed obsoleted standalone conf from Dockerfiles * pf-tlspol: use git instead of wget --- data/Dockerfiles/postfix-tlspol/Dockerfile | 49 +++++++++++++++++ .../postfix-tlspol/docker-entrypoint.sh | 7 +++ .../postfix-tlspol/postfix-tlspol.sh | 52 +++++++++++++++++++ .../postfix-tlspol/stop-supervisor.sh | 8 +++ .../postfix-tlspol/supervisord.conf | 25 +++++++++ .../postfix-tlspol/syslog-ng-redis_slave.conf | 45 ++++++++++++++++ .../Dockerfiles/postfix-tlspol/syslog-ng.conf | 45 ++++++++++++++++ data/Dockerfiles/postfix/Dockerfile | 11 ---- data/Dockerfiles/postfix/postfix.sh | 23 -------- data/Dockerfiles/postfix/supervisord.conf | 9 ---- data/conf/postfix/main.cf | 2 +- docker-compose.yml | 25 +++++++++ 12 files changed, 257 insertions(+), 44 deletions(-) create mode 100644 data/Dockerfiles/postfix-tlspol/Dockerfile create mode 100755 data/Dockerfiles/postfix-tlspol/docker-entrypoint.sh create mode 100755 data/Dockerfiles/postfix-tlspol/postfix-tlspol.sh create mode 100755 data/Dockerfiles/postfix-tlspol/stop-supervisor.sh create mode 100644 data/Dockerfiles/postfix-tlspol/supervisord.conf create mode 100644 data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf create mode 100644 data/Dockerfiles/postfix-tlspol/syslog-ng.conf diff --git a/data/Dockerfiles/postfix-tlspol/Dockerfile b/data/Dockerfiles/postfix-tlspol/Dockerfile new file mode 100644 index 000000000..95a035265 --- /dev/null +++ b/data/Dockerfiles/postfix-tlspol/Dockerfile @@ -0,0 +1,49 @@ +FROM golang:1.25-bookworm AS builder +WORKDIR /src + +ENV CGO_ENABLED=0 \ + GO111MODULE=on \ + VERSION=1.8.14 + +RUN git clone --branch v${VERSION} https://github.com/Zuplu/postfix-tlspol && \ + cd /src/postfix-tlspol && \ + scripts/build.sh build-only + + +FROM debian:bookworm-slim +LABEL maintainer="The Infrastructure Company GmbH " + +ARG DEBIAN_FRONTEND=noninteractive +ENV LC_ALL=C + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + dirmngr \ + dnsutils \ + iputils-ping \ + sudo \ + supervisor \ + redis-tools \ + syslog-ng \ + syslog-ng-core \ + syslog-ng-mod-redis \ + tzdata \ + && rm -rf /var/lib/apt/lists/* \ + && touch /etc/default/locale + +COPY supervisord.conf /etc/supervisor/supervisord.conf +COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf +COPY syslog-ng-redis_slave.conf /etc/syslog-ng/syslog-ng-redis_slave.conf +COPY postfix-tlspol.sh /opt/postfix-tlspol.sh +COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh +COPY docker-entrypoint.sh /docker-entrypoint.sh +COPY --from=builder /src/postfix-tlspol/build/postfix-tlspol /usr/local/bin/postfix-tlspol + +RUN chmod +x /opt/postfix-tlspol.sh \ + /usr/local/sbin/stop-supervisor.sh \ + /docker-entrypoint.sh +RUN rm -rf /tmp/* /var/tmp/* + +ENTRYPOINT ["/docker-entrypoint.sh"] + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] \ No newline at end of file diff --git a/data/Dockerfiles/postfix-tlspol/docker-entrypoint.sh b/data/Dockerfiles/postfix-tlspol/docker-entrypoint.sh new file mode 100755 index 000000000..8c4f2c43e --- /dev/null +++ b/data/Dockerfiles/postfix-tlspol/docker-entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +if [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then + cp /etc/syslog-ng/syslog-ng-redis_slave.conf /etc/syslog-ng/syslog-ng.conf +fi + +exec "$@" \ No newline at end of file diff --git a/data/Dockerfiles/postfix-tlspol/postfix-tlspol.sh b/data/Dockerfiles/postfix-tlspol/postfix-tlspol.sh new file mode 100755 index 000000000..407a08f6f --- /dev/null +++ b/data/Dockerfiles/postfix-tlspol/postfix-tlspol.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +LOGLVL=info + +if [ ${DEV_MODE} != "n" ]; then + echo -e "\e[31mEnabling debug mode\e[0m" + set -x + LOGLVL=debug +fi + +[[ ! -d /etc/postfix-tlspol ]] && mkdir -p /etc/postfix-tlspol +[[ ! -d /var/lib/postfix-tlspol ]] && mkdir -p /var/lib/postfix-tlspol + +until dig +short mailcow.email > /dev/null; do + echo "Waiting for DNS..." + sleep 1 +done + +# Do not attempt to write to slave +if [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then + export REDIS_CMDLINE="redis-cli -h ${REDIS_SLAVEOF_IP} -p ${REDIS_SLAVEOF_PORT} -a ${REDISPASS} --no-auth-warning" +else + export REDIS_CMDLINE="redis-cli -h redis -p 6379 -a ${REDISPASS} --no-auth-warning" +fi + +until [[ $(${REDIS_CMDLINE} PING) == "PONG" ]]; do + echo "Waiting for Redis..." + sleep 2 +done + +echo "Waiting for Postfix..." +until ping postfix -c1 > /dev/null; do + sleep 1 +done +echo "Postfix OK" + +cat < /etc/postfix-tlspol/config.yaml +server: + address: 0.0.0.0:8642 + + log-level: ${LOGLVL} + + prefetch: true + + cache-file: /var/lib/postfix-tlspol/cache.db + +dns: + # must support DNSSEC + address: 127.0.0.11:53 +EOF + +/usr/local/bin/postfix-tlspol -config /etc/postfix-tlspol/config.yaml \ No newline at end of file diff --git a/data/Dockerfiles/postfix-tlspol/stop-supervisor.sh b/data/Dockerfiles/postfix-tlspol/stop-supervisor.sh new file mode 100755 index 000000000..5394490ce --- /dev/null +++ b/data/Dockerfiles/postfix-tlspol/stop-supervisor.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +printf "READY\n"; + +while read line; do + echo "Processing Event: $line" >&2; + kill -3 $(cat "/var/run/supervisord.pid") +done < /dev/stdin diff --git a/data/Dockerfiles/postfix-tlspol/supervisord.conf b/data/Dockerfiles/postfix-tlspol/supervisord.conf new file mode 100644 index 000000000..90cf785ad --- /dev/null +++ b/data/Dockerfiles/postfix-tlspol/supervisord.conf @@ -0,0 +1,25 @@ +[supervisord] +pidfile=/var/run/supervisord.pid +nodaemon=true +user=root + +[program:syslog-ng] +command=/usr/sbin/syslog-ng --foreground --no-caps +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +autostart=true + +[program:postfix-tlspol] +startsecs=10 +autorestart=true +command=/opt/postfix-tlspol.sh +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[eventlistener:processes] +command=/usr/local/sbin/stop-supervisor.sh +events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL \ No newline at end of file diff --git a/data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf b/data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf new file mode 100644 index 000000000..3862a3547 --- /dev/null +++ b/data/Dockerfiles/postfix-tlspol/syslog-ng-redis_slave.conf @@ -0,0 +1,45 @@ +@version: 3.38 +@include "scl.conf" +options { + chain_hostnames(off); + flush_lines(0); + use_dns(no); + dns_cache(no); + use_fqdn(no); + owner("root"); group("adm"); perm(0640); + stats_freq(0); + bad_hostname("^gconfd$"); +}; +source s_src { + unix-stream("/dev/log"); + internal(); +}; +destination d_stdout { pipe("/dev/stdout"); }; +destination d_redis_ui_log { + redis( + host("`REDIS_SLAVEOF_IP`") + persist-name("redis1") + port(`REDIS_SLAVEOF_PORT`) + auth("`REDISPASS`") + command("LPUSH" "POSTFIX_MAILLOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n") + ); +}; +filter f_mail { facility(mail); }; +# start +# overriding warnings are still displayed when the entrypoint runs its initial check +# warnings logged by postfix-mailcow to syslog are hidden to reduce repeating msgs +# Some other warnings are ignored +filter f_ignore { + not match("overriding earlier entry" value("MESSAGE")); + not match("TLS SNI from checks.mailcow.email" value("MESSAGE")); + not match("no SASL support" value("MESSAGE")); + not facility (local0, local1, local2, local3, local4, local5, local6, local7); +}; +# end +log { + source(s_src); + filter(f_ignore); + destination(d_stdout); + filter(f_mail); + destination(d_redis_ui_log); +}; diff --git a/data/Dockerfiles/postfix-tlspol/syslog-ng.conf b/data/Dockerfiles/postfix-tlspol/syslog-ng.conf new file mode 100644 index 000000000..7126c1250 --- /dev/null +++ b/data/Dockerfiles/postfix-tlspol/syslog-ng.conf @@ -0,0 +1,45 @@ +@version: 3.38 +@include "scl.conf" +options { + chain_hostnames(off); + flush_lines(0); + use_dns(no); + dns_cache(no); + use_fqdn(no); + owner("root"); group("adm"); perm(0640); + stats_freq(0); + bad_hostname("^gconfd$"); +}; +source s_src { + unix-stream("/dev/log"); + internal(); +}; +destination d_stdout { pipe("/dev/stdout"); }; +destination d_redis_ui_log { + redis( + host("redis-mailcow") + persist-name("redis1") + port(6379) + auth("`REDISPASS`") + command("LPUSH" "POSTFIX_MAILLOG" "$(format-json time=\"$S_UNIXTIME\" priority=\"$PRIORITY\" program=\"$PROGRAM\" message=\"$MESSAGE\")\n") + ); +}; +filter f_mail { facility(mail); }; +# start +# overriding warnings are still displayed when the entrypoint runs its initial check +# warnings logged by postfix-mailcow to syslog are hidden to reduce repeating msgs +# Some other warnings are ignored +filter f_ignore { + not match("overriding earlier entry" value("MESSAGE")); + not match("TLS SNI from checks.mailcow.email" value("MESSAGE")); + not match("no SASL support" value("MESSAGE")); + not facility (local0, local1, local2, local3, local4, local5, local6, local7); +}; +# end +log { + source(s_src); + filter(f_ignore); + destination(d_stdout); + filter(f_mail); + destination(d_redis_ui_log); +}; diff --git a/data/Dockerfiles/postfix/Dockerfile b/data/Dockerfiles/postfix/Dockerfile index d1a32917d..994612ec4 100644 --- a/data/Dockerfiles/postfix/Dockerfile +++ b/data/Dockerfiles/postfix/Dockerfile @@ -1,13 +1,3 @@ -FROM golang:1.25-bookworm AS builder -WORKDIR /src - -ENV CGO_ENABLED=0 \ - GO111MODULE=on - -RUN git clone https://github.com/Zuplu/postfix-tlspol.git && \ - cd postfix-tlspol && \ - scripts/build.sh build-only - FROM debian:bookworm-slim LABEL maintainer="The Infrastructure Company GmbH " @@ -58,7 +48,6 @@ COPY rspamd-pipe-spam /usr/local/bin/rspamd-pipe-spam COPY whitelist_forwardinghosts.sh /usr/local/bin/whitelist_forwardinghosts.sh COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh COPY docker-entrypoint.sh /docker-entrypoint.sh -COPY --from=builder /src/postfix-tlspol/build/postfix-tlspol /usr/local/bin/postfix-tlspol RUN chmod +x /opt/postfix.sh \ /usr/local/bin/rspamd-pipe-ham \ diff --git a/data/Dockerfiles/postfix/postfix.sh b/data/Dockerfiles/postfix/postfix.sh index 44b7d7d39..0a6494ed6 100755 --- a/data/Dockerfiles/postfix/postfix.sh +++ b/data/Dockerfiles/postfix/postfix.sh @@ -3,9 +3,6 @@ trap "postfix stop" EXIT [[ ! -d /opt/postfix/conf/sql/ ]] && mkdir -p /opt/postfix/conf/sql/ -[[ ! -d /opt/postfix/conf/postfix-tlspol ]] && mkdir -p /opt/postfix/conf/postfix-tlspol -[[ ! -d /etc/postfix-tlspol ]] && mkdir -p /etc/postfix-tlspol -[[ ! -d /var/lib/postfix-tlspol ]] && mkdir -p /var/lib/postfix-tlspol # Wait for MySQL to warm-up while ! mariadb-admin status --ssl=false --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do @@ -506,26 +503,6 @@ if [[ ! -f /opt/postfix/conf/custom_postscreen_whitelist.cidr ]]; then EOF fi -cat < /opt/postfix/conf/postfix-tlspol/config.yaml -server: - address: 127.0.0.1:8642 - - log-level: info - - prefetch: true - - cache-file: /var/lib/postfix-tlspol/cache.db - -dns: - # must support DNSSEC - address: 127.0.0.11:53 -EOF - -# Fixing local command execution of postfix-tlspol with symlink to config -if [ ! -L /etc/postfix-tlspol/config.yaml ]; then - ln -s /opt/postfix/conf/postfix-tlspol/config.yaml /etc/postfix-tlspol/config.yaml -fi - # Fix Postfix permissions chown -R root:postfix /opt/postfix/conf/sql/ /opt/postfix/conf/custom_transport.pcre chmod 640 /opt/postfix/conf/sql/*.cf /opt/postfix/conf/custom_transport.pcre diff --git a/data/Dockerfiles/postfix/supervisord.conf b/data/Dockerfiles/postfix/supervisord.conf index 26fec862c..ba70f8edf 100644 --- a/data/Dockerfiles/postfix/supervisord.conf +++ b/data/Dockerfiles/postfix/supervisord.conf @@ -11,15 +11,6 @@ stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 autostart=true -[program:postfix-tlspol] -startsecs=10 -autorestart=true -command=/usr/local/bin/postfix-tlspol -config /opt/postfix/conf/postfix-tlspol/config.yaml -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - [program:postfix] command=/opt/postfix.sh stdout_logfile=/dev/stdout diff --git a/data/conf/postfix/main.cf b/data/conf/postfix/main.cf index e4354c40c..f091cb3f9 100644 --- a/data/conf/postfix/main.cf +++ b/data/conf/postfix/main.cf @@ -152,7 +152,7 @@ smtp_sasl_auth_enable = yes smtp_sasl_password_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_sasl_passwd_maps_sender_dependent.cf smtp_sasl_security_options = smtp_sasl_mechanism_filter = plain, login -smtp_tls_policy_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_tls_policy_override_maps.cf socketmap:inet:127.0.0.1:8642:QUERY +smtp_tls_policy_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_tls_policy_override_maps.cf socketmap:inet:postfix-tlspol:8642:QUERY smtp_header_checks = pcre:/opt/postfix/conf/anonymize_headers.pcre mail_name = Postcow # local_transport map catches local destinations and prevents routing local dests when the next map would route "*" diff --git a/docker-compose.yml b/docker-compose.yml index 5878a8b49..1b47cf592 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -378,6 +378,30 @@ services: aliases: - postfix + postfix-tlspol-mailcow: + image: ghcr.io/mailcow/postfix-tlspol:1.0 + depends_on: + unbound-mailcow: + condition: service_healthy + postfix-mailcow: + condition: service_started + volumes: + - postfix-tlspol-vol-1:/var/lib/postfix-tlspol + environment: + - LOG_LINES=${LOG_LINES:-9999} + - TZ=${TZ} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - REDISPASS=${REDISPASS} + - DEV_MODE=${DEV_MODE:-n} + restart: always + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + networks: + mailcow-network: + aliases: + - postfix-tlspol + memcached-mailcow: image: memcached:alpine restart: always @@ -649,6 +673,7 @@ volumes: redis-vol-1: rspamd-vol-1: postfix-vol-1: + postfix-tlspol-vol-1: crypt-vol-1: sogo-web-vol-1: sogo-userdata-backup-vol-1: From 29e28b47ed3dac40c8f7522e3dbddad965ff2992 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Thu, 28 Aug 2025 10:20:21 +0200 Subject: [PATCH 050/180] compose: add depends on for postfix-tlspol --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1b47cf592..8fa7e0606 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -344,6 +344,8 @@ services: condition: service_started unbound-mailcow: condition: service_healthy + postfix-tlspol-mailcow: + condition: service_started volumes: - ./data/hooks/postfix:/hooks:Z - ./data/conf/postfix:/opt/postfix/conf:z @@ -383,8 +385,6 @@ services: depends_on: unbound-mailcow: condition: service_healthy - postfix-mailcow: - condition: service_started volumes: - postfix-tlspol-vol-1:/var/lib/postfix-tlspol environment: From 4d88e191068c0b17a3e0e00d73f417788c756ae2 Mon Sep 17 00:00:00 2001 From: Sajjad hassanzadeh <32982356+Hassanzadeh-sd@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:06:43 +0330 Subject: [PATCH 051/180] Feat/prometheus-exporter : Add prometheus exporter and grafana dashboard for mailcow. (#6314) * add : readme for prometheus exporter configs * add : grafana dashboard json file * add: prometheus exporter service on docker-compose.override.yml * migrate: doc files into docs.mailcow.email project * add : security configs in prometheus exporter compose file * add : explain more in my comment part in prometheus override compose file * remove : mailcow dockerized docs --------- Co-authored-by: Saji --- .../docker-compose.override.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml diff --git a/helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml b/helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml new file mode 100644 index 000000000..6fd4e8e08 --- /dev/null +++ b/helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml @@ -0,0 +1,18 @@ +services: + prometheus-exporter-mailcow: + image: ghcr.io/mailcow/prometheus-exporter:2 + ports: + - "9099:9099" + restart: always + environment: + MAILCOW_EXPORTER_HOST: "" # Replace with your Mailcow hostname + MAILCOW_EXPORTER_API_KEY: "" # Replace with your API key + MAILCOW_EXPORTER_TOKEN: "" # Replace with your secure key + # MAILCOW_EXPORTER_TOKEN_DISABLE: "true" # Uncomment only if it is safe to disable token authentication (e.g., internal network only) + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + networks: + mailcow-network: + ipv4_address: ${IPV4_NETWORK:-172.22.1}.209 + aliases: + - prometheus-exporter From 5e66ffa36604e8c41bb23c7606ad951ed888b6b4 Mon Sep 17 00:00:00 2001 From: maxi322 <66129899+maxi322@users.noreply.github.com> Date: Thu, 28 Aug 2025 12:56:37 +0200 Subject: [PATCH 052/180] watchdog: use dig instead of check_dns (#6685) * watchdog: use dig instead of check_dns check_dns is slower and uses more system resources, dig wrapped in a script is a more performant approach and uses fewer system resources * added debug mode + compose image bump --------- Co-authored-by: maxi322 Co-authored-by: DerLinkman --- data/Dockerfiles/watchdog/Dockerfile | 5 ++-- data/Dockerfiles/watchdog/check_dns.sh | 39 ++++++++++++++++++++++++++ data/Dockerfiles/watchdog/watchdog.sh | 7 ++++- docker-compose.yml | 3 +- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100755 data/Dockerfiles/watchdog/check_dns.sh diff --git a/data/Dockerfiles/watchdog/Dockerfile b/data/Dockerfiles/watchdog/Dockerfile index a55a97a4c..6d8541d79 100644 --- a/data/Dockerfiles/watchdog/Dockerfile +++ b/data/Dockerfiles/watchdog/Dockerfile @@ -16,7 +16,6 @@ RUN apk add --update \ fcgi \ openssl \ nagios-plugins-mysql \ - nagios-plugins-dns \ nagios-plugins-disk \ bind-tools \ redis \ @@ -32,9 +31,11 @@ RUN apk add --update \ tzdata \ whois \ && curl https://raw.githubusercontent.com/mludvig/smtp-cli/v3.10/smtp-cli -o /smtp-cli \ - && chmod +x smtp-cli + && chmod +x smtp-cli \ + && mkdir /usr/lib/mailcow COPY watchdog.sh /watchdog.sh COPY check_mysql_slavestatus.sh /usr/lib/nagios/plugins/check_mysql_slavestatus.sh +COPY check_dns.sh /usr/lib/mailcow/check_dns.sh CMD ["/watchdog.sh"] diff --git a/data/Dockerfiles/watchdog/check_dns.sh b/data/Dockerfiles/watchdog/check_dns.sh new file mode 100755 index 000000000..ce4cfa3b1 --- /dev/null +++ b/data/Dockerfiles/watchdog/check_dns.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +while getopts "H:s:" opt; do + case "$opt" in + H) HOST="$OPTARG" ;; + s) SERVER="$OPTARG" ;; + *) echo "Usage: $0 -H host -s server"; exit 3 ;; + esac +done + +if [ -z "$SERVER" ]; then + echo "No DNS Server provided" + exit 3 +fi + +if [ -z "$HOST" ]; then + echo "No host to test provided" + exit 3 +fi + +# run dig and measure the time it takes to run +START_TIME=$(date +%s%3N) +dig_output=$(dig +short +timeout=2 +tries=1 "$HOST" @"$SERVER" 2>/dev/null) +dig_rc=$? +dig_output_ips=$(echo "$dig_output" | grep -E '^[0-9.]+$' | sort | paste -sd ',' -) +END_TIME=$(date +%s%3N) +ELAPSED_TIME=$((END_TIME - START_TIME)) + +# validate and perform nagios like output and exit codes +if [ $dig_rc -ne 0 ] || [ -z "$dig_output" ]; then + echo "Domain $HOST was not found by the server" + exit 2 +elif [ $dig_rc -eq 0 ]; then + echo "DNS OK: $ELAPSED_TIME ms response time. $HOST returns $dig_output_ips" + exit 0 +else + echo "Unknown error" + exit 3 +fi diff --git a/data/Dockerfiles/watchdog/watchdog.sh b/data/Dockerfiles/watchdog/watchdog.sh index d1c659ce8..a087ca5f1 100755 --- a/data/Dockerfiles/watchdog/watchdog.sh +++ b/data/Dockerfiles/watchdog/watchdog.sh @@ -1,5 +1,10 @@ #!/bin/bash +if [ "${DEV_MODE}" != "n" ]; then + echo -e "\e[31mEnabled Debug Mode\e[0m" + set -x +fi + trap "exit" INT TERM trap "kill 0" EXIT @@ -297,7 +302,7 @@ unbound_checks() { touch /tmp/unbound-mailcow; echo "$(tail -50 /tmp/unbound-mailcow)" > /tmp/unbound-mailcow host_ip=$(get_container_ip unbound-mailcow) err_c_cur=${err_count} - /usr/lib/nagios/plugins/check_dns -s ${host_ip} -H stackoverflow.com 2>> /tmp/unbound-mailcow 1>&2; err_count=$(( ${err_count} + $? )) + /usr/lib/mailcow/check_dns.sh -s ${host_ip} -H stackoverflow.com 2>> /tmp/unbound-mailcow 1>&2; err_count=$(( ${err_count} + $? )) DNSSEC=$(dig com +dnssec | egrep 'flags:.+ad') if [[ -z ${DNSSEC} ]]; then echo "DNSSEC failure" 2>> /tmp/unbound-mailcow 1>&2 diff --git a/docker-compose.yml b/docker-compose.yml index 8fa7e0606..ce33e3d93 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -521,7 +521,7 @@ services: - /lib/modules:/lib/modules:ro watchdog-mailcow: - image: ghcr.io/mailcow/watchdog:2.08 + image: ghcr.io/mailcow/watchdog:2.09 dns: - ${IPV4_NETWORK:-172.22.1}.254 tmpfs: @@ -588,6 +588,7 @@ services: - OLEFY_THRESHOLD=${OLEFY_THRESHOLD:-5} - MAILQ_THRESHOLD=${MAILQ_THRESHOLD:-20} - MAILQ_CRIT=${MAILQ_CRIT:-30} + - DEV_MODE=${DEV_MODE:-n} networks: mailcow-network: aliases: From 6c5d82c4df2cf24be38608e45b4e1e6bed6e61b2 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Thu, 28 Aug 2025 14:06:17 +0200 Subject: [PATCH 053/180] expanded postscreen whitelist with modern freemailers + included checks.mailcow.email --- data/conf/postfix/postscreen_access.cidr | 98 +++++++++++++++---- helper-scripts/update_postscreen_whitelist.sh | 5 +- 2 files changed, 82 insertions(+), 21 deletions(-) diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr index 4453feca3..1783620dd 100644 --- a/data/conf/postfix/postscreen_access.cidr +++ b/data/conf/postfix/postscreen_access.cidr @@ -1,13 +1,25 @@ -# Whitelist generated by Postwhite v3.4 on Fri Aug 1 00:24:14 UTC 2025 +# Whitelist generated by Postwhite v3.4 on Do 28. Aug 14:05:16 CEST 2025 # https://github.com/stevejenkins/postwhite/ -# 2166 total rules +# 2225 total rules 2a00:1450:4000::/36 permit 2a01:111:f400::/48 permit +2a01:111:f403::/49 permit 2a01:111:f403:8000::/50 permit 2a01:111:f403:8000::/51 permit -2a01:111:f403::/49 permit 2a01:111:f403:c000::/51 permit 2a01:111:f403:f000::/52 permit +2a01:238:20a:202:5370::1 permit +2a01:238:20a:202:5372::1 permit +2a01:238:20a:202:5373::1 permit +2a01:238:400:101:53::1 permit +2a01:238:400:102:53::1 permit +2a01:238:400:103:53::1 permit +2a01:238:400:301:53::1 permit +2a01:238:400:302:53::1 permit +2a01:238:400:303:53::1 permit +2a01:238:400:470:53::1 permit +2a01:238:400:471:53::1 permit +2a01:238:400:472:53::1 permit 2a01:b747:3000:200::/56 permit 2a01:b747:3001:200::/56 permit 2a01:b747:3002:200::/56 permit @@ -17,16 +29,17 @@ 2a01:b747:3006:200::/56 permit 2a02:a60:0:5::/64 permit 2c0f:fb50:4000::/36 permit -2.207.151.53 permit 2.207.217.30 permit 3.64.237.68 permit 3.65.3.180 permit 3.70.123.177 permit 3.72.182.33 permit 3.74.81.189 permit +3.74.125.228 permit 3.75.33.185 permit 3.93.157.0/24 permit 3.94.40.108 permit +3.121.107.214 permit 3.129.120.190 permit 3.210.190.0/24 permit 3.211.80.218 permit @@ -42,7 +55,7 @@ 8.40.222.0/23 permit 8.40.222.250/31 permit 12.130.86.238 permit -13.107.253.40 permit +13.107.253.44 permit 13.110.208.0/21 permit 13.110.209.0/24 permit 13.110.216.0/22 permit @@ -64,6 +77,8 @@ 18.97.2.64/26 permit 18.156.89.250 permit 18.156.205.64 permit +18.157.70.148 permit +18.157.114.255 permit 18.157.243.190 permit 18.158.153.154 permit 18.194.95.56 permit @@ -75,9 +90,7 @@ 18.216.232.154 permit 18.235.27.253 permit 18.236.40.242 permit -18.236.56.161 permit 20.51.6.32/30 permit -20.51.98.61 permit 20.52.52.2 permit 20.52.128.133 permit 20.59.80.4/30 permit @@ -153,7 +166,6 @@ 34.212.163.75 permit 34.215.104.144 permit 34.218.115.239 permit -34.218.116.3 permit 34.225.212.172 permit 34.241.242.183 permit 35.83.148.184 permit @@ -171,6 +183,7 @@ 37.218.249.47 permit 37.218.251.62 permit 39.156.163.64/29 permit +40.90.65.81 permit 40.92.0.0/15 permit 40.92.0.0/16 permit 40.107.0.0/16 permit @@ -178,6 +191,7 @@ 40.233.64.216 permit 40.233.83.78 permit 40.233.88.28 permit +43.239.212.33 permit 44.206.138.57 permit 44.210.169.44 permit 44.217.45.156 permit @@ -188,7 +202,10 @@ 44.246.68.102 permit 44.246.77.92 permit 45.14.148.0/22 permit -46.19.170.16 permit +45.143.132.0/24 permit +45.143.133.0/24 permit +45.143.134.0/24 permit +45.143.135.0/24 permit 46.226.48.0/21 permit 46.228.36.37 permit 46.228.36.38/31 permit @@ -254,6 +271,9 @@ 50.56.130.221 permit 50.56.130.222 permit 50.112.246.219 permit +51.77.79.158 permit +51.83.17.38 permit +51.89.119.103 permit 52.1.14.157 permit 52.5.230.59 permit 52.6.74.205 permit @@ -304,6 +324,8 @@ 52.234.172.96/28 permit 52.235.253.128 permit 52.236.28.240/28 permit +54.36.149.183 permit +54.38.221.122 permit 54.90.148.255 permit 54.165.19.38 permit 54.174.52.0/24 permit @@ -324,6 +346,7 @@ 54.255.61.23 permit 56.124.6.228 permit 57.103.64.0/18 permit +57.129.93.249 permit 62.13.128.0/24 permit 62.13.129.128/25 permit 62.13.136.0/21 permit @@ -643,6 +666,11 @@ 77.238.189.142 permit 77.238.189.146/31 permit 77.238.189.148/30 permit +79.135.106.0/24 permit +79.135.107.0/24 permit +81.169.146.243 permit +81.169.146.245 permit +81.169.146.246 permit 81.223.46.0/27 permit 82.165.159.2 permit 82.165.159.3 permit @@ -658,7 +686,17 @@ 82.165.159.45 permit 82.165.159.130 permit 82.165.159.131 permit +85.9.206.169 permit +85.9.210.45 permit 85.158.136.0/21 permit +85.215.255.39 permit +85.215.255.40 permit +85.215.255.41 permit +85.215.255.45 permit +85.215.255.46 permit +85.215.255.47 permit +85.215.255.48 permit +85.215.255.49 permit 86.61.88.25 permit 87.238.80.0/21 permit 87.248.103.12 permit @@ -698,6 +736,7 @@ 87.248.117.205 permit 87.253.232.0/21 permit 89.22.108.0/24 permit +91.134.188.129 permit 91.198.2.0/24 permit 91.211.240.0/22 permit 94.236.119.0/26 permit @@ -1342,9 +1381,9 @@ 108.174.6.215 permit 108.175.18.45 permit 108.175.30.45 permit -108.177.8.0/22 permit -108.177.96.0/19 permit +108.177.96.0/20 permit 108.179.144.0/20 permit +109.224.244.0/24 permit 109.237.142.0/24 permit 111.221.23.128/25 permit 111.221.26.0/27 permit @@ -1508,7 +1547,6 @@ 148.105.0.0/16 permit 148.105.8.0/21 permit 149.72.0.0/16 permit -149.72.223.204 permit 149.72.248.236 permit 149.97.173.180 permit 150.230.98.160 permit @@ -1623,7 +1661,6 @@ 169.148.144.0/25 permit 169.148.144.10 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 @@ -1671,6 +1708,9 @@ 185.12.80.0/22 permit 185.28.196.0/22 permit 185.58.84.93 permit +185.70.40.0/24 permit +185.70.41.0/24 permit +185.70.43.0/24 permit 185.80.93.204 permit 185.80.93.227 permit 185.80.95.31 permit @@ -1732,6 +1772,7 @@ 188.125.85.234/31 permit 188.125.85.236/31 permit 188.125.85.238 permit +188.165.51.139 permit 188.172.128.0/20 permit 192.0.64.0/18 permit 192.18.139.154 permit @@ -1757,7 +1798,11 @@ 193.142.157.0/24 permit 193.142.157.191 permit 193.142.157.198 permit +193.201.168.38 permit +193.201.168.170/31 permit 194.19.134.0/25 permit +194.25.134.16/28 permit +194.25.134.80/28 permit 194.64.234.129 permit 194.97.196.0/24 permit 194.97.196.3 permit @@ -1957,8 +2002,6 @@ 208.71.42.212/31 permit 208.71.42.214 permit 208.72.249.240/29 permit -208.74.204.5 permit -208.74.204.9 permit 208.75.120.0/22 permit 208.76.62.0/24 permit 208.76.63.0/24 permit @@ -2022,6 +2065,8 @@ 212.227.15.4 permit 212.227.15.5 permit 212.227.15.6 permit +212.227.15.7 permit +212.227.15.8 permit 212.227.15.14 permit 212.227.15.15 permit 212.227.15.18 permit @@ -2038,16 +2083,30 @@ 212.227.15.53 permit 212.227.15.54 permit 212.227.15.55 permit +212.227.17.1 permit +212.227.17.2 permit +212.227.17.7 permit 212.227.17.11 permit 212.227.17.12 permit +212.227.17.16 permit +212.227.17.17 permit 212.227.17.18 permit 212.227.17.19 permit 212.227.17.20 permit 212.227.17.21 permit 212.227.17.22 permit 212.227.17.26 permit +212.227.17.27 permit 212.227.17.28 permit 212.227.17.29 permit +212.227.126.206 permit +212.227.126.207 permit +212.227.126.208 permit +212.227.126.209 permit +212.227.126.220 permit +212.227.126.221 permit +212.227.126.222 permit +212.227.126.223 permit 212.227.126.224 permit 212.227.126.225 permit 212.227.126.226 permit @@ -2155,16 +2214,17 @@ 2607:13c0:0002:0000:0000:0000:0000:1000/116 permit 2607:13c0:0004:0000:0000:0000:0000:0000/116 permit 2607:f8b0:4000::/36 permit -2620:109:c003:104::/64 permit 2620:109:c003:104::215 permit -2620:109:c006:104::/64 permit +2620:109:c003:104::/64 permit 2620:109:c006:104::215 permit +2620:109:c006:104::/64 permit 2620:109:c00d:104::/64 permit 2620:10d:c090:400::8:1 permit 2620:10d:c091:400::8:1 permit 2620:10d:c09b:400::8:1 permit 2620:10d:c09c:400::8:1 permit -2620:119:50c0:207::/64 permit 2620:119:50c0:207::215 permit +2620:119:50c0:207::/64 permit 2800:3f0:4000::/36 permit -194.25.134.0/24 permit # t-online.de +49.12.4.251 permit # checks.mailcow.email +2a01:4f8:c17:7906::10 permit # checks.mailcow.email diff --git a/helper-scripts/update_postscreen_whitelist.sh b/helper-scripts/update_postscreen_whitelist.sh index 04335bda5..dda64b263 100644 --- a/helper-scripts/update_postscreen_whitelist.sh +++ b/helper-scripts/update_postscreen_whitelist.sh @@ -6,9 +6,10 @@ SPFTOOLS_DIR=${WORKING_DIR}/spf-tools POSTWHITE_DIR=${WORKING_DIR}/postwhite POSTWHITE_CONF=${POSTWHITE_DIR}/postwhite.conf -CUSTOM_HOSTS='"web.de gmx.net mail.de freenet.de arcor.de unity-mail.de"' +CUSTOM_HOSTS='"web.de gmx.net mail.de freenet.de arcor.de unity-mail.de protonmail.ch ionos.com strato.com t-online.de"' STATIC_HOSTS=( - "194.25.134.0/24 permit # t-online.de" + "49.12.4.251 permit # checks.mailcow.email" + "2a01:4f8:c17:7906::10 permit # checks.mailcow.email" ) mkdir ${SCRIPT_DIR}/postwhite_tmp From 0b0a65a3f338a2e3b191841d6322d4dcc4834e70 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Thu, 28 Aug 2025 17:02:16 +0200 Subject: [PATCH 054/180] web: rename login placeholder for mailbox to email address (#6693) --- data/web/lang/lang.de-de.json | 3 ++- data/web/lang/lang.en-gb.json | 3 ++- data/web/templates/user_index.twig | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index 1d2edc1b4..55fc11ab4 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -846,7 +846,8 @@ "password": "Passwort", "reset_password": "Passwort zurücksetzen", "request_reset_password": "Passwortänderung anfordern", - "username": "Benutzername" + "username": "Benutzername", + "email": "E-Mail-Adresse" }, "mailbox": { "action": "Aktion", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 78059c0b8..4ee5675be 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -847,7 +847,8 @@ "password": "Password", "reset_password": "Reset Password", "request_reset_password": "Request password change", - "username": "Username" + "username": "Username", + "email": "Email address" }, "mailbox": { "action": "Action", diff --git a/data/web/templates/user_index.twig b/data/web/templates/user_index.twig index 234aa01cb..28eb6389c 100644 --- a/data/web/templates/user_index.twig +++ b/data/web/templates/user_index.twig @@ -48,7 +48,7 @@
- +
From 6dc90186f937ab9fa23db850abee0a3220641389 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 29 Aug 2025 16:22:28 +0000 Subject: [PATCH 055/180] chore(deps): update dependency krakjoe/apcu to v5.1.27 Signed-off-by: milkmaker --- data/Dockerfiles/phpfpm/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile index e7b43790b..262da24f4 100644 --- a/data/Dockerfiles/phpfpm/Dockerfile +++ b/data/Dockerfiles/phpfpm/Dockerfile @@ -3,7 +3,7 @@ FROM php:8.2-fpm-alpine3.21 LABEL maintainer = "The Infrastructure Company GmbH " # renovate: datasource=github-tags depName=krakjoe/apcu versioning=semver-coerced extractVersion=^v(?.*)$ -ARG APCU_PECL_VERSION=5.1.26 +ARG APCU_PECL_VERSION=5.1.27 # renovate: datasource=github-tags depName=Imagick/imagick versioning=semver-coerced extractVersion=(?.*)$ ARG IMAGICK_PECL_VERSION=3.8.0 # renovate: datasource=github-tags depName=php/pecl-mail-mailparse versioning=semver-coerced extractVersion=^v(?.*)$ From c0b7a98e6c44c62ee06eb7462ac05d313e2a808e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:23:56 +0200 Subject: [PATCH 056/180] chore(deps): update actions/checkout action to v5 (#6671) Signed-off-by: milkmaker Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/image_builds.yml | 2 +- .github/workflows/pr_to_nightly.yml | 2 +- .github/workflows/rebuild_backup_image.yml | 2 +- .github/workflows/update_postscreen_access_list.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/image_builds.yml b/.github/workflows/image_builds.yml index 27fc9a2d5..a5ebb902f 100644 --- a/.github/workflows/image_builds.yml +++ b/.github/workflows/image_builds.yml @@ -27,7 +27,7 @@ jobs: - "watchdog-mailcow" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup Docker run: | curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh diff --git a/.github/workflows/pr_to_nightly.yml b/.github/workflows/pr_to_nightly.yml index 51df14f6e..334dcf69a 100644 --- a/.github/workflows/pr_to_nightly.yml +++ b/.github/workflows/pr_to_nightly.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - name: Run the Action diff --git a/.github/workflows/rebuild_backup_image.yml b/.github/workflows/rebuild_backup_image.yml index adf69eb35..a8679d980 100644 --- a/.github/workflows/rebuild_backup_image.yml +++ b/.github/workflows/rebuild_backup_image.yml @@ -13,7 +13,7 @@ jobs: packages: write steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Set up QEMU uses: docker/setup-qemu-action@v3 diff --git a/.github/workflows/update_postscreen_access_list.yml b/.github/workflows/update_postscreen_access_list.yml index 3d79e801b..eed07876e 100644 --- a/.github/workflows/update_postscreen_access_list.yml +++ b/.github/workflows/update_postscreen_access_list.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Generate postscreen_access.cidr run: | From 48e90a72dce562eef8cf237faffe2b03f32d8a28 Mon Sep 17 00:00:00 2001 From: Peter Date: Fri, 29 Aug 2025 18:27:34 +0200 Subject: [PATCH 057/180] Changed clamavs tmp folder structure --- data/Dockerfiles/clamd/clamd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Dockerfiles/clamd/clamd.sh b/data/Dockerfiles/clamd/clamd.sh index 2c6e75dc6..c656be065 100755 --- a/data/Dockerfiles/clamd/clamd.sh +++ b/data/Dockerfiles/clamd/clamd.sh @@ -8,7 +8,7 @@ fi # Cleaning up garbage echo "Cleaning up tmp files..." -rm -rf /var/lib/clamav/clamav-*.tmp +rm -rf /var/lib/clamav/tmp.* # Prepare whitelist From 921de02a2b09d1a80cc68dca811cbf892b44ee2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A1ndor?= <9724897+sandroshu@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:32:17 +0200 Subject: [PATCH 058/180] Update lang.hu-hu.json (#6697) Extended Hungarian translation --- data/web/lang/lang.hu-hu.json | 624 +++++++++++++++++++++++++++++++--- 1 file changed, 586 insertions(+), 38 deletions(-) diff --git a/data/web/lang/lang.hu-hu.json b/data/web/lang/lang.hu-hu.json index 3b9eb5fbc..6ec3ed68a 100644 --- a/data/web/lang/lang.hu-hu.json +++ b/data/web/lang/lang.hu-hu.json @@ -9,11 +9,11 @@ "source": "Forrás", "spamfilter": "Spam szűrő", "subject": "Tárgy", - "sys_mails": "Rendszer-üzenetek", + "sys_mails": "Rendszerüzenetek", "text": "Szöveg", "time": "Idő", "title": "Cím", - "title_name": "\"mailcow UI\" website címe", + "title_name": "\"mailcow UI\" weboldal címe", "to_top": "Vissza a tetejére", "transport_dest_format": "Szintaxis: pelda.hu, .pelda.hu, *, fiok@pelda.hu (több érték esetén vesszővel elválasztva)", "upload": "Feltöltés", @@ -29,14 +29,14 @@ "logo_dark_label": "Sötét üzemmódhoz invertálva", "f2b_regex_info": "Figyelembe vett naplók: SOGo, Postfix, Dovecot, PHP-FPM.", "f2b_retry_window": "Újrapróbálkozási ablak (s) a maximális próbálkozásokhoz", - "f2b_whitelist": "Fehérlistás hálózatok/hostok", + "f2b_whitelist": "Engedélyezési listás hálózatok/hostok", "filter_table": "Szűrő táblázat", "forwarding_hosts": "Továbbító hostok", - "forwarding_hosts_add_hint": "Megadhat IPv4/IPv6 címeket, hálózatokat CIDR jelölésben, állomásneveket (amelyek IP-címekre lesznek feloldva) vagy tartományneveket (amelyek IP-címekre lesznek feloldva az SPF rekordok vagy ezek hiányában az MX rekordok lekérdezésével).", + "forwarding_hosts_add_hint": "Megadhat IPv4/IPv6 címeket, hálózatokat CIDR jelölésben, állomásneveket (amelyek IP címekre lesznek feloldva) vagy tartományneveket (amelyek IP címekre lesznek feloldva az SPF rekordok vagy ezek hiányában az MX rekordok lekérdezésével).", "from": "A címről", "copy_to_clipboard": "Szöveg másolva a vágólapra!", "f2b_manage_external": "A Fail2Ban külső kezelése", - "f2b_manage_external_info": "A Fail2ban továbbra is karbantartja a tiltólistát, de nem állít be aktívan szabályokat a forgalom blokkolására. Használja az alábbi generált tiltólistát a forgalom külső blokkolásához.", + "f2b_manage_external_info": "A Fail2ban továbbra is karbantartja a tiltólistát, de nem állít be aktívan szabályokat a forgalom blokkolásához. Használja az alábbi generált tiltólistát a forgalom külső blokkolásához.", "f2b_max_ban_time": "Maximális tiltási idő (s)", "f2b_netban_ipv4": "IPv4 alhálózat mérete, amelyre tilalmat kell alkalmazni (8-32)", "f2b_netban_ipv6": "IPv6 alhálózat mérete, amelyre tilalmat kell alkalmazni (8-128)", @@ -47,13 +47,13 @@ "html": "HTML", "import": "Import", "ip_check": "IP ellenőrzés", - "ip_check_disabled": "Az IP-ellenőrzés le van tiltva. Bekapcsolhatja a következő menüpont alatt
Rendszer > Beállítások > Opciók > Személyreszabás", + "ip_check_disabled": "Az IP ellenőrzés le van tiltva. Bekapcsolhatja a következő menüpont alatt
Rendszer > Beállítások > Opciók > Személyreszabás", "is_mx_based": "MX alapú", "last_applied": "Utoljára alkalmazott", "link": "Link", "loading": "Kérjük, várj...", "login_time": "Bejelentkezési idő", - "f2b_list_info": "Egy feketelistán szereplő állomás vagy hálózat mindig nagyobb súlyú, mint egy fehérlistás entitás. A lista frissítései néhány másodpercig tartanak.", + "f2b_list_info": "Egy tiltólistán szereplő állomás vagy hálózat mindig nagyobb súlyú, mint egy engedélyezési listás elem. A lista frissítései néhány másodpercig tartanak.", "f2b_ban_time_increment": "A tiltási idő minden egyes tiltással növekszik", "additional_rows": " - további sorokat adtak hozzá", "admin": "Adminisztrátor", @@ -68,7 +68,7 @@ "api_key": "API-kulcs", "api_read_only": "Csak olvasható hozzáférés", "api_read_write": "Olvasás-írás hozzáférés", - "api_skip_ip_check": "IP-ellenőrzés kihagyása az API esetében", + "api_skip_ip_check": "IP ellenőrzés kihagyása az API esetében", "cors_settings": "CORS beállítások", "guid": "GUID - egyedi példányazonosító", "dkim_to": "A címre", @@ -82,8 +82,8 @@ "edit": "Szerkesztés", "empty": "Nincs eredmény", "excludes": "Kizárja ezeket a kedvezményezetteket", - "f2b_ban_time": "Tilalmi idő (s)", - "f2b_blacklist": "Feketelistás hálózatok/hostok", + "f2b_ban_time": "Tiltás időtartam (s)", + "f2b_blacklist": "Tiltólistás címek", "f2b_filter": "Regex szűrők", "logo_info": "A képed 40px magasságúra lesz méretezve a felső navigációs sávhoz és max. 250px szélességűre a kezdőlaphoz. A skálázható grafika használata erősen ajánlott.", "dkim_add_key": "ARC/DKIM kulcs hozzáadása", @@ -122,21 +122,187 @@ "arrival_time": "Érkezési idő (szerveridő)", "authed_user": "Azonosított felhasználó", "ays": "Biztos, hogy folytatni akarod?", - "ban_list_info": "A tiltott IP-címek listáját lásd alább: hálózat (fennmaradó tiltási idő) - [akciók].
A tiltás feloldására várakozó IP-ket néhány másodpercen belül eltávolítjuk az aktív tiltási listáról.
A piros címkék a feketelistán szereplő aktív állandó tiltásokat jelzik.", + "ban_list_info": "A tiltott IP címek listáját lásd alább: hálózat (fennmaradó tiltási idő) - [akciók].
A tiltás feloldására várakozó IP-ket néhány másodpercen belül eltávolítjuk az aktív tiltási listáról.
A piros címkék a tiltólistán szereplő aktív állandó tiltásokat jelzik.", "configuration": "Konfiguráció", "convert_html_to_text": "HTML átalakítása egyszerű szöveggé", "credentials_transport_warning": "Figyelmeztetés: Egy új közlekedési térképbejegyzés hozzáadása frissíti a hitelesítő adatokat minden olyan bejegyzéshez, amelynek a következő ugrás oszlopa megegyezik.", "customize": "Testreszabás", "destination": "Célállomás", "customer_id": "Ügyfél azonosító", - "apps_name": "\"mailcow Apps\" név" + "apps_name": "\"mailcow Apps\" név", + "admin_quicklink": "Gyorshivatkozás elrejtése az Adminisztrátori bejelentkezési oldalra", + "app_hide": "Elrejtés a bejelentkezéshez", + "domainadmin_quicklink": "Gyorshivatkozás elrejtése a Domain adminisztrátori bejelentkezési oldalra", + "filter": "Szűrő", + "force_sso_text": "Ha egy külső OIDC-szolgáltató van beállítva, ez az opció elrejti az alapértelmezett mailcow bejelentkezési űrlapokat, és csak az egységes bejelentkezési (Single Sign-On) gombot jeleníti meg", + "force_sso": "A mailcow bejelentkezés letiltása és csak az egységes bejelentkezés megjelenítése", + "hash_remove_info": "Egy arányszám-korlát hash eltávolítása (ha még létezik) teljesen visszaállítja a számlálóját.
\r\n Minden hash-t egyedi szín jelöl.", + "iam": "Azonosítási szolgáltató", + "iam_attribute_field": "Attribútum mező", + "iam_authorize_url": "Engedélyezési végpont", + "iam_auth_flow": "Azonosítási folyamat", + "iam_auth_flow_info": "Az engedélyezési kód áramláson (Authorization Code Flow) kívül, amelyet az egységes bejelentkezéshez (Single-Sign On) használnak (ez a standard áramlás Keycloak-ban), a mailcow támogatja a közvetlen hitelesítő adatokkal történő hitelesítési áramlást is. A Jelszóáramlás (Mailpassword Flow) megpróbálja érvényesíteni a felhasználó hitelesítő adatait a Keycloak Admin REST API használatával. A mailcow a mailcow_password attribútumból olvassa be a hash-elt jelszót, amely a Keycloak-ban van leképezve.", + "iam_basedn": "Bázis DN", + "iam_client_id": "Kliens azonosító", + "iam_client_secret": "Kliens titok", + "iam_client_scopes": "Kliens hatókörök", + "iam_default_template": "Alapértelmezett sablon", + "iam_default_template_description": "Ha nincs sablon hozzárendelve egy felhasználóhoz, az alapértelmezett sablon lesz felhasználva a postafiók létrehozásához, de a postafiók frissítéséhez nem.", + "iam_description": "Külső azonosítási szolgáltató konfigurálása.
A felhasználók postafiókjai automatikusan létrejönnek az első bejelentkezéskor, feltéve, hogy van attribútum-hozzárendelés beállítva.", + "iam_extra_permission": "A következő beállításokhoz a Keycloak-ban lévő mailcow kliensnek szüksége van egy Service account-ra és a view-users engedélyre.", + "iam_host": "Házigazda", + "iam_host_info": "Adjon meg egy vagy több LDAP állomást, vesszővel elválasztva.", + "iam_import_users": "Felhasználók importálása", + "iam_login_provisioning": "Felhasználók automatikus létrehozása bejelentkezéskor", + "iam_mapping": "Attribútum-hozzárendelés", + "iam_bindpass": "Bind jelszó", + "iam_periodic_full_sync": "Időszakos teljes szinkronizálás", + "iam_port": "Port", + "iam_realm": "Tartomány", + "iam_redirect_url": "Átirányítási URL", + "iam_rest_flow": "Mailpassword Flow", + "iam_server_url": "Szerver URL", + "iam_sso": "Egységes bejelentkezés", + "iam_sync_interval": "Szinkronizálási / importálási időtartam (perc)", + "iam_test_connection": "Kapcsolat tesztelése", + "iam_token_url": "Token végpont", + "iam_userinfo_url": "Felhasználói információ végpont", + "iam_username_field": "Felhasználónév mező", + "iam_binddn": "Bind DN", + "iam_use_ssl": "SSL használata", + "iam_use_ssl_info": "Ha az SSL-t engedélyezi, és a port 389-re van állítva, az automatikusan felülíródik 636-ra.", + "iam_use_tls": "StartTLS használata", + "iam_use_tls_info": "Ha a TLS-t engedélyezi, az LDAP szerver alapértelmezett portját kell használnia (389). Az SSL portok nem használhatók.", + "iam_version": "Verzió", + "ignore_ssl_error": "SSL hibák figyelmen kívül hagyása", + "ip_check_opt_in": "Választás a harmadik féltől származó ipv4.mailcow.email és ipv6.mailcow.email szolgáltatás használatára a külső IP címek feloldásához.", + "license_info": "A licensz nem kötelező, de segít a további fejlesztésben.
Regisztrálja a GUID-ját itt vagy vásároljon támogatást a mailcow telepítéséhez.", + "lookup_mx": "A cél egy reguláris kifejezés, amely illeszkedik az MX névre (.*\\.google\\.com, hogy a google.com-ra végződő MX-en keresztül továbbítsa az összes levelet)", + "main_name": "\"mailcow UI\" név", + "merged_vars_hint": "A szürkével jelölt sorok a vars.(local.)inc.php fájlból lettek összevonva, és nem módosíthatók.", + "message": "Üzenet", + "message_size": "Üzenet mérete", + "nexthop": "Következő ugrás", + "no": "✕", + "no_active_bans": "Nincs aktív tiltás", + "no_new_rows": "Nincs több sor elérhető", + "no_record": "Nincs bejegyzés", + "oauth2_apps": "OAuth2 alkalmazások", + "oauth2_add_client": "OAuth2 kliens hozzáadása", + "oauth2_client_id": "Kliens azonosító", + "oauth2_client_secret": "Kliens titok", + "oauth2_info": "Az OAuth2 implementáció támogatja az \"Authorization Code\" engedélyezési típust és frissítési tokeneket ad ki.
\r\nA szerver automatikusan új frissítési tokeneket is kiad, miután egy frissítési token fel lett használva.

\r\n• Az alapértelmezett hatókör a profile. Csak postafiók-felhasználók hitelesíthetők az OAuth2-vel szemben. Ha a scope paraméter elmarad, az visszaesik a profile-ra.
\r\n• A state paramétert a kliensnek kötelező elküldenie az engedélyezési kérelem részeként.

\r\nAz OAuth2 API-hoz intézett kérések útvonalai:
\r\n
    \r\n
  • Engedélyezési végpont: /oauth/authorize
  • \r\n
  • Token végpont: /oauth/token
  • \r\n
  • Erőforrás oldal: /oauth/profile
  • \r\n
\r\nA kliens titok újragenerálása nem jár le a meglévő engedélyezési kódok lejáratával, de azok nem tudják megújítani a tokenjüket.

\r\nA kliens tokenek visszavonása az összes aktív munkamenet azonnali leállítását okozza. Minden kliensnek újra kell hitelesítenie magát.", + "oauth2_redirect_uri": "Átirányítási URI", + "oauth2_renew_secret": "Új kliens titok generálása", + "oauth2_revoke_tokens": "Minden kliens token visszavonása", + "optional": "opcionális", + "options": "Opciók", + "password": "Jelszó", + "password_length": "Jelszó hossza", + "password_policy": "Jelszó házirend", + "password_policy_chars": "Legalább egy betűkaraktert kell tartalmaznia", + "password_policy_length": "A jelszó minimális hossza %d", + "password_policy_lowerupper": "Kis- és nagybetűket kell tartalmaznia", + "password_policy_numbers": "Legalább egy számot kell tartalmaznia", + "password_policy_special_chars": "Speciális karaktereket kell tartalmaznia", + "password_repeat": "Megerősítő jelszó (ismétlés)", + "password_reset_info": "Ha nincs megadva helyreállítási e-mail cím, ez a funkció nem használható.", + "password_reset_settings": "Jelszó-helyreállítási beállítások", + "password_reset_tmpl_html": "HTML sablon", + "password_reset_tmpl_text": "Szöveges sablon", + "password_settings": "Jelszó beállítások", + "priority": "Prioritás", + "private_key": "Privát kulcs", + "quarantine": "Karantén", + "quarantine_bcc": "Az összes értesítés másolatának elküldése (BCC) erre a címzettnek:
Hagyja üresen a letiltáshoz. Aláíratlan, nem ellenőrzött levél. Csak belső kézbesítésre alkalmas.", + "quarantine_exclude_domains": "Tartományok és alias-tartományok kizárása", + "quarantine_max_age": "Maximális életkor napokban
Az értéknek legalább 1 napnak kell lennie.", + "quarantine_max_score": "Az értesítés elvetése, ha egy levél spam pontszáma magasabb ennél az értéknél:
Alapértelmezett értéke 9999.0", + "quarantine_max_size": "Maximális méret MiB-ban (a nagyobb elemeket elveti):
A 0 nem jelent korlátlant.", + "quarantine_notification_html": "Értesítő e-mail sablon:
Hagyja üresen az alapértelmezett sablon visszaállításához.", + "quarantine_notification_sender": "Értesítő e-mail feladója", + "quarantine_notification_subject": "Értesítő e-mail tárgya", + "quarantine_redirect": "Az összes értesítés átirányítása erre a címzettnek:
Hagyja üresen a letiltáshoz. Aláíratlan, nem ellenőrzött levél. Csak belső kézbesítésre alkalmas.", + "quarantine_release_format": "A feloldott elemek formátuma", + "quarantine_release_format_att": "Csatolmányként", + "quarantine_release_format_raw": "Eredeti, módosítatlan formában", + "quarantine_retention_size": "Megőrzések postafiókonként:
A 0 inaktívat jelent.", + "quicklink_text": "A gyorshivatkozások megjelenítése vagy elrejtése a bejelentkezési űrlap alatt", + "quota_notification_html": "Értesítő e-mail sablon:
Hagyja üresen az alapértelmezett sablon visszaállításához.", + "quota_notification_sender": "Kvóta értesítő e-mail feladója", + "quota_notification_subject": "Kvóta értesítő e-mail tárgya", + "quota_notifications": "Kvóta értesítések", + "quota_notifications_info": "A kvóta értesítéseket a felhasználók egyszer kapják meg, amikor a 80%-os határt, majd a 95%-os határt átlépik.", + "quota_notifications_vars": "{{percent}} a felhasználó aktuális kvótáját jelenti
{{username}} a postafiók neve", + "queue_unban": "tiltás feloldása", + "r_active": "Aktív korlátozások", + "r_inactive": "Inaktív korlátozások", + "r_info": "A szürkével/letiltva jelölt elemek az aktív korlátozások listáján a mailcow számára nem érvényes korlátozások, és nem mozgathatók. Az ismeretlen korlátozások a megjelenési sorrendben lesznek beállítva.
Új elemeket adhat hozzá a inc/vars.local.inc.php fájlban, hogy váltani tudja őket.", + "rate_name": "Arányszám neve", + "recipients": "Címzettek", + "refresh": "Frissítés", + "regen_api_key": "API kulcs újragenerálása", + "regex_maps": "Regex térképek", + "relay_from": "\"Feladó:\" cím", + "relay_rcpt": "\"Címzett:\" cím", + "relay_run": "Teszt futtatása", + "relayhosts": "Feladófüggő szállítások", + "relayhosts_hint": "Határozzon meg feladófüggő szállításokat, hogy kiválaszthassa őket egy tartomány konfigurációs párbeszédpanelén.
\r\n A szállítási szolgáltatás mindig \"smtp:\" és ezért megpróbálja a TLS-t, ha felajánlják. A becsomagolt TLS (SMTPS) nem támogatott. A felhasználók egyéni kimenő TLS-szabályzati beállításai figyelembe vételre kerülnek.
\r\n Érintik a kiválasztott tartományokat, beleértve az alias tartományokat is.", + "remove": "Eltávolítás", + "remove_row": "Sor eltávolítása", + "reset_default": "Visszaállítás alapértelmezettre", + "reset_limit": "Hash eltávolítása", + "reset_password_vars": "{{link}} A generált jelszó-helyreállítási link
{{username}} A jelszó-helyreállítást kérő felhasználó postafiók neve
{{username2}} A helyreállítási postafiók neve
{{date}} A jelszó-helyreállítási kérelem dátuma
{{token_lifetime}} A token élettartama percekben
{{hostname}} A mailcow hosztnév", + "restore_template": "Hagyja üresen az alapértelmezett sablon visszaállításához.", + "routing": "Útválasztás", + "rsetting_add_rule": "Szabály hozzáadása", + "rsetting_content": "Szabály tartalma", + "rsetting_desc": "Rövid leírás", + "rsetting_no_selection": "Kérjük, válasszon egy szabályt", + "rsetting_none": "Nincsenek elérhető szabályok", + "rsettings_insert_preset": "Példa előre beállított \"%s\" beillesztése", + "rsettings_preset_1": "Minden letiltása, kivéve a DKIM és az arányszám-korlátot a hitelesített felhasználók számára", + "rsettings_preset_2": "A Postmasterek spamet akarnak", + "rsettings_preset_3": "Csak bizonyos feladókat engedélyezzen egy postafiók számára (pl. csak belső postafiókként használva)", + "rsettings_preset_4": "Rspamd letiltása egy tartomány számára", + "rspamd_com_settings": "A beállítás neve automatikusan generálódik, kérjük, nézze meg a lenti példa-előrebeállításokat. További részletekért lásd a Rspamd dokumentációját", + "rspamd_global_filters": "Globális szűrőtérképek", + "rspamd_global_filters_agree": "Óvatos leszek!", + "rspamd_global_filters_info": "A globális szűrőtérképek különböző típusú globális tiltó- és engedélyezési listákat tartalmaznak.", + "rspamd_global_filters_regex": "A nevük elmagyarázza a céljukat. Minden tartalomnak érvényes reguláris kifejezést kell tartalmaznia \"/pattern/options\" formátumban (pl. /.+@domain\\.tld/i).
\r\n Bár alapvető ellenőrzések történnek minden regex soron, az Rspamd funkcionalitása megszakadhat, ha nem sikerül helyesen értelmeznie a szintaxist.
\r\n Az Rspamd megpróbálja elolvasni a térkép tartalmát, amikor az megváltozik. Ha problémákat tapasztal, indítsa újra az Rspamd-et, hogy kikényszerítse a térkép újratöltését.
A tiltólistára került elemek ki vannak zárva a karanténból.", + "rspamd_settings_map": "Rspamd beállítási térkép", + "sal_level": "Moo szint", + "service": "Szolgáltatás", + "service_id": "Szolgáltatás azonosító", + "sys_mails": "Rendszer e-mailek", + "task": "Feladat", + "transport_maps": "Szállítási térképek", + "transport_test_rcpt_info": "• Használja a null@hosted.mailcow.de címet a külföldi célra történő továbbítás teszteléséhez.", + "transports_hint": "• Egy szállítási térkép bejegyzés felülírja a feladófüggő szállítási térképet
.
\r\n• Az MX-alapú szállítások előnyben részesítettek.
\r\n• A felhasználónkénti kimenő TLS-szabályzati beállítások figyelmen kívül hagyódnak, és csak a TLS-szabályzati térkép bejegyzései kényszeríthetik ki őket.
\r\n• A definiált szállításokhoz a szállítási szolgáltatás mindig \"smtp:\" és ezért megpróbálja a TLS-t, ha felajánlják. A becsomagolt TLS (SMTPS) nem támogatott.
\r\n• A \"/localhost$/\"-nek megfelelő címek mindig \"local:\"-on keresztül lesznek szállítva, ezért a \"*\" cél nem vonatkozik ezekre a címekre.
\r\n• A hitelesítő adatok meghatározásához egy példa következő ugráshoz \"[host]:25\", a Postfix mindig lekérdezi a \"host\"-ot, mielőtt a \"[host]:25\"-re keresne. Ez a viselkedés lehetetlenné teszi a \"host\" és a \"[host]:25\" egyidejű használatát.", + "ui_footer": "Lábléc (HTML engedélyezett)", + "ui_header_announcement": "Közlemények", + "ui_header_announcement_active": "Közlemény beállítása aktívra", + "ui_header_announcement_content": "Szöveg (HTML engedélyezett)", + "ui_header_announcement_help": "A közlemény minden bejelentkezett felhasználó számára látható, valamint a felhasználói felület bejelentkezési képernyőjén.", + "ui_header_announcement_select": "Válassza ki a közlemény típusát", + "ui_header_announcement_type": "Típus", + "ui_header_announcement_type_danger": "Nagyon fontos", + "ui_header_announcement_type_info": "Információ", + "ui_header_announcement_type_warning": "Fontos", + "ui_texts": "Felhasználói felület címkéi és szövegei", + "unban_pending": "tiltás feloldása függőben", + "unchanged_if_empty": "Ha nem változik, hagyja üresen", + "user_link": "Felhasználói-link", + "user_quicklink": "Gyorshivatkozás elrejtése a Felhasználói bejelentkezési oldalra", + "validate_license_now": "GUID érvényesítése a licenszszerverrel szemben", + "yes": "✓" }, "edit": { "active": "Aktív", "advanced_settings": "Haladó beállítások", "alias": "Alias szerkesztése", - "allow_from_smtp": "Kizárólag ezen IP-címek használhatnak SMTP-t", - "allow_from_smtp_info": "Leave empty to allow all senders.
IPv4/IPv6 addresses and networks.", + "allow_from_smtp": "Kizárólag ezen IP címek használhatnak SMTP-t", + "allow_from_smtp_info": "Hagyja üresen minden feladó engedélyezéséhez.
IPv4/IPv6 címek és hálózatok.", "allowed_protocols": "Engedélyezett protokollok", "app_name": "Applikáció neve", "app_passwd": "Applikáció jelszava", @@ -146,7 +312,127 @@ "description": "Leírás", "domain_quota": "Domain kvóta", "domains": "Domainek", - "edit_alias_domain": "Alias domain szerkesztése" + "edit_alias_domain": "Alias domain szerkesztése", + "acl": "ACL (Engedélyek)", + "admin": "Adminisztrátor szerkesztése", + "app_passwd_protocols": "Engedélyezett protokollok az alkalmazás jelszavához", + "automap": "Próbálja automatikusan feltérképezni a mappákat (\"Elküldött elemek\", \"Elküldött\" => \"Elküldött\" stb.)", + "bcc_dest_format": "A BCC-célpontnak egyetlen érvényes e-mail címnek kell lennie.
Ha több címre kell másolatot küldenie, hozzon létre egy aliast, és használja azt itt.", + "comment_info": "A privát megjegyzés nem látható a felhasználó számára, míg a nyilvános megjegyzés tooltip-ként jelenik meg, amikor a felhasználó áttekintésében a megjegyzésre mutat.", + "created_on": "Létrehozva", + "custom_attributes": "Egyéni attribútumok", + "delete1": "Törlés a forrásból, ha befejeződött", + "delete2": "Üzenetek törlése a célállomáson, amelyek nincsenek a forráson", + "delete2duplicates": "Duplikáltak törlése a célállomáson", + "delete_ays": "Erősítse meg a törlési folyamatot.", + "disable_login": "Bejelentkezés letiltása (a bejövő leveleket továbbra is elfogadja)", + "domain": "Domain szerkesztése", + "domain_admin": "Domain adminisztrátor szerkesztése", + "domain_footer": "Tartományszintű lábléc", + "domain_footer_html": "HTML lábléc", + "domain_footer_info": "A tartományszintű lábléceket a tartományon belüli címmel társított összes kimenő e-mailhez hozzáadják.
A következő változók használhatók a lábléchez:", + "domain_footer_info_vars": { + "auth_user": "{= auth_user =} - Hitelesített felhasználónév az MTA által megadott", + "from_user": "{= from_user =} - A boríték feladójának felhasználói része, pl. a \"moo@mailcow.tld\" esetén \"moo\"-t ad vissza", + "from_name": "{= from_name =} - A boríték feladójának neve, pl. a \"Mailcow <moo@mailcow.tld>\" esetén \"Mailcow\"-t ad vissza", + "from_addr": "{= from_addr =} - A boríték feladójának címe", + "from_domain": "{= from_domain =} - A boríték feladójának tartománya", + "custom": "{= foo =} - Ha a postafiók rendelkezik a \"foo\" egyéni attribútummal, amelynek értéke \"bar\", akkor \"bar\"-t ad vissza" + }, + "domain_footer_plain": "Egyszerű szöveges lábléc", + "domain_footer_skip_replies": "Lábléc figyelmen kívül hagyása válasz e-maileknél", + "dont_check_sender_acl": "Küldő ellenőrzés letiltása a(z) %s tartományhoz (+ alias tartományok)", + "encryption": "Titkosítás", + "exclude": "Objektumok kizárása (regex)", + "extended_sender_acl": "Külső feladói címek", + "extended_sender_acl_info": "Importálni kell egy DKIM tartomány kulcsot, ha elérhető.
\r\n Ne felejtse el hozzáadni ezt a szervert a megfelelő SPF TXT rekordhoz.
\r\n Amikor egy tartományt vagy alias tartományt ad hozzá ehhez a szerverhez, amely átfedésben van egy külső címmel, a külső cím eltávolításra kerül.
\r\n Használja a @domain.tld címet, hogy engedélyezze a küldést *@domain.tld néven.", + "force_pw_update": "Jelszófrissítés kényszerítése a következő bejelentkezéskor", + "force_pw_update_info": "Ez a felhasználó csak a(z) %s címre tud bejelentkezni. Az alkalmazás jelszavak használhatóak maradnak.", + "footer_exclude": "Kizárás a láblécből", + "full_name": "Teljes név", + "gal": "Globális címlista", + "gal_info": "A GAL tartalmazza a tartomány összes objektumát, és egyetlen felhasználó sem szerkesztheti. A Szabad/Foglalt információ a SOGo-ban hiányzik, ha le van tiltva! Indítsa újra a SOGo-t a változások alkalmazásához.", + "generate": "generál", + "grant_types": "Engedélyezési típusok", + "hostname": "Hosztnév", + "inactive": "Inaktív", + "kind": "Típus", + "last_modified": "Utoljára módosítva", + "lookup_mx": "A cél egy reguláris kifejezés, amely illeszkedik az MX névre (.*\\.google\\.com, hogy a google.com-ra végződő MX-en keresztül továbbítsa az összes levelet)", + "mailbox": "Postafiók szerkesztése", + "mailbox_quota_def": "Alapértelmezett postafiók kvóta", + "mailbox_relayhost_info": "A postafiókra és csak a közvetlen aliasokra vonatkozik, felülírja a tartományi továbbító hostot.", + "mailbox_rename": "Postafiók átnevezése", + "mailbox_rename_agree": "Készítettem biztonsági másolatot.", + "mailbox_rename_warning": "FONTOS! Hozzon létre biztonsági másolatot a postafiók átnevezése előtt.", + "mailbox_rename_alias": "Alias automatikus létrehozása", + "mailbox_rename_title": "Új helyi postafiók neve", + "max_aliases": "Max. aliasok", + "max_mailboxes": "Max. lehetséges postafiókok", + "max_quota": "Max. kvóta postafiókonként (MiB)", + "maxage": "Üzenetek maximális életkora napokban, amelyek lekérdezésre kerülnek a távolról
(0 = figyelmen kívül hagyás)", + "maxbytespersecond": "Max. bájt/másodperc
(0 = korlátlan)", + "mbox_rl_info": "Ez a sebességkorlátozás a SASL bejelentkezési névre vonatkozik, és illeszkedik minden, a bejelentkezett felhasználó által használt \"from\" címre. Egy postafiók sebességkorlátozása felülírja a tartományszintű sebességkorlátozást.", + "mins_interval": "Időköz (perc)", + "multiple_bookings": "Több foglalás", + "none_inherit": "Nincs / Örökölt", + "nexthop": "Következő ugrás", + "password": "Jelszó", + "password_recovery_email": "Jelszó-helyreállítási e-mail", + "password_repeat": "Megerősítő jelszó (ismétlés)", + "previous": "Előző oldal", + "private_comment": "Privát megjegyzés", + "public_comment": "Nyilvános megjegyzés", + "pushover": "Pushover", + "pushover_evaluate_x_prio": "Magas prioritású levelek továbbítása [X-Priority: 1]", + "pushover_info": "A push értesítési beállítások az összes tiszta (nem-spam) levélre vonatkoznak, amelyeket a %s címre kézbesítettek, beleértve az aliasokat is (megosztott, nem megosztott, címkézett).", + "pushover_only_x_prio": "Csak a magas prioritású leveleket vegye figyelembe [X-Priority: 1]", + "pushover_sender_array": "Csak a következő feladói e-mail címeket vegye figyelembe (vesszővel elválasztva)", + "pushover_sender_regex": "Feladók egyeztetése a következő regex-szel", + "pushover_text": "Értesítési szöveg", + "pushover_title": "Értesítési cím", + "pushover_sound": "Hang", + "pushover_vars": "Ha nincs feladói szűrő meghatározva, minden e-mail figyelembe vételre kerül.
A Regex szűrők, valamint a pontos feladói ellenőrzések egyénileg definiálhatók, és sorban lesznek figyelembe véve. Nem függenek egymástól.
Használható változók a szöveghez és a címhez (kérjük, vegye figyelembe az adatvédelmi szabályzatokat)", + "pushover_verify": "Hitelesítő adatok ellenőrzése", + "quota_mb": "Kvóta (MiB)", + "quota_warning_bcc": "Kvóta figyelmeztetés BCC", + "quota_warning_bcc_info": "A figyelmeztetések külön másolatként lesznek elküldve a következő címzetteknek. A tárgyat a megfelelő felhasználónévvel egészítik ki zárójelben, például: Quota warning (user@example.com).", + "ratelimit": "Arányszám-korlát", + "redirect_uri": "Átirányítási/Visszahívási URL", + "relay_all": "Az összes címzett továbbítása", + "relay_all_info": "↪ Ha úgy döntesz, hogy nem továbbítod az összes címzettet, akkor minden egyes címzett számára, akit továbbítani kell, létre kell hoznod egy (\"vak\") postafiókot.", + "relay_domain": "Továbbítsa ezt a tartományt", + "relay_transport_info": "
Információ
Definiálhatsz szállítási térképeket ehhez a tartományhoz egyedi célállomásra. Ha nincs beállítva, egy MX lekérdezés történik.", + "relay_unknown_only": "Csak a nem létező postafiókok továbbítása. A létező postafiókok helyben lesznek kézbesítve.", + "relayhost": "Feladófüggő szállítások", + "remove": "Eltávolítás", + "resource": "Erőforrás", + "save": "Módosítások mentése", + "scope": "Hatókör", + "sender_acl": "Engedélyezés küldésre mint", + "sender_acl_disabled": "A küldő ellenőrzése le van tiltva", + "sender_acl_info": "Ha az A postafiók felhasználója küldhet a B postafiók felhasználójaként, a feladói cím nem jelenik meg automatikusan választható \"from\" mezőként a SOGo-ban.
\r\n A B postafiók felhasználójának delegálást kell létrehoznia a SOGo-ban, hogy az A postafiók felhasználója kiválaszthassa a címét feladóként. A SOGo-ban egy postafiók delegálásához használja a menüt (három pont) a postafiók neve jobb oldalán a bal felső sarokban, a levélnézetben. Ez a viselkedés nem vonatkozik az alias címekre.", + "sieve_desc": "Rövid leírás", + "sieve_type": "Szűrő típusa", + "skipcrossduplicates": "Átugrani a duplikált üzeneteket a mappák között (aki előbb jön, előbb kapja)", + "sogo_access": "Közvetlen továbbítás a SOGo-ra", + "sogo_access_info": "A bejelentkezés után a felhasználó automatikusan átirányításra kerül a SOGo-ra.", + "sogo_visible": "Alias látható a SOGo-ban", + "sogo_visible_info": "Ez az opció csak azokra az objektumokra vonatkozik, amelyek megjeleníthetők a SOGo-ban (megosztott vagy nem megosztott alias címek, amelyek legalább egy helyi postafiókra mutatnak). Ha el van rejtve, egy alias nem jelenik meg választható feladóként a SOGo-ban.", + "spam_alias": "Időkorlátos alias címek létrehozása vagy módosítása", + "spam_filter": "Spam szűrő", + "spam_policy": "Elemek hozzáadása vagy eltávolítása a tiltó- vagy engedélyezési listán", + "spam_score": "Egyéni spam pontszám beállítása", + "subfolder2": "Szinkronizálás a célállomáson egy almappába
(üres = ne használjon almappát)", + "syncjob": "Szinkronizálási feladat szerkesztése", + "target_address": "Célcím(ek) (vesszővel elválasztva)", + "target_domain": "Cél domain", + "timeout1": "Időtúllépés a távoli állomáshoz való csatlakozáskor", + "timeout2": "Időtúllépés a helyi állomáshoz való csatlakozáskor", + "title": "Objektum szerkesztése", + "unchanged_if_empty": "Ha nem változik, hagyja üresen", + "username": "Felhasználónév", + "validate_save": "Érvényesítés és mentés" }, "footer": { "cancel": "Mégse", @@ -159,7 +445,9 @@ "restart_container": "Konténer újraindítása", "restart_container_info": "Fontos: A teljes újraindulás eltarthat egy ideig, kérjük várjon, amíg befejeződik!", "restart_now": "Újraindítás most", - "restarting_container": "Konténer újraindítása. Ez eltarthat egy darabig." + "restarting_container": "Konténer újraindítása. Ez eltarthat egy darabig.", + "hibp_check": "Ellenőrzés a haveibeenpwned.com-on", + "nothing_selected": "Nincs semmi kiválasztva" }, "header": { "administration": "Beállítások és részletek", @@ -170,7 +458,8 @@ "quarantine": "Karantén", "restart_netfilter": "Netfilter újraindítása", "restart_sogo": "SOGo újraindítása", - "user_settings": "Felhasználó beállításai" + "user_settings": "Felhasználó beállításai", + "mailcow_system": "Rendszer" }, "info": { "awaiting_tfa_confirmation": "TFA megerősítésre várakozás", @@ -182,7 +471,23 @@ "login": "Bejelentkezés", "mobileconfig_info": "A kért Apple kapcsolat profil letöltéséhez jelentkezzen be, mint postafiók-felhasználó.", "password": "Jelszó", - "username": "Felhasználónév" + "username": "Felhasználónév", + "back_to_mailcow": "Vissza a mailcow-hoz", + "fido2_webauthn": "FIDO2/WebAuthn bejelentkezés", + "forgot_password": "> Elfelejtett jelszó?", + "invalid_pass_reset_token": "A jelszó-helyreállítási token érvénytelen vagy lejárt.
Kérjen új jelszó-helyreállítási linket.", + "login_linkstext": "Nem a megfelelő bejelentkezés?", + "login_usertext": "Bejelentkezés felhasználóként", + "login_domainadmintext": "Bejelentkezés domain adminisztrátorként", + "login_admintext": "Bejelentkezés adminisztrátorként", + "login_user": "Felhasználói bejelentkezés", + "login_dadmin": "Domain-adminisztrátori bejelentkezés", + "login_admin": "Adminisztrátori bejelentkezés", + "new_password": "Új jelszó", + "new_password_confirm": "Új jelszó megerősítése", + "other_logins": "vagy bejelentkezés", + "reset_password": "Jelszó visszaállítása", + "request_reset_password": "Jelszó módosítás kérése" }, "mailbox": { "action": "Művelet", @@ -200,10 +505,10 @@ "add_resource": "Erőforrás hozzáadása", "add_tls_policy_map": "TLS irányelv-térkép hozzáadása", "address_rewriting": "Címátírás", - "alias": "Alias", + "alias": "Álnév", "alias_domain_backupmx": "Alias domain inaktív a továbbító domain részére", - "aliases": "Alias-ok", - "allow_from_smtp": "Kizárólag ezek az IP-címek használhatják az SMTP-t", + "aliases": "Álnevek", + "allow_from_smtp": "Kizárólag ezek az IP címek használhatják az SMTP-t", "allow_from_smtp_info": "Hagyja üresen minden feladó engedélyezéséhez.
IPv4/IPv6 címek és hálózatok.", "allowed_protocols": "Engedélyezett protokollok", "backup_mx": "Továbbító domain", @@ -221,7 +526,7 @@ "domain_admins": "Domain adminisztrátorok", "domain_aliases": "Domain alias-ok", "domain_quota": "Kvóta", - "domains": "Domain-ek", + "domains": "Domainek", "edit": "Szerkesztés", "empty": "Nincs találat", "enable_x": "Engedélyezés", @@ -277,7 +582,88 @@ "toggle_all": "Összes átváltása", "username": "Felhasználónév", "waiting": "Várakozás", - "weekly": "Hetente" + "weekly": "Hetente", + "add_alias_expand": "Alias kiterjesztése alias tartományokra", + "alias_domain_alias_hint": "Az aliasok nem vonatkoznak automatikusan a domain aliasokra. Egy my-alias@domain alias cím nem fedezi a my-alias@alias-domain címet (ahol az \"alias-domain\" a \"domain\" képzeletbeli alias tartománya).
Kérjük, használjon sieve szűrőt a levél külső postafiókba történő átirányításához (lásd a \"Szűrők\" fület vagy a SOGo -> Továbbító). Használja az \"Alias kiterjesztése alias tartományokra\" opciót a hiányzó aliasok automatikus hozzáadásához.", + "all_domains": "Minden tartomány", + "bcc_info": "A BCC térképek arra szolgálnak, hogy csendesen továbbítsák az összes üzenet másolatát egy másik címre. A címzett térkép típust akkor használják, ha a helyi célpont egy levél címzettjeként működik. A feladói térképek ugyanazon elv szerint működnek.
\r\n A helyi célpontot nem értesítik a sikertelen kézbesítésről.", + "bcc_map_type": "BCC típus", + "bcc_maps": "BCC térképek", + "bcc_rcpt_map": "Címzett térkép", + "bcc_sender_map": "Feladó térkép", + "bcc_to_rcpt": "Váltás címzett térkép típusra", + "bcc_to_sender": "Váltás feladó térkép típusra", + "bcc_type": "BCC típus", + "booking_null": "Mindig szabadként mutat", + "booking_0_short": "Mindig szabad", + "booking_custom": "Kemény korlát a foglalások egyéni számára", + "booking_custom_short": "Kemény korlát", + "booking_ltnull": "Korlátlan, de foglaltnak mutatja magát, ha le van foglalva", + "booking_lt0_short": "Lágy korlát", + "catch_all": "Catch-All", + "created_on": "Létrehozva", + "dkim_domains_selector": "Válogató", + "dkim_key_length": "DKIM kulcs hossza (bit)", + "domain_templates": "Domain sablonok", + "domain_quota_total": "Teljes domain kvóta", + "gal": "Globális címlista", + "goto_ham": "Tanulás ham-ként", + "goto_spam": "Tanulás spam-ként", + "iam": "Azonosítási szolgáltató", + "last_modified": "Utoljára módosítva", + "last_pw_change": "Utolsó jelszócsere", + "mailbox_defaults": "Alapértelmezett beállítások", + "mailbox_defaults_info": "Alapértelmezett beállítások meghatározása az új postafiókokhoz.", + "mailbox_templates": "Postafiók sablonok", + "max_aliases": "Max. aliasok", + "max_mailboxes": "Max. lehetséges postafiókok", + "max_quota": "Max. kvóta postafiókonként", + "no": "✕", + "open_logs": "Naplók megnyitása", + "q_add_header": "amikor a levélszemét mappába kerül", + "q_all": " amikor a levélszemét mappába kerül és elutasításkor", + "q_reject": "elutasításkor", + "quarantine_category": "Karantén értesítési kategória", + "recipient": "Címzett", + "recipient_map_info": "A címzett térképeket arra használják, hogy egy üzenet célcímét kicseréljék, mielőtt azt kézbesítenék.", + "recipient_map_new_info": "A címzett térkép célja érvényes e-mail címnek vagy tartománynévnek kell lennie.", + "recipient_map_old_info": "Egy címzett térkép eredeti céljának érvényes e-mail címnek vagy tartománynévnek kell lennie.", + "relay_all": "Az összes címzett továbbítása", + "relay_unknown": "Ismeretlen postafiókok továbbítása", + "sender": "Feladó", + "set_postfilter": "Megjelölés poszt-szűrőként", + "set_prefilter": "Megjelölés pre-szűrőként", + "sieve_info": "Több szűrőt is tárolhatsz felhasználónként, de egyszerre csak egy pre-szűrő és egy poszt-szűrő lehet aktív.
\r\nMinden szűrő a leírt sorrendben lesz feldolgozva. Sem a sikertelen szkript, sem a kiadott \"keep;\" parancs nem állítja le a további szkriptek feldolgozását. A globális sieve szkriptek változásai a Dovecot újraindítását váltják ki.

Globális sieve pre-szűrő • Pre-szűrő • Felhasználói szkriptek • Poszt-szűrő • Globális sieve poszt-szűrő", + "sieve_preset_1": "Levél eldobása valószínűleg veszélyes fájltípusokkal", + "sieve_preset_2": "Egy adott feladó e-mailjét mindig olvasottként jelölje meg", + "sieve_preset_3": "Csendesen elvetni, leállítani minden további sieve feldolgozást", + "sieve_preset_4": "Fájl az INBOX-ba, kihagyni a további feldolgozást a sieve szűrőkkel", + "sieve_preset_5": "Auto válaszadó (szabadság)", + "sieve_preset_6": "Levél elutasítása válasszal", + "sieve_preset_7": "Átirányítás és megtartás/eldobás", + "sieve_preset_8": "E-mail átirányítása egy adott feladótól, olvasottként jelölés és almappába rendezés", + "sieve_preset_header": "Kérjük, nézze meg az alábbi példa-előrebeállításokat. További részletekért lásd a Wikipedia-t.", + "sogo_visible": "Alias látható a SOGo-ban", + "sogo_visible_n": "Alias elrejtése a SOGo-ban", + "sogo_visible_y": "Alias megjelenítése a SOGo-ban", + "sender": "Feladó", + "syncjob_check_log": "Napló ellenőrzése", + "syncjob_last_run_result": "Utolsó futás eredménye", + "syncjob_EX_OK": "Siker", + "syncjob_EXIT_CONNECTION_FAILURE": "Kapcsolati probléma", + "syncjob_EXIT_TLS_FAILURE": "Probléma a titkosított kapcsolattal", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Hitelesítési probléma", + "syncjob_EXIT_OVERQUOTA": "A cél postafiók túllépte a kvótát", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Nem lehet csatlakozni a távoli szerverhez", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Hibás felhasználónév vagy jelszó", + "templates": "Sablonok", + "template": "Sablon", + "tls_map_policy": "Irányelv", + "tls_policy_maps": "TLS irányelv térképek", + "tls_policy_maps_enforced_tls": "Ezek az irányelvek felülírják a kimenő TLS szállítási szabályokat függetlenül a felhasználó TLS irányelvi beállításaitól. Ha nincs alább egyetlen irányelv sem, ezek a felhasználók az alapértelmezett értékeket alkalmazzák, amelyeket a smtp_tls_mandatory_protocols és a smtp_tls_mandatory_ciphers határoz meg.", + "tls_policy_maps_info": "Ez az irányelv térkép felülírja a kimenő TLS szállítási szabályokat függetlenül a felhasználó TLS irányelvi beállításaitól.
\r\n Kérjük, ellenőrizze a \"smtp_tls_policy_maps\" dokumentációját további információkért.", + "tls_policy_maps_long": "Kimenő TLS irányelv térkép felülírások", + "yes": "✓" }, "oauth2": { "access_denied": "Kérjük jelentkezzen be postafiók felhasználójával az OAuth2 használatához.", @@ -301,7 +687,7 @@ "medium_danger": "Közepes veszély", "neutral_danger": "Semleges", "notified": "Értesítve", - "qinfo": "A karantén-rendszer elmenti a visszautasított leveleket az adatbázisba, miközben a feladónak nem lesz az a benyomása, hogy a levelet kézbesítették.\r\n
\"Spamnek jelölés és törlés\" spam-ként jegyzi meg az üzenetet a Bayes-tétel segítségével, illetve fuzzy hash-eket számít, hogy hasonló üzenetek is spam-be kerüljenek a jövőben.\r\n
Több üzenet spamként való megjegyzése időigényes lehet.
Feketelistára vett levelek nem kerülnek karanténba.", + "qinfo": "A karantén-rendszer elmenti a visszautasított leveleket az adatbázisba, miközben a feladónak nem lesz az a benyomása, hogy a levelet kézbesítették.\r\n
\"Spamnek jelölés és törlés\" spam-ként jegyzi meg az üzenetet a Bayes-tétel segítségével, illetve fuzzy hash-eket számít, hogy hasonló üzenetek is spam-be kerüljenek a jövőben.\r\n
Több üzenet spamként való megjegyzése időigényes lehet.
Tiltólistára vett levelek nem kerülnek karanténba.", "qitem": "Tétel", "quarantine": "Karantén", "quick_actions": "Műveletek", @@ -324,10 +710,38 @@ "table_size_show_n": "%s tétel mutatása", "text_from_html_content": "Tartalom (konvertált html)", "text_plain_content": "Tartalom (sima szöveg)", - "toggle_all": "Összes átkapcsolása" + "toggle_all": "Összes átkapcsolása", + "check_hash": "Fájl hash keresése @ VT", + "confirm": "Megerősítés", + "deliver_inbox": "Kézbesítés a beérkező mappába", + "disabled_by_config": "A jelenlegi rendszerkonfiguráció letiltja a karantén funkcionalitást. Kérjük, állítsa be a \"megőrzéseket postafiókonként\" és a \"maximális méretet\" a karantén elemek számára.", + "info": "Információ", + "junk_folder": "Levélszemét mappa", + "qhandler_success": "A kérés sikeresen elküldve a rendszernek. Most már bezárhatja az ablakot.", + "qid": "Rspamd QID", + "rejected": "Elutasítva", + "release_body": "A levelét eml fájlként csatoltuk ehhez az üzenethez.", + "rewrite_subject": "Tárgy átírása", + "settings_info": "A karanténba helyezhető elemek maximális száma: %s
Maximális e-mail méret: %s MiB", + "spam": "Spam", + "quick_info_link": "Információs link megnyitása", + "type": "Típus" }, "queue": { - "queue_manager": "Queue Manager" + "queue_manager": "Queue Manager", + "delete": "Összes törlése", + "flush": "Üzenetsor ürítése", + "info": "A levelezési üzenetsor tartalmazza az összes kézbesítésre váró e-mailt. Ha egy e-mail hosszú ideig ragad az üzenetsorban, a rendszer automatikusan törli.
A megfelelő levél hibaüzenete tájékoztatást ad arról, miért nem lehetett a levelet kézbesíteni.", + "legend": "A levelezési üzenetsor műveleti funkciói:", + "ays": "Kérjük, erősítse meg, hogy törölni szeretné az összes elemet az aktuális üzenetsorból.", + "deliver_mail": "Kézbesítés", + "deliver_mail_legend": "Megpróbálja újra kézbesíteni a kiválasztott leveleket.", + "hold_mail": "Visszatartás", + "hold_mail_legend": "Visszatartja a kiválasztott leveleket. (Megakadályozza a további kézbesítési kísérleteket)", + "show_message": "Üzenet megjelenítése", + "unban": "üzenetsor tiltás feloldása", + "unhold_mail": "Visszatartás feloldása", + "unhold_mail_legend": "Kiadja a kiválasztott leveleket a kézbesítéshez. (Előzetes visszatartás szükséges)" }, "start": { "help": "Súgó panel megjelenítése/elrejtése", @@ -380,7 +794,49 @@ "resource_modified": "Postafiók %s módosításai mentve", "resource_removed": "Erőforrás %s eltávolítva", "saved_settings": "Beállítások mentve", - "upload_success": "File sikeresen feltöltve" + "upload_success": "File sikeresen feltöltve", + "acl_saved": "Az ACL a(z) %s objektumhoz mentve", + "bcc_deleted": "BCC térkép bejegyzések törölve: %s", + "bcc_edited": "BCC térkép bejegyzés %s szerkesztve", + "bcc_saved": "BCC térkép bejegyzés mentve", + "cors_headers_edited": "A CORS beállítások mentve", + "custom_login_modified": "A bejelentkezési testreszabás sikeresen mentve", + "domain_add_dkim_available": "Egy DKIM kulcs már létezett", + "dkim_duplicated": "A DKIM kulcs a(z) %s tartományhoz sikeresen átmásolva a(z) %s tartományba", + "domain_footer_modified": "A(z) %s tartományi lábléc módosításai mentve", + "f2b_banlist_refreshed": "A tiltólista azonosítója sikeresen frissítve.", + "f2b_modified": "A Fail2ban paraméterek módosításai mentve", + "forwarding_host_added": "A továbbító állomás %s hozzáadva", + "forwarding_host_removed": "A továbbító állomás %s eltávolítva", + "iam_test_connection": "Kapcsolat sikeres", + "ip_check_opt_in_modified": "Az IP ellenőrzés sikeresen mentve", + "nginx_reloaded": "Az Nginx újra lett töltve", + "password_policy_saved": "A jelszó házirend sikeresen mentve", + "password_changed_success": "A jelszó sikeresen megváltoztatva", + "pushover_settings_edited": "A Pushover beállítások sikeresen elmentve, kérjük, ellenőrizze a hitelesítő adatokat.", + "queue_command_success": "A sor parancs sikeresen befejeződött", + "recipient_map_entry_deleted": "A címzett térkép ID %s törölve", + "recipient_map_entry_saved": "A címzett térkép bejegyzés \"%s\" mentve", + "recovery_email_sent": "Helyreállítási e-mail elküldve a(z) %s címre", + "relayhost_added": "A térkép bejegyzés %s hozzáadva", + "relayhost_removed": "A térkép bejegyzés %s eltávolítva", + "reset_main_logo": "Visszaállítás alapértelmezett logóra", + "rl_saved": "Arányszám-korlát a(z) %s objektumhoz mentve", + "rspamd_ui_pw_set": "Rspamd UI jelszó sikeresen beállítva", + "settings_map_added": "Hozzáadott beállítási térkép bejegyzés", + "settings_map_removed": "Eltávolított beállítási térkép ID %s", + "sogo_profile_reset": "A SOGo profil a(z) %s felhasználóhoz visszaállítva", + "template_added": "Hozzáadott sablon %s", + "template_modified": "A(z) %s sablon módosításai mentve", + "template_removed": "A sablon ID %s törölve", + "tls_policy_map_entry_deleted": "TLS irányelv térkép ID %s törölve", + "tls_policy_map_entry_saved": "TLS irányelv térkép bejegyzés \"%s\" mentve", + "ui_texts": "A felhasználói felület szövegeinek módosításai mentve", + "verified_fido2_login": "FIDO2 bejelentkezés ellenőrizve", + "verified_totp_login": "TOTP bejelentkezés ellenőrizve", + "verified_webauthn_login": "WebAuthn bejelentkezés ellenőrizve", + "verified_yotp_login": "Yubico OTP bejelentkezés ellenőrizve", + "mailbox_renamed": "A postafiók átnevezve %s-ről %s-re" }, "user": { "action": "Művelet", @@ -449,15 +905,14 @@ "spam_score_reset": "Szerver szerinti alapértelmezésre visszaállítás", "spamfilter": "Spam szűrő", "spamfilter_behavior": "Osztályozás", - "spamfilter_bl": "Feketelista", - "spamfilter_bl_desc": "A feketelistán szereplő email címek mindig spam-ként lesznek kezelve és vissza lesznek utasítva. Joker karakter használható. A szűrő csak közvetlen aliasokra vonatkozik (alias egyetlen cél-postafiókkal), magára a postafiókra, illetve mindent elkapó aliasokra nem.", + "spamfilter_bl": "Tiltólista", + "spamfilter_bl_desc": "A tiltólistán szereplő email címek mindig spam-ként lesznek kezelve és vissza lesznek utasítva. Joker karakter használható. A szűrő csak közvetlen aliasokra vonatkozik (alias egyetlen cél-postafiókkal), magára a postafiókra, illetve mindent elkapó aliasokra nem.", "spamfilter_default_score": "Alapértelmezett értékek", "spamfilter_green": "Zöld: ez az üzenet nem spam", "spamfilter_hint": "Az első érték az alacsony spam pontszámot, a második a magas spam pontszámot jelöli.", "spamfilter_red": "Vörös: Ez az üzenet spam, a szerver el fogja vetni.", "spamfilter_table_action": "Művelet", "spamfilter_table_add": "Tétel hozzáadása", - "spamfilter_table_empty": "Nincs megjeleníthető adat", "spamfilter_table_remove": "eltávolítás", "spamfilter_table_rule": "Szabály", "spamfilter_wl": "Engedélyezőlista", @@ -482,15 +937,90 @@ "waiting": "Várakozás", "week": "hét", "weekly": "heti", - "weeks": "hét" + "weeks": "hét", + "aliases_also_send_as": "Küldhet még mint felhasználó", + "aliases_send_as_all": "Ne ellenőrizze a küldő hozzáférését a következő tartomány(ok) és annak alias tartományai számára", + "app_hint": "Az alkalmazás jelszavak alternatív jelszavak az IMAP, SMTP, CalDAV, CardDAV és EAS bejelentkezéshez. A felhasználónév változatlan marad. A SOGo webmail nem érhető el az alkalmazás jelszavakon keresztül.", + "allowed_protocols": "Engedélyezett protokollok", + "apple_connection_profile_complete": "Ez a kapcsolati profil tartalmazza az IMAP és SMTP paramétereket, valamint a CalDAV (naptárak) és CardDAV (névjegyek) útvonalakat egy Apple eszközhöz.", + "apple_connection_profile_mailonly": "Ez a kapcsolati profil csak IMAP és SMTP konfigurációs paramétereket tartalmaz egy Apple eszközhöz.", + "apple_connection_profile_with_app_password": "Új alkalmazás jelszó generálódik és hozzáadódik a profilhoz, így nem kell jelszót megadni az eszköz beállításakor. Kérjük, ne ossza meg a fájlt, mivel teljes hozzáférést biztosít a postafiókjához.", + "attribute": "Attribútum", + "authentication": "Hitelesítés", + "change_password_hint_app_passwords": "Fiókodnak %d alkalmazás jelszava van, amelyek nem lesznek megváltoztatva. Ezek kezeléséhez menj az Alkalmazás jelszavak fülre.", + "clear_recent_successful_connections": "Sikeres kapcsolatok törlése", + "created_on": "Létrehozva", + "direct_aliases_desc": "A közvetlen alias címeket érintik a spam szűrő és a TLS irányelv beállításai.", + "direct_protocol_access": "Ennek a postafiók felhasználónak közvetlen, külső hozzáférése van a következő protokollokhoz és alkalmazásokhoz. Ezt a beállítást az adminisztrátor vezérli. Az alkalmazás jelszavak létrehozhatók, hogy hozzáférést biztosítsanak az egyedi protokollokhoz és alkalmazásokhoz.
A \"Webmail\" gomb egységes bejelentkezést biztosít a SOGo-ra, és mindig elérhető.", + "eas_reset_help": "Sok esetben a eszköz gyorsítótárának visszaállítása segít egy sérült ActiveSync profil helyreállításában.
Figyelem: Minden elem újra letöltődik!", + "empty": "Nincs eredmény", + "from": "feladó", + "is_catch_all": "Catch-all a tartomány(ok)hoz", + "last_pw_change": "Utolsó jelszócsere", + "last_ui_login": "Utolsó UI bejelentkezés", + "login_history": "Bejelentkezési előzmények", + "mailbox": "Postafiók", + "mailbox_general": "Általános", + "mailbox_settings": "Beállítások", + "month": "hónap", + "months": "hónap", + "open_logs": "Naplók megnyitása", + "open_webmail_sso": "Webmail", + "overview": "Áttekintés", + "password_reset_info": "Ha nincs megadva e-mail a jelszó-helyreállításhoz, ez a funkció nem használható.", + "protocols": "Protokollok", + "pushover_evaluate_x_prio": "Magas prioritású levelek továbbítása [X-Priority: 1]", + "pushover_info": "A push értesítési beállítások az összes tiszta (nem-spam) levélre vonatkoznak, amelyeket a %s címre kézbesítettek, beleértve az aliasokat is (megosztott, nem megosztott, címkézett).", + "pushover_only_x_prio": "Csak a magas prioritású leveleket vegye figyelembe [X-Priority: 1]", + "pushover_sender_array": "A következő feladói e-mail címek figyelembe vétele (vesszővel elválasztva)", + "pushover_sender_regex": "Feladók egyeztetése a következő regex-szel", + "pushover_text": "Értesítési szöveg", + "pushover_title": "Értesítési cím", + "pushover_sound": "Hang", + "pushover_vars": "Ha nincs feladói szűrő meghatározva, minden e-mail figyelembe vételre kerül.
A Regex szűrők, valamint a pontos feladói ellenőrzések egyénileg definiálhatók, és sorban lesznek figyelembe véve. Nem függenek egymástól.
Használható változók a szöveghez és a címhez (kérjük, vegye figyelembe az adatvédelmi szabályzatokat)", + "pushover_verify": "Hitelesítő adatok ellenőrzése", + "pw_recovery_email": "Jelszó-helyreállítási e-mail", + "q_add_header": "Levélszemét mappa", + "q_all": "Összes kategória", + "q_reject": "Elutasítva", + "quarantine_category": "Karantén értesítési kategória", + "quarantine_category_info": "Az \"Elutasítva\" értesítési kategória magában foglalja azokat a leveleket, amelyeket elutasítottak, míg a \"Levélszemét mappa\" értesíti a felhasználót a levélszemét mappába helyezett levelekről.", + "recent_successful_connections": "Látott sikeres kapcsolatok", + "shared_aliases_desc": "A megosztott aliasokat nem érintik a felhasználóspecifikus beállítások, mint a spam szűrő vagy a titkosítási szabályzat. A megfelelő spam szűrőket csak egy adminisztrátor hozhatja létre tartományszintű szabályzatként.", + "sogo_profile_reset": "SOGo profil visszaállítása", + "sogo_profile_reset_help": "Ez tönkreteszi a felhasználó SOGo profilját, és visszavonhatatlanul törli az összes névjegy- és naptáradatot.", + "sogo_profile_reset_now": "Profil visszaállítása most", + "spamfilter_table_domain_policy": "n/a (tartományi szabályzat)", + "syncjob_check_log": "Napló ellenőrzése", + "syncjob_last_run_result": "Utolsó futás eredménye", + "syncjob_EX_OK": "Siker", + "syncjob_EXIT_CONNECTION_FAILURE": "Kapcsolati probléma", + "syncjob_EXIT_TLS_FAILURE": "Probléma a titkosított kapcsolattal", + "syncjob_EXIT_AUTHENTICATION_FAILURE": "Hitelesítési probléma", + "syncjob_EXIT_OVERQUOTA": "A cél postafiók túllépte a kvótát", + "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Nem lehet csatlakozni a távoli szerverhez", + "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Hibás felhasználónév vagy jelszó", + "text": "Szöveg", + "tfa_info": "A kétlépcsős hitelesítés segít megvédeni a fiókodat. Ha engedélyezed, alkalmazás jelszavakra lesz szükséged, hogy bejelentkezz olyan alkalmazásokba vagy szolgáltatásokba, amelyek nem támogatják a kétlépcsős hitelesítést (pl. levelező kliensek).", + "tls_policy_warning": "Figyelem: Ha titkosított levélátvitelt kényszerítesz ki, elveszíthetsz e-maileket.
Azok az üzenetek, amelyek nem felelnek meg a szabályzatnak, kemény hibával visszapattannak a levelezőrendszerből.
Ez az opció a fő e-mail címedre (bejelentkezési név), az alias tartományokból származó összes címre, valamint az alias címekre vonatkozik, amelyeknek csak ez az egy postafiók a célja.", + "value": "Érték", + "with_app_password": "alkalmazás jelszóval", + "year": "év", + "years": "év" }, "warning": { "cannot_delete_self": "Bejelentkezett felhasználó nem törölhető.", - "ip_invalid": "Érvénytelen IP-cím átugorva: %s", + "ip_invalid": "Érvénytelen IP cím átugorva: %s", "no_active_admin": "Utolsó aktív admin felhasználó nem deaktiválható.", "quota_exceeded_scope": "Domain kvóta átlépve: csak korlátok nélküli postafiókok hozhatók létre ebben a domain-ben.", - "session_token": "Űrlap-token érvénytelen: Tokenek nem egyeznek", - "session_ua": "Űrlap-token érvénytelen: User-Agent hitelesítési probléma" + "session_token": "Űrlaptoken érvénytelen: Tokenek nem egyeznek", + "session_ua": "Űrlaptoken érvénytelen: User-Agent hitelesítési probléma", + "domain_added_sogo_failed": "A tartomány hozzáadva, de a SOGo újraindítása sikertelen, kérjük, ellenőrizze a szerver naplókat.", + "dovecot_restart_failed": "A Dovecot újraindítása sikertelen, kérjük, ellenőrizze a naplókat", + "fuzzy_learn_error": "Fuzzy hash tanulási hiba: %s", + "hash_not_found": "A hash nem található vagy már törölve lett", + "is_not_primary_alias": "Nem elsődleges alias %s kihagyva", + "mailbox_renamed_alias": "A postafiók át lett nevezve, de az alias nem lett automatikusan létrehozva. Kérjük, hozza létre kézzel: %s" }, "acl": { "delimiter_action": "Elhatárolás", @@ -516,15 +1046,24 @@ "smtp_ip_access": "Az SMTP engedélyezett állomásainak módosítása", "sogo_profile_reset": "SOGo profil visszaállítása", "spam_alias": "Ideiglenes álnevek", - "spam_policy": "Fekete/Fehér lista", + "spam_policy": "Tiltó/engedélyezési lista", "spam_score": "Spam pontszám", "syncjobs": "Szinkronizálási feladatok", "tls_policy": "TLS szabályzat", "unlimited_quota": "Korlátlan kvóta a postafiókok számára", - "sogo_access": "A SOGo-hozzáférés kezelésének lehetővé tétele" + "sogo_access": "A SOGo-hozzáférés kezelésének lehetővé tétele", + "pw_reset": "Lehetővé teszi a mailcow felhasználói jelszavak visszaállítását" }, "diagnostics": { - "dns_records": "DNS bejegyzések" + "dns_records": "DNS bejegyzések", + "cname_from_a": "Az A/AAAA rekordból származó érték. Ez addig támogatott, amíg a rekord a megfelelő erőforrásra mutat.", + "dns_records_24hours": "Kérjük, vegye figyelembe, hogy a DNS-ben végrehajtott változtatások akár 24 órát is igénybe vehetnek, amíg a jelenlegi állapotuk helyesen megjelenik ezen az oldalon. Ez a célja, hogy könnyen láthassa, hogyan kell konfigurálnia a DNS rekordokat, és ellenőrizze, hogy az összes rekordja helyesen van-e tárolva a DNS-ben.", + "dns_records_data": "Helyes adatok", + "dns_records_docs": "Kérjük, konzultáljon a dokumentációval is.", + "dns_records_name": "Név", + "dns_records_status": "Jelenlegi állapot", + "dns_records_type": "Típus", + "optional": "Ez a rekord opcionális." }, "add": { "username": "Felhasználónév", @@ -588,6 +1127,15 @@ "alias_domain": "Alias domain", "alias_domain_info": "Csak érvényes tartománynevek (vesszővel elválasztva).", "app_name": "Alkalmazás neve", - "app_passwd_protocols": "Engedélyezett protokollok az alkalmazás jelszavához" + "app_passwd_protocols": "Engedélyezett protokollok az alkalmazás jelszavához", + "automap": "Próbálja automatikusan feltérképezni a mappákat (\"Elküldött elemek\", \"Elküldött\" => \"Elküldött\" stb.)", + "multiple_bookings": "Több foglalás", + "quota_mb": "Kvóta (MiB)", + "relay_all": "Az összes címzett továbbítása", + "relay_all_info": "↪ Ha úgy döntesz, hogy nem továbbítod az összes címzettet, akkor minden egyes címzett számára, akit továbbítani kell, létre kell hoznod egy (\"vak\") postafiókot.", + "relay_domain": "Továbbítsa ezt a tartományt", + "relay_transport_info": "
Információ
Definiálhatsz szállítási térképeket ehhez a tartományhoz egyedi célállomásra. Ha nincs beállítva, egy MX lekérdezés történik.", + "relay_unknown_only": "Csak a nem létező postafiókok továbbítása. A létező postafiókok helyben lesznek kézbesítve.", + "relayhost_wrapped_tls_info": "Kérjük, ne használjon TLS-be csomagolt portokat (többnyire a 465-ös porton használatosak).
\r\nHasználjon bármilyen nem csomagolt portot és adjon ki STARTTLS-t. A TLS kikényszerítésére egy TLS irányelv hozható létre a \"TLS irányelv térképek\" alatt." } } From 0997548d7f3e7aa004cbae3b1062332f53163c90 Mon Sep 17 00:00:00 2001 From: milkmaker Date: Fri, 29 Aug 2025 22:38:06 +0200 Subject: [PATCH 059/180] Translations update from Weblate (#6699) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Web] Updated lang.de-de.json Co-authored-by: Peter * [Web] Updated lang.en-gb.json Co-authored-by: Peter * [Web] Updated lang.hu-hu.json [Web] Language file updated by 'Cleanup translation files' addon Co-authored-by: Peter Co-authored-by: milkmaker * [Web] Updated lang.si-si.json Co-authored-by: Matjaž Tekavec --------- Co-authored-by: Peter Co-authored-by: Matjaž Tekavec --- data/web/lang/lang.de-de.json | 3 ++- data/web/lang/lang.en-gb.json | 2 +- data/web/lang/lang.hu-hu.json | 20 ++++++++++++-------- data/web/lang/lang.si-si.json | 22 +++++++++++++++++++--- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index 55fc11ab4..93b908d6c 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -408,7 +408,8 @@ "allowed_origins": "Access-Control-Allow-Origin", "logo_dark_label": "Invertiert für den Darkmode", "logo_normal_label": "Normal", - "user_link": "Nutzer-Link" + "user_link": "Nutzer-Link", + "filter": "Filter" }, "danger": { "access_denied": "Zugriff verweigert oder unvollständige/ungültige Daten", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 4ee5675be..0af0e59b0 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -711,7 +711,7 @@ "mta_sts": "MTA-STS", "mta_sts_info": "MTA-STS is a standard that enforces email delivery between mail servers to use TLS with valid certificates.
It is used when DANE is not possible due to missing or unsupported DNSSEC.
Note: If the receiving domain supports DANE with DNSSEC, DANE is always preferred – MTA-STS only acts as a fallback.", "mta_sts_version": "Version", - "mta_sts_version_info": "Defines the version of the MTA-STS standard – currently only STSv1 is valid." , + "mta_sts_version_info": "Defines the version of the MTA-STS standard – currently only STSv1 is valid.", "mta_sts_mode": "Mode", "mta_sts_mode_info": "There are three modes to choose from:
  • testing – policy is only monitored, violations have no impact.
  • enforce – policy is strictly enforced, connections without valid TLS are rejected.
  • none – policy is published but not applied.
", "mta_sts_max_age": "Max age", diff --git a/data/web/lang/lang.hu-hu.json b/data/web/lang/lang.hu-hu.json index 6ec3ed68a..2f78d5b21 100644 --- a/data/web/lang/lang.hu-hu.json +++ b/data/web/lang/lang.hu-hu.json @@ -9,7 +9,7 @@ "source": "Forrás", "spamfilter": "Spam szűrő", "subject": "Tárgy", - "sys_mails": "Rendszerüzenetek", + "sys_mails": "Rendszer e-mailek", "text": "Szöveg", "time": "Idő", "title": "Cím", @@ -274,7 +274,6 @@ "sal_level": "Moo szint", "service": "Szolgáltatás", "service_id": "Szolgáltatás azonosító", - "sys_mails": "Rendszer e-mailek", "task": "Feladat", "transport_maps": "Szállítási térképek", "transport_test_rcpt_info": "• Használja a null@hosted.mailcow.de címet a külföldi célra történő továbbítás teszteléséhez.", @@ -295,7 +294,8 @@ "user_link": "Felhasználói-link", "user_quicklink": "Gyorshivatkozás elrejtése a Felhasználói bejelentkezési oldalra", "validate_license_now": "GUID érvényesítése a licenszszerverrel szemben", - "yes": "✓" + "yes": "✓", + "success": "Siker" }, "edit": { "active": "Aktív", @@ -646,7 +646,6 @@ "sogo_visible": "Alias látható a SOGo-ban", "sogo_visible_n": "Alias elrejtése a SOGo-ban", "sogo_visible_y": "Alias megjelenítése a SOGo-ban", - "sender": "Feladó", "syncjob_check_log": "Napló ellenőrzése", "syncjob_last_run_result": "Utolsó futás eredménye", "syncjob_EX_OK": "Siker", @@ -1000,7 +999,6 @@ "syncjob_EXIT_OVERQUOTA": "A cél postafiók túllépte a kvótát", "syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Nem lehet csatlakozni a távoli szerverhez", "syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Hibás felhasználónév vagy jelszó", - "text": "Szöveg", "tfa_info": "A kétlépcsős hitelesítés segít megvédeni a fiókodat. Ha engedélyezed, alkalmazás jelszavakra lesz szükséged, hogy bejelentkezz olyan alkalmazásokba vagy szolgáltatásokba, amelyek nem támogatják a kétlépcsős hitelesítést (pl. levelező kliensek).", "tls_policy_warning": "Figyelem: Ha titkosított levélátvitelt kényszerítesz ki, elveszíthetsz e-maileket.
Azok az üzenetek, amelyek nem felelnek meg a szabályzatnak, kemény hibával visszapattannak a levelezőrendszerből.
Ez az opció a fő e-mail címedre (bejelentkezési név), az alias tartományokból származó összes címre, valamint az alias címekre vonatkozik, amelyeknek csak ez az egy postafiók a célja.", "value": "Érték", @@ -1019,8 +1017,7 @@ "dovecot_restart_failed": "A Dovecot újraindítása sikertelen, kérjük, ellenőrizze a naplókat", "fuzzy_learn_error": "Fuzzy hash tanulási hiba: %s", "hash_not_found": "A hash nem található vagy már törölve lett", - "is_not_primary_alias": "Nem elsődleges alias %s kihagyva", - "mailbox_renamed_alias": "A postafiók át lett nevezve, de az alias nem lett automatikusan létrehozva. Kérjük, hozza létre kézzel: %s" + "is_not_primary_alias": "Nem elsődleges alias %s kihagyva" }, "acl": { "delimiter_action": "Elhatárolás", @@ -1136,6 +1133,13 @@ "relay_domain": "Továbbítsa ezt a tartományt", "relay_transport_info": "
Információ
Definiálhatsz szállítási térképeket ehhez a tartományhoz egyedi célállomásra. Ha nincs beállítva, egy MX lekérdezés történik.", "relay_unknown_only": "Csak a nem létező postafiókok továbbítása. A létező postafiókok helyben lesznek kézbesítve.", - "relayhost_wrapped_tls_info": "Kérjük, ne használjon TLS-be csomagolt portokat (többnyire a 465-ös porton használatosak).
\r\nHasználjon bármilyen nem csomagolt portot és adjon ki STARTTLS-t. A TLS kikényszerítésére egy TLS irányelv hozható létre a \"TLS irányelv térképek\" alatt." + "relayhost_wrapped_tls_info": "Kérjük, ne használjon TLS-be csomagolt portokat (többnyire a 465-ös porton használatosak).
\r\nHasználjon bármilyen nem csomagolt portot és adjon ki STARTTLS-t. A TLS kikényszerítésére egy TLS irányelv hozható létre a \"TLS irányelv térképek\" alatt.", + "select": "Kérjük, válasszon...", + "select_domain": "Kérjük, először válasszon egy domaint", + "sieve_desc": "Rövid leírás", + "sieve_type": "Szűrő típusa", + "skipcrossduplicates": "Duplikált üzenetek átugrása mappák között (érkezési sorrendben)", + "subscribeall": "Feliratkozás minden mappára", + "syncjob": "Szinkronizálási feladat hozzáadása" } } diff --git a/data/web/lang/lang.si-si.json b/data/web/lang/lang.si-si.json index 35c4eaa96..56da00f74 100644 --- a/data/web/lang/lang.si-si.json +++ b/data/web/lang/lang.si-si.json @@ -550,7 +550,11 @@ "recovery_email_failed": "E-poštnega sporočila za obnovitev ni bilo mogoče poslati. Obrnite se na skrbnika.", "required_data_missing": "Manjkajo zahtevani podatki %s", "reset_token_limit_exceeded": "Omejitev žetonov za ponastavitev je bila presežena. Poskusite znova pozneje.", - "to_invalid": "Polje za prejemnika ne sme biti prazno" + "to_invalid": "Polje za prejemnika ne sme biti prazno", + "max_age_invalid": "Najvišja starost %s je neveljavna", + "mode_invalid": "Način %s ni veljaven", + "mx_invalid": "Zapis MX %s je neveljaven", + "version_invalid": "Različica %s je neveljavna" }, "debug": { "containers_info": "Informacije o vsebniku (containerju)", @@ -761,7 +765,18 @@ "mailbox_rename": "Preimenuj poštni predal", "mailbox_rename_agree": "Ustvaril/a sem varnostno kopijo.", "mailbox_rename_warning": "POMEMBNO! Pred preimenovanjem nabiralnika ustvarite varnostno kopijo.", - "sieve_desc": "Kratek opis" + "sieve_desc": "Kratek opis", + "mta_sts": "MTA-STS", + "mta_sts_info": "MTA-STS je standard, ki vsiljuje dostavo e-pošte med poštnimi strežniki z uporabo TLS z veljavnimi potrdili.
Uporablja se, kadar DANE ni mogoč zaradi manjkajočega ali nepodprtega DNSSEC.
Opomba: Če prejemna domena podpira DANE z DNSSEC, je DANE vedno prednost – MTA-STS deluje le kot rezervna možnost.", + "mta_sts_version": "Različica", + "mta_sts_version_info": "Določa različico standarda MTA-STS – trenutno je veljavna samo različica STSv1.", + "mta_sts_mode": "Način", + "mta_sts_mode_info": "Na voljo so trije načini:
  • testiranje – pravilnik se samo spremlja, kršitve nimajo vpliva.
  • uveljavljanje – pravilnik se strogo uveljavlja, povezave brez veljavnega TLS so zavrnjene.
  • brez – pravilnik je objavljen, vendar se ne uporablja.
", + "mta_sts_max_age": "Najvišja starost", + "mta_sts_max_age_info": "Čas v sekundah, ki ga lahko prejemni poštni strežniki shranijo v predpomnilnik, dokler se ne ponovno naloži.", + "mta_sts_mx": "MX strežnik", + "mta_sts_mx_info": "Omogoča pošiljanje samo na izrecno navedena imena gostiteljskih strežnikov poštnih strežnikov; pošiljajoči MTA preveri, ali se ime gostitelja DNS MX ujema s seznamom pravilnikov, in dovoljuje dostavo le z veljavnim potrdilom TLS (zaščita pred MITM).", + "mta_sts_mx_notice": "Določiti je mogoče več strežnikov MX (ločenih z vejicami)." }, "footer": { "restart_container_info": "Pomembno: Ugoden ponovni zagon lahko traja nekaj časa, zato počakajte, da se konča.", @@ -799,7 +814,8 @@ "other_logins": "ali se prijavite s/z", "reset_password": "Ponastavi geslo", "request_reset_password": "Zahteva za spremembo gesla", - "username": "Uporabniško ime" + "username": "Uporabniško ime", + "email": "E-poštni naslov" }, "mailbox": { "last_mail_login": "Zadnja prijava v e-pošto", From 5361a4a4ee0e3c9a6434b3728b00e3f9bcf34f1f Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Mon, 1 Sep 2025 12:32:27 +0200 Subject: [PATCH 060/180] updated sponsors in Readme.md --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 2aad841c2..40288f10e 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,6 @@ A big thank you to everyone supporting us on GitHub Sponsors—your contribution - ### 50$/Month Sponsors Date: Wed, 3 Sep 2025 08:14:14 +0200 Subject: [PATCH 061/180] update postscreen_access.cidr (#6703) --- data/conf/postfix/postscreen_access.cidr | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/data/conf/postfix/postscreen_access.cidr b/data/conf/postfix/postscreen_access.cidr index 1783620dd..35fc1a802 100644 --- a/data/conf/postfix/postscreen_access.cidr +++ b/data/conf/postfix/postscreen_access.cidr @@ -1,6 +1,6 @@ -# Whitelist generated by Postwhite v3.4 on Do 28. Aug 14:05:16 CEST 2025 +# Whitelist generated by Postwhite v3.4 on Mon Sep 1 00:23:07 UTC 2025 # https://github.com/stevejenkins/postwhite/ -# 2225 total rules +# 2165 total rules 2a00:1450:4000::/36 permit 2a01:111:f400::/48 permit 2a01:111:f403::/49 permit @@ -55,7 +55,7 @@ 8.40.222.0/23 permit 8.40.222.250/31 permit 12.130.86.238 permit -13.107.253.44 permit +13.107.246.40 permit 13.110.208.0/21 permit 13.110.209.0/24 permit 13.110.216.0/22 permit @@ -686,8 +686,6 @@ 82.165.159.45 permit 82.165.159.130 permit 82.165.159.131 permit -85.9.206.169 permit -85.9.210.45 permit 85.158.136.0/21 permit 85.215.255.39 permit 85.215.255.40 permit @@ -736,7 +734,6 @@ 87.248.117.205 permit 87.253.232.0/21 permit 89.22.108.0/24 permit -91.134.188.129 permit 91.198.2.0/24 permit 91.211.240.0/22 permit 94.236.119.0/26 permit @@ -1669,7 +1666,7 @@ 170.10.132.56/29 permit 170.10.132.64/29 permit 170.10.133.0/24 permit -172.217.0.0/19 permit +172.217.0.0/20 permit 172.217.32.0/20 permit 172.217.128.0/19 permit 172.217.160.0/20 permit @@ -1798,8 +1795,6 @@ 193.142.157.0/24 permit 193.142.157.191 permit 193.142.157.198 permit -193.201.168.38 permit -193.201.168.170/31 permit 194.19.134.0/25 permit 194.25.134.16/28 permit 194.25.134.80/28 permit From 34877ecf9c976f52ccff73311a1424021d4b2e68 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Wed, 3 Sep 2025 08:18:04 +0200 Subject: [PATCH 062/180] watchdog: added postfix-tlspol check (#6691) --- data/Dockerfiles/watchdog/watchdog.sh | 37 +++++++++++++++++++++++++++ docker-compose.yml | 1 + 2 files changed, 38 insertions(+) diff --git a/data/Dockerfiles/watchdog/watchdog.sh b/data/Dockerfiles/watchdog/watchdog.sh index a087ca5f1..558aaa197 100755 --- a/data/Dockerfiles/watchdog/watchdog.sh +++ b/data/Dockerfiles/watchdog/watchdog.sh @@ -450,6 +450,31 @@ postfix_checks() { return 1 } +postfix-tlspol_checks() { + err_count=0 + diff_c=0 + THRESHOLD=${POSTFIX_TLSPOL_THRESHOLD} + # Reduce error count by 2 after restarting an unhealthy container + trap "[ ${err_count} -gt 1 ] && err_count=$(( ${err_count} - 2 ))" USR1 + while [ ${err_count} -lt ${THRESHOLD} ]; do + touch /tmp/postfix-tlspol-mailcow; echo "$(tail -50 /tmp/postfix-tlspol-mailcow)" > /tmp/postfix-tlspol-mailcow + host_ip=$(get_container_ip postfix-tlspol-mailcow) + err_c_cur=${err_count} + /usr/lib/nagios/plugins/check_tcp -4 -H ${host_ip} -p 8642 2>> /tmp/postfix-tlspol-mailcow 1>&2; err_count=$(( ${err_count} + $? )) + [ ${err_c_cur} -eq ${err_count} ] && [ ! $((${err_count} - 1)) -lt 0 ] && err_count=$((${err_count} - 1)) diff_c=1 + [ ${err_c_cur} -ne ${err_count} ] && diff_c=$(( ${err_c_cur} - ${err_count} )) + progress "Postfix TLS Policy companion" ${THRESHOLD} $(( ${THRESHOLD} - ${err_count} )) ${diff_c} + if [[ $? == 10 ]]; then + diff_c=0 + sleep 1 + else + diff_c=0 + sleep $(( ( RANDOM % 60 ) + 20 )) + fi + done + return 1 +} + clamd_checks() { err_count=0 diff_c=0 @@ -927,6 +952,18 @@ PID=$! echo "Spawned mailq_checks with PID ${PID}" BACKGROUND_TASKS+=(${PID}) +( +while true; do + if ! postfix-tlspol_checks; then + log_msg "Postfix TLS Policy hit error limit" + echo postfix-tlspol-mailcow > /tmp/com_pipe + fi +done +) & +PID=$! +echo "Spawned postfix-tlspol_checks with PID ${PID}" +BACKGROUND_TASKS+=(${PID}) + ( while true; do if ! dovecot_checks; then diff --git a/docker-compose.yml b/docker-compose.yml index ce33e3d93..0501e43fa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -577,6 +577,7 @@ services: - MYSQL_REPLICATION_THRESHOLD=${MYSQL_REPLICATION_THRESHOLD:-1} - SOGO_THRESHOLD=${SOGO_THRESHOLD:-3} - POSTFIX_THRESHOLD=${POSTFIX_THRESHOLD:-8} + - POSTFIX_TLSPOL_THRESHOLD=${POSTFIX_TLSPOL_THRESHOLD:-8} - CLAMD_THRESHOLD=${CLAMD_THRESHOLD:-15} - DOVECOT_THRESHOLD=${DOVECOT_THRESHOLD:-12} - DOVECOT_REPL_THRESHOLD=${DOVECOT_REPL_THRESHOLD:-20} From 81775ab4d59c4ee3bf2fa113a3388097164a3ca5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 18:02:11 +0200 Subject: [PATCH 063/180] chore(deps): update actions/stale action to v10 (#6708) Signed-off-by: milkmaker Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/close_old_issues_and_prs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close_old_issues_and_prs.yml b/.github/workflows/close_old_issues_and_prs.yml index af5fd807d..91870fd1d 100644 --- a/.github/workflows/close_old_issues_and_prs.yml +++ b/.github/workflows/close_old_issues_and_prs.yml @@ -14,7 +14,7 @@ jobs: pull-requests: write steps: - name: Mark/Close Stale Issues and Pull Requests 🗑️ - uses: actions/stale@v9.1.0 + uses: actions/stale@v10.0.0 with: repo-token: ${{ secrets.STALE_ACTION_PAT }} days-before-stale: 60 From 06db1d6a72ce65cd5e464eab7f2b1970da555b49 Mon Sep 17 00:00:00 2001 From: Dmitriy Alekseev <1865999+dragoangel@users.noreply.github.com> Date: Fri, 5 Sep 2025 03:37:59 +0200 Subject: [PATCH 064/180] [Rspamd] Do not increment rate limit for emails from user to himself (#6706) * [Rspamd] Do not increment rate limit for emails from user to himself * Lowercase username and recipient address for comparison Normalize username and recipient address comparison to lowercase. --- data/conf/rspamd/lua/rspamd.local.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/conf/rspamd/lua/rspamd.local.lua b/data/conf/rspamd/lua/rspamd.local.lua index 5fe66f75f..2bf328e5b 100644 --- a/data/conf/rspamd/lua/rspamd.local.lua +++ b/data/conf/rspamd/lua/rspamd.local.lua @@ -454,12 +454,18 @@ rspamd_config:register_symbol({ local redis_params = rspamd_parse_redis_server('dyn_rl') local rspamd_logger = require "rspamd_logger" local envfrom = task:get_from(1) + local envrcpt = task:get_recipients(1) or {} local uname = task:get_user() if not envfrom or not uname then return false end + local uname = uname:lower() + if #envrcpt == 1 and envrcpt[1].addr:lower() == uname then + return false + end + local env_from_domain = envfrom[1].domain:lower() -- get smtp from domain in lower case local function redis_cb_user(err, data) From f67c0530f56495d4b7a2c3b8816a8140c2f25586 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:37:54 +0200 Subject: [PATCH 065/180] [Rspamd][Web] Internal alias support --- data/conf/rspamd/dynmaps/settings.php | 38 ++++++++++++++++++++++++-- data/web/inc/functions.mailbox.inc.php | 28 ++++++++++++------- data/web/inc/init_db.inc.php | 1 + data/web/js/site/mailbox.js | 9 ++++++ data/web/lang/lang.de-de.json | 5 ++++ data/web/lang/lang.en-gb.json | 5 ++++ data/web/templates/edit/alias.twig | 7 ++++- data/web/templates/modals/mailbox.twig | 9 ++++-- 8 files changed, 86 insertions(+), 16 deletions(-) diff --git a/data/conf/rspamd/dynmaps/settings.php b/data/conf/rspamd/dynmaps/settings.php index 274e9da28..1b0e6b6e4 100644 --- a/data/conf/rspamd/dynmaps/settings.php +++ b/data/conf/rspamd/dynmaps/settings.php @@ -56,7 +56,7 @@ function normalize_email($email) { $email = explode('@', $email); $email[0] = str_replace('.', '', $email[0]); $email = implode('@', $email); - } + } $gm_alt = "@googlemail.com"; if (substr_compare($email, $gm_alt, -strlen($gm_alt)) == 0) { $email = explode('@', $email); @@ -114,7 +114,7 @@ function ucl_rcpts($object, $type) { $rcpt[] = str_replace('/', '\/', $row['address']); } // Aliases by alias domains - $stmt = $pdo->prepare("SELECT CONCAT(`local_part`, '@', `alias_domain`.`alias_domain`) AS `alias` FROM `mailbox` + $stmt = $pdo->prepare("SELECT CONCAT(`local_part`, '@', `alias_domain`.`alias_domain`) AS `alias` FROM `mailbox` LEFT OUTER JOIN `alias_domain` ON `mailbox`.`domain` = `alias_domain`.`target_domain` WHERE `mailbox`.`username` = :object"); $stmt->execute(array( @@ -184,7 +184,7 @@ while ($row = array_shift($rows)) { rcpt = ; prepare("SELECT `option`, `value` FROM `filterconf` + $stmt = $pdo->prepare("SELECT `option`, `value` FROM `filterconf` WHERE (`option` = 'highspamlevel' OR `option` = 'lowspamlevel') AND `object`= :object"); $stmt->execute(array(':object' => $row['object'])); @@ -468,4 +468,36 @@ while ($row = array_shift($rows)) { + +query("SELECT `id`, `address`, `domain` FROM `alias` WHERE `active` = '1' AND `internal` = '1'"); +$aliases = $stmt->fetchAll(PDO::FETCH_ASSOC); +while ($alias = array_shift($aliases)) { + // build allowed_domains regex and add target domain and alias domains + $stmt = $pdo->prepare("SELECT `alias_domain` FROM `alias_domain` WHERE `active` = '1' AND `target_domain` = :target_domain"); + $stmt->execute(array(':target_domain' => $alias['domain'])); + $allowed_domains = $stmt->fetchAll(PDO::FETCH_ASSOC); + $allowed_domains = array_map(function($item) { + return str_replace('.', '\.', $item['alias_domain']); + }, $allowed_domains); + $allowed_domains[] = str_replace('.', '\.', $alias['domain']); + $allowed_domains = implode('|', $allowed_domains); +?> + internal_alias_ { + priority = 10; + rcpt = ""; + from = "/^((?!.*@()).)*$/"; + apply "default" { + MAILCOW_INTERNAL_ALIAS = 9999.0; + } + symbols [ + "MAILCOW_INTERNAL_ALIAS" + ] + } + + } diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index a74d182cf..a0199fbdc 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -684,15 +684,16 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { return true; break; case 'alias': - $addresses = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['address'])); - $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto'])); - $active = intval($_data['active']); - $sogo_visible = intval($_data['sogo_visible']); - $goto_null = intval($_data['goto_null']); - $goto_spam = intval($_data['goto_spam']); - $goto_ham = intval($_data['goto_ham']); + $addresses = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['address'])); + $gotos = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['goto'])); + $internal = intval($_data['internal']); + $active = intval($_data['active']); + $sogo_visible = intval($_data['sogo_visible']); + $goto_null = intval($_data['goto_null']); + $goto_spam = intval($_data['goto_spam']); + $goto_ham = intval($_data['goto_ham']); $private_comment = $_data['private_comment']; - $public_comment = $_data['public_comment']; + $public_comment = $_data['public_comment']; if (strlen($private_comment) > 160 | strlen($public_comment) > 160){ $_SESSION['return'][] = array( 'type' => 'danger', @@ -842,8 +843,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ); continue; } - $stmt = $pdo->prepare("INSERT INTO `alias` (`address`, `public_comment`, `private_comment`, `goto`, `domain`, `sogo_visible`, `active`) - VALUES (:address, :public_comment, :private_comment, :goto, :domain, :sogo_visible, :active)"); + $stmt = $pdo->prepare("INSERT INTO `alias` (`address`, `public_comment`, `private_comment`, `goto`, `domain`, `sogo_visible`, `internal`, `active`) + VALUES (:address, :public_comment, :private_comment, :goto, :domain, :sogo_visible, :internal, :active)"); if (!filter_var($address, FILTER_VALIDATE_EMAIL) === true) { $stmt->execute(array( ':address' => '@'.$domain, @@ -853,6 +854,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':goto' => $goto, ':domain' => $domain, ':sogo_visible' => $sogo_visible, + ':internal' => $internal, ':active' => $active )); } @@ -864,6 +866,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':goto' => $goto, ':domain' => $domain, ':sogo_visible' => $sogo_visible, + ':internal' => $internal, ':active' => $active )); } @@ -2481,6 +2484,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { foreach ($ids as $id) { $is_now = mailbox('get', 'alias_details', $id); if (!empty($is_now)) { + $internal = (isset($_data['internal'])) ? intval($_data['internal']) : $is_now['internal']; $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $sogo_visible = (isset($_data['sogo_visible'])) ? intval($_data['sogo_visible']) : $is_now['sogo_visible']; $goto_null = (isset($_data['goto_null'])) ? intval($_data['goto_null']) : 0; @@ -2666,6 +2670,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `domain` = :domain, `goto` = :goto, `sogo_visible`= :sogo_visible, + `internal`= :internal, `active`= :active WHERE `id` = :id"); $stmt->execute(array( @@ -2675,6 +2680,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':domain' => $domain, ':goto' => $goto, ':sogo_visible' => $sogo_visible, + ':internal' => $internal, ':active' => $active, ':id' => $is_now['id'] )); @@ -4700,6 +4706,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `address`, `public_comment`, `private_comment`, + `internal`, `active`, `sogo_visible`, `created`, @@ -4730,6 +4737,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $aliasdata['goto'] = $row['goto']; $aliasdata['address'] = $row['address']; (!filter_var($aliasdata['address'], FILTER_VALIDATE_EMAIL)) ? $aliasdata['is_catch_all'] = 1 : $aliasdata['is_catch_all'] = 0; + $aliasdata['internal'] = $row['internal']; $aliasdata['active'] = $row['active']; $aliasdata['active_int'] = $row['active']; $aliasdata['sogo_visible'] = $row['sogo_visible']; diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index ecb87c380..1c4f0ebf2 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -184,6 +184,7 @@ function init_db_schema() "private_comment" => "TEXT", "public_comment" => "TEXT", "sogo_visible" => "TINYINT(1) NOT NULL DEFAULT '1'", + "internal" => "TINYINT(1) NOT NULL DEFAULT '0'", "active" => "TINYINT(1) NOT NULL DEFAULT '1'" ), "keys" => array( diff --git a/data/web/js/site/mailbox.js b/data/web/js/site/mailbox.js index 135ec764a..6a04eb241 100644 --- a/data/web/js/site/mailbox.js +++ b/data/web/js/site/mailbox.js @@ -1972,6 +1972,15 @@ jQuery(function($){ data: 'private_comment', defaultContent: '' }, + { + title: lang.internal, + data: 'internal', + defaultContent: '', + responsivePriority: 6, + render: function (data, type) { + return 1==data?'1':0==data&&'0'; + } + }, { title: lang.active, data: 'active', diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index 93b908d6c..b5f3f325d 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -71,6 +71,8 @@ "goto_spam": "Nachrichten als Spam lernen", "hostname": "Host", "inactive": "Inaktiv", + "internal": "Intern", + "internal_info": "Interne Aliasse sind nur von der eigenen Domäne oder Alias-Domänen erreichbar.", "kind": "Art", "mailbox_quota_def": "Standard-Quota einer Mailbox", "mailbox_quota_m": "Max. Speicherplatz pro Mailbox (MiB)", @@ -690,6 +692,8 @@ "grant_types": "Grant-types", "hostname": "Servername", "inactive": "Inaktiv", + "internal": "Intern", + "internal_info": "Interne Aliasse sind nur von der eigenen Domäne oder Alias-Domänen erreichbar.", "kind": "Art", "last_modified": "Zuletzt geändert", "lookup_mx": "Ziel mit MX vergleichen (Regex, etwa .*\\.google\\.com, um alle Ziele mit MX *google.com zu routen)", @@ -923,6 +927,7 @@ "in_use": "Prozentualer Gebrauch", "inactive": "Inaktiv", "insert_preset": "Beispiel \"%s\" laden", + "internal": "Intern", "kind": "Art", "last_mail_login": "Letzter Mail-Login", "last_modified": "Zuletzt geändert", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 0af0e59b0..d46e4606c 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -71,6 +71,8 @@ "goto_spam": "Learn as spam", "hostname": "Host", "inactive": "Inactive", + "internal": "Internal", + "internal_info": "Internal aliases are only accessible from the own domain or alias domains.", "kind": "Kind", "mailbox_quota_def": "Default mailbox quota", "mailbox_quota_m": "Max. quota per mailbox (MiB)", @@ -690,6 +692,8 @@ "grant_types": "Grant types", "hostname": "Hostname", "inactive": "Inactive", + "internal": "Internal", + "internal_info": "Internal aliases are only accessible from the own domain or alias domains.", "kind": "Kind", "last_modified": "Last modified", "lookup_mx": "Destination is a regular expression to match against MX name (.*\\.google\\.com to route all mail targeted to a MX ending in google.com over this hop)", @@ -928,6 +932,7 @@ "in_use": "In use (%)", "inactive": "Inactive", "insert_preset": "Insert example preset \"%s\"", + "internal": "Internal", "kind": "Kind", "last_mail_login": "Last mail login", "last_modified": "Last modified", diff --git a/data/web/templates/edit/alias.twig b/data/web/templates/edit/alias.twig index 48d19617b..64a6e706b 100644 --- a/data/web/templates/edit/alias.twig +++ b/data/web/templates/edit/alias.twig @@ -6,6 +6,7 @@
+ {% if not skip_sogo %} {% endif %} @@ -33,8 +34,12 @@
-

{{ lang.edit.sogo_visible_info }}

+ {{ lang.edit.sogo_visible_info }} {% endif %} +
+ +
+ {{ lang.edit.internal_info }}

diff --git a/data/web/templates/modals/mailbox.twig b/data/web/templates/modals/mailbox.twig index 0c164332b..1e8ee53fa 100644 --- a/data/web/templates/modals/mailbox.twig +++ b/data/web/templates/modals/mailbox.twig @@ -777,6 +777,7 @@