模擬郵件服務器,批量註冊利器

搞事情

這是一溝絕望的死水,清風吹不起半點漪淪。 在這隻許州官放火不準百姓電燈的年代,咱們不如一塊兒拿起幾行簡單的python代碼,向這死水中多扔些破銅爛鐵。html

咱們的目標就是把這互聯網搞的更亂更臭,因此咱們是不被規則束縛的。今天要拿來開刀的,是郵件系統。python

垃圾郵件,不少人都深受其害,但咱們今天並非要搞它。以相反的方式進行思考,咱們並不討厭它,並且歡迎它的到來。好比,我要批量註冊一萬個github帳號。github經過郵箱驗證就算註冊成功了,這個時候,咱們須要一個郵件服務器,具體流程以下: ios

這個時候就想啊,能不能把郵件接收這塊給自動化呢?自動化涉及兩個點: 1)要有無窮無盡的郵箱供你使用 2)要很是容易的得到郵件內容進行解析git

稍做思考,一個方案就在腦海中浮現,居然是超簡單的存在。 github

其中: 1) 閹割的郵件系統不須要登陸,只管收,無論發 2)郵件系統能夠接受帶有某後綴的任意郵件 3)提供簡單的REST接口返回郵件JSON供解析web

下面咱們直接進入正題,說一下實現方式。sql

域名解析配置

打開域名管理,以阿里云爲例,加入兩條信息json

加入一條A記錄,指向咱們將要部署的服務IP地址flask

A	mx	 6x.216.2xx.1xx
複製代碼

加入一條MX記錄,指向上面配置的收郵件的域名地址。瀏覽器

MX	*	mx.sayhiai.com
複製代碼

注意 *號,意思是全部的域名包括二級域名等,都會被收到。好比xxxx@sayhiai.com 、 xjksfdsf@dfjsdlfjsd.sayhiai.com。 是否是無窮無盡?

編寫SMTPD服務器

使用python能夠很容易的實現一個SMTPD服務器,具體的是使用aiosmtpd庫。郵件默認收到後是BASE64編碼,還分不少部分和類型,解析起來仍是比較麻煩的。須要猜解其編碼並遞歸拼接郵件等。代碼片斷以下:

def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value
def guess_charset(msg):
    charset = msg.get_charset()
    if charset is None:
        content_type = msg.get('Content-Type', '').lower()
        pos = content_type.find('charset=')
        if pos >= 0:
            charset = content_type[pos + 8:].strip()
    return charset
def print_part(msg):
    rs = ""
    content_type = msg.get_content_type()
    if content_type == 'text/plain' or content_type == 'text/html':
        content = msg.get_payload(decode=True)
        charset = guess_charset(msg)
        if charset:
            content = content.decode(charset)
        rs = rs + str(content)
    else:
        rs = rs + str(content_type)
    return rs
def print_info(msg):
    rs = ""
    if (msg.is_multipart()):
        parts = msg.get_payload()
        for n, part in enumerate(parts):
            if part.is_multipart():
                rs = rs + print_info(part)
            else:
                rs = rs + print_part(part)
    else:
        return print_part(msg)
    return rs
複製代碼

編寫REST服務

解析完郵件後,咱們把內容存放在sqlite3中。接下來就是編寫數據接口了。

咱們的目的是儘可能方便郵件的獲取,REST+json是首選的。python的flask庫無疑是最簡單最適合的。

import json
from flask import Flask
from flask import send_file
from data import dataInstance
app = Flask(__name__)
dao = dataInstance
def web_start(host, port):
    app.run(host=host, port=port)
@app.route('/')
def index():
    return send_file('static/index.html')
@app.route('/all')
def msg_all():
    rows = dao.read_all()
    return json.dumps(rows)
@app.route('/from/<addr>')
def msg_from(addr):
    rows = dao.read_from(addr)
    return json.dumps(rows)
@app.route('/to/<addr>')
def msg_to(addr):
    rows = dao.read_to(addr)
    return json.dumps(rows)
複製代碼

如你所見,提供了三個接口 1)/all 獲取全部郵件 2) /from/{addr} 根據發送方查找郵件 3) /to/{addr} 根據接收方查找郵件

每次查詢作多返回100條記錄,反正多了你也用不着。

試驗一下

使用 skdfkdsjf@sayhiai.com 註冊一個帳號。使用curl或者瀏覽器獲取郵件信息:

curl -XGET http://sayhiai.com:14000/to/skdfkdsjf@sayhiai.com
複製代碼

或者使用 sayhiai.com:14000/ 在線查詢一下。

個人太慢,記得本身搭建一個啊,別忘了SMTPD的端口是25,綁定其餘的是不行的

結尾

至此, 一個完美的閉環完成了。我記的前段時間某些同窗還對微軟收購github心存不滿,是時候給你一個發泄的途徑了,注意多弄幾個ip。

你瞧瞧你瞧瞧,即便github這麼大的一個網站,僅僅郵箱驗證就經過了,能夠預見網絡上有多少的網站可使用相同的思路去搞。

我已經把代碼放到github上了 :) :) :). github.com/lycying/cra…

要是你幹了壞事的話,就先不要留名了~

相關文章
相關標籤/搜索