diff --git a/app/config.py b/app/config.py index b4dc1184..047178d5 100644 --- a/app/config.py +++ b/app/config.py @@ -49,7 +49,6 @@ POSTFIX_SERVER = os.environ.get("POSTFIX_SERVER", "1.1.1.1") EMAIL_SERVERS_WITH_PRIORITY = eval( os.environ["EMAIL_SERVERS_WITH_PRIORITY"] ) # [(10, "email.hostname.")] -EMAIL_SERVERS = [es for _, es in EMAIL_SERVERS_WITH_PRIORITY] # these emails are ignored when computing stats if os.environ.get("IGNORED_EMAILS"): diff --git a/app/dashboard/templates/dashboard/domain_detail/dns.html b/app/dashboard/templates/dashboard/domain_detail/dns.html index f37b72c1..a6a78dc5 100644 --- a/app/dashboard/templates/dashboard/domain_detail/dns.html +++ b/app/dashboard/templates/dashboard/domain_detail/dns.html @@ -27,7 +27,9 @@ {% endif %} -
Add the following MX DNS record to your domain
+
Add the following MX DNS record to your domain. + Please note that there's a point (.) at the end of target addresses. +
{% for priority, email_server in EMAIL_SERVERS_WITH_PRIORITY %}
diff --git a/app/dashboard/views/domain_detail.py b/app/dashboard/views/domain_detail.py index 92a17ba7..a5d55545 100644 --- a/app/dashboard/views/domain_detail.py +++ b/app/dashboard/views/domain_detail.py @@ -1,7 +1,7 @@ from flask import render_template, request, redirect, url_for, flash from flask_login import login_required, current_user -from app.config import EMAIL_SERVERS_WITH_PRIORITY, EMAIL_SERVERS, DKIM_DNS_VALUE +from app.config import EMAIL_SERVERS_WITH_PRIORITY, DKIM_DNS_VALUE, EMAIL_DOMAIN from app.dashboard.base import dashboard_bp from app.dns_utils import ( get_mx_domains, @@ -33,9 +33,12 @@ def domain_detail_dns(custom_domain_id): if request.form.get("form-name") == "check-mx": mx_domains = get_mx_domains(custom_domain.domain) - if mx_domains != EMAIL_SERVERS: + if sorted(mx_domains) != sorted(EMAIL_SERVERS_WITH_PRIORITY): mx_ok = False - mx_errors = get_mx_domains(custom_domain.domain, keep_priority=True) + # build mx_errors to show to user + mx_errors = [ + f"{priority} {domain}" for (priority, domain) in mx_domains + ] else: flash( "Your domain is verified. Now it can be used to create custom alias", @@ -50,15 +53,7 @@ def domain_detail_dns(custom_domain_id): ) elif request.form.get("form-name") == "check-spf": spf_domains = get_spf_domain(custom_domain.domain) - for email_server in EMAIL_SERVERS: - email_server = email_server[:-1] # remove the trailing . - if email_server not in spf_domains: - flash( - f"{email_server} is not included in your SPF record.", "warning" - ) - spf_ok = False - - if spf_ok: + if EMAIL_DOMAIN in spf_domains: custom_domain.spf_verified = True db.session.commit() flash("The SPF is setup correctly", "success") @@ -68,6 +63,8 @@ def domain_detail_dns(custom_domain_id): ) ) else: + flash(f"{EMAIL_DOMAIN} is not included in your SPF record.", "warning") + spf_ok = False spf_errors = get_txt_record(custom_domain.domain) elif request.form.get("form-name") == "check-dkim": @@ -87,11 +84,7 @@ def domain_detail_dns(custom_domain_id): dkim_ok = False dkim_errors = get_txt_record(f"dkim._domainkey.{custom_domain.domain}") - spf_include_records = [] - for priority, email_server in EMAIL_SERVERS_WITH_PRIORITY: - spf_include_records.append(f"include:{email_server[:-1]}") - - spf_record = f"v=spf1 {' '.join(spf_include_records)} -all" + spf_record = f"v=spf1 include:{EMAIL_DOMAIN} -all" dkim_record = f"v=DKIM1; k=rsa; p={DKIM_DNS_VALUE}" diff --git a/app/dns_utils.py b/app/dns_utils.py index cc2201ea..0110b343 100644 --- a/app/dns_utils.py +++ b/app/dns_utils.py @@ -1,8 +1,9 @@ import dns.resolver -def get_mx_domains(hostname, keep_priority=False) -> [str]: - """return list of (domain name). priority is also included if `keep_priority` +def get_mx_domains(hostname) -> [(int, str)]: + """return list of (priority, domain name). + domain name ends with a "." at the end. """ try: answers = dns.resolver.query(hostname, "MX") @@ -13,10 +14,9 @@ def get_mx_domains(hostname, keep_priority=False) -> [str]: for a in answers: record = a.to_text() # for ex '20 alt2.aspmx.l.google.com.' - if not keep_priority: - record = record.split(" ")[1] # alt2.aspmx.l.google.com. + parts = record.split(" ") - ret.append(record) + ret.append((int(parts[0]), parts[1])) return ret