CLI
usage: checkdmarc [-h] [-p] [--ns NS [NS ...]] [--mx MX [MX ...]] [-d] [-f FORMAT]
[-o OUTPUT [OUTPUT ...]] [-n NAMESERVER [NAMESERVER ...]] [-t TIMEOUT]
[-b BIMI_SELECTOR] [-v] [-w WAIT] [--skip-tls] [--debug]
domain [domain ...]
TValidates and parses email-related DNS records
positional arguments:
domain one or more domains, or a single path to a file containing a
list of domains
options:
-h, --help show this help message and exit
-p, --parked indicate that the domains are parked
--ns NS [NS ...] approved nameserver substrings
--mx MX [MX ...] approved MX hostname substrings
-d, --descriptions include descriptions of tags in the JSON output
-f FORMAT, --format FORMAT
specify JSON or CSV screen output format
-o OUTPUT [OUTPUT ...], --output OUTPUT [OUTPUT ...]
one or more file paths to output to (must end in .json or .csv)
(silences screen output)
-n NAMESERVER [NAMESERVER ...], --nameserver NAMESERVER [NAMESERVER ...]
nameservers to query
-t TIMEOUT, --timeout TIMEOUT
number of seconds to wait for an answer from DNS (default 2.0)
-b BIMI_SELECTOR, --bimi-selector BIMI_SELECTOR
Check for a BIMI record at the provided selector
-v, --version show program's version number and exit
-w WAIT, --wait WAIT number of seconds to wait between checking domains (default 0.0)
--skip-tls skip TLS/SSL testing
--debug enable debugging output
Example
checkdmarc --skip-tls proton.me
{
"domain": "proton.me",
"base_domain": "proton.me",
"dnssec": true,
"ns": {
"hostnames": [
"ns1.proton.me",
"ns2.proton.me",
"ns3.proton.me"
],
"warnings": []
},
"mx": {
"hosts": [
{
"preference": 10,
"hostname": "mail.protonmail.ch",
"addresses": [
"176.119.200.128",
"185.205.70.128",
"185.70.42.128"
],
"dnssec": true,
"tlsa": [
"3 1 1 6111a5698d23c89e09c36ff833c1487edc1b0c841f87c49dae8f7a09e11e979e",
"3 1 1 76bb66711da416433ca890a5b2e5a0533c6006478f7d10a4469a947acc8399e1"
]
},
{
"preference": 20,
"hostname": "mailsec.protonmail.ch",
"addresses": [
"176.119.200.129",
"185.205.70.129",
"185.70.42.129"
],
"dnssec": true,
"tlsa": [
"3 1 1 6111a5698d23c89e09c36ff833c1487edc1b0c841f87c49dae8f7a09e11e979e",
"3 1 1 76bb66711da416433ca890a5b2e5a0533c6006478f7d10a4469a947acc8399e1"
]
}
],
"warnings": []
},
"mta_sts": {
"valid": true,
"id": "190906205100Z",
"policy": {
"version": "STSv1",
"mode": "enforce",
"max_age": 604800,
"mx": [
"mail.protonmail.ch",
"mailsec.protonmail.ch"
]
},
"warnings": [
"MTA-STS policy lines should end with CRLF not LF"
]
},
"spf": {
"record": "v=spf1 include:_spf.protonmail.ch ~all",
"valid": true,
"dns_lookups": 2,
"dns_void_lookups": 0,
"warnings": [],
"parsed": {
"pass": [],
"neutral": [],
"softfail": [],
"fail": [],
"include": [
{
"domain": "_spf.protonmail.ch",
"record": "v=spf1 ip4:185.70.40.0/24 ip4:185.70.41.0/24 ip4:185.70.43.0/24 include:_spf2.protonmail.ch ~all",
"dns_lookups": 1,
"dns_void_lookups": 0,
"parsed": {
"pass": [
{
"value": "185.70.40.0/24",
"mechanism": "ip4"
},
{
"value": "185.70.41.0/24",
"mechanism": "ip4"
},
{
"value": "185.70.43.0/24",
"mechanism": "ip4"
}
],
"neutral": [],
"softfail": [],
"fail": [],
"include": [
{
"domain": "_spf2.protonmail.ch",
"record": "v=spf1 ip4:51.89.119.103 ip4:91.134.188.129 ip4:51.77.79.158 ip4:54.38.221.122 ip4:188.165.51.139 ip4:54.36.149.183 ~all",
"dns_lookups": 0,
"dns_void_lookups": 0,
"parsed": {
"pass": [
{
"value": "51.89.119.103",
"mechanism": "ip4"
},
{
"value": "91.134.188.129",
"mechanism": "ip4"
},
{
"value": "51.77.79.158",
"mechanism": "ip4"
},
{
"value": "54.38.221.122",
"mechanism": "ip4"
},
{
"value": "188.165.51.139",
"mechanism": "ip4"
},
{
"value": "54.36.149.183",
"mechanism": "ip4"
}
],
"neutral": [],
"softfail": [],
"fail": [],
"include": [],
"redirect": null,
"exp": null,
"all": "softfail"
},
"warnings": []
}
],
"redirect": null,
"exp": null,
"all": "softfail"
},
"warnings": []
}
],
"redirect": null,
"exp": null,
"all": "softfail"
}
},
"dmarc": {
"record": "v=DMARC1; p=quarantine; fo=1; aspf=s; adkim=s;",
"valid": true,
"location": "proton.me",
"warnings": [
"rua tag (destination for aggregate reports) not found"
],
"tags": {
"v": {
"value": "DMARC1",
"explicit": true
},
"p": {
"value": "quarantine",
"explicit": true
},
"fo": {
"value": "1",
"explicit": true
},
"aspf": {
"value": "s",
"explicit": true
},
"adkim": {
"value": "s",
"explicit": true
},
"pct": {
"value": 100,
"explicit": false
},
"rf": {
"value": "afrf",
"explicit": false
},
"ri": {
"value": 86400,
"explicit": false
},
"sp": {
"value": "quarantine",
"explicit": false
}
}
},
"smtp_tls_reporting": {
"valid": true,
"tags": {
"v": {
"value": "TLSRPTv1"
},
"rua": {
"value": [
"https://reports.proton.me/reports/smtptls"
]
}
},
"warnings": []
}
}