import socket, threading, base64, json, sys
OUT = sys.argv[1]; PORT = int(sys.argv[2])
srv = socket.socket(); srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("127.0.0.1", PORT)); srv.listen(5)
def handle(c):
    f = c.makefile("rwb", buffering=0)
    def send(s): f.write((s + "\r\n").encode())
    def line(): return f.readline().decode().rstrip("\r\n")
    msg = {"user": None, "pass": None, "from": None, "rcpt": [], "data": ""}
    send("220 fake ESMTP")
    while True:
        l = line()
        if not l: break
        u = l.upper()
        if u.startswith("EHLO"): send("250-fake\r\n250 AUTH LOGIN")
        elif u == "AUTH LOGIN":
            send("334 VXNlcm5hbWU6"); msg["user"] = base64.b64decode(line()).decode()
            send("334 UGFzc3dvcmQ6"); msg["pass"] = base64.b64decode(line()).decode()
            if msg["pass"] == "right-password": send("235 ok")
            else: send("535 5.7.8 bad credentials"); break
        elif u.startswith("MAIL FROM"): msg["from"] = l[10:]; send("250 ok")
        elif u.startswith("RCPT TO"): msg["rcpt"].append(l[8:]); send("250 ok")
        elif u == "DATA":
            send("354 go"); d = []
            while True:
                x = line()
                if x == ".": break
                d.append(x[1:] if x.startswith("..") else x)
            msg["data"] = "\r\n".join(d); send("250 queued")
            open(OUT, "a").write(json.dumps(msg) + "\n")
        elif u == "QUIT": send("221 bye"); break
        else: send("502 unknown")
    c.close()
while True:
    c, _ = srv.accept(); threading.Thread(target=handle, args=(c,), daemon=True).start()
