diff --git a/.travis.yml b/.travis.yml
index 887e7d961..2464a8b36 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -50,7 +50,7 @@ before_script:
script:
- python ./tests.py
- cd test_project
- - coverage run --source ../modoboa manage.py test modoboa.core modoboa.lib modoboa.admin modoboa.limits modoboa.transport modoboa.relaydomains
+ - coverage run --source ../modoboa manage.py test modoboa.core modoboa.lib modoboa.admin modoboa.limits modoboa.transport modoboa.relaydomains modoboa.dnstools
after_success:
- coverage xml
diff --git a/modoboa/admin/app_settings.py b/modoboa/admin/app_settings.py
index d0ad679b0..8b343910a 100644
--- a/modoboa/admin/app_settings.py
+++ b/modoboa/admin/app_settings.py
@@ -51,6 +51,39 @@ class AdminParametersForm(param_forms.AdminParametersForm):
)
)
+ enable_spf_checks = YesNoField(
+ label=ugettext_lazy("Enable SPF checks"),
+ initial=True,
+ help_text=ugettext_lazy(
+ "Check if every domain has a valid SPF record"
+ )
+ )
+
+ enable_dkim_checks = YesNoField(
+ label=ugettext_lazy("Enable DKIM checks"),
+ initial=True,
+ help_text=ugettext_lazy(
+ "Check if every domain with DKIM signin enabled has a valid DNS "
+ "record"
+ )
+ )
+
+ enable_dmarc_checks = YesNoField(
+ label=ugettext_lazy("Enable DMARC checks"),
+ initial=True,
+ help_text=ugettext_lazy(
+ "Check if every domain has a valid DMARC record"
+ )
+ )
+
+ enable_autoconfig_checks = YesNoField(
+ label=ugettext_lazy("Enable autoconfig checks"),
+ initial=True,
+ help_text=ugettext_lazy(
+ "Check if every domain has a valid records for autoconfiguration"
+ )
+ )
+
enable_dnsbl_checks = YesNoField(
label=ugettext_lazy("Enable DNSBL checks"),
initial=True,
diff --git a/modoboa/admin/lib.py b/modoboa/admin/lib.py
index ea5c54f4f..f2ac6f556 100644
--- a/modoboa/admin/lib.py
+++ b/modoboa/admin/lib.py
@@ -23,6 +23,7 @@ from modoboa.core import signals as core_signals
from modoboa.core.models import User
from modoboa.lib.exceptions import PermDeniedException
from modoboa.parameters import tools as param_tools
+
from . import signals
from .models import Alias, Domain, DomainAlias
@@ -170,56 +171,70 @@ def import_dlist(user, row, formopts):
_import_alias(user, row)
-def get_domain_mx_list(domain):
- """Return a list of MX IP address for domain."""
- result = []
- logger = logging.getLogger("modoboa.admin")
+def get_dns_resolver():
+ """Return a DNS resolver object."""
dns_server = param_tools.get_global_parameter("custom_dns_server")
if dns_server:
resolver = dns.resolver.Resolver()
resolver.nameservers = [dns_server]
else:
resolver = dns.resolver
+ return resolver
+
+def get_dns_records(name, typ, resolver=None):
+ """Retrieve DNS records for given name and type."""
+ logger = logging.getLogger("modoboa.admin")
+ if not resolver:
+ resolver = get_dns_resolver()
try:
- dns_answers = resolver.query(domain, "MX")
+ dns_answers = resolver.query(name, typ)
except dns.resolver.NXDOMAIN as e:
- logger.error(_("No DNS records found for %s") % domain, exc_info=e)
+ logger.error(_("No DNS record found for %s") % name, exc_info=e)
except dns.resolver.NoAnswer as e:
- logger.error(_("No MX record for %s") % domain, exc_info=e)
+ logger.error(
+ _("No %(type)s record for %(name)s") % {"type": typ, "name": name},
+ exc_info=e
+ )
except dns.resolver.NoNameservers as e:
logger.error(_("No working name servers found"), exc_info=e)
except dns.resolver.Timeout as e:
logger.warning(
_("DNS resolution timeout, unable to query %s at the moment") %
- domain, exc_info=e)
+ name, exc_info=e)
else:
- for dns_answer in dns_answers:
- for rtype in ["A", "AAAA"]:
+ return dns_answers
+ return None
+
+
+def get_domain_mx_list(domain):
+ """Return a list of MX IP address for domain."""
+ result = []
+ logger = logging.getLogger("modoboa.admin")
+ resolver = get_dns_resolver()
+ dns_answers = get_dns_records(domain, "MX", resolver)
+ if dns_answers is None:
+ return result
+ for dns_answer in dns_answers:
+ mx_domain = dns_answer.exchange.to_unicode(
+ omit_final_dot=True, idna_codec=IDNA_2008_UTS_46)
+ for rtype in ["A", "AAAA"]:
+ ip_answers = get_dns_records(mx_domain, rtype, resolver)
+ if not ip_answers:
+ continue
+ for ip_answer in ip_answers:
try:
- mx_domain = dns_answer.exchange.to_unicode(
- omit_final_dot=True, idna_codec=IDNA_2008_UTS_46)
- ip_answers = resolver.query(mx_domain, rtype)
- except dns.resolver.NXDOMAIN as e:
- logger.error(
- _("No {type} record found for MX {mx}").format(
- type=rtype, mx=domain), exc_info=e)
- except dns.resolver.NoAnswer:
- pass
+ address_smart = smart_text(ip_answer.address)
+ mx_ip = ipaddress.ip_address(address_smart)
+ except ValueError as e:
+ logger.warning(
+ _("Invalid IP address format for "
+ "{domain}; {addr}").format(
+ domain=mx_domain,
+ addr=smart_text(ip_answer.address)
+ ), exc_info=e)
else:
- for ip_answer in ip_answers:
- try:
- address_smart = smart_text(ip_answer.address)
- mx_ip = ipaddress.ip_address(address_smart)
- except ValueError as e:
- logger.warning(
- _("Invalid IP address format for "
- "{domain}; {addr}").format(
- domain=mx_domain,
- addr=smart_text(ip_answer.address)
- ), exc_info=e)
- else:
- result.append((mx_domain, mx_ip))
+ result.append((mx_domain, mx_ip))
return result
diff --git a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po
index f5621cc5e..614b7854c 100644
--- a/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/cs_CZ/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2018-08-10 11:53+0000\n"
"Last-Translator: Jarda Tesar \n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/tonio/"
@@ -61,26 +61,74 @@ msgstr ""
"zadaných adres."
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Zapnout kontrolu DNS"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Ověřit, zda má každá doména platný MX záznam"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Povolit MX kontroly"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Ověřit, zda má každá doména platný MX záznam"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Povolit MX kontroly"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Ověřit, zda má každá doména platný MX záznam"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Povolit MX kontroly"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Ověřit, zda má každá doména platný MX záznam"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Povolit DNSBL kontroly"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Ověřit každou doménu vůči hlavním DNSBL providerům"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr "Složka pro uložení DKIM klíčů"
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
@@ -90,23 +138,23 @@ msgstr ""
"se, že vytvořená složka patří uživateli root a není možné z ní číst okolním "
"světem."
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr "Výchozí délka DKIM klíče"
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr "Výchozí délka v bitech pro nově vygenerované DKIM klíče."
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Schránky"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Spravovat schránky v souborovém systému"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -114,19 +162,19 @@ msgstr ""
"Přejmenovat nebo odstranit schránky v souborovém systému, pokud jsou "
"přejmenovány nebo odstraněny v Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Majitel schránky"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "Účet UNIXu, který vlastní schránky v souborovém systému"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Výchozí kvóta domény"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -134,12 +182,12 @@ msgstr ""
"Výchozí kvóta (v MB), které se použije u nově vytvořených domén bez uvedené "
"hodnoty kvóty. Hodnota 0 znamená, že se kvóta nepoužívá."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Výchozí kvóta schránky"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -148,59 +196,59 @@ msgstr ""
"které nemají specifikovanou vlastní hodnotu. Hodnota 0 znamená neomezenou "
"kvótu."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Automatické odstranění účtu"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "Když je schránka odstraněná, odstranit také přiřazený účet uživatele"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Automatické vytvoření domény/schránky"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr "Při založení účtu automaticky vytvořit doménu a schránku."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Vytvořit alias, pokud je mailová schránka přejmenována"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
"Vytvořit alias použitím původní adresy, pokud je mailová schránka "
"přejmenována."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Musí se jednat o kladné číslo"
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr "Složka nenalezena."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr "openssl nenalezeno, prosím ujistěte se, že je nainstalováno."
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Definujte alespoň jednu autorizovanou síť / adresu"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Správa"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Doména"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr "Relay doména"
@@ -261,7 +309,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Pouze super správci jsou oprávnění pro tento režim"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Toto pole je vyžadováno."
@@ -430,7 +478,7 @@ msgstr ""
msgid "Key selector"
msgstr "Identifikátor klíče"
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -457,7 +505,7 @@ msgstr "doménový alias"
msgid "A %s with this name already exists"
msgstr "%s s tímto názvem již existuje"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "Nebyly nalezeny žádné autorizované MX záznamy pro tuto doménu"
@@ -465,7 +513,7 @@ msgstr "Nebyly nalezeny žádné autorizované MX záznamy pro tuto doménu"
msgid "DKIM keys storage directory not configured"
msgstr "Není nastavena složka pro ukládání DKIM klíčů"
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "Nemůže být vyšší než kvóta domény"
@@ -612,44 +660,40 @@ msgstr "Identity"
msgid "Forward"
msgstr "Přeposlat"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Schránka je vyžadována"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Nemáte oprávnění pro import domén"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Nemáte oprávnění pri import doménových aliasů"
-#: lib.py:187 tests/test_mx.py:135
-#, python-format
-msgid "No DNS records found for %s"
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
+#, fuzzy, python-format
+#| msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Nenalezeny žádné DNS záznamy pro %s"
-#: lib.py:189 tests/test_mx.py:138
-#, python-format
-msgid "No MX record for %s"
+#: lib.py:196
+#, fuzzy, python-format
+#| msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Žádný MX záznam pro %s"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr "Nenalezeny žádné funkční DNS servery"
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr "Vypršel časový limit DNS požadavku, nelze získat %s v tuto chvíli"
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No DNS records found for %s"
-msgid "No {type} record found for MX {mx}"
-msgstr "Nenalezeny žádné DNS záznamy pro %s"
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -669,20 +713,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] DNSBL problém(y) pro doménu {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Doména {} nemá MX záznam"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "MX záznam pro doménu {0} je neplatný: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] MX problém(y) pro doménu {}"
@@ -694,7 +738,7 @@ msgstr "adresa"
msgid "The alias address."
msgstr "Adresa aliasu."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "povoleno"
@@ -740,53 +784,49 @@ msgstr "název"
msgid "The domain name"
msgstr "Doménové jméno"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr "Výchozí kvóta v MB pro schránky. Hodnota 0 = žádná kvóta."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Zatrhněte pole pro povolení této domény"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Zapnout kontrolu DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Zaškrtněte pro zapnutí kontroly DNS pro tuto doménu"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr "Povolit DKIM podepisování"
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
"Pokud povolíte tuto možnost, bude vygenerován DKIM klíč pro tuto doménu."
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr "Délka klíče"
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Neplatný řádek"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "Nenalezeny žádný autorizovaný MX záznam pro doménu {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Neplatná hodnota kvóty pro doménu '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Neplatná výchozí hodnota kvóty schránky pro doménu '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr "Výchozí kvóta mailové schránky nemůže být větší než kvóta domény"
@@ -824,40 +864,44 @@ msgstr "Kvóta je vyžadována"
msgid "Domain quota exceeded"
msgstr "Kvóta domény byla překročena"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr "Výchozí kvóta v MB pro schránky. Hodnota 0 = žádná kvóta."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Přístup zamítnut."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "Zobrazit spravované domény (jenom distributori a správci domén)"
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Není povoleno pro tuto roli."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Musí být rovno hodnote schránky celá_adresa"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Lokální doména {} neexistuje"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "Seznam příjemců"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Doména nebyla nalezena."
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr "K této doméně nemáte přístup."
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr "K této schránce nemáte přístup."
@@ -888,6 +932,18 @@ msgstr "Zákázáno"
msgid "Awaiting checks"
msgstr "Čeká na kontrolu"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No DNS records found for %s"
+msgid "No record found"
+msgstr "Nenalezeny žádné DNS záznamy pro %s"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Globální statistiky"
@@ -1275,19 +1331,12 @@ msgstr "Upravit {}"
msgid "Delete %s?"
msgstr "Smazat %s?"
-#: tests/test_mx.py:144
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam."
+#: tests/test_mx.py:139
+#, python-format
+msgid "No MX record for %s"
+msgstr "Žádný MX záznam pro %s"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam."
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr "Neplatný formát IP adresy pro %(domain)s; %(addr)s"
@@ -1328,11 +1377,11 @@ msgstr "MX záznamy pro {}"
msgid "DNSBL summary for {}"
msgstr "DNSBL přehled pro {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Nemůžete smazat vlastní doménu"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Doména smazána"
@@ -1382,6 +1431,21 @@ msgstr "Importovat identity"
msgid "Forward updated"
msgstr "Přeposílání aktualizováno"
+#, fuzzy
+#~| msgid "No DNS records found for %s"
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Nenalezeny žádné DNS záznamy pro %s"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam."
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Pro tuto doménu nebyl nalezen žádný MX záznam."
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr "Kvóta v MB sdílená mezi schránky. Hodnota 0 = žádná kvóta."
diff --git a/modoboa/admin/locale/de/LC_MESSAGES/django.po b/modoboa/admin/locale/de/LC_MESSAGES/django.po
index 21c17614b..f9be7231d 100644
--- a/modoboa/admin/locale/de/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/de/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2015-09-09 09:33+0000\n"
"Last-Translator: controlc.de\n"
"Language-Team: German (http://www.transifex.com/tonio/modoboa/language/de/)\n"
@@ -55,49 +55,81 @@ msgid ""
msgstr ""
#: app_settings.py:55
-msgid "Enable DNSBL checks"
+msgid "Enable SPF checks"
msgstr ""
#: app_settings.py:58
-msgid "Check every domain against major DNSBL providers"
+msgid "Check if every domain has a valid SPF record"
msgstr ""
#: app_settings.py:63
-msgid "Custom DNS server"
+msgid "Enable DKIM checks"
msgstr ""
#: app_settings.py:66
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr ""
+
+#: app_settings.py:72
+msgid "Enable DMARC checks"
+msgstr ""
+
+#: app_settings.py:75
+msgid "Check if every domain has a valid DMARC record"
+msgstr ""
+
+#: app_settings.py:80
+msgid "Enable autoconfig checks"
+msgstr ""
+
+#: app_settings.py:83
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr ""
+
+#: app_settings.py:88
+msgid "Enable DNSBL checks"
+msgstr ""
+
+#: app_settings.py:91
+msgid "Check every domain against major DNSBL providers"
+msgstr ""
+
+#: app_settings.py:96
+msgid "Custom DNS server"
+msgstr ""
+
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Postfächer"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Postfächer im Dateisystem verwalten"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -105,21 +137,21 @@ msgstr ""
"Postfächer auch in Dateisystem umbenennen oder entfernen wenn sie in Modoboa "
"umbenannt oder entfernt werden"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Postfach-Besitzer"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr ""
"UID des virtuellen Benutzers, der Besitzer der Domains, Mailboxen und "
"Nachrichten im Dateisystem ist."
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Standard-Domainquota"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -127,14 +159,14 @@ msgstr ""
"Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. "
"Der Wert 0 bedeutet „Kein Quota“"
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
#, fuzzy
#| msgid "Default domain quota"
msgid "Default mailbox quota"
msgstr "Standard-Domainquota"
-#: app_settings.py:122
+#: app_settings.py:155
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -146,61 +178,61 @@ msgstr ""
"Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. "
"Der Wert 0 bedeutet „Kein Quota“"
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Automatische Konto-Entfernung"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "Beim Löschen des Postfachs auch das Konto entfernen."
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Automatische Domain- /Postfach-Erstellung"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"Erstelle eine Domain und ein Postfach, wenn ein Konto automatisch erstellt "
"wurde."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr ""
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Muss eine positive Ganzzahl sein"
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain modified"
msgid "Directory not found."
msgstr "Domain verändert"
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr ""
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Verwaltung"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domain"
-#: constants.py:99
+#: constants.py:97
#, fuzzy
#| msgid "New domain"
msgid "Relay domain"
@@ -263,7 +295,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Nur Super-Administratoren dürfen diesen Modus benutzen."
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
#, fuzzy
#| msgid "A mailbox is required"
msgid "This field is required."
@@ -452,7 +484,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -485,7 +517,7 @@ msgstr "Domain-Alias"
msgid "A %s with this name already exists"
msgstr "Ein %s mit diesem Namen existiert bereits"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr ""
@@ -493,7 +525,7 @@ msgstr ""
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr ""
@@ -647,44 +679,39 @@ msgstr "Identitäten"
msgid "Forward"
msgstr "Weiterleiten"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Ein Postfach ist erforderlich"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Sie verfügen nicht über ausreichend Rechte, um Domains zu importieren."
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr ""
"Sie verfügen nicht über ausreichend Rechte, um Domain Aliase zu importieren."
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, python-format
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr ""
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, python-format
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr ""
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, python-brace-format
-msgid "No {type} record found for MX {mx}"
-msgstr ""
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -704,20 +731,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr ""
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr ""
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr ""
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr ""
@@ -729,7 +756,7 @@ msgstr "Adresse"
msgid "The alias address."
msgstr "Die Alias-Adresse"
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "aktiviert"
@@ -775,64 +802,54 @@ msgstr "Name"
msgid "The domain name"
msgstr "Name der Domain"
-#: models/domain.py:44
-#, fuzzy
-#| msgid ""
-#| "Default quota (in MB) applied to freshly created domains with no value "
-#| "specified. A value of 0 means no quota."
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. "
-"Der Wert 0 bedeutet „Kein Quota“"
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Auswählen, um diese Domain zu aktivieren"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr ""
-#: models/domain.py:56
+#: models/domain.py:48
#, fuzzy
#| msgid "Check to activate this domain"
msgid "Check to enable DNS checks for this domain"
msgstr "Auswählen, um diese Domain zu aktivieren"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Ungültige Zeile"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr ""
-#: models/domain.py:320
+#: models/domain.py:337
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid quota value for domain '{}'"
msgstr "Ungültiger Quota-Wert für Domain '%s'"
-#: models/domain.py:327
+#: models/domain.py:344
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Ungültiger Quota-Wert für Domain '%s'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
@@ -872,48 +889,58 @@ msgstr "Ein Quota ist erforderlich"
msgid "Domain quota exceeded"
msgstr "Domain erstellt."
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+#, fuzzy
+#| msgid ""
+#| "Default quota (in MB) applied to freshly created domains with no value "
+#| "specified. A value of 0 means no quota."
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Standardquota (in MB) für neu erstelle Domains ohne explizite Wertangabe. "
+"Der Wert 0 bedeutet „Kein Quota“"
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
#, fuzzy
#| msgid "Permissions"
msgid "Permission denied."
msgstr "Berechtigungen"
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr ""
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: serializers.py:291
+#: serializers.py:303
#, fuzzy
#| msgid "Domain does not exist"
msgid "Local domain {} does not exist"
msgstr "Domain existiert nicht"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr ""
-#: serializers.py:400
+#: serializers.py:412
#, fuzzy
#| msgid "Domain modified"
msgid "Domain not found."
msgstr "Domain verändert"
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Der Zugriff auf diese Domain ist Ihnen nicht gestattet"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -952,6 +979,18 @@ msgstr "deaktiviert"
msgid "Awaiting checks"
msgstr ""
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "Domain modified"
+msgid "No record found"
+msgstr "Domain verändert"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
#, fuzzy
#| msgid "Statistics"
@@ -1407,17 +1446,12 @@ msgstr ""
msgid "Delete %s?"
msgstr "%s löschen?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, python-format
-msgid "No A record found for MX %(domain)s"
+msgid "No MX record for %s"
msgstr ""
-#: tests/test_mx.py:147
-#, python-format
-msgid "No AAAA record found for MX %(domain)s"
-msgstr ""
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1458,11 +1492,11 @@ msgstr ""
msgid "DNSBL summary for {}"
msgstr ""
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Sie können Ihre eigene Domain nicht löschen"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domain gelöscht"
diff --git a/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po b/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po
index 5a20a4cf6..42f22db03 100644
--- a/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/el_GR/LC_MESSAGES/django.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2017-10-12 08:13+0000\n"
"Last-Translator: Kostas Moumouris \n"
"Language-Team: Greek (Greece) (http://www.transifex.com/tonio/modoboa/"
@@ -59,49 +59,97 @@ msgstr ""
"είδη ορισμένες διευθύνσεις."
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Ενεργοποίση ελέγχου DNS"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Ενεργοποίηση ελέγχου MX"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Ενεργοποίηση ελέγχου MX"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Ενεργοποίηση ελέγχου MX"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Έλεγχος ότι κάθε domain έχει μια έγκυρη εγράφη MX"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Ενεργοποίηση ελέγχου DNSBL"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Έλεγχος κάθε domain κατά κύριους DNSBL πάροχους"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Γραμματοκιβώτια"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Χειριστείτε γραμματοκιβώτια στο σύστημα αρχείων"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -109,21 +157,21 @@ msgstr ""
"Μετονομασία και διαγραφή γραμματοκιβωτίων στο σύστημα αρχείων, όταν "
"μετονομάζονται ή διαγράφονται από το Medaboa "
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Ο ιδιοκτήτης των γραμματοκιβωτίων"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr ""
"Ο UNIX λογαριασμός που είναι ιδιοκτήτης των γραμματοκιβωτίων στο σύστημα "
"αρχείων"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Προκαθορισμένο domain quota"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -131,12 +179,12 @@ msgstr ""
"Προκαθορισμένο quota (σε MB) που εφαρμόζεται στα νέα domains χωρίς "
"προκαθορισμένες τιμές. Μια τιμή 0 σημαίνει ότι δεν έχει quota. "
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Προκαθορισμένο quota γραμματοκιβωτίου "
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -144,64 +192,64 @@ msgstr ""
"Προκαθορισμένο quota γραμματοκιβωτίου (σε MB) που εφαρμόζεται στα νέα "
"domains χωρίς προκαθορισμένες τιμές. Μια τιμή 0 σημαίνει ότι δεν έχει quota. "
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Αυτόματη αφαίρεση λογαριασμών"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr ""
"Όταν αφαιρείται ένα γραμματοκιβώτιο, να αφαιρείται και ο σχετικός λογαριασμός"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Αυτόματη δημιουργία domain/γραμματοκιβωτίων"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"Δημιουργία domain και γραμματοκιβωτίου κατά την αυτόματη δημιουργία "
"λογαριασμού"
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Δημιουργία ενός ψευδώνυμου κατά τη μετονομασία ενός γραμματοκιβωτίου"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
"Δημιουργήστε ένα ψευδώνυμο χρησιμοποιώντας την παλιά διεύθυνση όταν "
"μετονομάζεται ένα γραμματοκιβώτιο."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Πρέπει να είναι θετικός ακέραιος"
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain not found."
msgid "Directory not found."
msgstr "To domain δεν βρέθηκε."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Ορίστε τουλάχιστον μια εξουσιοδοτημένη διεύθυνση / δίκτυο"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Διαχείριση"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domain"
-#: constants.py:99
+#: constants.py:97
#, fuzzy
#| msgid "New domain"
msgid "Relay domain"
@@ -264,7 +312,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Μόνο σε super διαχειριστές επιτρέπεται αυτή η λειτουργία. "
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Αυτό το πεδίο απαιτείτε."
@@ -435,7 +483,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -466,7 +514,7 @@ msgstr "Ψευδώνυμα (alias) domain "
msgid "A %s with this name already exists"
msgstr "Το '%s' με αυτό το όνομα υπάρχει ήδη"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "Δεν υπάρχουν ΜΧ έγραφες για αυτό το domain "
@@ -474,7 +522,7 @@ msgstr "Δεν υπάρχουν ΜΧ έγραφες για αυτό το domain
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "Δεν μπορεί να είναι μεγαλύτερο από το domain quota."
@@ -624,46 +672,40 @@ msgstr "Ταυτότητες"
msgid "Forward"
msgstr "Προώθηση"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Απαιτείται γραμματοκιβώτιο"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Δεν έχετε δικαίωμα εισαγωγής domain"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Δεν επιτρέπεται να εισαγάγετε ψευδώνυμα στο domain."
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, fuzzy, python-format
#| msgid "No MX record found for this domain."
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, fuzzy, python-format
#| msgid "MX records of {}"
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Έγραφες MX από{}"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No MX record found for this domain."
-msgid "No {type} record found for MX {mx}"
-msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '{}'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -683,20 +725,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] DNSBL ζήτημα(τα) για το domain {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Το Domain {} δεν έχει εγγραφή MX "
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "Η εγγραφή MX για το domain {0} δεν είναι έγκυρη: {1} "
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] MX ζήτημα(τα) για το domain {}"
@@ -708,7 +750,7 @@ msgstr "διεύθυνση"
msgid "The alias address."
msgstr "Η εναλλακτική διεύθυνση."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "ενεργοποιημένο"
@@ -754,55 +796,49 @@ msgstr "όνομα"
msgid "The domain name"
msgstr "Το όνομα του domain"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Προκαθορισμένο quota σε MB που εφαρμόζεται στα γραμματοκιβώτια. Μια τιμή 0 "
-"σημαίνει ότι δεν υπάρχει quota. "
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Επιλέξτε για να ενεργοποιηθεί αυτό το domain"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Ενεργοποίση ελέγχου DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Επιλέξτε για να ενεργοποιήσετε τους ελέγχους DNS για αυτόν το domain"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Λάθος γραμμή"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "Δεν βρέθηκε εξουσιοδοτημένη εγγραφή MX για το domain {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Μη έγκυρη τιμή quota για το domain '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr ""
"Μη έγκυρη τιμή quota για το προεπιλεγμένο γραμματοκιβώτιο για το domain '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
"Το προεπιλεγμένο quota για το γραμματοκιβώτιο δεν πρέπει να είναι μεγαλύτερο "
@@ -842,44 +878,50 @@ msgstr "Ένα quota απαιτείται "
msgid "Domain quota exceeded"
msgstr "Υπέρβαση του domain quota"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Προκαθορισμένο quota σε MB που εφαρμόζεται στα γραμματοκιβώτια. Μια τιμή 0 "
+"σημαίνει ότι δεν υπάρχει quota. "
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Η άδεια απορρίφθηκε."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Λίστα διαχειριζόμενων domains (αφορά μόνο μεταπωλητές και διαχειριστές "
"domain)"
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Δεν επιτρέπεται για αυτόν τον ρόλο."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Πρέπει να είναι ίσο με την full_address του γραμματοκιβωτίου"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Το τοπικός domain {} δεν υπάρχει"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "Λίστα παραληπτών"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "To domain δεν βρέθηκε."
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Δεν έχετε πρόσβαση σε αυτό το domain"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -916,6 +958,18 @@ msgstr "Απενεργοποιήθηκε "
msgid "Awaiting checks"
msgstr "Αναμονή ελέγχων"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No MX record found for this domain."
+msgid "No record found"
+msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Γενικά στατιστικά"
@@ -1310,19 +1364,13 @@ msgstr "Επεξεργασία{}"
msgid "Delete %s?"
msgstr "Διαγραφή %s;"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
+#| msgid "MX records of {}"
+msgid "No MX record for %s"
+msgstr "Έγραφες MX από{}"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1361,11 +1409,11 @@ msgstr "Έγραφες MX από{}"
msgid "DNSBL summary for {}"
msgstr "Περίληψη DNSBL για{}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Δεν μπορείτε να σβήσετε το δικό σας domain"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Το domain διαφράφηκε"
@@ -1411,6 +1459,21 @@ msgstr "Εισαγωγή ταυτοτήτων"
msgid "Forward updated"
msgstr "Η προώθηση ενημερώθηκε"
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Δεν βρέθηκε εγράφη MX για αυτό το domain. "
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr ""
#~ "Κοινόχρηστο quota σε MB μεταξύ γραμματοκιβωτίων. Μια τιμή 0 σημαίνει ότι "
diff --git a/modoboa/admin/locale/en/LC_MESSAGES/django.po b/modoboa/admin/locale/en/LC_MESSAGES/django.po
index 20b9aa140..2b40edee2 100644
--- a/modoboa/admin/locale/en/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -52,134 +52,166 @@ msgid ""
msgstr ""
#: app_settings.py:55
-msgid "Enable DNSBL checks"
+msgid "Enable SPF checks"
msgstr ""
#: app_settings.py:58
-msgid "Check every domain against major DNSBL providers"
+msgid "Check if every domain has a valid SPF record"
msgstr ""
#: app_settings.py:63
-msgid "Custom DNS server"
+msgid "Enable DKIM checks"
msgstr ""
#: app_settings.py:66
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr ""
+
+#: app_settings.py:72
+msgid "Enable DMARC checks"
+msgstr ""
+
+#: app_settings.py:75
+msgid "Check if every domain has a valid DMARC record"
+msgstr ""
+
+#: app_settings.py:80
+msgid "Enable autoconfig checks"
+msgstr ""
+
+#: app_settings.py:83
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr ""
+
+#: app_settings.py:88
+msgid "Enable DNSBL checks"
+msgstr ""
+
+#: app_settings.py:91
+msgid "Check every domain against major DNSBL providers"
+msgstr ""
+
+#: app_settings.py:96
+msgid "Custom DNS server"
+msgstr ""
+
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr ""
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr ""
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
msgstr ""
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr ""
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr ""
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr ""
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
msgstr ""
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr ""
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
msgstr ""
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr ""
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr ""
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr ""
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr ""
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr ""
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr ""
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr ""
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr ""
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr ""
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr ""
@@ -236,7 +268,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr ""
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr ""
@@ -386,7 +418,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -407,7 +439,7 @@ msgstr ""
msgid "A %s with this name already exists"
msgstr ""
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr ""
@@ -415,7 +447,7 @@ msgstr ""
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr ""
@@ -561,43 +593,38 @@ msgstr ""
msgid "Forward"
msgstr ""
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr ""
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr ""
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr ""
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, python-format
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr ""
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, python-format
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr ""
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, python-brace-format
-msgid "No {type} record found for MX {mx}"
-msgstr ""
-
-#: lib.py:214
+#: lib.py:231
#, python-brace-format
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
@@ -616,20 +643,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr ""
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr ""
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr ""
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr ""
@@ -641,7 +668,7 @@ msgstr ""
msgid "The alias address."
msgstr ""
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr ""
@@ -687,52 +714,48 @@ msgstr ""
msgid "The domain name"
msgstr ""
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr ""
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr ""
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr ""
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr ""
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr ""
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr ""
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr ""
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
@@ -770,40 +793,44 @@ msgstr ""
msgid "Domain quota exceeded"
msgstr ""
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr ""
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr ""
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr ""
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr ""
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr ""
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr ""
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr ""
@@ -834,6 +861,16 @@ msgstr ""
msgid "Awaiting checks"
msgstr ""
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+msgid "No record found"
+msgstr ""
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr ""
@@ -1201,17 +1238,12 @@ msgstr ""
msgid "Delete %s?"
msgstr ""
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, python-format
-msgid "No A record found for MX %(domain)s"
+msgid "No MX record for %s"
msgstr ""
-#: tests/test_mx.py:147
-#, python-format
-msgid "No AAAA record found for MX %(domain)s"
-msgstr ""
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1250,11 +1282,11 @@ msgstr ""
msgid "DNSBL summary for {}"
msgstr ""
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr ""
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] ""
diff --git a/modoboa/admin/locale/es/LC_MESSAGES/django.po b/modoboa/admin/locale/es/LC_MESSAGES/django.po
index 20b3ea2f1..0949420e7 100644
--- a/modoboa/admin/locale/es/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/es/LC_MESSAGES/django.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2017-06-28 00:48+0000\n"
"Last-Translator: Evilham \n"
"Language-Team: Spanish (http://www.transifex.com/tonio/modoboa/language/"
@@ -57,49 +57,97 @@ msgid ""
msgstr ""
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Activar comprobación de DNS"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Compruebe que cada dominio tenga un registro MX válido"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Habilitar comprobación MX"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Compruebe que cada dominio tenga un registro MX válido"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Habilitar comprobación MX"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Compruebe que cada dominio tenga un registro MX válido"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Habilitar comprobación MX"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Compruebe que cada dominio tenga un registro MX válido"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Habilitar comprobación DNSBL"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Compruebe cada dominio con los principales proveedores de DNSBL"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Mailboxes"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Manejar mailboxes en el sistema de fichero"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -107,19 +155,19 @@ msgstr ""
"Renombrar o eliminar mailboxes en el sistema de ficheros cuando sean "
"renombrados o eliminados dentro de Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Propietario de los mailboxes"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "Cuenta de UNIX que posee los mailboxes en el sistema de ficheros"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Cuota del dominio por defecto"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -127,12 +175,12 @@ msgstr ""
"Cuota por defecto (en MB) que se aplica a la creación de nuevos dominios que "
"no tuvieran un valor especificado. Un valor de 0 significa que no hay cuota."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Cuota de mailbox por defecto"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -140,59 +188,59 @@ msgstr ""
"La cuota de mailbox por defecto (en MB) se aplica a los dominios nuevos que "
"no especifican este valor. Un valor de 0 significa ningún limite."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Elminar cuentas automáticamente"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "Cuando un mailbox es eliminado, también lo es su cuenta asociada."
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Creación automática de dominio/buzón"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr "Crear un dominio y un buzón cuando se cree automáticamente una cuenta."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr ""
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Debe ser un entero positivo"
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain not found."
msgid "Directory not found."
msgstr "Dominio no encontrado."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr ""
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administración"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Dominio"
-#: constants.py:99
+#: constants.py:97
#, fuzzy
#| msgid "New domain"
msgid "Relay domain"
@@ -255,7 +303,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Sólo se permiten superadministradores para este modo"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Este campo es obligatorio."
@@ -426,7 +474,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -455,7 +503,7 @@ msgstr "alias del dominio"
msgid "A %s with this name already exists"
msgstr "Ya existe un %s con ese nombre"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
#, fuzzy
#| msgid "No MX record found for this domain."
msgid "No authorized MX record found for this domain"
@@ -465,7 +513,7 @@ msgstr "No se encontró ningún registro MX para este dominio."
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "No puede superar la cuota de dominio"
@@ -617,46 +665,40 @@ msgstr "Identidades"
msgid "Forward"
msgstr "Siguiente"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Es obligatorio un buzón"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "No está autorizado para importar dominios"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "No está autorizado para importar alias de dominio."
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, fuzzy, python-format
#| msgid "No MX record found for this domain."
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "No se encontró ningún registro MX para este dominio."
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, fuzzy, python-format
#| msgid "MX records of {}"
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Registros MX de {}"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No MX record found for this domain."
-msgid "No {type} record found for MX {mx}"
-msgstr "No se encontró ningún registro MX para este dominio."
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '{}'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -676,20 +718,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] DNSBL problema(s) para el dominio {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "El dominio {} no tiene registro MX"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "El registro MX para el dominio {0} no es válido: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] MX problema(s) para el dominio {}"
@@ -701,7 +743,7 @@ msgstr "dirección"
msgid "The alias address."
msgstr "La dirección del alias."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "activado"
@@ -747,55 +789,50 @@ msgstr "nombre"
msgid "The domain name"
msgstr "Nombre del dominio"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Marcar para activar este dominio"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Activar comprobación de DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Seleccionar para activar la comprobación de DNS para este dominio"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Línea inválida"
-#: models/domain.py:313
+#: models/domain.py:330
#, fuzzy
#| msgid "No MX record found for this domain."
msgid "No authorized MX record found for domain {}"
msgstr "No se encontró ningún registro MX para este dominio."
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Cuota inválida para dominio '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Cuota de mailbox por defecto inválida para dominio '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr "La cuota de mailbox por defecto no puede superar la cuota de dominio"
@@ -833,44 +870,49 @@ msgstr "Una cuota es obligatoria"
msgid "Domain quota exceeded"
msgstr "Cuota de dominio excedida"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Cuota de mailbox predeterminda en MB. Un valor de 0 significa ningún limite."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Permiso denegado."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista de dominios administrados (sólo distribuidores y administradores de "
"dominio)."
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "No estás autorizado para esta función."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Debe ser igual a la dirección completa del buzón"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "El dominio local {} no existe"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "Lista de destinatarios"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Dominio no encontrado."
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "No tienes acceso a este dominio"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -907,6 +949,18 @@ msgstr "Deshabilitado"
msgid "Awaiting checks"
msgstr "Esperando verificación"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No MX record found for this domain."
+msgid "No record found"
+msgstr "No se encontró ningún registro MX para este dominio."
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Estadísticas globales"
@@ -1303,19 +1357,13 @@ msgstr "Editar {}"
msgid "Delete %s?"
msgstr "¿Eliminar %s?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "No se encontró ningún registro MX para este dominio."
+#| msgid "MX records of {}"
+msgid "No MX record for %s"
+msgstr "Registros MX de {}"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "No se encontró ningún registro MX para este dominio."
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1354,11 +1402,11 @@ msgstr "Registros MX de {}"
msgid "DNSBL summary for {}"
msgstr "Resumen de DNSBL para {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "No puedo eliminar su propio dominio"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Dominio eliminado"
@@ -1404,6 +1452,21 @@ msgstr "Importar identidades"
msgid "Forward updated"
msgstr "Reenvío actualizado"
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "No se encontró ningún registro MX para este dominio."
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "No se encontró ningún registro MX para este dominio."
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "No se encontró ningún registro MX para este dominio."
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr ""
#~ "La cuota compartida entre las mailboxes en MB. Un valor de 0 significa "
diff --git a/modoboa/admin/locale/fr/LC_MESSAGES/django.po b/modoboa/admin/locale/fr/LC_MESSAGES/django.po
index 2d87982c9..2e5b5ea58 100644
--- a/modoboa/admin/locale/fr/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/fr/LC_MESSAGES/django.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
-"PO-Revision-Date: 2018-01-25 09:18+0100\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
+"PO-Revision-Date: 2018-11-20 10:36+0100\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: French (http://www.transifex.com/tonio/modoboa/language/fr/)\n"
"Language: fr\n"
@@ -58,28 +58,60 @@ msgstr ""
"adresse autorisée."
#: app_settings.py:55
+msgid "Enable SPF checks"
+msgstr "Activer les tests SPF"
+
+#: app_settings.py:58
+msgid "Check if every domain has a valid SPF record"
+msgstr "Vérifie que chaque domaine a un enregistrement SPF valide"
+
+#: app_settings.py:63
+msgid "Enable DKIM checks"
+msgstr "Activer les tests DKIM"
+
+#: app_settings.py:66
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Vérifie que chaque domaine ayant la signature DKIM activée dispose d'un enregistrement DNS valide"
+
+#: app_settings.py:72
+msgid "Enable DMARC checks"
+msgstr "Activer les tests DMARC"
+
+#: app_settings.py:75
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Vérifie que chaque domaine a un enregistrement DMARC valide"
+
+#: app_settings.py:80
+msgid "Enable autoconfig checks"
+msgstr "Activer les tests d'autoconfiguration"
+
+#: app_settings.py:83
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Vérifie que chaque domaine a les enregistrements nécessaires à l'autoconfiguration"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Activer les vérifications DNSBL"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Vérifie chaque domaine auprès des fournisseurs de DNSBL"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr "Serveur DNS personnalisé"
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
"Utiliser un serveur DNS personnalisé à la place de la configuration par "
"défaut du serveur"
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr "Répertoire de stockage des clés DKIM"
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
@@ -89,23 +121,23 @@ msgstr ""
"Assurez vous que ce répertoire appartient à l'utilisateur root et qu'il "
"n'est pas lisible par le monde extérieur."
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr "Taille par défaut d'une clé DKIM"
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr "Taille par défaut en octets des clés DKIM nouvellement générées."
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Boites"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Gérer les boites sur le système de fichiers"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -113,19 +145,19 @@ msgstr ""
"Renommer ou supprimer les boites sur le système de fichiers quand elles sont "
"renommées ou supprimées dans Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Propriétaire des boites"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "Le compte UNIX qui possède les boites sur le système de fichiers"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Quota de domaine par défaut"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -133,12 +165,12 @@ msgstr ""
"Quota par défaut (en Mo) appliqué aux domaines fraichement créés et ne "
"spécifiant pas de valeur. 0 signifie qu'aucun quota ne sera appliqué."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Quota par défaut pour une boîte aux lettres"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -146,64 +178,64 @@ msgstr ""
"Quota par défaut pour une boîte aux lettres utilisé pour les domaines "
"nouvellement créés. Une valeur à 0 signifie pas de quota."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Suppression automatique de compte"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr ""
"Lorsqu'une boite aux lettres est supprimée, supprimer le compte associé en "
"même temps"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Création automatique de domaine/boite aux lettres"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"Créer un domaine et une boite aux lettres quand un compte est créé "
"automatiquement."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Créer un alias quand une boite aux lettres est renommée"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
"Créer un alias en utilisant l'ancienne adresse quand une boite aux lettres "
"est renommée."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Doit être un entier positif"
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr "Répertoire introuvable."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
"impossible de trouver openssl, veuillez vous assurer vous qu'il est installé."
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Définissez au moins un réseau / une adresse autorisé"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administration"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domaine"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr "Domaine relais"
@@ -264,7 +296,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Seuls les super administrateurs sont autorisés pour ce mode"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Ce champ est requis."
@@ -431,13 +463,13 @@ msgstr ""
msgid "Key selector"
msgstr "Sélecteur de clé"
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
msgstr ""
-"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, "
-"Mo (défaut) ou Go. Une valeur à 0 signifie pas de quota."
+"Quota partagé entre les boîtes aux lettres. Peut être exprimé en Ko, Mo "
+"(défaut) ou Go. Une valeur à 0 signifie pas de quota."
#: forms/domain.py:56
msgid ""
@@ -456,7 +488,7 @@ msgstr "alias de domaine"
msgid "A %s with this name already exists"
msgstr "Un %s de ce nom existe déjà"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "Aucun enregistrement MX autorisé trouvé pour ce domaine"
@@ -464,7 +496,7 @@ msgstr "Aucun enregistrement MX autorisé trouvé pour ce domaine"
msgid "DKIM keys storage directory not configured"
msgstr "Répertoire de stockage des clés DKIM non configuré"
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "Ne peut pas être supérieur au quota du domaine"
@@ -614,43 +646,38 @@ msgstr "Identités"
msgid "Forward"
msgstr "Transfert"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Une boite aux lettres est requise"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Vous n'êtes pas autorisé à importer des domaines"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Vous n'êtes pas autorisé à importer des alias de domaine."
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, python-format
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Aucun enregistrement DNS trouvé pour %s."
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, python-format
-msgid "No MX record for %s"
-msgstr "Aucun enregistrement MX trouvé pour %s"
+msgid "No %(type)s record for %(name)s"
+msgstr "Aucun enregistrement %(type)s trouvé pour %(name)s"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr "Aucun serveur de noms fonctionnel trouvé"
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr "Timeout de résolution DNS, impossible de requêter %s pour l'instant"
-#: lib.py:205
-#, python-brace-format
-msgid "No {type} record found for MX {mx}"
-msgstr "Aucun enregistrement {type} trouvé pour le MX {mx}."
-
-#: lib.py:214
+#: lib.py:231
#, python-brace-format
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Format d'adresse IP incorrect pour {domain}; {addr}"
@@ -669,20 +696,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] Problème(s) DNSBL pour le domaine {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Le domaine {} n'a pas d'enregistrement MX"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "Enregistrement MX invalide pour le domaine {0} : {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] problème(s) de MX pour le domaine {}"
@@ -694,7 +721,7 @@ msgstr "Adresse"
msgid "The alias address."
msgstr "L'adresse de l'alias"
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "Activé"
@@ -740,57 +767,51 @@ msgstr "Nom"
msgid "The domain name"
msgstr "Le nom du domaine"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Quota par défaut en Mo appliqué aux boîtes aux lettres. Une valeur à 0 "
-"signifie pas de quota."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Cocher pour activer ce domaine"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Activer les tests DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Cocher pour activer les tests DNS pour ce domaine"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr "Activer la signature DKIM"
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
"Si vous activez cette fonctionnalité, une clé DKIM sera générée pour ce "
"domain."
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr "Taille de la clé"
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Ligne invalide"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "Aucun enregistrement MX autorisé trouvé pour le domaine {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Quota invalide pour le domaine '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr ""
"Quota par défaut pour une boîte aux lettres invalide pour le domaine '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
"Le quota par défaut d'une boîte aux lettres ne peut pas être supérieur au "
@@ -830,42 +851,48 @@ msgstr "Un quota est requis"
msgid "Domain quota exceeded"
msgstr "Quota du domaine dépassé"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Quota par défaut en Mo appliqué aux boîtes aux lettres. Une valeur à 0 "
+"signifie pas de quota."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Permission refusée."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Liste des domaines administrés (revendeurs et administrateurs de domaine "
"seulement)."
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Non autorisé pour ce rôle."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Doit être égale au champ full_address dans mailbox"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Le domaine local {} n'existe pas"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "Une liste de destinataire"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Domaine introuvable."
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr "Vous n'avez pas accès à ce domaine."
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr "Vous n'avez pas accès à cette boîtes aux lettres."
@@ -896,6 +923,16 @@ msgstr "Désactivés"
msgid "Awaiting checks"
msgstr "En attente de vérification"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+msgid "No record found"
+msgstr "Aucun enregistrement trouvé"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr "En attente de génération de la clé"
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Statistiques globales"
@@ -1059,7 +1096,7 @@ msgstr "Afficher la clé"
#: templates/admin/domain_detail.html:109
msgid "Generate new key"
-msgstr ""
+msgstr "Générer une nouvelle clé"
#: templates/admin/domain_detail.html:111
msgid "Not generated"
@@ -1286,17 +1323,12 @@ msgstr "Modifier {}"
msgid "Delete %s?"
msgstr "Supprimer %s ?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, python-format
-msgid "No A record found for MX %(domain)s"
-msgstr "Aucun enregistrement A trouvé pour le MX %(domain)s."
+msgid "No MX record for %s"
+msgstr "Aucun enregistrement MX trouvé pour %s"
-#: tests/test_mx.py:147
-#, python-format
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Aucun enregistrement AAAA trouvé pour le MX %(domain)s."
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr "Format d'adresse IP incorrect pour %(domain)s; %(addr)s"
@@ -1335,11 +1367,11 @@ msgstr "Enregistrements MX de {}"
msgid "DNSBL summary for {}"
msgstr "Résumé DNSBL pour {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Vous ne pouvez pas supprimer votre propre domaine"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domaine supprimé"
@@ -1385,6 +1417,15 @@ msgstr "Importer des identités"
msgid "Forward updated"
msgstr "Transfert mis à jour"
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Aucun enregistrement {type} trouvé pour le MX {mx}."
+
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Aucun enregistrement A trouvé pour le MX %(domain)s."
+
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Aucun enregistrement AAAA trouvé pour le MX %(domain)s."
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr ""
#~ "Quota en Mo partagé entre les boîtes aux lettres. Une valeur à 0 signifie "
diff --git a/modoboa/admin/locale/it/LC_MESSAGES/django.po b/modoboa/admin/locale/it/LC_MESSAGES/django.po
index 0316b5bc5..1f99c2694 100644
--- a/modoboa/admin/locale/it/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/it/LC_MESSAGES/django.po
@@ -1,7 +1,7 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-#
+#
# Translators:
# Giancarlo Gaifas , 2013
# marcotrevisan , 2018
@@ -10,14 +10,15 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2018-11-02 14:26+0000\n"
"Last-Translator: marcotrevisan \n"
-"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/it/)\n"
+"Language-Team: Italian (http://www.transifex.com/tonio/modoboa/language/"
+"it/)\n"
+"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: app_settings.py:24 handlers.py:265
@@ -40,9 +41,11 @@ msgstr "MX validi"
#: app_settings.py:38
msgid ""
-"A list of IP or network address every MX record should match. A warning will"
-" be sent if a record does not respect it."
-msgstr "Una lista di indirizzi IP o host a cui ciascun record MX dovrebbe appartenere. Verrà inviato un avviso se un record non la rispetta. "
+"A list of IP or network address every MX record should match. A warning will "
+"be sent if a record does not respect it."
+msgstr ""
+"Una lista di indirizzi IP o host a cui ciascun record MX dovrebbe "
+"appartenere. Verrà inviato un avviso se un record non la rispetta. "
#: app_settings.py:46
msgid "New domains must use authorized MX(s)"
@@ -52,138 +55,200 @@ msgstr "Nuovi domini devono utilizzare MX autorizzati"
msgid ""
"Prevent the creation of a new domain if its MX record does not use one of "
"the defined addresses."
-msgstr "Impedisci la creazione di un nuovo dominio se il suo record MX non utilizza uno degli indirizzi definiti."
+msgstr ""
+"Impedisci la creazione di un nuovo dominio se il suo record MX non utilizza "
+"uno degli indirizzi definiti."
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Abilita i controlli DNS"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Verifica che ogni dominio abbia un record MX valido"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Abilita i controlli MX"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Verifica che ogni dominio abbia un record MX valido"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Abilita i controlli MX"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Verifica che ogni dominio abbia un record MX valido"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Abilita i controlli MX"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Verifica che ogni dominio abbia un record MX valido"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Abilita i controlli DNSBL"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Verifica ciascun dominio sui principali provider DNSBL"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr "DNS server custom"
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr "Usa un DNS server custom invece della configurazione a sever locale"
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr "Cartella di salvataggio delle chiavi DKIM"
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
-msgstr "Percorso assoluto della cartella dove le chiavi private DKIM verranno salvate. Assicurarsi che questa cartella sia di proprietà dell'utente root e che non sia leggibile da altri."
+msgstr ""
+"Percorso assoluto della cartella dove le chiavi private DKIM verranno "
+"salvate. Assicurarsi che questa cartella sia di proprietà dell'utente root e "
+"che non sia leggibile da altri."
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr "Lunghezza predefinita delle chiavi DKIM"
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr "Lunghezza predefinita in numero di bit per nuove chiavi DKIM."
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Caselle di posta"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Gestione delle caselle di posta nel filsystem"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
-msgstr "Rinomina o rimuovi le caselle di posta nel filesystem quando vengono rinominate o cancellate in Modoboa "
+msgstr ""
+"Rinomina o rimuovi le caselle di posta nel filesystem quando vengono "
+"rinominate o cancellate in Modoboa "
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Proprietario delle caselle postali"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "L'account UNIX a cui appartengono le caselle postali nel filsystem"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Quota predefinita per il domini"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
-msgstr "Quota predefinita (in MB) applicata ai nuovi domini che non la specificano. Un valore 0 implica nessuna quota."
+msgstr ""
+"Quota predefinita (in MB) applicata ai nuovi domini che non la specificano. "
+"Un valore 0 implica nessuna quota."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Dimensione massima predefinita per le mailbox"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
-msgstr "Dimensione massima predefinita (in MB) applicata per nuovi domini creati senza alcun valore specificato. Un valore 0 indica nessun limite."
+msgstr ""
+"Dimensione massima predefinita (in MB) applicata per nuovi domini creati "
+"senza alcun valore specificato. Un valore 0 indica nessun limite."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Rimozione automatica dell'account"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
-msgstr "Quando una casella postale viene rimossa rimuovi anche l'account associato"
+msgstr ""
+"Quando una casella postale viene rimossa rimuovi anche l'account associato"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Creazione automatica del domini/casella di posta elettronica"
-#: app_settings.py:138
-msgid ""
-"Create a domain and a mailbox when an account is automatically created."
-msgstr "Crea un dominio ed una casella di posta elettronica quando si crea un account utente"
+#: app_settings.py:171
+msgid "Create a domain and a mailbox when an account is automatically created."
+msgstr ""
+"Crea un dominio ed una casella di posta elettronica quando si crea un "
+"account utente"
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Crea un alias quando una mailbox viene rinominata"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
-msgstr "Crea un alias con il vecchio indirizzo quando una mailbox viene rinominata."
+msgstr ""
+"Crea un alias con il vecchio indirizzo quando una mailbox viene rinominata."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Dev'essere un intero positivo"
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr "Cartella non trovata."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr "openssl non trovato, assicurarsi che sia installato."
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Definire almeno una rete / indirizzo autorizzato"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Amministrazione"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Dominio"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr "Dominio di relay"
@@ -195,7 +260,9 @@ msgstr "Nome utente"
msgid ""
"The user's name. Must be a valid e-mail address for simple users or "
"administrators with a mailbox."
-msgstr "Il nome dell'utente. Dev'essere un indirizzo e-mail per gli utenti semplici o gli amministratori che posseggono una casella"
+msgstr ""
+"Il nome dell'utente. Dev'essere un indirizzo e-mail per gli utenti semplici "
+"o gli amministratori che posseggono una casella"
#: forms/account.py:43 templates/admin/account_detail.html:29
msgid "Role"
@@ -217,7 +284,9 @@ msgstr "Password casuale"
msgid ""
"Generate a random password. If you're updating this account and check this "
"box, a new password will be generated."
-msgstr "Genera una password casuale. Selezionando questa casella durante l'aggioenamento dell'account, verrà generata una nuova password."
+msgstr ""
+"Genera una password casuale. Selezionando questa casella durante "
+"l'aggioenamento dell'account, verrà generata una nuova password."
#: forms/account.py:56
msgid "Password"
@@ -229,7 +298,8 @@ msgstr "Conferma"
#: forms/account.py:64
msgid "Enter the same password as above, for verification."
-msgstr "Inserisci la medesima password che hai inserito sopra, per la verifica."
+msgstr ""
+"Inserisci la medesima password che hai inserito sopra, per la verifica."
#: forms/account.py:76
msgid "Enabled"
@@ -240,7 +310,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Solo i super amministratori possono operare in questa modalità"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Questo campo è obbligatorio."
@@ -261,17 +331,20 @@ msgid "Create an alias using the old address"
msgstr "Crea un alias con il vecchio indirizzo."
#: forms/account.py:233 forms/domain.py:45
-#: templates/admin/account_detail.html:45
-#: templates/admin/domain_detail.html:49
+#: templates/admin/account_detail.html:45 templates/admin/domain_detail.html:49
msgid "Quota"
msgstr "Quota"
#: forms/account.py:236
msgid ""
-"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a"
-" custom value or use domain's default one. Leave empty to define an "
-"unlimited value (not allowed for domain administrators)."
-msgstr "Dimensione massima per questa mailbox, può essere espressa in KB, MB (predefinito) o GB. Definire un valore personalizzato o utilizzare quello predefinito per il dominio. Lasciare vuoto per specificare un valore non limitato (non permesso per amministratori di dominio)."
+"Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a "
+"custom value or use domain's default one. Leave empty to define an unlimited "
+"value (not allowed for domain administrators)."
+msgstr ""
+"Dimensione massima per questa mailbox, può essere espressa in KB, MB "
+"(predefinito) o GB. Definire un valore personalizzato o utilizzare quello "
+"predefinito per il dominio. Lasciare vuoto per specificare un valore non "
+"limitato (non permesso per amministratori di dominio)."
#: forms/account.py:246 forms/domain.py:35
#: templates/admin/domain_headers.html:4
@@ -283,7 +356,10 @@ msgid ""
"Alias(es) of this mailbox. Indicate only one address per input, press ENTER "
"to add a new input. To create a catchall alias, just enter the domain name "
"(@domain.tld)."
-msgstr "Alias di questa mailbox. Indicare un solo indirizzo per inserimento, premere ENTER per effettuare un nuovo inserimento. Per creare un alias \"intercetta-tutto\", inserire semplicemente il nome dominio (@domain.tld)."
+msgstr ""
+"Alias di questa mailbox. Indicare un solo indirizzo per inserimento, premere "
+"ENTER per effettuare un nuovo inserimento. Per creare un alias \"intercetta-"
+"tutto\", inserire semplicemente il nome dominio (@domain.tld)."
#: forms/account.py:255
msgid "Sender addresses"
@@ -294,7 +370,10 @@ msgid ""
"Additional sender address(es) for this account. The user will be allowed to "
"send emails using this address, even if it does not exist locally. Indicate "
"one address per input. Press ENTER to add a new input."
-msgstr "Indirizzo(/i) mittente aggiuntivo per questo account. L'utente potrà inviare email usando questo indirizzo/i, anche se non esiste localmente. Indicare un indirizzo per inserimento. Premere ENTER per un nuovo inserimento."
+msgstr ""
+"Indirizzo(/i) mittente aggiuntivo per questo account. L'utente potrà inviare "
+"email usando questo indirizzo/i, anche se non esiste localmente. Indicare un "
+"indirizzo per inserimento. Premere ENTER per un nuovo inserimento."
#: forms/account.py:313 forms/alias.py:92 models/mailbox.py:317
msgid "Domain does not exist"
@@ -357,7 +436,9 @@ msgstr "Indirizzo email"
msgid ""
"The alias address. To create a catchall alias, just enter the domain name "
"(@domain.tld)."
-msgstr "Indirizzi email alias. Per creare un alias catchall specifica il nome del dominio (@domain.tld)."
+msgstr ""
+"Indirizzi email alias. Per creare un alias catchall specifica il nome del "
+"dominio (@domain.tld)."
#: forms/alias.py:35 templates/admin/alias_detail.html:37
msgid "Recipients"
@@ -367,7 +448,9 @@ msgstr "Destinatari"
msgid ""
"Addresses this alias will point to. Indicate only one address per input, "
"press ENTER to add a new input."
-msgstr "Indirizzi verso il quale questo alias punterà . Indicare un solo indirizzo per ogni ingresso , premere INVIO per aggiungere un nuovo input ."
+msgstr ""
+"Indirizzi verso il quale questo alias punterà . Indicare un solo indirizzo "
+"per ogni ingresso , premere INVIO per aggiungere un nuovo input ."
#: forms/alias.py:112 forms/alias.py:114
msgid "This field is required"
@@ -385,23 +468,30 @@ msgstr "Tipo"
msgid ""
"Alias(es) of this domain. Indicate only one name per input, press ENTER to "
"add a new input."
-msgstr "Alias per questo dominio. Inserire un solo nome alla volta, premere INVIO per aggiungere un nuovo elemento"
+msgstr ""
+"Alias per questo dominio. Inserire un solo nome alla volta, premere INVIO "
+"per aggiungere un nuovo elemento"
#: forms/domain.py:43
msgid "Key selector"
msgstr "Selettore di chiave"
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
-msgstr "Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite."
+msgstr ""
+"Spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB "
+"(predefinito) o GB. Il valore 0 indica nessun limite."
#: forms/domain.py:56
msgid ""
"Default quota applied to mailboxes. Can be expressed in KB, MB (default) or "
"GB. A value of 0 means no quota."
-msgstr "Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun limite."
+msgstr ""
+"Valore predefinito per lo spazio massimo confiviso tra le mailbox. Può "
+"essere espresso in KB, MB (predefinito) o GB. Il valore 0 indica nessun "
+"limite."
#: forms/domain.py:98 handlers.py:165
msgid "domain alias"
@@ -412,7 +502,7 @@ msgstr "alias del dominio"
msgid "A %s with this name already exists"
msgstr "Un %s con questo nome esiste già"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "Non è stato trovato alcun record MX autorizzato per questo dominio"
@@ -420,9 +510,10 @@ msgstr "Non è stato trovato alcun record MX autorizzato per questo dominio"
msgid "DKIM keys storage directory not configured"
msgstr "Cartella di salvataggio per le chiavi DKIM non configurata."
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
-msgstr "Non può essere maggiore dello spazio massimo definito a livello di dominio"
+msgstr ""
+"Non può essere maggiore dello spazio massimo definito a livello di dominio"
#: forms/domain.py:156
msgid "You can't define an unlimited quota."
@@ -451,7 +542,9 @@ msgstr "Nome"
msgid ""
"The administrator's name. Don't include the domain's name here, it will be "
"automatically appended."
-msgstr "Il nome dell'amministratore. Non includere il nome del dominio, verrà aggiunto automaticamente."
+msgstr ""
+"Il nome dell'amministratore. Non includere il nome del dominio, verrà "
+"aggiunto automaticamente."
#: forms/domain.py:252
msgid "Generate a random password for the administrator."
@@ -520,7 +613,8 @@ msgstr "Mantieni copie locali"
#: forms/forward.py:26
msgid "Forward messages and store copies into your local mailbox"
-msgstr "Inoltra i messaggi e memorizza le copie nella tua casella di posta locale"
+msgstr ""
+"Inoltra i messaggi e memorizza le copie nella tua casella di posta locale"
#: forms/import_.py:15
msgid "Select a file"
@@ -540,7 +634,8 @@ msgstr "Cripta le password"
#: forms/import_.py:44
msgid "Check this option if passwords contained in your file are not crypted"
-msgstr "Seleziona questa opzione se le password contenute nel file non sono criptate"
+msgstr ""
+"Seleziona questa opzione se le password contenute nel file non sono criptate"
#: handlers.py:214
#, python-format
@@ -566,43 +661,42 @@ msgstr "Identità"
msgid "Forward"
msgstr "Inoltra"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "É necessaria una casella"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Non hai i permessi di importare domini"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Non hai i permessi di importare gli alias dominio"
-#: lib.py:187 tests/test_mx.py:135
-#, python-format
-msgid "No DNS records found for %s"
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
+#, fuzzy, python-format
+#| msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Nessun record DNS trovato per %s"
-#: lib.py:189 tests/test_mx.py:138
-#, python-format
-msgid "No MX record for %s"
+#: lib.py:196
+#, fuzzy, python-format
+#| msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Nessun record MX per %s"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr "Nessun DNS server funzionante trovato"
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
-msgstr "Timeout nella risoluzione DNS del nome, problema momentaneo nell'interrogare %s "
+msgstr ""
+"Timeout nella risoluzione DNS del nome, problema momentaneo nell'interrogare "
+"%s "
-#: lib.py:205
-#, python-brace-format
-msgid "No {type} record found for MX {mx}"
-msgstr "Nessun record {type} trovato per l'MX {mx}"
-
-#: lib.py:214
+#: lib.py:231
#, python-brace-format
msgid "Invalid IP address format for {domain}; {addr}"
msgstr "Formato di indirizzo IP non valido per {domain}; {addr}"
@@ -619,22 +713,23 @@ msgstr "Lettura del file CSV utilizzando la codifica %(encoding)s"
#: management/commands/subcommands/_import.py:126
#, python-format
msgid "Unable to decode CSV file using %(encoding)s encoding"
-msgstr "Impossibile decodificare il file CSV utilizzando la codifica %(encoding)s"
+msgstr ""
+"Impossibile decodificare il file CSV utilizzando la codifica %(encoding)s"
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] problema(/i) DNSBL per il dominio {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Il dominio {} non ha record MX"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "Il record MX per il dominio {0} non è valido: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] problema(/i) MX per il dominio {}"
@@ -646,7 +741,7 @@ msgstr "indirizzo"
msgid "The alias address."
msgstr "Indirizzi Alias."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "Attivato"
@@ -692,54 +787,53 @@ msgstr "nome"
msgid "The domain name"
msgstr "Il nome del dominio"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr "Spazio massimo predefinito in MB applicato alle caselle di posta. Un valore 0 indica nessun limite."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Seleziona per attivare questo dominio"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Abilita i controlli DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Seleziona per abilitare i controlli DNS per questo dominio"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr "Abilita la firma DKIM"
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
-msgstr "Se attivi questa feature, verrà generata una chiave DKIM per questo dominio."
+msgstr ""
+"Se attivi questa feature, verrà generata una chiave DKIM per questo dominio."
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr "Lunghezza della chiave"
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Riga non valida"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "Non è stato trovato alcun record MX autorizzato per il dominio {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Valore di spazio massimo non valido per il dominio '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Valore di spazio massimo predefinito non valido per il dominio '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
-msgstr "Lo spazio massimo predefinito per una casella di posta non può superare quello definito a livello di dominio"
+msgstr ""
+"Lo spazio massimo predefinito per una casella di posta non può superare "
+"quello definito a livello di dominio"
#: models/domain_alias.py:39
msgid "The alias name"
@@ -775,40 +869,48 @@ msgstr "È richiesta una quota"
msgid "Domain quota exceeded"
msgstr "Superato lo spazio massimo per il dominio"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Spazio massimo predefinito in MB applicato alle caselle di posta. Un valore "
+"0 indica nessun limite."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Permesso negato."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
-msgstr "Lista dei domini amministrati (solo per rivenditori e amministratori di dominio)."
+msgstr ""
+"Lista dei domini amministrati (solo per rivenditori e amministratori di "
+"dominio)."
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Non consentito per questo ruolo."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Deve essere uguale a full_address della casella di posta"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Il dominio locale {} non esiste"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "Una lista di destinatari"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Dominio non trovato."
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr "Non hai accesso a questo dominio"
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr "Non hai accesso a questa casella di posta."
@@ -839,6 +941,18 @@ msgstr "Disabilitato"
msgid "Awaiting checks"
msgstr "In attesa dei controlli"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No DNS records found for %s"
+msgid "No record found"
+msgstr "Nessun record DNS trovato per %s"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Statistiche globali"
@@ -979,14 +1093,12 @@ msgstr "MB"
msgid "Usage"
msgstr "Utilizzo"
-#: templates/admin/domain_detail.html:57
-#: templates/admin/domains_quotas.html:11
+#: templates/admin/domain_detail.html:57 templates/admin/domains_quotas.html:11
msgctxt "quota"
msgid "used"
msgstr "utilizzato"
-#: templates/admin/domain_detail.html:58
-#: templates/admin/domains_quotas.html:12
+#: templates/admin/domain_detail.html:58 templates/admin/domains_quotas.html:12
msgid "allocated"
msgstr "allocato"
@@ -1096,17 +1208,31 @@ msgid ""
"verify recipients The first element of each line is "
"mandatory and must be equal to one of the previous values.
You can "
"use a different character as separator.
"
-msgstr "Fornire un file CSV le cui linee rispettino uno dei seguenti formati: - dominio; nome; dimensioni massime; dimensioni massime di default per casella postale; abilitato
- alias di dominio; nome; dominio destinazione; abilitato
- dominio di relay; nome; host destinazione; porta destinazione; servizio; abilitato; verifica destinatari
Il primo elemento di ciascuna riga è obbligatorio e deve essere uguale ad uno dei precedenti valori.
Si uò utilizzare un diverso separatore.
"
+msgstr ""
+"Fornire un file CSV le cui linee rispettino uno dei seguenti formati: "
+"- dominio; nome; dimensioni massime; dimensioni massime di default "
+"per casella postale; abilitato
- alias di dominio; nome; "
+"dominio destinazione; abilitato
- dominio di relay; nome; "
+"host destinazione; porta destinazione; servizio; abilitato; verifica "
+"destinatari
Il primo elemento di ciascuna riga è "
+"obbligatorio e deve essere uguale ad uno dei precedenti valori.
Si uò "
+"utilizzare un diverso separatore.
"
#: templates/admin/import_identities_form.html:6
msgid ""
"Provide a CSV file where lines respect one of the following formats: "
-"- account; loginname; password; first name; last name; enabled; group;"
-" address; quota; [, domain, ...]
- alias; address; enabled; "
+"
- account; loginname; password; first name; last name; enabled; group; "
+"address; quota; [, domain, ...]
- alias; address; enabled; "
"recipient; recipient; ...
The first element of each line "
-"is mandatory and must be equal to one of the previous values.
You can"
-" use a different character as separator.
"
-msgstr "Fornire un file CSV le cui linee rispettino uno dei seguenti formati: - account; nomeutente; password; nome; cognome; abilitato; gruppo; indirizzo; dimensioni massime; [, dominio, ...]
- alias; indirizzo; abilitato; destinatario; destinatario; ...
Il primo elemento di ciascuna linea è obbligatorio e deve essere uguale ad uno dei precedenti valori.
Si può utilizzare un diverso separatore.
"
+"is mandatory and must be equal to one of the previous values.
You can "
+"use a different character as separator.
"
+msgstr ""
+"Fornire un file CSV le cui linee rispettino uno dei seguenti formati: "
+"- account; nomeutente; password; nome; cognome; abilitato; gruppo; "
+"indirizzo; dimensioni massime; [, dominio, ...]
- alias; "
+"indirizzo; abilitato; destinatario; destinatario; ...
Il "
+"primo elemento di ciascuna linea è obbligatorio e deve essere uguale ad uno "
+"dei precedenti valori.
Si può utilizzare un diverso separatore.
"
#: templates/admin/importform.html:6
msgid "Help"
@@ -1134,7 +1260,9 @@ msgstr "Aggiornato"
#: templates/admin/mx_domain_detail.html:23
msgid "This IP does not match any of the valid MXs defined in parameters"
-msgstr "Questo indirizzo IP non coincide con nessuno degli MX validi definiti nei parametri."
+msgstr ""
+"Questo indirizzo IP non coincide con nessuno degli MX validi definiti nei "
+"parametri."
#: templates/admin/mx_domain_detail.html:36
msgid "No MX record found for this domain."
@@ -1145,19 +1273,26 @@ msgstr "Non è stato trovato alcun record MX per questo dominio"
msgid ""
"Modoboa detected that domain %(domain)s is listed by the following DNSBL "
"providers:"
-msgstr "Modoboa ha rilevato che il dominio %(domain)sè presente nelle liste dei seguenti provider DNSBL:"
+msgstr ""
+"Modoboa ha rilevato che il dominio %(domain)sè presente nelle liste dei "
+"seguenti provider DNSBL:"
#: templates/admin/notifications/domain_in_dnsbl.html:11
msgid ""
"The domain's reputation will be affected and there is a chance that emails "
"coming from it are considered as spam. You should contact those providers "
"and ask them to unlist detected IP address(es)."
-msgstr "La reputazione del dominio verrà influenzata negativamente ed è probabile che le email provenienti da esso vengano considerate spam. Dovresti contattare questi provider e chiedere loro di togliere dalla lista gli indirizzi IP identificati."
+msgstr ""
+"La reputazione del dominio verrà influenzata negativamente ed è probabile "
+"che le email provenienti da esso vengano considerate spam. Dovresti "
+"contattare questi provider e chiedere loro di togliere dalla lista gli "
+"indirizzi IP identificati."
#: templates/admin/notifications/domain_invalid_mx.html:3
#, python-format
msgid "Modoboa detected that domain %(domain)s has no valid MX record:"
-msgstr "Modoboa ha rilevato che il dominio %(domain)snon ha un record MX valido:"
+msgstr ""
+"Modoboa ha rilevato che il dominio %(domain)snon ha un record MX valido:"
#: templates/admin/searchform.html:6
msgid "Search"
@@ -1208,17 +1343,12 @@ msgstr "Modifica {}"
msgid "Delete %s?"
msgstr "Eliminare %s?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, python-format
-msgid "No A record found for MX %(domain)s"
-msgstr "Nessun record A trovato per il record MX%(domain)s"
+msgid "No MX record for %s"
+msgstr "Nessun record MX per %s"
-#: tests/test_mx.py:147
-#, python-format
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Nessun record AAAA trovato per il record MX %(domain)s"
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr "Formato non valido per l'indirizzo IP %(domain)s;%(addr)s"
@@ -1257,11 +1387,11 @@ msgstr "Record MX di {}"
msgid "DNSBL summary for {}"
msgstr "Sommario DNSBL per {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Non puoi cancellare il tuo dominio"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Dominio cancellato"
@@ -1306,3 +1436,12 @@ msgstr "Identità di importazione"
#: views/user.py:40
msgid "Forward updated"
msgstr "Inoltro aggiornato"
+
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Nessun record {type} trovato per l'MX {mx}"
+
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Nessun record A trovato per il record MX%(domain)s"
+
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Nessun record AAAA trovato per il record MX %(domain)s"
diff --git a/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po b/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po
index 6b7bad750..41f553ed9 100644
--- a/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/ja_JP/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2016-09-14 17:06+0000\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/tonio/modoboa/"
@@ -54,49 +54,93 @@ msgid ""
msgstr ""
#: app_settings.py:55
-msgid "Enable DNSBL checks"
+#, fuzzy
+#| msgid "Enable DNSBL checks"
+msgid "Enable SPF checks"
msgstr "DNSBL チェックを有効にする"
#: app_settings.py:58
-msgid "Check every domain against major DNSBL providers"
+#, fuzzy
+#| msgid "Check every domain against major DNSBL providers"
+msgid "Check if every domain has a valid SPF record"
msgstr "すべてのドメインを 主な DNSBL プロバイダーでチェックする"
#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable DNSBL checks"
+msgid "Enable DKIM checks"
+msgstr "DNSBL チェックを有効にする"
+
+#: app_settings.py:66
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr ""
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable DNSBL checks"
+msgid "Enable DMARC checks"
+msgstr "DNSBL チェックを有効にする"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check every domain against major DNSBL providers"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "すべてのドメインを 主な DNSBL プロバイダーでチェックする"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable DNSBL checks"
+msgid "Enable autoconfig checks"
+msgstr "DNSBL チェックを有効にする"
+
+#: app_settings.py:83
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr ""
+
+#: app_settings.py:88
+msgid "Enable DNSBL checks"
+msgstr "DNSBL チェックを有効にする"
+
+#: app_settings.py:91
+msgid "Check every domain against major DNSBL providers"
+msgstr "すべてのドメインを 主な DNSBL プロバイダーでチェックする"
+
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "メールボックス"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "ファイルシステムのメールボックスを操作する"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -104,19 +148,19 @@ msgstr ""
"Modoboa で、メールボックスの名前の変更もしくは、削除したとき、ファイルシステ"
"ム上のメールボックスも、名前の変更もしくは削除する。"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "メールボックス所有者"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "ファイルシステム上のメールボックスを所有するUNIXアカウント"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "デフォルトドメインクォータ"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -125,14 +169,14 @@ msgstr ""
"用されます。\n"
"値が0の場合は、クォータ制限はありません。"
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
#, fuzzy
#| msgid "Default domain quota"
msgid "Default mailbox quota"
msgstr "デフォルトドメインクォータ"
-#: app_settings.py:122
+#: app_settings.py:155
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -145,60 +189,60 @@ msgstr ""
"用されます。\n"
"値が0の場合は、クォータ制限はありません。"
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "アカウントの自動削除"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "メールボックスが削除されたとき、関連するアカウントも削除します"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "ドメインとメールボックスを自動作成"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"アカウントが自動的に作成されたとき、ドメインとメールボックを作成します。"
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr ""
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "正の整数でなければいけません"
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain not found."
msgid "Directory not found."
msgstr "ドメインが見つかりません"
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr ""
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "管理"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "ドメイン"
-#: constants.py:99
+#: constants.py:97
#, fuzzy
#| msgid "New domain"
msgid "Relay domain"
@@ -262,7 +306,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "スーパー管理者だけが、このモードのために許可されています。"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
#, fuzzy
#| msgid "A mailbox is required"
msgid "This field is required."
@@ -444,7 +488,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -479,7 +523,7 @@ msgstr "ドメインエイリアス"
msgid "A %s with this name already exists"
msgstr " %s という名前は、すでに存在しています"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
#, fuzzy
#| msgid "No information available for this domain."
msgid "No authorized MX record found for this domain"
@@ -489,7 +533,7 @@ msgstr "このドメインに関する情報がありません。"
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr ""
@@ -643,46 +687,40 @@ msgstr "ID"
msgid "Forward"
msgstr "転送先"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "メールボックスは必須です"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "ドメインのインポートは許可されていません"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "ドメインエイリアスのインポートは許可されていません"
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, fuzzy, python-format
#| msgid "No information available for this domain."
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "このドメインに関する情報がありません。"
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, fuzzy, python-format
#| msgid "No information available for this domain."
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "このドメインに関する情報がありません。"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No information available for this domain."
-msgid "No {type} record found for MX {mx}"
-msgstr "このドメインに関する情報がありません。"
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -702,20 +740,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] ドメイン {} の DNSBL結果"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr ""
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr ""
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr ""
@@ -727,7 +765,7 @@ msgstr "アドレス"
msgid "The alias address."
msgstr "エイリアスアドレス"
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "有効"
@@ -773,69 +811,58 @@ msgstr "名前"
msgid "The domain name"
msgstr "ドメイン名"
-#: models/domain.py:44
-#, fuzzy
-#| msgid ""
-#| "Default quota (in MB) applied to freshly created domains with no value "
-#| "specified. A value of 0 means no quota."
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"デフォルトのクォータ (MB) が、値を指定しないで、新しく作成されたドメインに適"
-"用されます。\n"
-"値が0の場合は、クォータ制限はありません。"
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "このドメインをアクティブするために確認してください"
-#: models/domain.py:55
+#: models/domain.py:47
#, fuzzy
#| msgid "Enable DNSBL checks"
msgid "Enable DNS checks"
msgstr "DNSBL チェックを有効にする"
-#: models/domain.py:56
+#: models/domain.py:48
#, fuzzy
#| msgid "Check to activate this domain"
msgid "Check to enable DNS checks for this domain"
msgstr "このドメインをアクティブするために確認してください"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "不正な行"
-#: models/domain.py:313
+#: models/domain.py:330
#, fuzzy
#| msgid "No information available for this domain."
msgid "No authorized MX record found for domain {}"
msgstr "このドメインに関する情報がありません。"
-#: models/domain.py:320
+#: models/domain.py:337
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid quota value for domain '{}'"
msgstr "不正なドメイン %s のクォータ値"
-#: models/domain.py:327
+#: models/domain.py:344
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "不正なドメイン %s のクォータ値"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
@@ -875,42 +902,53 @@ msgstr "クォータは必須です"
msgid "Domain quota exceeded"
msgstr "ドメインが作成されました"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+#, fuzzy
+#| msgid ""
+#| "Default quota (in MB) applied to freshly created domains with no value "
+#| "specified. A value of 0 means no quota."
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"デフォルトのクォータ (MB) が、値を指定しないで、新しく作成されたドメインに適"
+"用されます。\n"
+"値が0の場合は、クォータ制限はありません。"
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "アクセス拒否"
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "管理しているドメインのリスト (リセーラーとドメイン管理者のみ)"
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "このロールには許可されていません"
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "メールボックス full_address に等しくなければなりません"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "ローカルドメイン {} は、存在しません"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr ""
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "ドメインが見つかりません"
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "このドメインにアクセスする権限がありません"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -949,6 +987,18 @@ msgstr "無効化"
msgid "Awaiting checks"
msgstr ""
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No information available for this domain."
+msgid "No record found"
+msgstr "このドメインに関する情報がありません。"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
#, fuzzy
#| msgid "Statistics"
@@ -1373,19 +1423,13 @@ msgstr "{} を編集"
msgid "Delete %s?"
msgstr "%s を削除しますか?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, fuzzy, python-format
#| msgid "No information available for this domain."
-msgid "No A record found for MX %(domain)s"
+msgid "No MX record for %s"
msgstr "このドメインに関する情報がありません。"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No information available for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "このドメインに関する情報がありません。"
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1423,11 +1467,11 @@ msgstr ""
msgid "DNSBL summary for {}"
msgstr "{} のDNSBL 要約"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "あなた自身のドメインは削除できません"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "ドメインを削除しました"
@@ -1471,6 +1515,21 @@ msgstr "ID をインポート"
msgid "Forward updated"
msgstr "転送先が更新されました"
+#, fuzzy
+#~| msgid "No information available for this domain."
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "このドメインに関する情報がありません。"
+
+#, fuzzy
+#~| msgid "No information available for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "このドメインに関する情報がありません。"
+
+#, fuzzy
+#~| msgid "No information available for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "このドメインに関する情報がありません。"
+
#, fuzzy
#~| msgid ""
#~| "Default quota (in MB) applied to freshly created domains with no value "
diff --git a/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po b/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po
index c748dfc9d..ce4b2d0b7 100644
--- a/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/nl_NL/LC_MESSAGES/django.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2014-12-31 11:37+0000\n"
"Last-Translator: TuxBrother \n"
"Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/"
@@ -55,49 +55,97 @@ msgid ""
msgstr ""
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Activeer DNS checks"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Controlleer of ieder domein een valide MX record heeft"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable DKIM checks"
+msgstr "Activeer DNS checks"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Controlleer of ieder domein een valide MX record heeft"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable DMARC checks"
+msgstr "Activeer DNS checks"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Controlleer of ieder domein een valide MX record heeft"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable autoconfig checks"
+msgstr "Activeer DNS checks"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Controlleer of ieder domein een valide MX record heeft"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Zet DNSBL controle aan"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Controlleer ieder domein bij de grote DNSBL providers"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Mailboxen"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Pas mailboxen op het bestandssysteem aan"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -105,20 +153,20 @@ msgstr ""
"Hernoem of verwijder mailboxen op het bestandssysteem wanner ze hernoemd of "
"verwijderd worden in Modoboa."
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Eigenaar van de mailboxen"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr ""
"De UNIX account die de rechten heeft tot de mailboxen op het bestandssysteem"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Standaard domein quota"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -126,14 +174,14 @@ msgstr ""
"Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe "
"te passen. Een waarde van 0 betekend geen quota."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
#, fuzzy
#| msgid "Default domain quota"
msgid "Default mailbox quota"
msgstr "Standaard domein quota"
-#: app_settings.py:122
+#: app_settings.py:155
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -145,62 +193,62 @@ msgstr ""
"Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe "
"te passen. Een waarde van 0 betekend geen quota."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Automatish een account verwijderen"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr ""
"Als een mailbox word verwijderd, verwijder dan ook de bijbehorende account"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Domein en mailbox automatisch aanmaken"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"Maak een domein en mailbox aan wanneer een account automatisch is aangemaakt."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Maak een alias aan wanneer een mailbox word hernoemd"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
"Maak een alias aan met het oude adres wanneer een mailbox word hernoemd"
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Dit moet een positive integer zijn."
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain modified"
msgid "Directory not found."
msgstr "Domein gewijzigd"
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr ""
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administratie"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domein"
-#: constants.py:99
+#: constants.py:97
#, fuzzy
#| msgid "New domain"
msgid "Relay domain"
@@ -263,7 +311,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Alleen super administrators mogen dit"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
#, fuzzy
#| msgid "A mailbox is required"
msgid "This field is required."
@@ -459,7 +507,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -492,7 +540,7 @@ msgstr "domein alias"
msgid "A %s with this name already exists"
msgstr "Een %s met deze naam bestaat al"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr ""
@@ -500,7 +548,7 @@ msgstr ""
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr ""
@@ -654,48 +702,42 @@ msgstr "Identiteiten"
msgid "Forward"
msgstr "Doorsturen"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Een mailbox is benodigd"
-#: lib.py:131
+#: lib.py:132
#, fuzzy
#| msgid "You can't delete your own domain"
msgid "You are not allowed to import domains"
msgstr "U kunt uw eigen domein niet verwijderen"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "U bent niet gemachtigd om domein aliassen te importeren."
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, fuzzy, python-format
#| msgid "No MX record found for this domain."
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Geen mx record gevonden voor dit domein"
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, fuzzy, python-format
#| msgid "No MX record found for this domain."
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Geen mx record gevonden voor dit domein"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No MX record found for this domain."
-msgid "No {type} record found for MX {mx}"
-msgstr "Geen mx record gevonden voor dit domein"
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -715,20 +757,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] DNSBL problemen voor domein {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Domein {} heeft geen MX record(s)"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "MX record voor domein {0} is ongeldig: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] MX probleem met domein {}"
@@ -742,7 +784,7 @@ msgstr "adres"
msgid "The alias address."
msgstr "De alias naam"
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "actief"
@@ -792,64 +834,54 @@ msgstr "naam"
msgid "The domain name"
msgstr "De domeinnaam"
-#: models/domain.py:44
-#, fuzzy
-#| msgid ""
-#| "Default quota (in MB) applied to freshly created domains with no value "
-#| "specified. A value of 0 means no quota."
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe "
-"te passen. Een waarde van 0 betekend geen quota."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Aanvinken om dit domein te activeren"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Activeer DNS checks"
-#: models/domain.py:56
+#: models/domain.py:48
#, fuzzy
#| msgid "Check to activate this domain"
msgid "Check to enable DNS checks for this domain"
msgstr "Aanvinken om dit domein te activeren"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Verkeerde regel"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr ""
-#: models/domain.py:320
+#: models/domain.py:337
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid quota value for domain '{}'"
msgstr "Verkeerde quota waarde voor domein '%s'"
-#: models/domain.py:327
+#: models/domain.py:344
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Verkeerde quota waarde voor domein '%s'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
@@ -889,48 +921,58 @@ msgstr "Een quota is vereist"
msgid "Domain quota exceeded"
msgstr "Domein aangemaakt"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+#, fuzzy
+#| msgid ""
+#| "Default quota (in MB) applied to freshly created domains with no value "
+#| "specified. A value of 0 means no quota."
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Standaard quota (in MB) om op nieuw aangemaakte domeinen zonder waarde toe "
+"te passen. Een waarde van 0 betekend geen quota."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
#, fuzzy
#| msgid "Permissions"
msgid "Permission denied."
msgstr "Toegang geweigerd"
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Niet toegestaan met deze rol"
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Moet gelijk zijn aan het volledige e-mail adres"
-#: serializers.py:291
+#: serializers.py:303
#, fuzzy
#| msgid "Domain does not exist"
msgid "Local domain {} does not exist"
msgstr "Domein bestaat niet"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "Een lijst van ontvangers"
-#: serializers.py:400
+#: serializers.py:412
#, fuzzy
#| msgid "Domain modified"
msgid "Domain not found."
msgstr "Domein gewijzigd"
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "U heeft geen toegang tot dit domein"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -969,6 +1011,18 @@ msgstr "uitgeschakeld"
msgid "Awaiting checks"
msgstr "Controles afwachten"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No MX record found for this domain."
+msgid "No record found"
+msgstr "Geen mx record gevonden voor dit domein"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
#, fuzzy
#| msgid "Statistics"
@@ -1430,19 +1484,13 @@ msgstr ""
msgid "Delete %s?"
msgstr "Verwijder %s?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, fuzzy, python-format
#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
+msgid "No MX record for %s"
msgstr "Geen mx record gevonden voor dit domein"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Geen mx record gevonden voor dit domein"
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1483,11 +1531,11 @@ msgstr ""
msgid "DNSBL summary for {}"
msgstr "DNSBL samenvatting voor {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "U kunt uw eigen domein niet verwijderen"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domeinen verwijderd"
@@ -1533,6 +1581,21 @@ msgstr "Identiteiten importeren"
msgid "Forward updated"
msgstr "Doorstuuradres aangepast"
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Geen mx record gevonden voor dit domein"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Geen mx record gevonden voor dit domein"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Geen mx record gevonden voor dit domein"
+
#, fuzzy
#~| msgid ""
#~| "Default quota (in MB) applied to freshly created domains with no value "
diff --git a/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po b/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po
index cdb781d6f..d0f9583aa 100644
--- a/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/pl_PL/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2017-12-07 08:37+0000\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: Polish (Poland) (http://www.transifex.com/tonio/modoboa/"
@@ -63,49 +63,97 @@ msgstr ""
"zdefiniowanych adresów."
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Aktywuj sprawdzanie rekordów DNS"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Włącz sprawdzanie rekordów MX"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Włącz sprawdzanie rekordów MX"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Włącz sprawdzanie rekordów MX"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Sprawdź czy dla domeny zdefiniowano poprawny rekord MX"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Włącz sprawdzanie DNSBL"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Sprawdź każdą domenę po kątem głównych providerów DNSBL"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Skrzynki pocztowe"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Przechowuj skrzynka na filesystemie"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -113,19 +161,19 @@ msgstr ""
"Zmieniaj lub usuwaj skrzynki na filesystemie jeśli zostały zmodyfikowane lub "
"usuniętę przez Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Właściciel skrzynek"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "Konto UNIX właściciela skrzynek na filesystemie"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Domyślne ograniczenie dla domeny"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -133,12 +181,12 @@ msgstr ""
"Domyślne ograniczenie (w MB) dla nowych domen, gdy nie zostało podane. (0 - "
"brak ograniczenia)"
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Domyślna przestrzeń dla konta pocztowego"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -146,59 +194,59 @@ msgstr ""
"Domyślna pojemność skrzynki (w MB) dla nowo tworzonych domen bez podanej "
"wartości. 0 oznacza brak limitu."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Automatyczne usuwanie konta"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "Gdy usuwana jest skrzynka usuń powizane z nią konto"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Automatyczne tworzenie domeny/skrzynki"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr "Utwórz domenę i skrzynkę gdy tworzone jest konto"
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Utwórz alias podczas zmiany nazwy skrzynki"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr "Utwórz alias używając starego adresu podczas zmiany nazwy skrzynki."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Musi być liczbą całkowitą dodatnią"
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain not found."
msgid "Directory not found."
msgstr "Domena nie znaleziona."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Zdefiniuj przynajmniej jedną autoryzowaną sieć / adres"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administracja"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domena"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr ""
@@ -259,7 +307,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Tylko super administratorzy mogą korzystać z tej opcji"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "To pole jest wymagane"
@@ -428,7 +476,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -459,7 +507,7 @@ msgstr "alias domeny"
msgid "A %s with this name already exists"
msgstr "Nazwa %s już istnieje"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "Nie znaleziono autoryzowanych dla tej domeny rekordów MX "
@@ -467,7 +515,7 @@ msgstr "Nie znaleziono autoryzowanych dla tej domeny rekordów MX "
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "Nie może być wyższa niż limit domeny"
@@ -615,46 +663,40 @@ msgstr "Tożsamości"
msgid "Forward"
msgstr "Przekaż"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Skrzynka jest obowiązkowa"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Nie masz uprawnień do importowania domen"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Nie masz uprawnień do importowania aliasów."
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, fuzzy, python-format
#| msgid "No MX record found for this domain."
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Nie znaleziono rekordu MX dla tej domeny"
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, fuzzy, python-format
#| msgid "MX records of {}"
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Rekordy MX dla {}"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No MX record found for this domain."
-msgid "No {type} record found for MX {mx}"
-msgstr "Nie znaleziono rekordu MX dla tej domeny"
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '{}'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -674,20 +716,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] DNSBL problem(y) dla domeny {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Domena {} nie ma zdefiniowanego rekordu MX"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "Rekord MX dla domeny {0} jest niepoprawny: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] Wykryto problem(y) z MX dla domeny {}"
@@ -699,7 +741,7 @@ msgstr "adres"
msgid "The alias address."
msgstr "Adres aliasu."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "włączone"
@@ -745,54 +787,48 @@ msgstr "nazwa"
msgid "The domain name"
msgstr "Nazwa domeny"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Domyślne ograniczenie (w MB) dla nowych skrzynek. Wartość 0 oznacza brak "
-"ograniczenia."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Zaznacz, aby aktywować domenę"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Aktywuj sprawdzanie rekordów DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Zaznacz aby aktywować sprawdzanie DNS dla tej domeny"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Niepoprawna linia"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "Nie znaleziono autoryzowanego rekordu MX dla domeny {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Niepoprawna wartość przydziału (quoty) dla domeny {}"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Niepoprawna wartość domyślna przydziału (quoty) dla domeny '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
"Domyślna wartość przydziału (quota) nie może być wyższa niż przydział domeny"
@@ -831,43 +867,49 @@ msgstr "Limit jest wymagany"
msgid "Domain quota exceeded"
msgstr "Przekroczono limit przydziału"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Domyślne ograniczenie (w MB) dla nowych skrzynek. Wartość 0 oznacza brak "
+"ograniczenia."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Odmowa dostępu"
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista administratorów domen (tylko resellerów i administratorów domen)."
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Niedozwolone dla tej roli."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Musi być równe z full_address skrzynki."
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Lokalna domena {} nie istnieje"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "Lista odbiorców"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Domena nie znaleziona."
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Nie masz uprawnień dla tej domeny"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -904,6 +946,18 @@ msgstr "Wyłączony"
msgid "Awaiting checks"
msgstr "Czeka na sprawdzenie"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No MX record found for this domain."
+msgid "No record found"
+msgstr "Nie znaleziono rekordu MX dla tej domeny"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Statystyki globalne"
@@ -1298,19 +1352,13 @@ msgstr "Edytuj {}"
msgid "Delete %s?"
msgstr "Usunąć %s?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "Nie znaleziono rekordu MX dla tej domeny"
+#| msgid "MX records of {}"
+msgid "No MX record for %s"
+msgstr "Rekordy MX dla {}"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Nie znaleziono rekordu MX dla tej domeny"
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1351,11 +1399,11 @@ msgstr "Rekordy MX dla {}"
msgid "DNSBL summary for {}"
msgstr "DNSBL podsumowanie dla {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Nie możesz usunąć swoje własnej domeny"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domena usunięta"
@@ -1405,6 +1453,21 @@ msgstr "Importuj tożsamości"
msgid "Forward updated"
msgstr "Reguła przekazywania zmodyfikowana"
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Nie znaleziono rekordu MX dla tej domeny"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Nie znaleziono rekordu MX dla tej domeny"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Nie znaleziono rekordu MX dla tej domeny"
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr ""
#~ "Przydział w MB dzielony między skrzynki. Wartość 0 oznacza brak limitu."
diff --git a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po
index a9850cd27..182ed14a4 100644
--- a/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/pt_BR/LC_MESSAGES/django.po
@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2018-09-25 03:25+0000\n"
"Last-Translator: Rafael Barretto \n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/tonio/modoboa/"
@@ -65,26 +65,74 @@ msgstr ""
"endereços definidos."
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Habilitar verificação DNS"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Checar se todo domínio tem um registro MX válido"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Habilitar checagens MX"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Checar se todo domínio tem um registro MX válido"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Habilitar checagens MX"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Checar se todo domínio tem um registro MX válido"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Habilitar checagens MX"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Checar se todo domínio tem um registro MX válido"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Habilitar checagens DNSBL"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Checar cada domínio em relação aos principais provedores DNSBL."
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr "Diretório de armazenamento de chaves DKIM"
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
@@ -94,23 +142,23 @@ msgstr ""
"armazenadas. Certifique-se de que este diretório pertença ao usuário root e "
"não seja legível pelo mundo externo."
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr "Comprimento padrão da chave DKIM"
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr "Comprimento padrão em bits para chaves DKIM recém-geradas."
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Caixas de correios"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Tratar caixas de mensagens no sistema de arquivos."
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -118,19 +166,19 @@ msgstr ""
"Renomeia ou remove caixas de mensagens do sistema de arquivos quando elas "
"são renomeadas ou removidas dentro do Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Proprietário de caixas de mensagens"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "A conta UNIX que possui caixas de mensagens no sistema de arquivos"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Cota padrão do domínio"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -138,12 +186,12 @@ msgstr ""
"Cota padrão (em MB) aplicada para novos domínios sem nenhum valor "
"especificado. Um valor de 0 indica que não existe cota."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Cota padrão da caixa de correio"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -151,62 +199,62 @@ msgstr ""
"Cota padrão para caixas de correio (em MB) aplicadas a domínios recém "
"criados sem nenhum valor especificado. Um valor de 0 significa sem cota."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Remoção automática da conta"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr ""
"Quando uma caixa de correio é removida, também remove a conta associada"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Criação automática de domínio/caixa de correio"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"Criar um domínio e uma caixa de correio quando uma conta é automaticamente "
"criada."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Criar um alias quando uma caixa de correio é renomeada"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
"Crie um alias usando o endereço antigo quando uma caixa de correio for "
"renomeada."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Deve ser um inteiro positivo"
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr "Diretório não encontrado."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr "openssl não encontrado, por favor, verifique se ele está instalado."
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Defina pelo menos uma rede ou endereço autorizado"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administração"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domínio"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr "Domínio de relay"
@@ -267,7 +315,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Apenas super administradores estão liberados para este modo"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Este campo é obrigatório."
@@ -438,7 +486,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -469,7 +517,7 @@ msgstr "alias de domínio"
msgid "A %s with this name already exists"
msgstr "Já existe um %s com este nome"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr ""
@@ -477,7 +525,7 @@ msgstr ""
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "Não pode ser maior do que a cota de domínio"
@@ -626,44 +674,40 @@ msgstr "Identidades"
msgid "Forward"
msgstr "Encaminhar"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "Um caixa de mensagens é obrigatória"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Você não tem permissão para importar domínios"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Você não tem permissão para importar aliases de domínio."
-#: lib.py:187 tests/test_mx.py:135
-#, python-format
-msgid "No DNS records found for %s"
-msgstr ""
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
+#, fuzzy, python-format
+#| msgid "No MX record found for this domain."
+msgid "No DNS record found for %s"
+msgstr "Nenhum registro MX foi encontrado para este domínio."
-#: lib.py:189 tests/test_mx.py:138
-#, python-format
-msgid "No MX record for %s"
-msgstr ""
+#: lib.py:196
+#, fuzzy, python-format
+#| msgid "No MX record found for this domain."
+msgid "No %(type)s record for %(name)s"
+msgstr "Nenhum registro MX foi encontrado para este domínio."
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No MX record found for this domain."
-msgid "No {type} record found for MX {mx}"
-msgstr "Nenhum registro MX foi encontrado para este domínio."
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '{}'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -683,20 +727,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] Problema(s) de DNSBL para o domínio {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "O domínio {} não possui registro MX"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "O registro MX para o domínio {0} é inválido: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] Problema(s) de MX para o domínio {}"
@@ -708,7 +752,7 @@ msgstr "endereço"
msgid "The alias address."
msgstr "O endereço alias."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "ativado"
@@ -754,54 +798,48 @@ msgstr "nome"
msgid "The domain name"
msgstr "Nome do domínio"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Cota padrão em MB aplicada a caixas de correio. Um valor de 0 significa sem "
-"cota."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Marque para ativar esse domínio"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Habilitar verificação DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Marque para habilitar verificações DNS para este domínio"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Linha inválida"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr ""
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Valor de cota inválida para o domínio '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Valor padrão de cota inválido para caixas de correio do domínio '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
"Valor padrão de cota para caixas de correio não pode ser maior que a cota do "
@@ -841,42 +879,48 @@ msgstr "Uma cota é requerida"
msgid "Domain quota exceeded"
msgstr "Cota do domínio excedida"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Cota padrão em MB aplicada a caixas de correio. Um valor de 0 significa sem "
+"cota."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Permissão negada."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista dos domínios administrados (somente revendedores e administradores de "
"domínio)."
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Não permitido para este perfil."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Deve ser igual ao endereço completo da conta"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Domínio local {} não existe"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr ""
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Domínio não encontrado."
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr ""
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr ""
@@ -907,6 +951,18 @@ msgstr "Desabilitado"
msgid "Awaiting checks"
msgstr "Aguardando checagens"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "Directory not found."
+msgid "No record found"
+msgstr "Diretório não encontrado."
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Estatísticas globais"
@@ -1294,19 +1350,12 @@ msgstr "Editar {}"
msgid "Delete %s?"
msgstr "Remover %s?"
-#: tests/test_mx.py:144
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "Nenhum registro MX foi encontrado para este domínio."
+#: tests/test_mx.py:139
+#, python-format
+msgid "No MX record for %s"
+msgstr ""
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Nenhum registro MX foi encontrado para este domínio."
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1345,11 +1394,11 @@ msgstr "Registro MX para {}"
msgid "DNSBL summary for {}"
msgstr "Sumário DNSBL para {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Você não pode deletar seu próprio domínio"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domínio deletado"
@@ -1395,6 +1444,16 @@ msgstr "Importar identidades"
msgid "Forward updated"
msgstr "Encaminhamento atualizado"
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Nenhum registro MX foi encontrado para este domínio."
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Nenhum registro MX foi encontrado para este domínio."
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr ""
#~ "Cota em MB compartilhada entre caixas de correio. Um valor de 0 significa "
diff --git a/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po b/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po
index 66af1f6c9..db5c7af17 100644
--- a/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/pt_PT/LC_MESSAGES/django.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2014-12-29 12:51+0000\n"
"Last-Translator: Mike C. \n"
"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/"
@@ -59,49 +59,81 @@ msgid ""
msgstr ""
#: app_settings.py:55
-msgid "Enable DNSBL checks"
+msgid "Enable SPF checks"
msgstr ""
#: app_settings.py:58
-msgid "Check every domain against major DNSBL providers"
+msgid "Check if every domain has a valid SPF record"
msgstr ""
#: app_settings.py:63
-msgid "Custom DNS server"
+msgid "Enable DKIM checks"
msgstr ""
#: app_settings.py:66
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr ""
+
+#: app_settings.py:72
+msgid "Enable DMARC checks"
+msgstr ""
+
+#: app_settings.py:75
+msgid "Check if every domain has a valid DMARC record"
+msgstr ""
+
+#: app_settings.py:80
+msgid "Enable autoconfig checks"
+msgstr ""
+
+#: app_settings.py:83
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr ""
+
+#: app_settings.py:88
+msgid "Enable DNSBL checks"
+msgstr ""
+
+#: app_settings.py:91
+msgid "Check every domain against major DNSBL providers"
+msgstr ""
+
+#: app_settings.py:96
+msgid "Custom DNS server"
+msgstr ""
+
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Caixas de Correio"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Lidar com caixas de correio no sistema de ficheiros"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -109,19 +141,19 @@ msgstr ""
"Renomear ou remover as caixas de correio no sistema de ficheiros quando "
"estas são renomeadas no Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Dono das caixas de correio"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "A conta UNIX que detém as caixas de correio no sistema de ficheiros"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Quota pré-definida para o domínio"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -129,14 +161,14 @@ msgstr ""
"Quota (em MB) a aplicar a domínios recentemente criados sem valor "
"especificado. Um valor de 0 implica sem quota."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
#, fuzzy
#| msgid "Default domain quota"
msgid "Default mailbox quota"
msgstr "Quota pré-definida para o domínio"
-#: app_settings.py:122
+#: app_settings.py:155
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -148,62 +180,62 @@ msgstr ""
"Quota (em MB) a aplicar a domínios recentemente criados sem valor "
"especificado. Um valor de 0 implica sem quota."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Remoção automática de conta"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr ""
"Ao remover uma caixa de correio estará também a remover a conta associada"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Criação automatica de domino/caixa de correio"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"Criar um dominio e uma caixa de correio quando uma conta é criada "
"automátiamente."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr ""
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Tem de ser um inteiro, positivo"
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain modified"
msgid "Directory not found."
msgstr "Domínio alterado"
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr ""
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administração"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domínio"
-#: constants.py:99
+#: constants.py:97
#, fuzzy
#| msgid "New domain"
msgid "Relay domain"
@@ -264,7 +296,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr ""
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
#, fuzzy
#| msgid "A mailbox is required"
msgid "This field is required."
@@ -460,7 +492,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota (in MB) applied to freshly created domains with no value "
@@ -493,7 +525,7 @@ msgstr "'Alias' de domínio"
msgid "A %s with this name already exists"
msgstr "Já existe um(a) %s com este nome. "
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr ""
@@ -501,7 +533,7 @@ msgstr ""
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr ""
@@ -656,45 +688,40 @@ msgstr "Identidades"
msgid "Forward"
msgstr "Reencaminhar"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "É necessária uma caixa de correio"
-#: lib.py:131
+#: lib.py:132
#, fuzzy
#| msgid "You can't delete your own domain"
msgid "You are not allowed to import domains"
msgstr "Não é possível eliminar o seu próprio domínio"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr ""
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, python-format
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr ""
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, python-format
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr ""
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, python-brace-format
-msgid "No {type} record found for MX {mx}"
-msgstr ""
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -714,20 +741,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr ""
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr ""
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr ""
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr ""
@@ -741,7 +768,7 @@ msgstr "endereços"
msgid "The alias address."
msgstr "O nome do 'alias'"
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "ativo"
@@ -791,64 +818,54 @@ msgstr "nome"
msgid "The domain name"
msgstr "O nome do domínio"
-#: models/domain.py:44
-#, fuzzy
-#| msgid ""
-#| "Default quota (in MB) applied to freshly created domains with no value "
-#| "specified. A value of 0 means no quota."
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Quota (em MB) a aplicar a domínios recentemente criados sem valor "
-"especificado. Um valor de 0 implica sem quota."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Marcar para ativar este domínio"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr ""
-#: models/domain.py:56
+#: models/domain.py:48
#, fuzzy
#| msgid "Check to activate this domain"
msgid "Check to enable DNS checks for this domain"
msgstr "Marcar para ativar este domínio"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Linha inválida"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr ""
-#: models/domain.py:320
+#: models/domain.py:337
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid quota value for domain '{}'"
msgstr "Valor de quota inválido para o dominio '%s'"
-#: models/domain.py:327
+#: models/domain.py:344
#, fuzzy
#| msgid "Invalid quota value for domain '%s'"
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Valor de quota inválido para o dominio '%s'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
@@ -888,48 +905,58 @@ msgstr "É necessário uma quota"
msgid "Domain quota exceeded"
msgstr "Domínio criado"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+#, fuzzy
+#| msgid ""
+#| "Default quota (in MB) applied to freshly created domains with no value "
+#| "specified. A value of 0 means no quota."
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Quota (em MB) a aplicar a domínios recentemente criados sem valor "
+"especificado. Um valor de 0 implica sem quota."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
#, fuzzy
#| msgid "Permissions"
msgid "Permission denied."
msgstr "Permissões"
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr ""
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: serializers.py:291
+#: serializers.py:303
#, fuzzy
#| msgid "Domain does not exist"
msgid "Local domain {} does not exist"
msgstr "O domínio não existe"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr ""
-#: serializers.py:400
+#: serializers.py:412
#, fuzzy
#| msgid "Domain modified"
msgid "Domain not found."
msgstr "Domínio alterado"
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Não tem acesso a este domínio"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -968,6 +995,18 @@ msgstr "inativo"
msgid "Awaiting checks"
msgstr ""
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "Domain modified"
+msgid "No record found"
+msgstr "Domínio alterado"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
#, fuzzy
#| msgid "Statistics"
@@ -1377,17 +1416,12 @@ msgstr ""
msgid "Delete %s?"
msgstr "Eliminar %s?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, python-format
-msgid "No A record found for MX %(domain)s"
+msgid "No MX record for %s"
msgstr ""
-#: tests/test_mx.py:147
-#, python-format
-msgid "No AAAA record found for MX %(domain)s"
-msgstr ""
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1428,11 +1462,11 @@ msgstr ""
msgid "DNSBL summary for {}"
msgstr ""
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Não é possível eliminar o seu próprio domínio"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domínio criado"
diff --git a/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po b/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po
index a53a4a68c..e078f31e0 100644
--- a/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/ro_RO/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2018-07-03 13:17+0000\n"
"Last-Translator: Andrei-Ilie Olteanu \n"
"Language-Team: Romanian (Romania) (http://www.transifex.com/tonio/modoboa/"
@@ -60,26 +60,74 @@ msgstr ""
"dintre adresele definite."
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Activează verificările DNS"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Verifică ca fiecare domeniu are asociat un MX valid"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Activează verificările MX"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Verifică ca fiecare domeniu are asociat un MX valid"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Activează verificările MX"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Verifică ca fiecare domeniu are asociat un MX valid"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Activează verificările MX"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Verifică ca fiecare domeniu are asociat un MX valid"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Activează verificările DNSBL"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Verificați fiecare domeniu folosind furnizorii DNSBL majori"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr "Folderul de stocare pentru cheile DKIM"
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
@@ -89,23 +137,23 @@ msgstr ""
"Asigurați-vă că acest director aparține utilizatorului root și nu poate fi "
"citit de orice user."
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr "Mărimea implicită în caractere a chei DKIM"
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr "Mărimea implicită în biți pentru o cheie DKIM nou generată"
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Cutii poștale"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Gestionați cutiile poștale în sistemul de fișiere"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -113,20 +161,20 @@ msgstr ""
"Redenumește sau eliminează căsuțele poștale din sistemul de fișiere atunci "
"când se redenumesc sau se elimină în Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Propietarul cutiilor postale"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr ""
"Contul UNIX care are in propietate casuțele poștale în sistemul de fișiere"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Cota-parte implicită a domeniului"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -134,12 +182,12 @@ msgstr ""
"Cota implicită (în MB) aplicată domeniilor nou create, care nu au nicio "
"valoare specificată. O valoare de 0 înseamnă că nu există o cotă."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Cota implicită pentru cutia poștală"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -148,60 +196,60 @@ msgstr ""
"care nu au nicio valoare specificată. O valoare de 0 înseamnă că nu există o "
"cotă."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Ștergere automată a contului"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "Când se șterge o cutie poștală, șterge, de asemenea și contul asociat"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Crearea automată a domeniului / cutiei poștale"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
"Creați un domeniu și o căsuță poștală atunci când un cont este creat automat."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Creați un alias când o cutie poștală este redenumită"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
"Creați un alias utilizând vechea adresă atunci când o cutie poștală este "
"redenumită."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Trebuie să fie un număr întreg pozitiv"
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr "Directorul nu a fost găsit."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr "openssl nu a fost găsit, asigurați-vă că este instalat."
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Definiți cel puțin o adresă de rețea autorizată"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administrare"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domeniu"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr "Domeniu de relay"
@@ -262,7 +310,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Numai superadministratorii sunt permiși la acest mod"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Acest câmp este necesar."
@@ -434,7 +482,7 @@ msgstr ""
msgid "Key selector"
msgstr "Selector cheie"
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -465,7 +513,7 @@ msgstr "alias domeniu"
msgid "A %s with this name already exists"
msgstr "Itemul%s cu acest nume există"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "Nu s-au gasit înregistrări MX autorizate pentru acest domeniu"
@@ -473,7 +521,7 @@ msgstr "Nu s-au gasit înregistrări MX autorizate pentru acest domeniu"
msgid "DKIM keys storage directory not configured"
msgstr "Folderul de stocare a cheilor DKIM nu este configurat"
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "Nu poate fi mai mare decat cota domeniului"
@@ -624,46 +672,42 @@ msgstr "Identități"
msgid "Forward"
msgstr "Redirecționează"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "O căsuță poștală este necesară"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Nu ești autorizat să imporți domenii"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Nu ești autorizat să imporți aliasuri de domenii"
-#: lib.py:187 tests/test_mx.py:135
-#, python-format
-msgid "No DNS records found for %s"
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
+#, fuzzy, python-format
+#| msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Nu s-au găsit înregistrări DNS pentru %s"
-#: lib.py:189 tests/test_mx.py:138
-#, python-format
-msgid "No MX record for %s"
+#: lib.py:196
+#, fuzzy, python-format
+#| msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Nu există înregidtrări MX pentru %s"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr "Nu s-au găsit NS-uri funcționale"
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
"Timeout întâmpinat la rezolvarea cererii DNS, imposibilă de interogat %s în "
"acest moment"
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No DNS records found for %s"
-msgid "No {type} record found for MX {mx}"
-msgstr "Nu s-au găsit înregistrări DNS pentru %s"
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -683,20 +727,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] Problemă(e) DNSBL pentru domeniul {} "
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Domeniul {} nu are înregistrări MX"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "Înregistrarea MX pentru domeniul {0} este invalidă: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] Problemă(e) MX pentru domeniul {}"
@@ -708,7 +752,7 @@ msgstr "adresă"
msgid "The alias address."
msgstr "Adresă alias."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "activat"
@@ -754,56 +798,50 @@ msgstr "nume"
msgid "The domain name"
msgstr "Numele domeniului"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-"Cota implicită exprimată în MB aplivată la cutiile poștale. O valuare 0 "
-"înseamnă fără cotă."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Bifează pentru a activa domeniul"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Activează verificările DNS"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Bifează pentru a activa verificările DNS pentru acest domeniu"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr "Activează semnarea DKIM"
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
"Dacă activezi această facilitate, o chieie DKIM se va genera pt acest "
"domeniu."
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr "Mărime cheie"
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Linie invalidă"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "Nu s-au gasit înregistrări MX autorizate pentru acest domeniu {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Valuare de cotă invalidă pentru domeniul '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Valuare implicită de cotă invalidă pentru domeniul '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
"Valuarea de cotă implicită a unei cutii poștale nu poate fi mai mare decât "
@@ -843,41 +881,47 @@ msgstr "O cotă este necesară"
msgid "Domain quota exceeded"
msgstr "Cota pentru domeniu a fost depașită"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+"Cota implicită exprimată în MB aplivată la cutiile poștale. O valuare 0 "
+"înseamnă fără cotă."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Permisiune refuzată."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista domenilor administrate (doar reselleri și administratori de domeniu)"
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Ne permis pentru acest rol."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Trebuie să fie egal cu mailbox full_address"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Domeniu local {} nu există"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "O listă de destinatari"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Domeniu negăsit"
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr "Nu ai acces la acest domeniu."
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr "Nu ai acces la această cutie postală"
@@ -908,6 +952,18 @@ msgstr "Dezactivat"
msgid "Awaiting checks"
msgstr "Se așteaptă verificările"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No DNS records found for %s"
+msgid "No record found"
+msgstr "Nu s-au găsit înregistrări DNS pentru %s"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Statistici globale"
@@ -1296,19 +1352,12 @@ msgstr "Editează {}"
msgid "Delete %s?"
msgstr "Șterge %s?"
-#: tests/test_mx.py:144
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "Nu există înregistrări MX pentru acest domeniu."
+#: tests/test_mx.py:139
+#, python-format
+msgid "No MX record for %s"
+msgstr "Nu există înregidtrări MX pentru %s"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Nu există înregistrări MX pentru acest domeniu."
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr "Format invalid de IP pentru %(domain)s; %(addr)s "
@@ -1348,11 +1397,11 @@ msgstr "Înregistrări MX ale {}"
msgid "DNSBL summary for {}"
msgstr "Sumar DNSBL pentru {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Nu poți să îți ștergi propriul domeniu"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domeniu șters"
@@ -1400,6 +1449,21 @@ msgstr "Importă identități"
msgid "Forward updated"
msgstr "Redirecționare actualizată"
+#, fuzzy
+#~| msgid "No DNS records found for %s"
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Nu s-au găsit înregistrări DNS pentru %s"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Nu există înregistrări MX pentru acest domeniu."
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Nu există înregistrări MX pentru acest domeniu."
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr ""
#~ "Cota în MB impărțită între cutiile poștale. O valuare 0 înseamnă fără "
diff --git a/modoboa/admin/locale/ru/LC_MESSAGES/django.po b/modoboa/admin/locale/ru/LC_MESSAGES/django.po
index d340da7e1..129a6ef31 100644
--- a/modoboa/admin/locale/ru/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/ru/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2013-12-03 09:35+0000\n"
"Last-Translator: Antoine Nguyen \n"
"Language-Team: Russian (http://www.transifex.com/projects/p/modoboa/language/"
@@ -54,49 +54,81 @@ msgid ""
msgstr ""
#: app_settings.py:55
-msgid "Enable DNSBL checks"
+msgid "Enable SPF checks"
msgstr ""
#: app_settings.py:58
-msgid "Check every domain against major DNSBL providers"
+msgid "Check if every domain has a valid SPF record"
msgstr ""
#: app_settings.py:63
-msgid "Custom DNS server"
+msgid "Enable DKIM checks"
msgstr ""
#: app_settings.py:66
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr ""
+
+#: app_settings.py:72
+msgid "Enable DMARC checks"
+msgstr ""
+
+#: app_settings.py:75
+msgid "Check if every domain has a valid DMARC record"
+msgstr ""
+
+#: app_settings.py:80
+msgid "Enable autoconfig checks"
+msgstr ""
+
+#: app_settings.py:83
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr ""
+
+#: app_settings.py:88
+msgid "Enable DNSBL checks"
+msgstr ""
+
+#: app_settings.py:91
+msgid "Check every domain against major DNSBL providers"
+msgstr ""
+
+#: app_settings.py:96
+msgid "Custom DNS server"
+msgstr ""
+
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr ""
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
"world."
msgstr ""
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr ""
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr ""
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Почтовые ящики"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Обрабатывать почтовые ящики на диске"
-#: app_settings.py:96
+#: app_settings.py:129
#, fuzzy
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
@@ -105,89 +137,89 @@ msgstr ""
"Удалять или переименовывать почтовые ящики на диске, если они удалены или "
"переименованы в Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Почтовые ящики закончились"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "UNIX аккаунт владельца почтового ящика на диске"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr ""
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
msgstr ""
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr ""
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
msgstr ""
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Автоматическое удаление аккаунта"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "При удалении почтового ящика, так же удалять и аккаунт владельца"
-#: app_settings.py:135
+#: app_settings.py:168
#, fuzzy
msgid "Automatic domain/mailbox creation"
msgstr "Домен создан"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr ""
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr ""
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr ""
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr ""
-#: app_settings.py:214
+#: app_settings.py:247
#, fuzzy
#| msgid "Domain modified"
msgid "Directory not found."
msgstr "Домен изменен"
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr ""
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr ""
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr ""
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr ""
-#: constants.py:99
+#: constants.py:97
#, fuzzy
#| msgid "New domain"
msgid "Relay domain"
@@ -248,7 +280,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr ""
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
#, fuzzy
#| msgid "A quota is required"
msgid "This field is required."
@@ -444,7 +476,7 @@ msgstr ""
msgid "Key selector"
msgstr ""
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
msgid ""
"Quota shared between mailboxes. Can be expressed in KB, MB (default) or GB. "
"A value of 0 means no quota."
@@ -465,7 +497,7 @@ msgstr ""
msgid "A %s with this name already exists"
msgstr ""
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr ""
@@ -473,7 +505,7 @@ msgstr ""
msgid "DKIM keys storage directory not configured"
msgstr ""
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr ""
@@ -629,45 +661,40 @@ msgstr "Пользователи"
msgid "Forward"
msgstr "Перенаправленые"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr ""
-#: lib.py:131
+#: lib.py:132
#, fuzzy
#| msgid "You can't delete your own domain"
msgid "You are not allowed to import domains"
msgstr "Вы не можете удалить собственный домен"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr ""
-#: lib.py:187 tests/test_mx.py:135
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
#, python-format
-msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr ""
-#: lib.py:189 tests/test_mx.py:138
+#: lib.py:196
#, python-format
-msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr ""
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr ""
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr ""
-#: lib.py:205
-#, python-brace-format
-msgid "No {type} record found for MX {mx}"
-msgstr ""
-
-#: lib.py:214
+#: lib.py:231
#, python-brace-format
msgid "Invalid IP address format for {domain}; {addr}"
msgstr ""
@@ -686,20 +713,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr ""
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr ""
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr ""
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr ""
@@ -713,7 +740,7 @@ msgstr "адрес"
msgid "The alias address."
msgstr "Имя синонима"
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "Разрешен"
@@ -763,54 +790,50 @@ msgstr "имя"
msgid "The domain name"
msgstr "Имя домена"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr ""
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Отметить для активации этого домена"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr ""
-#: models/domain.py:56
+#: models/domain.py:48
#, fuzzy
#| msgid "Check to activate this domain"
msgid "Check to enable DNS checks for this domain"
msgstr "Отметить для активации этого домена"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr ""
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr ""
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Ошибочная строка"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr ""
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr ""
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr ""
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr ""
@@ -850,48 +873,52 @@ msgstr "Требуется квота"
msgid "Domain quota exceeded"
msgstr "Домен создан"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr ""
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
#, fuzzy
#| msgid "Permissions"
msgid "Permission denied."
msgstr "Права"
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr ""
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr ""
-#: serializers.py:291
+#: serializers.py:303
#, fuzzy
#| msgid "Domain does not exist"
msgid "Local domain {} does not exist"
msgstr "Домен не существует"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr ""
-#: serializers.py:400
+#: serializers.py:412
#, fuzzy
#| msgid "Domain modified"
msgid "Domain not found."
msgstr "Домен изменен"
-#: serializers.py:449
+#: serializers.py:461
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this domain."
msgstr "Вы не имеете права доступа к этому домену"
-#: serializers.py:457
+#: serializers.py:469
#, fuzzy
#| msgid "You don't have access to this domain"
msgid "You don't have access to this mailbox."
@@ -929,6 +956,18 @@ msgstr "Разрешен"
msgid "Awaiting checks"
msgstr ""
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "Domain modified"
+msgid "No record found"
+msgstr "Домен изменен"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
#, fuzzy
#| msgid "Statistics"
@@ -1338,17 +1377,12 @@ msgstr ""
msgid "Delete %s?"
msgstr "Удалить %s?"
-#: tests/test_mx.py:144
+#: tests/test_mx.py:139
#, python-format
-msgid "No A record found for MX %(domain)s"
+msgid "No MX record for %s"
msgstr ""
-#: tests/test_mx.py:147
-#, python-format
-msgid "No AAAA record found for MX %(domain)s"
-msgstr ""
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr ""
@@ -1390,11 +1424,11 @@ msgstr ""
msgid "DNSBL summary for {}"
msgstr ""
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Вы не можете удалить собственный домен"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Домен удален"
diff --git a/modoboa/admin/locale/sv/LC_MESSAGES/django.po b/modoboa/admin/locale/sv/LC_MESSAGES/django.po
index b45d2b983..41048cb06 100644
--- a/modoboa/admin/locale/sv/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/sv/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2018-08-14 08:35+0000\n"
"Last-Translator: Olle Gustafsson \n"
"Language-Team: Swedish (http://www.transifex.com/tonio/modoboa/language/"
@@ -60,26 +60,74 @@ msgstr ""
"fördefinerat."
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "Aktivera DNS kontroller"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "Kontrollera att varje domän har ett giltigt MX record"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "Aktivera MX kontroll"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "Kontrollera att varje domän har ett giltigt MX record"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "Aktivera MX kontroll"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "Kontrollera att varje domän har ett giltigt MX record"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "Aktivera MX kontroll"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "Kontrollera att varje domän har ett giltigt MX record"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "Aktivera DNSBL kontroller"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "Kontrollera varje domän mot större DNSBL leverantörer"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr "DKIM nycklar lagrings katalog"
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
@@ -89,23 +137,23 @@ msgstr ""
"till att den här katalogen ägs av root-användaren och inte kan läsas av "
"utomstående."
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr "Standard DKIM nyckellängd"
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr "Standardlängd i bitar för genererade DKIM nycklar."
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "Brevlådor"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "Hantera brevlådor på filsystem"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
@@ -113,19 +161,19 @@ msgstr ""
"Byt namn på eller ta bort brevlådor på filsystemet när de kommer byta namn "
"eller tas bort inom Modoboa"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "Brevlådans ägare"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "Den UNIX-konto som äger brevlådor på filsystemet"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "Standard domän kvota"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
@@ -133,12 +181,12 @@ msgstr ""
"Standard kvota (i MB) applicerad på nyskapade domäner som inte har något "
"värde specificerat. Ett värde på 0 betyder ingen kvota."
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "Standard brevlåde kvota"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
@@ -146,57 +194,57 @@ msgstr ""
"Standard brevlåde kvota (i MB) applicerad på nyligen skapade domäner där "
"inget värde angetts. 0 betyder ingen kvota."
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "Automatisk konto borttagning"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "När en brevlåda raderas, radera också tillhörande konto"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "Automatisk skapande av domän/brevlåda"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr "Skapa en domän och en brevlåda när ett konto skapas automatiskt."
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "Skapa ett alias när en brevlåda döps om"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr "Skapa ett alias med den gamla adressen när en brevlåda bytt namn."
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "Måste vara ett positivt heltal"
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr "Katalog kunde ej hittas."
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr "openssl hittades inte, kontroller att det är installerat."
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "Ange åtminstonde en auktoriserad nätverk / adress"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "Administration"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "Domän"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr "Relay domän"
@@ -257,7 +305,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "Endast superadmininstratörer tillåts åtkomst till det här läget"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "Detta fält krävs."
@@ -426,7 +474,7 @@ msgstr ""
msgid "Key selector"
msgstr "Nyckelväljare"
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -453,7 +501,7 @@ msgstr "domän alias"
msgid "A %s with this name already exists"
msgstr "En %s med detta namn finns redan"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "Inga auktoriserade MX inlägg finns för denna domänen"
@@ -461,7 +509,7 @@ msgstr "Inga auktoriserade MX inlägg finns för denna domänen"
msgid "DKIM keys storage directory not configured"
msgstr "DKIM nycklar lagringskatalog ej konfigurerad"
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "Får inte vara större än domän kvot"
@@ -609,44 +657,40 @@ msgstr "Konton"
msgid "Forward"
msgstr "Vidarebefordra"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "En brevlåda krävs"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "Du tillåts inte att importera domäner"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "Du tillåts inte att importera domän alias."
-#: lib.py:187 tests/test_mx.py:135
-#, python-format
-msgid "No DNS records found for %s"
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
+#, fuzzy, python-format
+#| msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "Inga DNS-poster hittades för %s"
-#: lib.py:189 tests/test_mx.py:138
-#, python-format
-msgid "No MX record for %s"
+#: lib.py:196
+#, fuzzy, python-format
+#| msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "Ingen MX-post för %s"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr "Inga fungerande namnservrar hittades"
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr "DNS-upplösning timeout, kan inte fråga %s för tillfället"
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No DNS records found for %s"
-msgid "No {type} record found for MX {mx}"
-msgstr "Inga DNS-poster hittades för %s"
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -666,20 +710,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] DNSBL fråga(or) för domän {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "Domän {} saknar MX record"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "MX record för domän {0} är ogiltig: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] MX problem för domän {}"
@@ -691,7 +735,7 @@ msgstr "adress"
msgid "The alias address."
msgstr "Alias adressen."
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "aktiverad"
@@ -737,54 +781,50 @@ msgstr "namn"
msgid "The domain name"
msgstr "Domännamnet"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr "Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota."
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "Markera för att aktivera denna domän"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "Aktivera DNS kontroller"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "Markera för att aktivera DNS kontroller för den här domänen"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr "Aktivera DKIM-signering"
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr ""
"Om du aktiverar den här funktionen genereras en DKIM-nyckel för den här "
"domänen."
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr "Nyckellängd"
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "Ogiltig rad"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "Inga auktoriserade MX inlägg finns för domänen {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "Ogiltig kvota värd för domän '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "Ogiltig standard brevlådekvota för domän '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr "Standard brevlådekvota kan inte vara större än domänkvotan"
@@ -822,42 +862,46 @@ msgstr "En kvota krävs"
msgid "Domain quota exceeded"
msgstr "Domänkvota överskriden"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr "Standardkvota i MB applicerad på nya brevlådor. 0 betyder ingen kvota."
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "Åtskomst nekad."
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr ""
"Lista över administrerade domäner (endast återförsäljare och "
"domänadministratörer)."
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "Inte tillåtet för denna roll."
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "Måste vara lika med brevlådans full_address"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "Lokal domän {} finns inte"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "En lista på mottagare"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "Domän kunde ej hittas."
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr "Du har inte åtkomst till denna domän."
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr "Du har inte åtkomst till denna brevlåda."
@@ -888,6 +932,18 @@ msgstr "Inaktiverad"
msgid "Awaiting checks"
msgstr "Väntar kontroll"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No DNS records found for %s"
+msgid "No record found"
+msgstr "Inga DNS-poster hittades för %s"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "Global statistik"
@@ -1273,19 +1329,12 @@ msgstr "Redigera {}"
msgid "Delete %s?"
msgstr "Radera %s?"
-#: tests/test_mx.py:144
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "Inget MX record funnet för denna domän."
+#: tests/test_mx.py:139
+#, python-format
+msgid "No MX record for %s"
+msgstr "Ingen MX-post för %s"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "Inget MX record funnet för denna domän."
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr "Ogiltigt IP-adress format för %(domain)s; %(addr)s"
@@ -1324,11 +1373,11 @@ msgstr "MX record för {}"
msgid "DNSBL summary for {}"
msgstr "DNSBL summering för {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "Du kan inte radera din egen domän"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "Domän raderad"
@@ -1374,6 +1423,21 @@ msgstr "Importera konton"
msgid "Forward updated"
msgstr "Vidarebefordring uppdaterad"
+#, fuzzy
+#~| msgid "No DNS records found for %s"
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "Inga DNS-poster hittades för %s"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "Inget MX record funnet för denna domän."
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "Inget MX record funnet för denna domän."
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr "Kvota i MB delade mellan brevlådor. 0 betyder ingen kvota."
diff --git a/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po b/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po
index fb9dc298b..38b8775a1 100644
--- a/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po
+++ b/modoboa/admin/locale/zh_TW/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Modoboa\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-17 13:41+0200\n"
+"POT-Creation-Date: 2018-11-20 10:32+0100\n"
"PO-Revision-Date: 2018-07-09 04:17+0000\n"
"Last-Translator: akong \n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/tonio/modoboa/"
@@ -57,26 +57,74 @@ msgid ""
msgstr "假如 MX 紀錄未使用定義的位址請避免建立新的網域。"
#: app_settings.py:55
+#, fuzzy
+#| msgid "Enable DNS checks"
+msgid "Enable SPF checks"
+msgstr "啟用 DNS 檢查"
+
+#: app_settings.py:58
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid SPF record"
+msgstr "檢查每個網域都有正確的 MX 紀錄"
+
+#: app_settings.py:63
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DKIM checks"
+msgstr "啟用 MX 檢查"
+
+#: app_settings.py:66
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain with DKIM signin enabled has a valid DNS record"
+msgstr "檢查每個網域都有正確的 MX 紀錄"
+
+#: app_settings.py:72
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable DMARC checks"
+msgstr "啟用 MX 檢查"
+
+#: app_settings.py:75
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid DMARC record"
+msgstr "檢查每個網域都有正確的 MX 紀錄"
+
+#: app_settings.py:80
+#, fuzzy
+#| msgid "Enable MX checks"
+msgid "Enable autoconfig checks"
+msgstr "啟用 MX 檢查"
+
+#: app_settings.py:83
+#, fuzzy
+#| msgid "Check that every domain has a valid MX record"
+msgid "Check if every domain has a valid records for autoconfiguration"
+msgstr "檢查每個網域都有正確的 MX 紀錄"
+
+#: app_settings.py:88
msgid "Enable DNSBL checks"
msgstr "啟用 DNSBL 檢查"
-#: app_settings.py:58
+#: app_settings.py:91
msgid "Check every domain against major DNSBL providers"
msgstr "針對每個 DNSBL 供應商來檢查每個網域"
-#: app_settings.py:63
+#: app_settings.py:96
msgid "Custom DNS server"
msgstr ""
-#: app_settings.py:66
+#: app_settings.py:99
msgid "Use a custom DNS server instead of local server configuration"
msgstr ""
-#: app_settings.py:71
+#: app_settings.py:104
msgid "DKIM keys storage directory"
msgstr "DKIM 金鑰儲存目錄"
-#: app_settings.py:74
+#: app_settings.py:107
msgid ""
"Absolute path of the directory where DKIM private keys will be stored. Make "
"sure this directory belongs to root user and is not readable by the outside "
@@ -85,109 +133,109 @@ msgstr ""
"絕對路徑的目錄將會給 DKIM 私鑰儲存。確認這個目錄屬於 root 使用者並且外面的世"
"界無法讀取。"
-#: app_settings.py:82
+#: app_settings.py:115
msgid "Default DKIM key length"
msgstr "預設 DKIM 金鑰長度"
-#: app_settings.py:86
+#: app_settings.py:119
msgid "Default length in bits for newly generated DKIM keys."
msgstr "預設長度是給新產生的 DKIM 金鑰用。"
-#: app_settings.py:90 templates/admin/domain_detail.html:41
+#: app_settings.py:123 templates/admin/domain_detail.html:41
msgid "Mailboxes"
msgstr "信箱"
-#: app_settings.py:93
+#: app_settings.py:126
msgid "Handle mailboxes on filesystem"
msgstr "在檔案系統上處理信箱"
-#: app_settings.py:96
+#: app_settings.py:129
msgid ""
"Rename or remove mailboxes on the filesystem when they get renamed or "
"removed within Modoboa"
msgstr "當他要在 Modoboa 上取得更名或移除就會在檔案系統上更名或移除信箱"
-#: app_settings.py:102
+#: app_settings.py:135
msgid "Mailboxes owner"
msgstr "信箱擁有者"
-#: app_settings.py:105
+#: app_settings.py:138
msgid "The UNIX account who owns mailboxes on the filesystem"
msgstr "UNIX 帳號是檔案系統上擁有的信箱"
-#: app_settings.py:110
+#: app_settings.py:143
msgid "Default domain quota"
msgstr "預設網域配額"
-#: app_settings.py:113
+#: app_settings.py:146
msgid ""
"Default quota (in MB) applied to freshly created domains with no value "
"specified. A value of 0 means no quota."
msgstr "預設配額(以MB為單位)應用於未指定值的創立網域。值為0表示沒有配額。"
-#: app_settings.py:119 forms/domain.py:53 models/domain.py:41
+#: app_settings.py:152 forms/domain.py:53 models/domain.py:37
#: templates/admin/domain_detail.html:64
msgid "Default mailbox quota"
msgstr "預設信箱配額"
-#: app_settings.py:122
+#: app_settings.py:155
msgid ""
"Default mailbox quota (in MB) applied to freshly created domains with no "
"value specified. A value of 0 means no quota."
msgstr ""
"預設信箱配額(以MB為單位)應用於未指定值的建立網域。值為0表示沒有配額。"
-#: app_settings.py:128
+#: app_settings.py:161
msgid "Automatic account removal"
msgstr "自動刪除帳號"
-#: app_settings.py:131
+#: app_settings.py:164
msgid "When a mailbox is removed, also remove the associated account"
msgstr "當信箱移除時,也會移除關聯的帳號"
-#: app_settings.py:135
+#: app_settings.py:168
msgid "Automatic domain/mailbox creation"
msgstr "自動建立網域/信箱"
-#: app_settings.py:138
+#: app_settings.py:171
msgid "Create a domain and a mailbox when an account is automatically created."
msgstr "當帳號自動建立後會建立網域和一個信箱。"
-#: app_settings.py:144
+#: app_settings.py:177
msgid "Create an alias when a mailbox is renamed"
msgstr "當信箱更名時會建立別名"
-#: app_settings.py:147
+#: app_settings.py:180
msgid "Create an alias using the old address when a mailbox is renamed."
msgstr "當信箱更名時建立別名並使用在舊的位址。"
-#: app_settings.py:196 app_settings.py:204 forms/account.py:339
+#: app_settings.py:229 app_settings.py:237 forms/account.py:339
msgid "Must be a positive integer"
msgstr "必須是正整數"
-#: app_settings.py:214
+#: app_settings.py:247
msgid "Directory not found."
msgstr "目錄不存在"
-#: app_settings.py:220
+#: app_settings.py:253
msgid "openssl not found, please make sure it is installed."
msgstr "openssl 找不到,請確認已安裝。"
-#: app_settings.py:234
+#: app_settings.py:267
msgid "Define at least one authorized network / address"
msgstr "定義至少一個已驗證網路/位址"
-#: app_settings.py:244
+#: app_settings.py:277
msgid "Administration"
msgstr "管理員"
-#: constants.py:98 forms/alias.py:47
+#: constants.py:96 forms/alias.py:47
#: templates/admin/_per_domain_statistics_widget.html:7
#: templates/admin/domains_quota_headers.html:2
msgid "Domain"
msgstr "網域"
-#: constants.py:99
+#: constants.py:97
msgid "Relay domain"
msgstr "網域轉送"
@@ -244,7 +292,7 @@ msgid "Only super administrators are allowed for this mode"
msgstr "只有超級管理員在這個模式下是允許的"
#: forms/account.py:182 forms/account.py:184 forms/domain.py:166
-#: forms/domain.py:295 forms/domain.py:298 serializers.py:279
+#: forms/domain.py:295 forms/domain.py:298 serializers.py:291
msgid "This field is required."
msgstr "這個欄位是必填的"
@@ -406,7 +454,7 @@ msgstr "這個網域的別名(es)。一行只能輸入一個電子郵件,按 E
msgid "Key selector"
msgstr "Key selector"
-#: forms/domain.py:48 models/domain.py:36
+#: forms/domain.py:48 serializers.py:34
#, fuzzy
#| msgid ""
#| "Default quota in MB applied to mailboxes. A value of 0 means no quota."
@@ -433,7 +481,7 @@ msgstr "網域別名"
msgid "A %s with this name already exists"
msgstr "此 %s 及這個名稱已存在"
-#: forms/domain.py:109 serializers.py:56
+#: forms/domain.py:109 serializers.py:68
msgid "No authorized MX record found for this domain"
msgstr "沒有找到這個網域已驗證過的 MX 紀錄"
@@ -441,7 +489,7 @@ msgstr "沒有找到這個網域已驗證過的 MX 紀錄"
msgid "DKIM keys storage directory not configured"
msgstr "未設置 DKIM 金鑰儲存目錄"
-#: forms/domain.py:151 serializers.py:74
+#: forms/domain.py:151 serializers.py:86
msgid "Cannot be greater than domain quota"
msgstr "不可以超過網域配額"
@@ -587,44 +635,40 @@ msgstr "使用者"
msgid "Forward"
msgstr "轉發"
-#: lib.py:41
+#: lib.py:42
msgid "A mailbox is required"
msgstr "信箱是必要的"
-#: lib.py:131
+#: lib.py:132
msgid "You are not allowed to import domains"
msgstr "您未允許匯入網域"
-#: lib.py:142
+#: lib.py:143
msgid "You are not allowed to import domain aliases."
msgstr "您未允許匯入網域別名。"
-#: lib.py:187 tests/test_mx.py:135
-#, python-format
-msgid "No DNS records found for %s"
+#: lib.py:193 tests/test_mx.py:136 tests/test_mx.py:145 tests/test_mx.py:148
+#, fuzzy, python-format
+#| msgid "No DNS records found for %s"
+msgid "No DNS record found for %s"
msgstr "沒有找到 %s 的 DNS 紀錄"
-#: lib.py:189 tests/test_mx.py:138
-#, python-format
-msgid "No MX record for %s"
+#: lib.py:196
+#, fuzzy, python-format
+#| msgid "No MX record for %s"
+msgid "No %(type)s record for %(name)s"
msgstr "沒有 %s 的 MX 紀錄"
-#: lib.py:191 tests/test_mx.py:139
+#: lib.py:200 tests/test_mx.py:140
msgid "No working name servers found"
msgstr "沒有找到執行中的名稱伺服器"
-#: lib.py:194 tests/test_mx.py:141
+#: lib.py:203 tests/test_mx.py:142
#, python-format
msgid "DNS resolution timeout, unable to query %s at the moment"
msgstr "DNS 解析逾時,無法查詢 %s 在這個時間點"
-#: lib.py:205
-#, fuzzy, python-brace-format
-#| msgid "No DNS records found for %s"
-msgid "No {type} record found for MX {mx}"
-msgstr "沒有找到 %s 的 DNS 紀錄"
-
-#: lib.py:214
+#: lib.py:231
#, fuzzy, python-brace-format
#| msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgid "Invalid IP address format for {domain}; {addr}"
@@ -644,20 +688,20 @@ msgstr ""
msgid "Unable to decode CSV file using %(encoding)s encoding"
msgstr ""
-#: management/commands/subcommands/_mx.py:135
+#: management/commands/subcommands/_mx.py:136
msgid "[modoboa] DNSBL issue(s) for domain {}"
msgstr "[modoboa] 此網域的 DNSBL 問題(s) {}"
-#: management/commands/subcommands/_mx.py:155
+#: management/commands/subcommands/_mx.py:156
msgid "Domain {} has no MX record"
msgstr "網域 {} 沒有 MX 紀錄"
-#: management/commands/subcommands/_mx.py:166
+#: management/commands/subcommands/_mx.py:167
#, python-brace-format
msgid "MX record for domain {0} is invalid: {1}"
msgstr "此網域的 MX 紀錄 {0} 是無效的: {1}"
-#: management/commands/subcommands/_mx.py:183
+#: management/commands/subcommands/_mx.py:184
msgid "[modoboa] MX issue(s) for domain {}"
msgstr "[modoboa] 此網域的 MX 問題(s) {}"
@@ -669,7 +713,7 @@ msgstr "地址"
msgid "The alias address."
msgstr "別名位址。"
-#: models/alias.py:43 models/domain.py:49 models/domain_alias.py:46
+#: models/alias.py:43 models/domain.py:41 models/domain_alias.py:46
msgid "enabled"
msgstr "已啟用"
@@ -715,52 +759,48 @@ msgstr "名稱"
msgid "The domain name"
msgstr "網域名稱"
-#: models/domain.py:44
-msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
-msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。"
-
-#: models/domain.py:50
+#: models/domain.py:42
msgid "Check to activate this domain"
msgstr "點擊啟用這個網域"
-#: models/domain.py:55
+#: models/domain.py:47
msgid "Enable DNS checks"
msgstr "啟用 DNS 檢查"
-#: models/domain.py:56
+#: models/domain.py:48
msgid "Check to enable DNS checks for this domain"
msgstr "點擊啟用這個網域的 DNS 檢查"
-#: models/domain.py:63
+#: models/domain.py:55
msgid "Enable DKIM signing"
msgstr "啟用 DKIM 簽署"
-#: models/domain.py:65
+#: models/domain.py:57
msgid ""
"If you activate this feature, a DKIM key will be generated for this domain."
msgstr "假如您啟用這個功能,DKIM 金鑰將會產生給這個網域。"
-#: models/domain.py:71
+#: models/domain.py:63
msgid "Key length"
msgstr "金鑰長度"
-#: models/domain.py:303 models/domain_alias.py:74
+#: models/domain.py:320 models/domain_alias.py:74
msgid "Invalid line"
msgstr "無效的行"
-#: models/domain.py:313
+#: models/domain.py:330
msgid "No authorized MX record found for domain {}"
msgstr "沒有找到這個網域已驗證過的 MX 紀錄 {}"
-#: models/domain.py:320
+#: models/domain.py:337
msgid "Invalid quota value for domain '{}'"
msgstr "此網域有無效的配額值 '{}'"
-#: models/domain.py:327
+#: models/domain.py:344
msgid "Invalid default mailbox quota value for domain '{}'"
msgstr "此網域有無效的預設信箱配額值 '{}'"
-#: models/domain.py:332
+#: models/domain.py:349
msgid "Default mailbox quota cannot be greater than domain quota"
msgstr "預設的信箱配額不可以超過網域配額"
@@ -798,40 +838,44 @@ msgstr "配額是必要的"
msgid "Domain quota exceeded"
msgstr "網域配額已超過"
-#: serializers.py:99 serializers.py:304 serializers.py:402
+#: serializers.py:41
+msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
+msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。"
+
+#: serializers.py:111 serializers.py:316 serializers.py:414
msgid "Permission denied."
msgstr "權限不足"
-#: serializers.py:150
+#: serializers.py:162
msgid ""
"List of administered domains (resellers and domain administrators only)."
msgstr "管理員網域列表 (只有經銷商和網域管理員)。"
-#: serializers.py:254
+#: serializers.py:266
msgid "Not allowed for this role."
msgstr "不允許這個身份"
-#: serializers.py:266
+#: serializers.py:278
msgid "Must be equal to mailbox full_address"
msgstr "必須跟信箱完整位址一樣"
-#: serializers.py:291
+#: serializers.py:303
msgid "Local domain {} does not exist"
msgstr "本機網域 {} 不存在"
-#: serializers.py:389
+#: serializers.py:401
msgid "A list of recipient"
msgstr "收件人列表"
-#: serializers.py:400
+#: serializers.py:412
msgid "Domain not found."
msgstr "網域不存在。"
-#: serializers.py:449
+#: serializers.py:461
msgid "You don't have access to this domain."
msgstr "您不能存取這個網域。"
-#: serializers.py:457
+#: serializers.py:469
msgid "You don't have access to this mailbox."
msgstr "您不能存取這個信箱。"
@@ -862,6 +906,18 @@ msgstr "已停用"
msgid "Awaiting checks"
msgstr "等待檢查"
+#: templates/admin/_domain_dnschecks_status.html:16
+#: templates/admin/_domain_dnschecks_status.html:32
+#: templates/admin/_domain_dnschecks_status.html:40
+#, fuzzy
+#| msgid "No DNS records found for %s"
+msgid "No record found"
+msgstr "沒有找到 %s 的 DNS 紀錄"
+
+#: templates/admin/_domain_dnschecks_status.html:24
+msgid "Waiting for key to be generated"
+msgstr ""
+
#: templates/admin/_global_statistics_widget.html:4
msgid "Global statistics"
msgstr "全域狀態"
@@ -1240,19 +1296,12 @@ msgstr "編輯 {}"
msgid "Delete %s?"
msgstr "刪除 %s?"
-#: tests/test_mx.py:144
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No A record found for MX %(domain)s"
-msgstr "沒有找到這個網域的 MX 紀錄。"
+#: tests/test_mx.py:139
+#, python-format
+msgid "No MX record for %s"
+msgstr "沒有 %s 的 MX 紀錄"
-#: tests/test_mx.py:147
-#, fuzzy, python-format
-#| msgid "No MX record found for this domain."
-msgid "No AAAA record found for MX %(domain)s"
-msgstr "沒有找到這個網域的 MX 紀錄。"
-
-#: tests/test_mx.py:150 tests/test_mx.py:153
+#: tests/test_mx.py:151 tests/test_mx.py:154
#, python-format
msgid "Invalid IP address format for %(domain)s; %(addr)s"
msgstr "無效的 IP 位址格式 %(domain)s; %(addr)s"
@@ -1290,11 +1339,11 @@ msgstr "MX 紀錄 {}"
msgid "DNSBL summary for {}"
msgstr "DNSBL 摘要 {}"
-#: views/domain.py:199
+#: views/domain.py:206
msgid "You can't delete your own domain"
msgstr "您不可以刪除您擁有的網域"
-#: views/domain.py:202
+#: views/domain.py:209
msgid "Domain deleted"
msgid_plural "Domains deleted"
msgstr[0] "網域移除"
@@ -1338,6 +1387,21 @@ msgstr "匯入使用者"
msgid "Forward updated"
msgstr "轉寄已更新"
+#, fuzzy
+#~| msgid "No DNS records found for %s"
+#~ msgid "No {type} record found for MX {mx}"
+#~ msgstr "沒有找到 %s 的 DNS 紀錄"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No A record found for MX %(domain)s"
+#~ msgstr "沒有找到這個網域的 MX 紀錄。"
+
+#, fuzzy
+#~| msgid "No MX record found for this domain."
+#~ msgid "No AAAA record found for MX %(domain)s"
+#~ msgstr "沒有找到這個網域的 MX 紀錄。"
+
#~ msgid "Quota in MB shared between mailboxes. A value of 0 means no quota."
#~ msgstr "信箱之間共用幾 MB 的配額。值為0表示沒配額。"
diff --git a/modoboa/admin/management/commands/subcommands/_mx.py b/modoboa/admin/management/commands/subcommands/_mx.py
index 8f0db645e..b88bd30a1 100644
--- a/modoboa/admin/management/commands/subcommands/_mx.py
+++ b/modoboa/admin/management/commands/subcommands/_mx.py
@@ -19,6 +19,7 @@ from django.utils.functional import cached_property
from django.utils.translation import ugettext as _
from modoboa.admin import constants, models
+from modoboa.dnstools import models as dns_models
from modoboa.parameters import tools as param_tools
@@ -193,6 +194,25 @@ class CheckMXRecords(BaseCommand):
if param_tools.get_global_parameter("enable_mx_checks"):
self.check_valid_mx(domain, mx_list, **options)
+ if param_tools.get_global_parameter("enable_spf_checks"):
+ dns_models.DNSRecord.objects.get_or_create_for_domain(
+ domain, "spf", ttl)
+ condition = (
+ param_tools.get_global_parameter("enable_dkim_checks") and
+ domain.dkim_public_key
+ )
+ if condition:
+ dns_models.DNSRecord.objects.get_or_create_for_domain(
+ domain, "dkim", ttl)
+ if param_tools.get_global_parameter("enable_dmarc_checks"):
+ dns_models.DNSRecord.objects.get_or_create_for_domain(
+ domain, "dmarc", ttl)
+ if param_tools.get_global_parameter("enable_autoconfig_checks"):
+ dns_models.DNSRecord.objects.get_or_create_for_domain(
+ domain, "autoconfig", ttl)
+ dns_models.DNSRecord.objects.get_or_create_for_domain(
+ domain, "autodiscover", ttl)
+
condition = (
not param_tools.get_global_parameter("enable_dnsbl_checks") or
options["no_dnsbl"] is True)
diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py
index 76958ec5c..230a97b81 100644
--- a/modoboa/admin/models/domain.py
+++ b/modoboa/admin/models/domain.py
@@ -161,6 +161,31 @@ class Domain(AdminObject):
else:
return "success"
+ @cached_property
+ def spf_record(self):
+ """Return SPF record."""
+ return self.dnsrecord_set.filter(type="spf").first()
+
+ @cached_property
+ def dkim_record(self):
+ """Return DKIM record."""
+ return self.dnsrecord_set.filter(type="dkim").first()
+
+ @cached_property
+ def dmarc_record(self):
+ """Return DMARC record."""
+ return self.dnsrecord_set.filter(type="dmarc").first()
+
+ @cached_property
+ def autoconfig_record(self):
+ """Return autoconfig record."""
+ return self.dnsrecord_set.filter(type="autoconfig").first()
+
+ @cached_property
+ def autodiscover_record(self):
+ """Return autodiscover record."""
+ return self.dnsrecord_set.filter(type="autodiscover").first()
+
@cached_property
def allocated_quota(self):
"""Return current quota allocation."""
@@ -257,7 +282,7 @@ class Domain(AdminObject):
}
if self.old_dkim_key_length != self.dkim_key_length:
self.dkim_public_key = ""
- self.dkim_private_key_path = ""
+ self.dkim_private_key_path = ""
super(Domain, self).save(*args, **kwargs)
def delete(self, fromuser, keepdir=False):
diff --git a/modoboa/admin/templates/admin/_domain_dnschecks_status.html b/modoboa/admin/templates/admin/_domain_dnschecks_status.html
index 1e123a4ae..4fc6fdfec 100644
--- a/modoboa/admin/templates/admin/_domain_dnschecks_status.html
+++ b/modoboa/admin/templates/admin/_domain_dnschecks_status.html
@@ -11,4 +11,37 @@
{% if enable_dnsbl_checks %}
DNSBL
{% endif %}
+ {% if enable_spf_checks %}
+ {% if not domain.spf_record %}
+ SPF
+ {% else %}
+
+ SPF
+ {% endif %}
+ {% endif %}
+ {% if enable_dkim_checks and domain.enable_dkim %}
+ {% if not domain.dkim_public_key %}
+ DKIM
+ {% else %}
+
+ DKIM
+ {% endif %}
+ {% endif %}
+ {% if enable_dmarc_checks %}
+ {% if not domain.dmarc_record %}
+ DMARC
+ {% else %}
+
+ DMARC
+ {% endif %}
+ {% endif %}
+ {% if enable_autoconfig_checks %}
+ {% if not domain.autoconfig_record and not domain.autodiscover_record %}
+ autoconfig
+ {% elif not domain.autoconfig_record or not domain.autodiscover_record %}
+ autoconfig
+ {% else %}
+ autoconfig
+ {% endif %}
+ {% endif %}
{% endif %}
diff --git a/modoboa/admin/tests/test_domain.py b/modoboa/admin/tests/test_domain.py
index 81c673dcd..0f54ba663 100644
--- a/modoboa/admin/tests/test_domain.py
+++ b/modoboa/admin/tests/test_domain.py
@@ -453,4 +453,3 @@ class DKIMTestCase(ModoTestCase):
os.unlink(key_path)
call_command("modo", "manage_dkim_keys")
self.assertTrue(os.path.exists(key_path))
-
\ No newline at end of file
diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py
index 1823be334..183ae8382 100644
--- a/modoboa/admin/tests/test_mx.py
+++ b/modoboa/admin/tests/test_mx.py
@@ -110,7 +110,7 @@ class MXTestCase(ModoTestCase):
@mock.patch("socket.getaddrinfo")
@mock.patch.object(dns.resolver.Resolver, "query")
- def test_get_mx_list_dsn_server(self, mock_query, mock_getaddrinfo):
+ def test_get_mx_list_dns_server(self, mock_query, mock_getaddrinfo):
"""Test to get mx list from specific DNS server."""
mock_query.side_effect = utils.mock_dns_query_result
mock_getaddrinfo.side_effect = utils.mock_ip_query_result
@@ -133,7 +133,7 @@ class MXTestCase(ModoTestCase):
get_domain_mx_list("bad-response.example.com")
log.check(
("modoboa.admin", "ERROR",
- _("No DNS records found for %s")
+ _("No DNS record found for %s")
% "does-not-exist.example.com"),
("modoboa.admin", "ERROR",
_("No MX record for %s") % "no-mx.example.com"),
@@ -142,11 +142,11 @@ class MXTestCase(ModoTestCase):
_("DNS resolution timeout, unable to query %s at the moment")
% "timeout.example.com"),
("modoboa.admin", "ERROR",
- _("No A record found for MX %(domain)s")
- % {"domain": "no-lookup.example.com"}),
+ _("No DNS record found for %s")
+ % "does-not-exist.example.com"),
("modoboa.admin", "ERROR",
- _("No AAAA record found for MX %(domain)s")
- % {"domain": "no-lookup.example.com"}),
+ _("No DNS record found for %s")
+ % "does-not-exist.example.com"),
("modoboa.admin", "WARNING",
_("Invalid IP address format for %(domain)s; %(addr)s")
% {"domain": "bad-response.example.com", "addr": "000.0.0.0"}),
@@ -225,3 +225,35 @@ class DNSBLTestCase(ModoTestCase):
response = self.client.get(
reverse("admin:dnsbl_domain_detail", args=[self.domain.pk]))
self.assertEqual(response.status_code, 200)
+
+
+class DNSChecksTestCase(ModoTestCase):
+ """A test case for DNS checks."""
+
+ @classmethod
+ def setUpTestData(cls): # NOQA:N802
+ """Create some data."""
+ super(DNSChecksTestCase, cls).setUpTestData()
+ cls.domain = factories.DomainFactory(name="dns-checks.com")
+
+ @mock.patch("gevent.socket.gethostbyname")
+ @mock.patch("socket.getaddrinfo")
+ @mock.patch.object(dns.resolver.Resolver, "query")
+ def test_management_command(
+ self, mock_query, mock_getaddrinfo, mock_g_gethostbyname):
+ """Check that command works fine."""
+ mock_query.side_effect = utils.mock_dns_query_result
+ mock_getaddrinfo.side_effect = utils.mock_ip_query_result
+ mock_g_gethostbyname.return_value = "1.2.3.4"
+
+ self.domain.enable_dkim = True
+ self.domain.dkim_public_key = "XXXXX"
+ self.domain.save(update_fields=["enable_dkim", "dkim_public_key"])
+
+ management.call_command("modo", "check_mx", "--no-dnsbl", "--ttl=0")
+
+ self.assertIsNot(self.domain.spf_record, None)
+ self.assertIsNot(self.domain.dkim_record, None)
+ self.assertIsNot(self.domain.dmarc_record, None)
+ self.assertIsNot(self.domain.autoconfig_record, None)
+ self.assertIsNot(self.domain.autodiscover_record, None)
diff --git a/modoboa/admin/tests/utils.py b/modoboa/admin/tests/utils.py
index 6a586a3c1..f0662d5ec 100644
--- a/modoboa/admin/tests/utils.py
+++ b/modoboa/admin/tests/utils.py
@@ -7,7 +7,9 @@ from __future__ import unicode_literals
import socket
from dns.name import Name
+from dns.rdtypes.IN.A import A
from dns.rdtypes.ANY.MX import MX
+from dns.rdtypes.ANY.TXT import TXT
from dns.resolver import NXDOMAIN, NoAnswer, NoNameservers, Timeout
@@ -23,8 +25,12 @@ class RRsetInvalid(object):
self.address = "000.0.0.0"
+_A_RECORD = A("IN", "A", "1.2.3.4")
_MX_RECORD_1 = MX("IN", "MX", 10, Name("mx.example.com".split(".")))
_MX_RECORD_2 = MX("IN", "MX", 10, Name("mx2.example.com".split(".")))
+_SPF_RECORD = TXT("IN", "TXT", ["v=spf1 mx -all"])
+_DMARC_RECORD = TXT("IN", "TXT", ["v=DMARC1 p=reject"])
+_DKIM_RECORD = TXT("IN", "TXT", ["v=DKIM1 p=XXXXX"])
_BAD_MX_RECORD = MX("IN", "MX", 10, Name("bad-response.example.com".split(".")))
_DNE_MX_RECORD = MX("IN", "MX", 10, Name(
"does-not-exist.example.com".split(".")))
@@ -46,6 +52,7 @@ _POSSIBLE_DNS_RESULTS = {
"bad-response.example.com": [_BAD_MX_RECORD],
"no-lookup.example.com": [_DNE_MX_RECORD],
"no-answer.example.com": [_DNE_MX_RECORD],
+ "dns-checks.com": [_MX_RECORD_2],
}
_POSSIBLE_DNS_RESULTS_NO_MX = {
@@ -54,6 +61,11 @@ _POSSIBLE_DNS_RESULTS_NO_MX = {
"no-lookup.example.com": NXDOMAIN(),
"no-answer.example.com": NoAnswer(),
"bad-response.example.com": [RRsetInvalid()],
+ "dns-checks.com": [_SPF_RECORD, ],
+ "modoboa._domainkey.dns-checks.com": [_DKIM_RECORD],
+ "_dmarc.dns-checks.com": [_DMARC_RECORD, ],
+ "autoconfig.dns-checks.com": [_A_RECORD],
+ "autodiscover.dns-checks.com": [_A_RECORD],
}
_POSSIBLE_IP_RESULTS = {
"test3.com": [_IPV4_RECORD_2],
diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py
index 824901cbd..41642d297 100644
--- a/modoboa/admin/views/domain.py
+++ b/modoboa/admin/views/domain.py
@@ -69,23 +69,25 @@ def _domains(request):
}
page = get_listing_page(domainlist, request.GET.get("page", 1))
parameters = request.localconfig.parameters
+ dns_checks = {
+ "enable_mx_checks": parameters.get_value("enable_mx_checks"),
+ "enable_spf_checks": parameters.get_value("enable_spf_checks"),
+ "enable_dkim_checks": parameters.get_value("enable_dkim_checks"),
+ "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"),
+ "enable_autoconfig_checks": (
+ parameters.get_value("enable_autoconfig_checks")),
+ "enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks")
+ }
context["headers"] = render_to_string(
- "admin/domain_headers.html", {
- "enable_mx_checks": parameters.get_value("enable_mx_checks"),
- "enable_dnsbl_checks": (
- parameters.get_value("enable_dnsbl_checks"))
- }, request
+ "admin/domain_headers.html", dns_checks, request
)
if page is None:
context["length"] = 0
else:
+ tpl_context = {"domains": page.object_list}
+ tpl_context.update(dns_checks)
context["rows"] = render_to_string(
- "admin/domains_table.html", {
- "domains": page.object_list,
- "enable_mx_checks": parameters.get_value("enable_mx_checks"),
- "enable_dnsbl_checks": (
- parameters.get_value("enable_dnsbl_checks"))
- }, request
+ "admin/domains_table.html", tpl_context, request
)
context["pages"] = [page.number]
return render_to_json_response(context)
@@ -104,6 +106,11 @@ def domains(request, tplname="admin/domains.html"):
return render(request, tplname, {
"selection": "domains",
"enable_mx_checks": parameters.get_value("enable_mx_checks"),
+ "enable_spf_checks": parameters.get_value("enable_spf_checks"),
+ "enable_dkim_checks": parameters.get_value("enable_dkim_checks"),
+ "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"),
+ "enable_autoconfig_checks": (
+ parameters.get_value("enable_autoconfig_checks")),
"enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks")
})
@@ -226,6 +233,11 @@ class DomainDetailView(
context.update({
"templates": {"left": [], "right": []},
"enable_mx_checks": parameters.get_value("enable_mx_checks"),
+ "enable_spf_checks": parameters.get_value("enable_spf_checks"),
+ "enable_dkim_checks": parameters.get_value("enable_dkim_checks"),
+ "enable_dmarc_checks": parameters.get_value("enable_dmarc_checks"),
+ "enable_autoconfig_checks": (
+ parameters.get_value("enable_autoconfig_checks")),
"enable_dnsbl_checks": parameters.get_value("enable_dnsbl_checks"),
})
for _receiver, widgets in result:
diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl
index 3f7ec5cf8..0b16ce2ea 100644
--- a/modoboa/core/commands/templates/settings.py.tpl
+++ b/modoboa/core/commands/templates/settings.py.tpl
@@ -2,8 +2,6 @@
"""
Django settings for {{ name }} project.
-Generated by 'django-admin startproject' using Django 1.11.8.
-
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
@@ -82,6 +80,7 @@ MODOBOA_APPS = (
'modoboa.relaydomains',
'modoboa.limits',
'modoboa.parameters',
+ 'modoboa.dnstools',
# Modoboa extensions here.
{% for extension in extensions %} '{{ extension }}',
{% endfor %}
diff --git a/modoboa/core/tests/test_views.py b/modoboa/core/tests/test_views.py
index fb5e3e840..07c9606c3 100644
--- a/modoboa/core/tests/test_views.py
+++ b/modoboa/core/tests/test_views.py
@@ -69,7 +69,11 @@ SETTINGS_SAMPLE = {
"admin-create_alias_on_mbox_rename": False,
"admin-dkim_keys_storage_dir": "",
"admin-dkim_default_key_length": 1024,
- "admin-custom_dns_server": "193.43.55.67"
+ "admin-custom_dns_server": "193.43.55.67",
+ "admin-enable_spf_checks": True,
+ "admin-enable_dkim_checks": True,
+ "admin-enable_dmarc_checks": True,
+ "admin-enable_autoconfig_checks": True,
}
diff --git a/modoboa/dnstools/__init__.py b/modoboa/dnstools/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/modoboa/dnstools/apps.py b/modoboa/dnstools/apps.py
new file mode 100644
index 000000000..d13d72ef1
--- /dev/null
+++ b/modoboa/dnstools/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class DnstoolsConfig(AppConfig):
+ name = 'dnstools'
diff --git a/modoboa/dnstools/constants.py b/modoboa/dnstools/constants.py
new file mode 100644
index 000000000..c579193ee
--- /dev/null
+++ b/modoboa/dnstools/constants.py
@@ -0,0 +1,29 @@
+"""App related constants."""
+
+import re
+
+
+DNS_RECORD_TYPES = [
+ ("spf", "SPF"),
+ ("dkim", "DKIM"),
+ ("dmarc", "DMARC"),
+ ("autoconfig", "Autoconfig"),
+ ("autodiscover", "Autodiscover"),
+]
+
+SPF_MECHANISMS = ["ip4", "ip6", "a", "mx", "ptr", "exists", "include"]
+
+DMARC_URI_REGEX = re.compile(r"^mailto:(.+)(!\w+)?")
+
+DMARC_TAGS = {
+ "adkim": {"values": ["r", "s"]},
+ "aspf": {"values": ["r", "s"]},
+ "fo": {"values": ["0", "1", "d", "s"]},
+ "p": {"values": ["none", "quarantine", "reject"]},
+ "pct": {"type": "int", "min_value": 0, "max_value": 100},
+ "rf": {"type": "list", "values": ["afrf"]},
+ "ri": {"type": "int"},
+ "rua": {"type": "list", "regex": DMARC_URI_REGEX},
+ "ruf": {"type": "list", "regex": DMARC_URI_REGEX},
+ "sp": {"values": ["none", "quarantine", "reject"]}
+}
diff --git a/modoboa/dnstools/factories.py b/modoboa/dnstools/factories.py
new file mode 100644
index 000000000..4a0b86641
--- /dev/null
+++ b/modoboa/dnstools/factories.py
@@ -0,0 +1,18 @@
+"""App related factories."""
+
+from __future__ import unicode_literals
+
+import factory
+
+from modoboa.admin import factories as admin_factories
+
+from . import models
+
+
+class DNSRecordFactory(factory.django.DjangoModelFactory):
+ """Factory for dns records."""
+
+ class Meta:
+ model = models.DNSRecord
+
+ domain = factory.SubFactory(admin_factories.DomainFactory)
diff --git a/modoboa/dnstools/lib.py b/modoboa/dnstools/lib.py
new file mode 100644
index 000000000..6a7e70b07
--- /dev/null
+++ b/modoboa/dnstools/lib.py
@@ -0,0 +1,264 @@
+"""dnstools library."""
+
+from __future__ import unicode_literals
+
+import ipaddress
+
+from django.utils.translation import ugettext as _
+
+from modoboa.admin import lib as admin_lib
+
+from . import constants
+
+
+def get_spf_record(domain):
+ """Return SPF record for domain (if any)."""
+ records = admin_lib.get_dns_records(domain, "TXT")
+ if records is None:
+ return None
+ for record in records:
+ value = str(record).strip('"')
+ if value.startswith("v=spf1"):
+ return value
+ return None
+
+
+def get_dkim_record(domain, selector):
+ """Return DKIM records form domain (if any)."""
+ name = "{}._domainkey.{}".format(selector, domain)
+ records = admin_lib.get_dns_records(name, "TXT")
+ if records is None:
+ return None
+ for record in records:
+ value = str(record).strip('"')
+ if value.startswith("v=DKIM1"):
+ return value
+ return None
+
+
+def get_dmarc_record(domain):
+ """Return DMARC record for domain (if any)."""
+ name = "_dmarc.{}".format(domain)
+ records = admin_lib.get_dns_records(name, "TXT")
+ if records is None:
+ return None
+ for record in records:
+ value = str(record).strip('"')
+ if value.startswith("v=DMARC1"):
+ return value
+ return None
+
+
+def _get_simple_record(name):
+ """We just want to know if name is declared."""
+ for rdtype in ["A", "CNAME", "AAAA"]:
+ records = admin_lib.get_dns_records(name, rdtype)
+ if records is not None:
+ break
+ else:
+ return None
+ for record in records:
+ value = str(record).strip('"')
+ break
+ return value
+
+
+def get_autoconfig_record(domain):
+ """Return autoconfig record for domain (if any)."""
+ return _get_simple_record("autoconfig.{}".format(domain))
+
+
+def get_autodiscover_record(domain):
+ """Return autodiscover record for domain (if any)."""
+ return _get_simple_record("autodiscover.{}".format(domain))
+
+
+class DNSSyntaxError(Exception):
+ """Custom exception for DNS errors."""
+
+ pass
+
+
+def check_spf_ip4(value):
+ """Check syntax of ip4 mechanism."""
+ parts = value.split(":")
+ if len(parts) != 2:
+ raise DNSSyntaxError(_("Wrong ip4 mechanism syntax"))
+ try:
+ ipaddress.ip_network(parts[1], False)
+ except ValueError:
+ raise DNSSyntaxError(_("Wrong IPv4 address format"))
+
+
+def check_spf_ip6(value):
+ """Check syntax of ip6 mechanism."""
+ if not value.startswith("ip6:"):
+ raise DNSSyntaxError(_("Wrong ip6 mechanism syntax"))
+ value = value.replace("ip6:", "")
+ try:
+ ipaddress.ip_network(value, False)
+ except ValueError:
+ raise DNSSyntaxError(_("Wrong IPv6 address format"))
+
+
+def _check_domain_and_mask(value, mechanism):
+ """Check for valid domain / mask."""
+ domain = None
+ mask = None
+ if ":" in value:
+ mechanism, domain = value.split(":")
+ if "/" in domain:
+ domain, mask = domain.split("/")
+ elif "/" in value:
+ mechanism, mask = value.split("/")
+ else:
+ raise DNSSyntaxError(
+ _("Invalid syntax for {} mechanism").format(mechanism))
+ if mask and (not mask.isdigit() or int(mask) > 32):
+ raise DNSSyntaxError(_("Invalid mask found {}").format(mask))
+
+
+def check_spf_a(value):
+ """Check syntax of a mechanism."""
+ if value == "a":
+ return
+ _check_domain_and_mask(value, "a")
+
+
+def check_spf_mx(value):
+ """Check syntax of mx mechanism."""
+ if value == "mx":
+ return
+ _check_domain_and_mask(value, "mx")
+
+
+def _check_simple(value, mechanism):
+ """Simple check."""
+ if value == mechanism:
+ return
+ parts = value.split(":")
+ if len(parts) != 2:
+ raise DNSSyntaxError(
+ _("Invalid syntax for {} mechanism").format(mechanism))
+
+
+def check_spf_ptr(value):
+ """Check syntax of ptr mechanism."""
+ _check_simple(value, "ptr")
+
+
+def check_spf_exists(value):
+ """Check syntax of ptr mechanism."""
+ _check_simple(value, "exists")
+
+
+def check_spf_include(value):
+ """Check syntax of include mechanism."""
+ _check_simple(value, "include")
+
+
+def check_spf_syntax(record):
+ """Check if record has a valid SPF syntax."""
+ if not record.startswith("v=spf1"):
+ raise DNSSyntaxError(_("Not an SPF record"))
+ parts = record.split(" ")[1:]
+ modifiers = []
+ mechanisms = []
+ for part in parts:
+ qualifier = None
+ if part[0] in ["+", "-", "~", "?"]:
+ qualifier = part[0]
+ part = part[1:]
+ if part == "all":
+ continue
+ for mechanism in constants.SPF_MECHANISMS:
+ if part.startswith(mechanism):
+ globals()["check_spf_{}".format(mechanism)](part)
+ mechanisms.append(mechanism)
+ break
+ else:
+ # Look for modifier
+ modifier = part.split("=")
+ if len(modifier) != 2:
+ raise DNSSyntaxError(_("Unknown mechanism {}").format(part))
+ if modifier[0] not in ["redirect", "exp"]:
+ raise DNSSyntaxError(_("Unknown modifier {}").format(
+ modifier[0]))
+ if modifier[0] in modifiers:
+ raise DNSSyntaxError(_("Duplicate modifier {} found").format(
+ modifier[0]))
+ modifiers.append(modifier[0])
+ if not len(mechanisms) and not len(modifiers):
+ raise DNSSyntaxError(_("No mechanism found"))
+ return None
+
+
+def check_dkim_syntax(record):
+ """Check if record has a valid DKIM syntax."""
+ if not record.startswith("v=DKIM1"):
+ raise DNSSyntaxError(_("Not a valid DKIM record"))
+ key = None
+ for tag in record.split(";")[1:]:
+ tag = tag.strip(" ")
+ parts = tag.split("=")
+ if len(parts) != 2:
+ raise DNSSyntaxError(_("Invalid tag {}").format(tag))
+ name = parts[0].strip(" ")
+ if name == "p":
+ key = "".join(part.strip('"') for part in parts[1].split(" "))
+ if key is None:
+ raise DNSSyntaxError(_("No key found in record"))
+ return key
+
+
+def check_dmarc_tag_string_value(tag, value):
+ """Check if value is valid for tag."""
+ tdef = constants.DMARC_TAGS[tag]
+ error = _("Wrong value {} for tag {}").format(value, tag)
+ if "values" in tdef and value not in tdef["values"]:
+ raise DNSSyntaxError(error)
+ elif "regex" in tdef and tdef["regex"].match(value) is None:
+ raise DNSSyntaxError(error)
+
+
+def check_dmarc_tag(tag, value):
+ """Check if tag is valid."""
+ tdef = constants.DMARC_TAGS[tag]
+ ttype = tdef.get("type", "string")
+ if ttype == "list":
+ for svalue in value.split(","):
+ check_dmarc_tag_string_value(tag, svalue)
+ elif ttype == "int":
+ error = _("Wrong value {} for tag {}:").format(value, tag)
+ try:
+ value = int(value)
+ except ValueError:
+ raise DNSSyntaxError(error + _(" not an integer"))
+ if "min_value" in tdef and value < tdef["min_value"]:
+ raise DNSSyntaxError(
+ error + _(" less than {}").format(tdef["min_value"]))
+ if "max_value" in tdef and value > tdef["max_value"]:
+ raise DNSSyntaxError(
+ error + _(" greater than {}").format(tdef["max_value"]))
+ else:
+ check_dmarc_tag_string_value(tag, value)
+
+
+def check_dmarc_syntax(record):
+ """Check if record has a valid DMARC syntax."""
+ if not record.startswith("v=DMARC1"):
+ raise DNSSyntaxError(_("Not a valid DMARC record"))
+ tags = {}
+ for tag in record.split(";")[1:]:
+ tag = tag.strip(" ")
+ parts = tag.split("=")
+ if len(parts) != 2:
+ raise DNSSyntaxError(_("Invalid tag {}").format(tag))
+ name = parts[0].strip(" ")
+ if name not in constants.DMARC_TAGS:
+ raise DNSSyntaxError(_("Unknown tag {}").format(name))
+ value = parts[1].strip(" ")
+ check_dmarc_tag(name, value)
+ tags[name] = value
+ if "p" not in tags:
+ raise DNSSyntaxError(_("Missing required p tag"))
diff --git a/modoboa/dnstools/locale/en/LC_MESSAGES/django.po b/modoboa/dnstools/locale/en/LC_MESSAGES/django.po
new file mode 100644
index 000000000..35a9dfc02
--- /dev/null
+++ b/modoboa/dnstools/locale/en/LC_MESSAGES/django.po
@@ -0,0 +1,142 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-11-20 10:22+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib.py:86
+msgid "Wrong ip4 mechanism syntax"
+msgstr ""
+
+#: lib.py:90
+msgid "Wrong IPv4 address format"
+msgstr ""
+
+#: lib.py:96
+msgid "Wrong ip6 mechanism syntax"
+msgstr ""
+
+#: lib.py:101
+msgid "Wrong IPv6 address format"
+msgstr ""
+
+#: lib.py:116 lib.py:142
+msgid "Invalid syntax for {} mechanism"
+msgstr ""
+
+#: lib.py:118
+msgid "Invalid mask found {}"
+msgstr ""
+
+#: lib.py:163
+msgid "Not an SPF record"
+msgstr ""
+
+#: lib.py:183
+msgid "Unknown mechanism {}"
+msgstr ""
+
+#: lib.py:185
+msgid "Unknown modifier {}"
+msgstr ""
+
+#: lib.py:188
+msgid "Duplicate modifier {} found"
+msgstr ""
+
+#: lib.py:192
+msgid "No mechanism found"
+msgstr ""
+
+#: lib.py:199
+msgid "Not a valid DKIM record"
+msgstr ""
+
+#: lib.py:205 lib.py:256
+msgid "Invalid tag {}"
+msgstr ""
+
+#: lib.py:210
+msgid "No key found in record"
+msgstr ""
+
+#: lib.py:217
+msgid "Wrong value {} for tag {}"
+msgstr ""
+
+#: lib.py:232
+msgid "Wrong value {} for tag {}:"
+msgstr ""
+
+#: lib.py:236
+msgid " not an integer"
+msgstr ""
+
+#: lib.py:239
+msgid " less than {}"
+msgstr ""
+
+#: lib.py:242
+msgid " greater than {}"
+msgstr ""
+
+#: lib.py:250
+msgid "Not a valid DMARC record"
+msgstr ""
+
+#: lib.py:259
+msgid "Unknown tag {}"
+msgstr ""
+
+#: lib.py:264
+msgid "Missing required p tag"
+msgstr ""
+
+#: models.py:79
+msgid "Public key mismatchs"
+msgstr ""
+
+#: templates/dnstools/autoconfig_records_status.html:8
+msgid "autoconfig record (Mozilla) found: "
+msgstr ""
+
+#: templates/dnstools/autoconfig_records_status.html:12
+msgid "autoconfig record (Mozilla) not found."
+msgstr ""
+
+#: templates/dnstools/autoconfig_records_status.html:17
+msgid "autodiscover record (Microsoft) found: "
+msgstr ""
+
+#: templates/dnstools/autoconfig_records_status.html:21
+msgid "autodiscover record (Microsoft) not found."
+msgstr ""
+
+#: templates/dnstools/dns_record_detail.html:8
+msgid "A DNS record has been found and is valid."
+msgstr ""
+
+#: templates/dnstools/dns_record_detail.html:12
+msgid "A DNS record has been found but its syntax is not valid:"
+msgstr ""
+
+#: views.py:36
+msgid "{} record of {}"
+msgstr ""
+
+#: views.py:64
+msgid "Auto configuration records for {}"
+msgstr ""
diff --git a/modoboa/dnstools/locale/fr/LC_MESSAGES/django.po b/modoboa/dnstools/locale/fr/LC_MESSAGES/django.po
new file mode 100644
index 000000000..9bda3a7fe
--- /dev/null
+++ b/modoboa/dnstools/locale/fr/LC_MESSAGES/django.po
@@ -0,0 +1,142 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-11-20 10:22+0100\n"
+"PO-Revision-Date: 2018-11-20 10:31+0100\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: LANGUAGE \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: lib.py:86
+msgid "Wrong ip4 mechanism syntax"
+msgstr "Mauvaise syntaxe de mécanisme ip4"
+
+#: lib.py:90
+msgid "Wrong IPv4 address format"
+msgstr "Mauvais format d'adresse IPv4"
+
+#: lib.py:96
+msgid "Wrong ip6 mechanism syntax"
+msgstr "Mauvaise syntaxe de mécanisme ip6"
+
+#: lib.py:101
+msgid "Wrong IPv6 address format"
+msgstr "Mauvais format d'adresse IPv6"
+
+#: lib.py:116 lib.py:142
+msgid "Invalid syntax for {} mechanism"
+msgstr "Mauvaise syntaxe de mécanisme {}"
+
+#: lib.py:118
+msgid "Invalid mask found {}"
+msgstr "Masque incorrect trouvé {}"
+
+#: lib.py:163
+msgid "Not an SPF record"
+msgstr "Ce n'est pas un enregistrement SPF"
+
+#: lib.py:183
+msgid "Unknown mechanism {}"
+msgstr "Mécanisme inconnu {}"
+
+#: lib.py:185
+msgid "Unknown modifier {}"
+msgstr "Modificateur inconnu {}"
+
+#: lib.py:188
+msgid "Duplicate modifier {} found"
+msgstr "Modificateur dupliqué {} trouvé"
+
+#: lib.py:192
+msgid "No mechanism found"
+msgstr "Aucun mécanisme trouvé"
+
+#: lib.py:199
+msgid "Not a valid DKIM record"
+msgstr "Ce n'est pas un enregistrement DKIM"
+
+#: lib.py:205 lib.py:256
+msgid "Invalid tag {}"
+msgstr "Tag incorrect {}"
+
+#: lib.py:210
+msgid "No key found in record"
+msgstr "Pas de clé trouvée dans l'enregistrement"
+
+#: lib.py:217
+msgid "Wrong value {} for tag {}"
+msgstr "Mauvaise valeur {} pour le tag {}"
+
+#: lib.py:232
+msgid "Wrong value {} for tag {}:"
+msgstr "Mauvaise valuer {} pour le tag {} :"
+
+#: lib.py:236
+msgid " not an integer"
+msgstr " ce n'est pas un entier"
+
+#: lib.py:239
+msgid " less than {}"
+msgstr " inférieur à {}"
+
+#: lib.py:242
+msgid " greater than {}"
+msgstr " supérieur à {}"
+
+#: lib.py:250
+msgid "Not a valid DMARC record"
+msgstr "Ce n'est pas un enregistrement DMARC"
+
+#: lib.py:259
+msgid "Unknown tag {}"
+msgstr "Tag inconnu {}"
+
+#: lib.py:264
+msgid "Missing required p tag"
+msgstr "Tag obligatoire p introuvable"
+
+#: models.py:79
+msgid "Public key mismatchs"
+msgstr "La clé publique ne correspond pas"
+
+#: templates/dnstools/autoconfig_records_status.html:8
+msgid "autoconfig record (Mozilla) found: "
+msgstr "Enregistrement autoconfig (Mozilla) trouvé :"
+
+#: templates/dnstools/autoconfig_records_status.html:12
+msgid "autoconfig record (Mozilla) not found."
+msgstr "Enregistrement autoconfig (Mozilla) introuvable."
+
+#: templates/dnstools/autoconfig_records_status.html:17
+msgid "autodiscover record (Microsoft) found: "
+msgstr "Enregistrement autodiscover (Microsoft) trouvé :"
+
+#: templates/dnstools/autoconfig_records_status.html:21
+msgid "autodiscover record (Microsoft) not found."
+msgstr "Enregistrement autodiscover (Microsoft) introuvable."
+
+#: templates/dnstools/dns_record_detail.html:8
+msgid "A DNS record has been found and is valid."
+msgstr "Un enregistrement DNS a été trouvé et est correct."
+
+#: templates/dnstools/dns_record_detail.html:12
+msgid "A DNS record has been found but its syntax is not valid:"
+msgstr "Un enregistrement DNS a été trouvé mais sa syntaxe est incorrecte :"
+
+#: views.py:36
+msgid "{} record of {}"
+msgstr "Enregistrement {} de {}"
+
+#: views.py:64
+msgid "Auto configuration records for {}"
+msgstr "Enregistrements d'autoconfiguration pour {}"
diff --git a/modoboa/dnstools/migrations/0001_initial.py b/modoboa/dnstools/migrations/0001_initial.py
new file mode 100644
index 000000000..6fd8e9891
--- /dev/null
+++ b/modoboa/dnstools/migrations/0001_initial.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.16 on 2018-11-19 10:07
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('admin', '0014_auto_20181017_1628'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='DNSRecord',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('type', models.CharField(choices=[('spf', 'SPF'), ('dkim', 'DKIM'), ('dmarc', 'DMARC'), ('autoconfig', 'Autoconfig'), ('autodiscover', 'Autodiscover')], max_length=15)),
+ ('value', models.TextField(blank=True)),
+ ('is_valid', models.BooleanField(default=False)),
+ ('error', models.CharField(blank=True, max_length=50, null=True)),
+ ('updated', models.DateTimeField(default=django.utils.timezone.now)),
+ ('domain', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='admin.Domain')),
+ ],
+ ),
+ ]
diff --git a/modoboa/dnstools/migrations/__init__.py b/modoboa/dnstools/migrations/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/modoboa/dnstools/models.py b/modoboa/dnstools/models.py
new file mode 100644
index 000000000..9c2ad4c79
--- /dev/null
+++ b/modoboa/dnstools/models.py
@@ -0,0 +1,85 @@
+"""App related models."""
+
+from __future__ import unicode_literals
+
+import datetime
+
+from django.db import models
+from django.utils import timezone
+from django.utils.encoding import python_2_unicode_compatible
+from django.utils.translation import ugettext as _
+
+from . import constants
+from . import lib
+
+
+class DNSRecordManager(models.Manager):
+ """Custom manager for DNSRecord."""
+
+ def get_or_create_for_domain(self, domain, rtype, ttl=7200):
+ """Get or create DNS record for given domain.
+
+ DNS queries are not performed while `ttl` (in seconds) is still valid.
+ """
+ now = timezone.now()
+ record = self.get_queryset().filter(
+ domain=domain, type=rtype, updated__gt=now).first()
+ if record:
+ return record
+
+ self.get_queryset().filter(domain=domain, type=rtype).delete()
+ record = DNSRecord(domain=domain, type=rtype)
+ record.get_dns_record()
+ if not record.value:
+ return
+ record.check_syntax(ttl)
+ record.save()
+ return record
+
+
+@python_2_unicode_compatible
+class DNSRecord(models.Model):
+ """A model to store DNS records for Domain."""
+
+ domain = models.ForeignKey("admin.Domain", on_delete=models.CASCADE)
+ type = models.CharField(
+ max_length=15, choices=constants.DNS_RECORD_TYPES)
+ value = models.TextField(blank=True)
+ is_valid = models.BooleanField(default=False)
+ error = models.CharField(max_length=50, null=True, blank=True)
+ updated = models.DateTimeField(default=timezone.now)
+
+ objects = DNSRecordManager()
+
+ def __str__(self):
+ return "{} ({}): {}".format(self.domain, self.type, self.value)
+
+ def get_dns_record(self):
+ """Retrieve corresponding DNS record."""
+ if self.type == "dkim":
+ self.value = lib.get_dkim_record(
+ self.domain.name, self.domain.dkim_key_selector)
+ else:
+ func = getattr(lib, "get_{}_record".format(self.type))
+ self.value = func(self.domain.name)
+
+ def check_syntax(self, ttl=7200):
+ """Check record syntax."""
+ try:
+ func = getattr(lib, "check_{}_syntax".format(self.type))
+ result = func(self.value)
+ except lib.DNSSyntaxError as err:
+ self.error = str(err)
+ self.updated = timezone.now()
+ return
+ except AttributeError:
+ pass
+
+ if self.type == "dkim" and result != self.dkim_public_key:
+ self.error = _("Public key mismatchs")
+ self.updated = timezone.now()
+ return
+
+ self.error = ""
+ self.is_valid = True
+ self.updated = timezone.now() + datetime.timedelta(seconds=ttl)
diff --git a/modoboa/dnstools/templates/dnstools/autoconfig_records_status.html b/modoboa/dnstools/templates/dnstools/autoconfig_records_status.html
new file mode 100644
index 000000000..d8fe9959d
--- /dev/null
+++ b/modoboa/dnstools/templates/dnstools/autoconfig_records_status.html
@@ -0,0 +1,24 @@
+{% extends "common/generic_modal.html" %}
+
+{% load i18n %}
+
+{% block modalbody %}
+ {% if object.autoconfig_record %}
+
+ {% trans "autoconfig record (Mozilla) found: "%} {{ object.autoconfig_record.value }}.
+
+ {% else %}
+
+ {% trans "autoconfig record (Mozilla) not found." %}
+
+ {% endif %}
+ {% if object.autodiscover_record %}
+
+ {% trans "autodiscover record (Microsoft) found: " %} {{ object.autodiscover_record.value }}.
+
+ {% else %}
+
+ {% trans "autodiscover record (Microsoft) not found." %}
+
+ {% endif %}
+{% endblock %}
diff --git a/modoboa/dnstools/templates/dnstools/dns_record_detail.html b/modoboa/dnstools/templates/dnstools/dns_record_detail.html
new file mode 100644
index 000000000..dccd8066b
--- /dev/null
+++ b/modoboa/dnstools/templates/dnstools/dns_record_detail.html
@@ -0,0 +1,16 @@
+{% extends "common/generic_modal.html" %}
+
+{% load i18n %}
+
+{% block modalbody %}
+ {% if object.is_valid %}
+
+ {% trans "A DNS record has been found and is valid." %}
+
+ {% else %}
+
+ {% trans "A DNS record has been found but its syntax is not valid:" %}
+ {{ object.error }}
+
+ {% endif %}
+{% endblock %}
diff --git a/modoboa/dnstools/tests.py b/modoboa/dnstools/tests.py
new file mode 100644
index 000000000..b0f7613c7
--- /dev/null
+++ b/modoboa/dnstools/tests.py
@@ -0,0 +1,150 @@
+"""App related tests."""
+
+from django.urls import reverse
+from django.test import SimpleTestCase
+
+from modoboa.lib.tests import ModoTestCase
+
+from . import factories
+from . import lib
+
+
+BAD_SPF_RECORDS = [
+ ("a mx ~all", "Not an SPF record"),
+ ("v=spf1 toto ~all", "Unknown mechanism toto"),
+ ("v=spf1 ip4 -all", "Wrong ip4 mechanism syntax"),
+ ("v=spf1 +ip4:1.1.1. +all", "Wrong IPv4 address format"),
+ ("v=spf1 ip6 ~all", "Wrong ip6 mechanism syntax"),
+ ("v=spf1 +ip6:x:: +all", "Wrong IPv6 address format"),
+ ("v=spf1 a|domain.com ~all", "Invalid syntax for a mechanism"),
+ ("v=spf1 a:domain.com/TOTO", "Invalid mask found TOTO"),
+ ("v=spf1 a/1000", "Invalid mask found 1000"),
+ ("v=spf1 mx:domain.com/TOTO", "Invalid mask found TOTO"),
+ ("v=spf1 mx/1000", "Invalid mask found 1000"),
+ ("v=spf1 ptr|test.com", "Invalid syntax for ptr mechanism"),
+ ("v=spf1 forward=test.com ~all", "Unknown modifier forward"),
+ ("v=spf1 redirect=test.com redirect=test.com ~all",
+ "Duplicate modifier redirect found"),
+ ("v=spf1", "No mechanism found"),
+]
+
+GOOD_SPF_RECORDS = [
+ "v=spf1 mx",
+ "v=spf1 a ~all",
+ "v=spf1 ip4:1.2.3.4 -all",
+ "v=spf1 ip4:1.2.3.4/16 -all",
+ "v=spf1 ip6:fe80::9eb6:d0ff:fe8e:2807 -all",
+ "v=spf1 ip6:fe80::9eb6:d0ff:fe8e:2807/64 -all",
+ "v=spf1 a -all",
+ "v=spf1 a:example.com -all",
+ "v=spf1 a:mailers.example.com -all",
+ "v=spf1 a/24 a:offsite.example.com/24 -all",
+ "v=spf1 mx mx:deferrals.domain.com -all",
+ "v=spf1 mx/24 mx:offsite.domain.com/24 -all",
+ "v=spf1 ptr -all",
+ "v=spf1 ptr:otherdomain.com -all",
+ "v=spf1 exists:example.com -all",
+ "v=spf1 include:example.com -all",
+ "v=spf1 ?include:example.com -all",
+ "v=spf1 redirect=example.com",
+ "v=spf1 exp=example.com",
+]
+
+BAD_DMARC_RECORDS = [
+ ("", "Not a valid DMARC record"),
+ ("v=DMARC1; test", "Invalid tag test"),
+ ("v=DMARC1; test=toto", "Unknown tag test"),
+ ("v=DMARC1; adkim=g", "Wrong value g for tag adkim"),
+ ("v=DMARC1; rua=mail:toto@test.com",
+ "Wrong value mail:toto@test.com for tag rua"),
+ ("v=DMARC1; rf=afrf,toto", "Wrong value toto for tag rf"),
+ ("v=DMARC1; ri=XXX", "Wrong value XXX for tag ri: not an integer"),
+ ("v=DMARC1; pct=-1", "Wrong value -1 for tag pct: less than 0"),
+ ("v=DMARC1; pct=1000", "Wrong value 1000 for tag pct: greater than 100"),
+ ("v=DMARC1; pct=100", "Missing required p tag"),
+]
+
+GOOD_DMARC_RECORDS = [
+ "v=DMARC1; p=reject; pct=100",
+ "v=DMARC1; p=quarantine; sp=none; adkim=s; aspf=s; "
+ "rua=mailto:dmarc-aggrep@ngyn.org; ruf=mailto:toto@test.com!24m; "
+ "rf=afrf; pct=100; ri=86400"
+]
+
+BAD_DKIM_RECORDS = [
+ ("", "Not a valid DKIM record"),
+ ("v=DKIM1; toto;p=XXX", "Invalid tag toto"),
+ ("v=DKIM1;k=rsa", "No key found in record"),
+]
+
+
+class TestCase(SimpleTestCase):
+ """Test test library."""
+
+ def test_check_spf_syntax(self):
+ for record in BAD_SPF_RECORDS:
+ with self.assertRaises(lib.DNSSyntaxError) as ctx:
+ lib.check_spf_syntax(record[0])
+ self.assertEqual(str(ctx.exception), record[1])
+ for record in GOOD_SPF_RECORDS:
+ lib.check_spf_syntax(record)
+
+ def test_check_dmarc_syntax(self):
+ for record in BAD_DMARC_RECORDS:
+ with self.assertRaises(lib.DNSSyntaxError) as ctx:
+ lib.check_dmarc_syntax(record[0])
+ self.assertEqual(str(ctx.exception), record[1])
+ for record in GOOD_DMARC_RECORDS:
+ lib.check_dmarc_syntax(record)
+
+ def test_check_dkim_syntax(self):
+ for record in BAD_DKIM_RECORDS:
+ with self.assertRaises(lib.DNSSyntaxError) as ctx:
+ lib.check_dkim_syntax(record[0])
+ self.assertEqual(str(ctx.exception), record[1])
+ key = lib.check_dkim_syntax("v=DKIM1;p=XXX123")
+ self.assertEqual(key, "XXX123")
+
+
+class ViewsTestCase(ModoTestCase):
+ """A test case for views."""
+
+ @classmethod
+ def setUpTestData(cls):
+ """Create some records."""
+ super(ViewsTestCase, cls).setUpTestData()
+ cls.spf_rec = factories.DNSRecordFactory(
+ type="spf", value="v=SPF1 mx -all", is_valid=True,
+ domain__name="test.com"
+ )
+ cls.dmarc_rec = factories.DNSRecordFactory(
+ type="dmarc", value="XXX", is_valid=False,
+ error="Not a DMARC record",
+ domain__name="test.com"
+ )
+ cls.dkim_rec = factories.DNSRecordFactory(
+ type="dkim", value="12345", is_valid=False,
+ error="Public key mismatchs",
+ domain__name="test.com"
+ )
+ cls.ac_rec = factories.DNSRecordFactory(
+ type="autoconfig", value="1.2.3.4", is_valid=True,
+ domain__name="test.com"
+ )
+
+ def test_record_detail_view(self):
+ url = reverse("dnstools:dns_record_detail", args=[self.spf_rec.pk])
+ response = self.client.get(url)
+ self.assertContains(
+ response, "A DNS record has been found and is valid")
+ url = reverse("dnstools:dns_record_detail", args=[self.dmarc_rec.pk])
+ response = self.client.get(url)
+ self.assertContains(response, "Not a DMARC record")
+
+ def test_autoconfig_record_status_view(self):
+ url = reverse(
+ "dnstools:autoconfig_records_status", args=[self.ac_rec.domain.pk])
+ response = self.client.get(url)
+ self.assertContains(response, "autoconfig record (Mozilla) found")
+ self.assertContains(
+ response, "autodiscover record (Microsoft) not found")
diff --git a/modoboa/dnstools/urls.py b/modoboa/dnstools/urls.py
new file mode 100644
index 000000000..b7c1f8496
--- /dev/null
+++ b/modoboa/dnstools/urls.py
@@ -0,0 +1,14 @@
+"""App related urls."""
+
+from django.conf.urls import url
+
+from . import views
+
+
+urlpatterns = [
+ url(r'^dnsrecords/(?P\d+)/$', views.DNSRecordDetailView.as_view(),
+ name="dns_record_detail"),
+ url(r'^dnsrecords/autoconfig/(?P\d+)/$',
+ views.AutoConfigRecordsStatusView.as_view(),
+ name="autoconfig_records_status"),
+]
diff --git a/modoboa/dnstools/views.py b/modoboa/dnstools/views.py
new file mode 100644
index 000000000..b6ea4c9c0
--- /dev/null
+++ b/modoboa/dnstools/views.py
@@ -0,0 +1,67 @@
+"""App related views."""
+
+from django.utils.translation import ugettext as _
+from django.views import generic
+
+from django.contrib.auth import mixins as auth_mixins
+
+from modoboa.admin import models as admin_models
+
+from . import models
+
+
+class DomainAccessRequiredMixin(auth_mixins.AccessMixin):
+ """Check if user can access domain."""
+
+ def dispatch(self, request, *args, **kwargs):
+ if not request.user.can_access(self.get_object()):
+ return self.handle_no_permission()
+ return super(DomainAccessRequiredMixin, self).dispatch(
+ request, *args, **kwargs)
+
+
+class DNSRecordDetailView(
+ auth_mixins.LoginRequiredMixin,
+ DomainAccessRequiredMixin,
+ generic.DetailView):
+ """View to display MX records."""
+
+ model = models.DNSRecord
+ template_name = "dnstools/dns_record_detail.html"
+
+ def get_context_data(self, **kwargs):
+ """Add extra variables."""
+ context = super(DNSRecordDetailView, self).get_context_data(**kwargs)
+ context.update({
+ "title": _("{} record of {}").format(
+ self.object.type.upper(), self.object.domain)
+ })
+ return context
+
+
+class AutoConfigRecordsStatusView(
+ auth_mixins.LoginRequiredMixin,
+ auth_mixins.PermissionRequiredMixin,
+ generic.DetailView):
+ """Autoconfig records status view."""
+
+ model = admin_models.Domain
+ permission_required = "admin.view_domain"
+ template_name = "dnstools/autoconfig_records_status.html"
+
+ def get_queryset(self):
+ """Add some prefetching."""
+ return (
+ admin_models.Domain.objects.get_for_admin(self.request.user)
+ .prefetch_related("dnsrecord_set")
+ )
+
+ def get_context_data(self, **kwargs):
+ """Add extra data to context."""
+ context = super(AutoConfigRecordsStatusView, self).get_context_data(
+ **kwargs)
+ context.update({
+ "title": _("Auto configuration records for {}").format(
+ self.object.name)
+ })
+ return context
diff --git a/modoboa/urls.py b/modoboa/urls.py
index 650816886..e8fe24b79 100644
--- a/modoboa/urls.py
+++ b/modoboa/urls.py
@@ -29,6 +29,7 @@ urlpatterns = [
url("", include("modoboa.core.urls", namespace="core")),
url("^user/forward/", forward, name="user_forward"),
url("admin/", include("modoboa.admin.urls", namespace="admin")),
+ url("dnstools/", include("modoboa.dnstools.urls", namespace="dnstools")),
# No namespace
url(r'^accounts/password_reset/$', core_views.password_reset,
name="password_reset"),
diff --git a/test_project/test_project/settings.py b/test_project/test_project/settings.py
index 364b38f22..3c20ea65a 100644
--- a/test_project/test_project/settings.py
+++ b/test_project/test_project/settings.py
@@ -69,6 +69,7 @@ MODOBOA_APPS = (
"modoboa.relaydomains",
"modoboa.limits",
"modoboa.parameters",
+ "modoboa.dnstools",
# Modoboa extensions here.
)