заниматься вещами
Это ров со стоячей водой отчаяния, и ветерок не может сдуть ни малейшей ряби. В эту эпоху, когда только государственным чиновникам разрешалось поджигать, а людям не разрешалось пользоваться электрическим светом, мы могли бы также взять несколько строк простого кода Python и бросить в эту мертвую воду больше железяк.
Наша цель — сделать Интернет более грязным и вонючим, поэтому мы не связаны правилами. То, что я собираюсь использовать для операции сегодня, это почтовая система.
Спам, от него страдает много людей, но мы не пытаемся этим заниматься сегодня. Думая наоборот, мы не ненавидим его, а приветствуем. Например, я хочу зарегистрироваться массоводесять тысячаккаунт на гитхабе. Github проходит проверку электронной почты, даже если регистрация прошла успешно.На данный момент нам нужен почтовый сервер.Конкретный процесс выглядит следующим образом:
В это время я подумал, не могли бы вы автоматизировать прием электронной почты? Автоматизация включает в себя два момента: 1) Иметь в своем распоряжении бесконечные почтовые ящики 2) Очень легко получить содержимое письма для анализа
Немного подумав, в голову пришел план, который оказался сверхпростым существованием.
в: 1) В кастрированную почтовую систему не нужно логиниться, только получать и отправлять 2) Почтовая система может принимать любую почту с определенным суффиксом 3) Обеспечьте простой интерфейс REST для возврата почты JSON для разбора.
Теперь перейдем непосредственно к теме и поговорим о реализации.
Конфигурация разрешения доменного имени
Откройте управление доменными именами, возьмите в качестве примера Alibaba Cloud, добавьте две части информации
Добавьте запись A, указывающую на IP-адрес службы, которую мы будем развертывать.
A mx 6x.216.2xx.1xx
Добавление записи MX, указывающей на адрес доменного имени конфигурации входящей почты выше.
MX * mx.sayhiai.com
Уведомление
*
, что означает, что будут получены все доменные имена, в том числе доменные имена второго уровня и т. д. Например, xxxx@sayhiai.com, xjksfdsf@dfjsdlfjsd.sayhiai.com. Это бесконечно?
Написание SMTPD-сервера
Сервер SMTPD легко реализовать с помощью python, в частности, используя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
является предпочтительным. питон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, другие невозможно привязать
конец
На данный момент идеальный замкнутый цикл завершен. Я помню, что некоторое время назад некоторые студенты все еще были недовольны приобретением Microsoft github.Пришло время дать вам выход, и обратить внимание на получение еще нескольких IP-адресов.
Посмотрите, вы можете видеть, что даже такой большой сайт, как github, проходит только проверку электронной почты, можно предвидеть, сколько сайтов в Интернете могут использовать ту же идею.
Я выложил код на гитхаб :) :) :).GitHub.com/Li Yuchunying/Shame…
Если ты сделаешь что-то плохое, не оставляй свое имя