Giter Site home page Giter Site logo

crazy-email-recv-srv's Introduction

搞事情

这是一沟绝望的死水,清风吹不起半点漪沦。 在这只许州官放火不许百姓电灯的年代,我们不如一起拿起几行简单的python代码,向这死水中多扔些破铜烂铁。

我们的目标就是把这互联网搞的更乱更臭,所以我们是不被规则束缚的。今天要拿来开刀的,是邮件系统。

垃圾邮件,很多人都深受其害,但我们今天并不是要搞它。以相反的方式进行思考,我们并不讨厌它,而且欢迎它的到来。比如,我要批量注册一万个github账号。github通过邮箱验证就算注册成功了,这个时候,我们需要一个邮件服务器,具体流程如下:

这个时候就想啊,能不能把邮件接收这块给自动化呢?自动化涉及两个点: 1)要有无穷无尽的邮箱供你使用 2)要非常容易的获得邮件内容进行解析

稍作思考,一个方案就在脑海中浮现,竟然是超简单的存在。

其中: 1) 阉割的邮件系统不需要登录,只管收,不管发 2)邮件系统可以接受带有某后缀的任意邮件 3)提供简单的REST接口返回邮件JSON供解析

下面我们直接进入正题,说一下实现方式。

域名解析配置

打开域名管理,以阿里云为例,加入两条信息

加入一条A记录,指向我们将要部署的服务IP地址

A	mx	 6x.216.2xx.1xx

加入一条MX记录,指向上面配置的收邮件的域名地址。

MX	*	mx.sayhiai.com

注意 *号,意思是所有的域名包括二级域名等,都会被收到。比如[email protected][email protected]。 是不是无穷无尽?

编写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条记录,反正多了你也用不着。

试验一下

使用 [email protected] 注册一个账号。使用curl或者浏览器获取邮件信息:

curl -XGET http://sayhiai.com:14000/to/[email protected]

或者使用 http://sayhiai.com:14000/ 在线查询一下。

我的太慢,记得自己搭建一个啊,别忘了SMTPD的端口是25,绑定其他的是不行的

结尾

至此, 一个完美的闭环完成了。我记的前段时间某些同学还对微软收购github心存不满,是时候给你一个发泄的途径了,注意多弄几个ip。

你瞧瞧你瞧瞧,即使github这么大的一个网站,仅仅邮箱验证就通过了,可以预见网络上有多少的网站可以使用相同的思路去搞。

我已经把代码放到github上了 :) :) :). https://github.com/lycying/crazy-email-recv-srv ,对你有帮助的话别忘了关注微信公众号小姐姐味道,如果顺便打赏几毛钱,那是最妙不过了。要是你干了坏事的话,就先不要留名了~

crazy-email-recv-srv's People

Contributors

lycying avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

crazy-email-recv-srv's Issues

代码运行错误

OSError: [Errno 10048] error while attempting to bind on address ('127.0.0.1', 8025): 通常每个套接字地址(协议/网络地址/ 端口)只允许使用一次。
debug发现执行了两次controller.start()导致的错误

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.