Compare commits
2 Commits
58212611ba
...
fd68be8991
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd68be8991 | ||
| 5b079317f8 |
@ -5,7 +5,7 @@ A Python script to resolve email-related DNS records for a domain.
|
|||||||
Example:
|
Example:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ python email_dns.py cbarts.net
|
$ python email_dns.py contoso.com
|
||||||
{
|
{
|
||||||
"cbarts.net": {
|
"cbarts.net": {
|
||||||
"mx": [
|
"mx": [
|
||||||
|
|||||||
22
email_dns.py
22
email_dns.py
@ -22,6 +22,15 @@ dkim_selectors = { # <selector>._domainkey.<domain>
|
|||||||
'protonmail': [
|
'protonmail': [
|
||||||
'protonmail', 'protonmail1', 'protonmail2'
|
'protonmail', 'protonmail1', 'protonmail2'
|
||||||
],
|
],
|
||||||
|
'autotask': [
|
||||||
|
'autotask'
|
||||||
|
],
|
||||||
|
'connectwise psa': [
|
||||||
|
's318306'
|
||||||
|
],
|
||||||
|
'zendesk': [
|
||||||
|
'zendesk1', 'zendesk2'
|
||||||
|
],
|
||||||
'sendgrid': [
|
'sendgrid': [
|
||||||
'sg', 's1', 'sg2', 's2', 's3'
|
'sg', 's1', 'sg2', 's2', 's3'
|
||||||
],
|
],
|
||||||
@ -36,8 +45,13 @@ dkim_selectors = { # <selector>._domainkey.<domain>
|
|||||||
'mandrill': [
|
'mandrill': [
|
||||||
'mandrill'
|
'mandrill'
|
||||||
],
|
],
|
||||||
|
# Mailgun (Very generic, thank you, Mailgun)
|
||||||
'mailgun': [
|
'mailgun': [
|
||||||
'pic', 'smtp', # Mailgun (Very generic, thank you, Mailgun)
|
'pic', 'smtp',
|
||||||
|
],
|
||||||
|
# Bloomerang (using SendGrid backend)
|
||||||
|
'bloomerang': [
|
||||||
|
'blm', 'blm2',
|
||||||
],
|
],
|
||||||
'bullhorn': [
|
'bullhorn': [
|
||||||
'bh'
|
'bh'
|
||||||
@ -59,7 +73,7 @@ def process_args(args: list) -> list:
|
|||||||
|
|
||||||
return domains
|
return domains
|
||||||
|
|
||||||
def safe_resolve(name: str, type: str) -> resolver.Answer:
|
def safe_resolve(name: str, type: str) -> resolver.Answer | None:
|
||||||
try:
|
try:
|
||||||
answer = resolver.resolve(name, type)
|
answer = resolver.resolve(name, type)
|
||||||
return answer
|
return answer
|
||||||
@ -70,7 +84,9 @@ def safe_resolve(name: str, type: str) -> resolver.Answer:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
class Domain:
|
class Domain:
|
||||||
|
|
||||||
# def __init__(self, name: str, mx: str = [], spf: str = None, dkim: list = [], dmarc: str = None) -> None:
|
# def __init__(self, name: str, mx: str = [], spf: str = None, dkim: list = [], dmarc: str = None) -> None:
|
||||||
|
|
||||||
def __init__(self, name: str) -> None:
|
def __init__(self, name: str) -> None:
|
||||||
self.name = name
|
self.name = name
|
||||||
self.mx = []
|
self.mx = []
|
||||||
@ -95,7 +111,7 @@ class Domain:
|
|||||||
for a in answer:
|
for a in answer:
|
||||||
if str(a).lower().find('v=spf1') != -1:
|
if str(a).lower().find('v=spf1') != -1:
|
||||||
self.spf = str(a).replace('"', '')
|
self.spf = str(a).replace('"', '')
|
||||||
# TODO: Recurse through includes
|
# TODO: Recurse through includes?
|
||||||
# matches = re.search(r'(?:include:)(.*)(?=\s)', str(a).lower())
|
# matches = re.search(r'(?:include:)(.*)(?=\s)', str(a).lower())
|
||||||
# domains = set()
|
# domains = set()
|
||||||
# if matches:
|
# if matches:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user