1. 程式人生 > >【如何校驗郵件地址的有效性】第三篇 :原理二

【如何校驗郵件地址的有效性】第三篇 :原理二

目標郵件伺服器

此過程的第一步是檢查是否存在我們要驗證的電子郵件地址域的MX記錄。MX記錄是儲存有關處理特定域的郵件的郵件伺服器資訊的DNS記錄。如果域名沒有MX記錄,則也不存在有效的電子郵件地址。我們來看看使用nslookup 命令的兩個例子 。請注意,您可以類似地使用其他命令,如挖 。

我們的示例電子郵件測試將是 [email protected] 和 [email protected] ,我們將使用Google的公共DNS伺服器8.8.8.8獲取DNS記錄。


> nslookup

> server 8.8.8.8
Default Server:  google-public
-dns-a.google.com Address: 8.8.8.8 > set q=mx > gmail.com Server: google-public-dns-a.google.com Address: 8.8.8.8 Non-authoritative answer: gmail.com MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com gmail.com MX preference = 30, mail exchanger = alt3.gmail-smtp-in
.l.google.com gmail.com MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com gmail.com MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com gmail.com MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com > nonexistingdomainname123456.com Server
: google-public-dns-a.google.com Address: 8.8.8.8 *** google-public-dns-a.google.com can't find nonexistingdomainname123456.com: Non-existent domain

對於非現有域的電子郵件地址,根本找不到任何MX伺服器。這自動錶示[email protected] 不是有效的電子郵件地址。對於 [email protected] ,情況不同。我們可以看到,對於 gmail.com 域,有5條MX記錄。通常只有少量電子郵件的域只能看到1個MX記錄,但較大的服務可能有多個郵件伺服器。重要的是不要在這裡選擇一個郵件伺服器。為了正確驗證電子郵件,我們可能必須使用所有發現的MX記錄中的所有伺服器。

搭建郵件伺服器(1~7篇文章)

為什麼這麼重要?想像一下我們從列表中選出一個MX伺服器的情況。可能發生的是,當我們嘗試連線到它以驗證電子郵件時,伺服器將不會因為任何原因而進行響應,或者由於該特定伺服器的最近問題,其響應將報告臨時錯誤。如果我們不嘗試其他可用的郵件伺服器,可能會導致錯誤的結果。另外一個伺服器可能會很好,並且給我們正確的答案。所以,如果一個伺服器有任何問題,只要嘗試另一個伺服器。這些問題包括無法連線到SMTP埠,沒有接收到問候,對HELO / EHLO或MAIL FROM命令的無效響應。

處理Greetdelay和HELO / EHLO

在這一步,我們假設我們有一個來自目標域的DNS MX記錄的郵件伺服器。下一步是將目標郵件伺服器連線到其埠25 / TCP的SMTP埠。我們剛才提到,如果無法建立連線,那麼我們應該嘗試另一臺伺服器(如果有的話)。

如果TCP連線建立,現在重要的是等待郵件伺服器傳送我們的問候語。我們不能簡單地將我們的命令傳送到伺服器,因為伺服器首先在SMTP協議中規定。一些伺服器被配置為拒絕與不尊重的客戶端進行協作。這是許多反垃圾郵件技術之一。垃圾郵件傳送程式有時被程式設計為儘可能簡單和快速。這就是為什麼他們不等待伺服器的問候,並在連線建立後立即開始傳送命令。拒絕這種客戶端的伺服器可能在最早階段擺脫這些垃圾郵件傳送者。

另一種相對較新的反垃圾郵件技術叫做Greetdelay。基本思想是基於我們已經提到的同樣的事實 - 垃圾郵件傳送者用於傳送電子郵件的許多程式非常簡單和編碼,以儘可能快地工作。如果要傳送數百萬封電子郵件獲得一些點選和銷售,他們必須快速。Greetdelay的想法是讓SMTP協議的RFC規範允許的時間延遲訊息傳輸代理(MTA,想要傳送電子郵件的軟體)。例如,執行Greetdelay的伺服器在向客戶端傳送問候之前等待30秒。或60秒。或90.不完全符合協議的垃圾郵件軟體可能會在允許傳送訊息之前放棄。可以在SMTP通訊的其他階段實現類似的策略。

因此,為了順利通過Greetdelay機制,電子郵件驗證機引擎必須將其超時設定至少5分鐘。問候語應該帶有程式碼SMTP響應程式碼220.其他程式碼可能意味著我們應該嘗試另一個MX伺服器。

收到問候語後,客戶端(我們的電子郵件驗證引擎)應傳送 HELO 或 EHLO 命令。由於 HELO 命令僅存在於與舊軟體的相容性,所以每次都使用 EHLO 。其唯一的引數是客戶端的完全限定域名(FQDN)。在我們傳送MAIL FROM 命令之後,我們將介紹在下一節中執行電子郵件驗證客戶端的伺服器擁有自己的域名的重要性 。但在我們可以這樣做之前,我們將等待對我們的EHLO的答覆 。這裡的SMTP程式碼應該是250,否則我們可以假設這個伺服器有問題。

讓我們看看當我們和其中一個Gmail的伺服器(從S開始的線路 : 來自伺服器,從C開始的線路: 來自我們的客戶端)時,會發生什麼情況:


> nc alt4.gmail-smtp-in.l.google.com 25
S: 220 mx.google.com ESMTP m14si19812165icp.91 - gsmtp
C: EHLO mail.example.com
S: 250-mx.google.com at your service, [198.51.100.123]
S: 250-SIZE 35882577
S: 250-8BITMIME
S: 250-STARTTLS
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8

我們使用 Netcat 作為客戶端,允許我們手動鍵入SMTP命令。我們的IP地址是198.51.100.123。MX伺服器向我們傳送正確的問候語,並使用EHLO 命令回覆 。伺服器的響應程式碼是250,它向我們傳送了一個受支援的副檔名單,這對我們來說並不重要

相關推薦

如何郵件地址有效性 原理

目標郵件伺服器 此過程的第一步是檢查是否存在我們要驗證的電子郵件地址域的MX記錄。MX記錄是儲存有關處理特定域的郵件的郵件伺服器資訊的DNS記錄。如果域名沒有MX記錄,則也不存在有效的電子郵件地址。我們來看看使用nslookup 命令的兩個例子 。請注意,您可以類似地使用其

搞定Java併發程式設計1執行緒的五種可用狀態

本文轉載自牛客網上一網友的回答:概括的解釋下執行緒的幾種可用狀態 第一種狀態:新建(new):新建了一個執行緒物件。例如,Thread thread = new Thread(); 第二種狀態:可執行狀態(Runnable):又叫“就緒狀態”。執行緒新建後,其他執行緒(比如main執行

搞定Java併發程式設計12happens-before

 上一篇:final域的記憶體語義:https://blog.csdn.net/pcwl1206/article/details/84925372 目  錄: 1、JMM的設計 2、happens-before的定義 3、happens-before規則

搞定Java併發程式設計11final域的記憶體語義

上一篇文章:鎖的記憶體語義:https://blog.csdn.net/pcwl1206/article/details/84921447 目  錄: 1、final域的重排序規則 2、寫final域的重排序規則 3、讀final域的重排序規則 4、final域為引用型

搞定Java併發程式設計10鎖的記憶體語義

上一篇:CAS詳解:https://blog.csdn.net/pcwl1206/article/details/84892287 目  錄: 1、鎖的釋放-獲取建立的happens-before關係 2、釋放鎖和獲取鎖的記憶體語義 3、鎖記憶體語義的實現 4、conc

搞定Java併發程式設計9CAS詳解

上一篇:volatile關鍵字詳解:https://blog.csdn.net/pcwl1206/article/details/84881395 目  錄: 一、CAS基本概念 1.1、CAS的定義 1.2、CAS的3個運算元  二、Java如何實現原子操作

搞定Java併發程式設計8volatile關鍵字詳解

上一篇:Java記憶體模型詳解:https://blog.csdn.net/pcwl1206/article/details/84871090 目  錄: 1、volatile的作用 1.1、volatile的可見性 1.2、volatile禁止指令重排序 2、vola

搞定Java併發程式設計7Java記憶體模型詳解

上一篇:ThreadLocal詳解:https://blog.csdn.net/pcwl1206/article/details/84859661 其實在Java虛擬機器的學習中,我們或多或少都已經接觸過了有關Java記憶體模型的相關概念(點選檢視),只不過在Java虛擬機器中講的不夠詳細,因此

搞定Java併發程式設計6ThreadLocal詳解

上一篇:synchronized關鍵字:https://blog.csdn.net/pcwl1206/article/details/84849400 目  錄: 1、ThreadLocal是什麼? 2、ThreadLocal使用示例 3、ThreadLocal原始碼分析

搞定Java併發程式設計5synchronized關鍵字

多執行緒上篇:https://blog.csdn.net/pcwl1206/article/details/84837530 多執行緒下篇:https://blog.csdn.net/pcwl1206/article/details/84843170 本文轉發自:https://blog.c

搞定Java併發程式設計4多執行緒概述~下篇

上一篇:多執行緒上篇:https://blog.csdn.net/pcwl1206/article/details/84837530 目  錄: 1、等待/喚醒機制 2、執行緒中斷 3、執行緒終止 4、執行緒休眠sleep 5、執行緒讓步yield() 6、jo

搞定Java併發程式設計3多執行緒概述~上

上一篇:併發基礎概述:https://blog.csdn.net/pcwl1206/article/details/84833911 目  錄: 1、什麼是執行緒 2、執行緒的建立 2.1、Thread和Runnable簡介 2.2、Thread和Runnable的異同

搞定Java併發程式設計2併發基礎概述

上一篇:執行緒的五種可用狀態 目  錄: 1、什麼是併發 2、Java的多執行緒和併發性 3、多執行緒的優點 4、多執行緒的代價 5、競態條件與臨界區 6、執行緒安全與共享資源 7、執行緒安全及不可變性 1、什麼是併發 在過去單CPU時代,單任務

搞定Java併發程式設計13重排序

上一篇:happens-before:https://blog.csdn.net/pcwl1206/article/details/84929752 目  錄: 1、資料依賴性 2、as-if-serial語義 3、程式順序規則 4、重排序對多執行緒的影響 5、指令

搞定Java併發程式設計17佇列同步器AQS原始碼分析之共享模式

AQS系列文章: 1、佇列同步器AQS原始碼分析之概要分析 2、佇列同步器AQS原始碼分析之獨佔模式 3、佇列同步器AQS原始碼分析之共享模式 4、佇列同步器AQS原始碼分析之Condition介面、等待佇列 通過上一篇文章的的分析,我們知道獨佔模式獲取同步狀態(或者說獲取鎖

搞定Java併發程式設計16佇列同步器AQS原始碼分析之獨佔模式

AQS系列文章: 1、佇列同步器AQS原始碼分析之概要分析 2、佇列同步器AQS原始碼分析之獨佔模式 3、佇列同步器AQS原始碼分析之共享模式 4、佇列同步器AQS原始碼分析之Condition介面、等待佇列 本文主要講解佇列同步器AQS的獨佔模式:主要分為獨佔式同步狀態獲取

搞定Java併發程式設計15佇列同步器AQS原始碼分析之概要分析

AQS系列文章: 1、佇列同步器AQS原始碼分析之概要分析 2、佇列同步器AQS原始碼分析之獨佔模式 3、佇列同步器AQS原始碼分析之共享模式 4、佇列同步器AQS原始碼分析之Condition介面、等待佇列 先推薦兩篇不錯的博文: 1、一行一行原始碼分析清楚Abstract

搞定Java併發程式設計14Java中鎖的概述

上一篇:重排序:https://blog.csdn.net/pcwl1206/article/details/84930669 1、Lock介面 鎖是用來控制多個執行緒訪問共享資源的方式,一般來說,一個鎖能夠防止多個執行緒同時訪問共享資源(但有些鎖可以允許多個執行緒併發訪問共享資源,比如:讀

搞定Java併發程式設計18佇列同步器AQS原始碼分析之Condition介面、等待佇列

AQS系列文章: 1、佇列同步器AQS原始碼分析之概要分析 2、佇列同步器AQS原始碼分析之獨佔模式 3、佇列同步器AQS原始碼分析之共享模式 4、佇列同步器AQS原始碼分析之Condition介面、等待佇列 通過前面三篇關於AQS文章的學習,我們深入瞭解了AbstractQ

搞定Java併發程式設計29Executor 框架詳解

上一篇:Java中的執行緒池詳解 本文目錄: 1、Executor 框架簡介 1.1、Executor 框架的兩級排程模型 1.2、Executor 框架的結構與成員 2、ThreadPoolExecutor 詳解 2.1、FixedThreadPool 2.2、Sing