diff -rupN mailman-2.1.18-1.org/Mailman/Cgi/admin.py mailman-2.1.18-1/Mailman/Cgi/admin.py --- mailman-2.1.18-1.org/Mailman/Cgi/admin.py 2014-05-06 09:43:56.000000000 -0700 +++ mailman-2.1.18-1/Mailman/Cgi/admin.py 2015-02-15 00:22:05.000000000 -0800 @@ -1408,6 +1408,9 @@ def change_options(mlist, category, subc except Errors.MMHostileAddress: subscribe_errors.append( (safeentry, _('Hostile address (illegal characters)'))) + except Errors.MMEmailMissingMXRecord: + subscribe_errors.append( + (safeentry, _('Email address missing DNS MX record'))) except Errors.MembershipIsBanned, pattern: subscribe_errors.append( (safeentry, _('Banned address (matched %(pattern)s)'))) diff -rupN mailman-2.1.18-1.org/Mailman/Cgi/options.py mailman-2.1.18-1/Mailman/Cgi/options.py --- mailman-2.1.18-1.org/Mailman/Cgi/options.py 2014-05-06 09:43:56.000000000 -0700 +++ mailman-2.1.18-1/Mailman/Cgi/options.py 2015-02-15 00:19:33.000000000 -0800 @@ -410,6 +410,8 @@ address. Upon confirmation, any other m msg = _('Bad email address provided') except Errors.MMHostileAddress: msg = _('Illegal email address provided') + except Errors.MMEmailMissingMXRecord: + msg = _('Email address provided missing DNS MX record') except Errors.MMAlreadyAMember: msg = _('%(newaddr)s is already a member of the list.') except Errors.MembershipIsBanned: diff -rupN mailman-2.1.18-1.org/Mailman/Cgi/subscribe.py mailman-2.1.18-1/Mailman/Cgi/subscribe.py --- mailman-2.1.18-1.org/Mailman/Cgi/subscribe.py 2014-05-06 09:43:56.000000000 -0700 +++ mailman-2.1.18-1/Mailman/Cgi/subscribe.py 2015-02-15 00:42:45.000000000 -0800 @@ -214,6 +214,10 @@ The email address you supplied is not va results = _("""\ Your subscription is not allowed because the email address you gave is insecure.""") + except Errors.MMEmailMissingMXRecord: + results = _("""\ +Your subscription is not allowed because the email address you gave +does not have a DNS MX record.""") except Errors.MMSubscribeNeedsConfirmation: # Results string depends on whether we have private rosters or not if privacy_results: diff -rupN mailman-2.1.18-1.org/Mailman/Commands/cmd_subscribe.py mailman-2.1.18-1/Mailman/Commands/cmd_subscribe.py --- mailman-2.1.18-1.org/Mailman/Commands/cmd_subscribe.py 2014-05-06 09:43:56.000000000 -0700 +++ mailman-2.1.18-1/Mailman/Commands/cmd_subscribe.py 2015-02-15 00:23:58.000000000 -0800 @@ -125,6 +125,11 @@ Mailman won't accept the given email add Your subscription is not allowed because the email address you gave is insecure.""")) return STOP + except Errors.MMEmailMissingMXRecord: + res.results.append(_("""\ +Your subscription is not allowed because +the email address you gave does not have a DNS MX record.""")) + return STOP except Errors.MMAlreadyAMember: res.results.append(_('You are already subscribed!')) return STOP diff -rupN mailman-2.1.18-1.org/Mailman/Errors.py mailman-2.1.18-1/Mailman/Errors.py --- mailman-2.1.18-1.org/Mailman/Errors.py 2014-05-06 09:43:56.000000000 -0700 +++ mailman-2.1.18-1/Mailman/Errors.py 2015-02-15 00:24:38.000000000 -0800 @@ -100,6 +100,10 @@ class MMHostileAddress(EmailAddressError """Email address has potentially hostile characters in it.""" pass +class MMEmailMissingMXRecord(EmailAddressError): + """Email address missing DNS MX record.""" + pass + # Exceptions for admin request database class LostHeldMessage(MailmanError): diff -rupN mailman-2.1.18-1.org/Mailman/Utils.py mailman-2.1.18-1/Mailman/Utils.py --- mailman-2.1.18-1.org/Mailman/Utils.py 2014-05-06 09:43:56.000000000 -0700 +++ mailman-2.1.18-1/Mailman/Utils.py 2015-02-15 00:48:58.000000000 -0800 @@ -243,6 +243,15 @@ def ValidateEmail(s): for p in domain_parts: if len(p) == 0 or p[0] == '-' or len(_valid_domain.sub('', p)) > 0: raise Errors.MMHostileAddress, s + # MX Record sanity test + if dns_resolver: + try: + mx_domain = '.'.join(domain_parts) + mx_query = dns.resolver.query(mx_domain, 'MX') + if len(mx_query) < 1: + raise Errors.MMEmailMissingMXRecord, s + except: + raise Errors.MMEmailMissingMXRecord, s