Smtp

有人有 Powershell 腳本來查找域的 MX 記錄嗎?

  • August 29, 2016

我想檢查我的聯繫人管理系統中的電子郵件地址是否有效,我能想到的最好方法是獲取其域的 MX 記錄,然後打開 SMTP 連接並查看遠端伺服器是否接受電子郵件地址作為有效的“收件人”。

看看Powershell Dig Cmdlet

使用它你可以做到這一點:

PS> $allRecords = Get-Dns -Name mydomain.com -Type MX
PS> write-host $allRecords.RecordsMX

$allRecords是 PoshNet.Dns.Response 類型,因此您可以讀取其上的屬性以獲取記錄。

這個 cmdlet 的另一個好處是您可以讓它在單個查詢中返回多種類型的記錄。

function Get-DnsAddressList
{
   param(
       [parameter(Mandatory=$true)][Alias("Host")]
         [string]$HostName)

   try {
       return [System.Net.Dns]::GetHostEntry($HostName).AddressList
   }
   catch [System.Net.Sockets.SocketException] {
       if ($_.Exception.ErrorCode -ne 11001) {
           throw $_
       }
       return = @()
   }
}

function Get-DnsMXQuery
{
   param(
       [parameter(Mandatory=$true)]
         [string]$DomainName)

   if (-not $Script:global_dnsquery) {
       $Private:SourceCS = @'
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace PM.Dns {
 public class MXQuery {
   [DllImport("dnsapi", EntryPoint="DnsQuery_W", CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
   private static extern int DnsQuery(
       [MarshalAs(UnmanagedType.VBByRefStr)]
       ref string pszName, 
       ushort     wType, 
       uint       options, 
       IntPtr     aipServers, 
       ref IntPtr ppQueryResults, 
       IntPtr pReserved);

   [DllImport("dnsapi", CharSet=CharSet.Auto, SetLastError=true)]
   private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);

   public static string[] Resolve(string domain)
   {
       if (Environment.OSVersion.Platform != PlatformID.Win32NT)
           throw new NotSupportedException();

       List<string> list = new List<string>();

       IntPtr ptr1 = IntPtr.Zero;
       IntPtr ptr2 = IntPtr.Zero;
       int num1 = DnsQuery(ref domain, 15, 0, IntPtr.Zero, ref ptr1, IntPtr.Zero);
       if (num1 != 0)
           throw new Win32Exception(num1);
       try {
           MXRecord recMx;
           for (ptr2 = ptr1; !ptr2.Equals(IntPtr.Zero); ptr2 = recMx.pNext) {
               recMx = (MXRecord)Marshal.PtrToStructure(ptr2, typeof(MXRecord));
               if (recMx.wType == 15)
                   list.Add(Marshal.PtrToStringAuto(recMx.pNameExchange));
           }
       }
       finally {
           DnsRecordListFree(ptr1, 0);
       }

       return list.ToArray();
   }

   [StructLayout(LayoutKind.Sequential)]
   private struct MXRecord
   {
       public IntPtr pNext;
       public string pName;
       public short  wType;
       public short  wDataLength;
       public int    flags;
       public int    dwTtl;
       public int    dwReserved;
       public IntPtr pNameExchange;
       public short  wPreference;
       public short  Pad;
   }
 }
}
'@

       Add-Type -TypeDefinition $Private:SourceCS -ErrorAction Stop
       $Script:global_dnsquery = $true
   }

   [PM.Dns.MXQuery]::Resolve($DomainName) | % {
       $rec = New-Object PSObject
       Add-Member -InputObject $rec -MemberType NoteProperty -Name "Host"        -Value $_
       Add-Member -InputObject $rec -MemberType NoteProperty -Name "AddressList" -Value $(Get-DnsAddressList $_)
       $rec
   }
}

Get-DnsMXQuery -DomainName "gmail.com"

引用自:https://serverfault.com/questions/164508