Skip to content

PowerShell script to get domain mail info and control status such as MX, SPF, DKIM, DMARC and StartTLS.

License

Notifications You must be signed in to change notification settings

dotBATmanNO/PSGet-Domain-MailInfo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PSGet-Domain-MailInfo

PowerShell script to get domain mail info such as MX, SPF, DKIM, DMARC and StartTLS.

Output is accessible in PowerShell pipeline. Results are also written to DomainResults.CSV file and optionally to pie-chart PNGs by adding -CreateGraphs 1.

Three example uses for one / a limited number of domain(s):

PS C:\>.\Get-Domain-MailInfo example.com
PS C:\>.\Get-Domain-MailInfo example.com, github.com
PS C:\>.\Get-Domain-MailInfo example.com, github.com -CreateGraphs 1 -CheckDKIM 1 -DKIMSelector google

Example where a variable is assigned the data that is returned when checking domains listed in a txt file:

$mydomains = .\Get-Domain-MailInfo -Path .\MyDomains.txt -CheckDKIM 1

(progress bar will be shown - enumerating each domain as it is checked) The array $mydomains now holds the result for all requested domain names.

List the domainnames that have SPF:

$mydomains | Where-Object -FilterScript { $_.HasSPF -eq $true } | Select-Object $_ -ExpandProperty Domain

Print information for one domain:

$mydomains[nn] | Format-Table

or named

$mydomains.where{ $_.Domain -eq "example.com" }

Domain       : example.com
HasMX        : True
HasSPF       : True
HasDKIM      : #N/A
HasDMARC     : False
HasStartTLS  : False
MXRecord     : Null MX (RFC7505)
SPFRecord    : v=spf1 -all
DKIMSelector : #N/A
DKIMRecord   : #N/A
DMARCRecord  : False

More information and examples can be found using Get-Help, see output below:

PS C:\> Get-Help .\Get-Domain-MailInfo.ps1 -Full
                                                                                                                       
NAME
    C:\Get-Domain-MailInfo.ps1

SYNOPSIS
    Get MailInfo for domain(s).

    Default is to retrieve MX, SPF and DMARC records.
    * Will recognize Null MX - RFC7505

    Optionally add -CheckDKIM 1 to retrieve DKIM record(s).
    * Note requirement to provide DKIMSelector parameter.
      This parameter is a text array - provide selectors separated by comma

      Will fall back to using -DKIMSelector Selector1, Selector2 (Microsoft Exchange Online)

      Returns two columns
      - DKIMSelector holding all Selectors tested, separated by /
      - DKIMRecord holding [Selector1]DKIMRecord1/[Selector2]DKIMRecord2

      Example below is typically seen when DNS has wildcard TXT/SOA record:
      "Selector1/Selector2";"[Selector1]NoDKIMRecord/[Selector2]NoDKIMRecord"

    - Outputs to DomainResults.csv and console.
    - Uses System Default List Separator Character and Quotes to simplify CSV processing.

SYNTAX
    C:\Get-Domain-MailInfo.ps1 [-Name <String[]>] [-CheckSPF <Boolean>] [-CheckDMARC <Boolean>] [-CheckDKIM <Boolean>] [-DKIMSelector <String[]>] [-DNSServer <String>] [-ForceDNSServer <Boolean>] [-CheckStartTLS <Boolean>] [-Overwrite <Boolean>] [-UseHeader <Boolean>] [-CreateGraphs <Boolean>] [<CommonParameters>]

    C:\Get-Domain-MailInfo.ps1 [[-Name] <String[]>] [-Path <String>] [-CheckSPF <Boolean>] [-CheckDMARC <Boolean>] [-CheckDKIM <Boolean>] [-DKIMSelector <String[]>] [-DNSServer <String>] [-ForceDNSServer <Boolean>] [-CheckStartTLS <Boolean>] [-Overwrite <Boolean>] [-UseHeader <Boolean>] [-CreateGraphs <Boolean>] [<CommonParameters>]

PARAMETERS
    -Name <String[]>
        Script execution option 1 is to check ONE domain

        Required?                    false
        Position?                    1
        Default value                example.com
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -Path <String>
        Script execution option 2 is to check a list of domains from a file, one domain per line

        Required?                    false
        Position?                    named
        Default value
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -CheckSPF <Boolean>
        Default is to check SPF (RFC7208)

        Required?                    false
        Position?                    named
        Default value                True
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -CheckDMARC <Boolean>
        Default is to check DMARC (RFC7489)

        Required?                    false
        Position?                    named
        Default value                True
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -CheckDKIM <Boolean>
        Default is NOT to check DKIM (RFC6376)
        If you add -CheckDKIM 1 you should also specify -DKIMSelector <selector>

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -DKIMSelector <String[]>
        Specify the DKIMSelector(s) to check separated by comma.
        Tip: Send an e-mail to external mailbox for each system to check Selector for.
        Note: The script defaults to -DKIMSelector Selector1, Selector2
              This is the default used by Microsoft Exchange online.
              You could try -DKIMSelector google for G-Suite

        Required?                    false
        Position?                    named
        Default value                @("Selector1", "Selector2")
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -CheckStartTLS <Boolean>
        Default is to check StartTLS (RFC3207)

        Required?                    false
        Position?                    named
        Default value                True
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -DNSServer <String>
        Default is to use system default DNS Server

        Required?                    false
        Position?                    named
        Default value
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -ForceDNSServer <Boolean>
        Default is to check if DNS server is working

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -Overwrite <Boolean>
        Default is to overwrite the .CSV file.
        Note: The script will check for file lock and softfail.
              Remember to close the CSV file before running the script again.

        Required?                    false
        Position?                    named
        Default value                True
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -UseHeader <Boolean>
        The UseHeader line preference follows Overwrite unless specified

        Required?                    false
        Position?                    named
        Default value                $Overwrite
        Accept pipeline input?       false
        Accept wildcard characters?  false

    -CreateGraphs <Boolean>
        The CreateGraph option is set to False by default as it is just a nice-to-have.
        Will create one .PNG pie-chart per protection type; HasSPF/HasDKIM/HasDMARC.

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       false
        Accept wildcard characters?  false

    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see
        about_CommonParameters (https:/go.microsoft.com/fwlink/?LinkID=113216).

INPUTS

OUTPUTS

    -------------------------- EXAMPLE 1 --------------------------

    PS C:\>.\Get-Domain-MailInfo

    Domain       : example.com
    HasMX        : True
    HasSPF       : True
    HasDKIM      : #N/A
    HasDMARC     : False
    HasStartTLS  : #N/A
    MXRecord     : Null MX (RFC7505)
    SPFRecord    : v=spf1 -all
    DKIMSelector : #N/A
    DKIMRecord   : #N/A
    DMARCRecord  : False

    -------------------------- EXAMPLE 2 --------------------------

    PS C:\>.\Get-Domain-MailInfo.ps1 -CheckDKIM 1 | Format-Table -AutoSize

    Domain      HasMX HasSPF HasDKIM HasDMARC HasStartTLS MXRecord          SPFRecord   DKIMSelector        DKIMRecord
    ------      ----- ------ ------- -------- ----------- --------          ---------   ------------        ----------
    example.com  True   True   False    False #N/A        Null MX (RFC7505) v=spf1 -all Selector1/Selector2      False

    -------------------------- EXAMPLE 3 --------------------------

    PS C:\>.\Get-Domain-MailInfo.ps1 github.com -CheckDKIM 1 -DKIMSelector google

    [Notice: ] Could not connect to the SMTP Server alt3.aspmx.l.google.com

    Domain       : github.com
    HasMX        : True
    HasSPF       : True
    HasDKIM      : True
    HasDMARC     : True
    HasStartTLS  : False
    MXRecord     : alt3.aspmx.l.google.com,alt2.aspmx.l.google.com,aspmx.l.google.com,alt1.aspmx.l.google.com,alt4.aspmx.l.google.com
    SPFRecord    : v=spf1 ip4:192.30.252.0/22 ip4:208.74.204.0/22 ip4:46.19.168.0/23 include:_spf.google.com include:esp.github.com include:_spf.createsend.com include:servers.mcsv.net ~all
    DKIMSelector : google
    DKIMRecord   : [google]v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCNcsfnwX5c/B/MF/7J6/kDTO7rl08yEcrDLMDPp2YONNwqqpZxRSNt+cI8am8ixoPQ0V0bMVu1mYwZEV59u96vZFjVQIkfh08Y7q1jSjjd35FoaQl4YS5H4q6C4ARaC70jf2/NEDUUJFImkPKUZ42SV7MWQs2NnAEOXNQwvWmbCwIDAQAB
    DMARCRecord  : v=DMARC1; p=none; rua=mailto:[email protected]

    -------------------------- EXAMPLE 4 --------------------------

    PS C:\>.\Get-Domain-MailInfo.ps1 -Name "-invalid.name" -verbose | FT

    VERBOSE:  Script Get-Domain-MailInfo.ps1
    VERBOSE:  Last Updated 2020-07-05
    VERBOSE:
    VERBOSE:  Checking 1 domain(s)
    VERBOSE: [INVALID:] Domain lookup failed - probable invalid domain name (-invalid.name)

    Domain        HasMX HasSPF HasDKIM HasDMARC HasStartTLS MXRecord SPFRecord DKIMSelector DKIMRecord
    ------        ----- ------ ------- -------- ----------- -------- --------- ------------ ----------
    -invalid.name #N/A  #N/A   #N/A    #N/A     #N/A        #N/A     #N/A      #N/A         #N/A

    -------------------------- EXAMPLE 5 --------------------------

    PS C:\>.\Get-Domain-MailInfo.ps1 -Path .\DomainList.txt | FT

    Domain       HasMX HasSPF HasDKIM HasDMARC HasStartTLS MXRecord          SPFRecord   DKIMSelector DKIMRecord
    ------       ----- ------ ------- -------- ----------- --------          ---------   ------------ ----------
    example.com   True   True #N/A       False #N/A        Null MX (RFC7505) v=spf1 -all #N/A         #N/A
    -example.com  #N/A   #N/A #N/A        #N/A #N/A        #N/A              #N/A        #N/A         #N/A

RELATED LINKS
    https://github.com/dotBATmanNO/PSGet-Domain-MailInfo/