# Local SMTP sink for testing sites that send mail.
# Usage: python3 mail_sink.py <dir> <port>
# Accepts any commands and saves each message as <dir>/<time>.eml.
# Deliberately lenient, to work with goodjava's MAIL FROM, which isn't RFC 5321.
import os, sys, time, socketserver

out_dir, port = sys.argv[1], int(sys.argv[2])
os.makedirs(out_dir, exist_ok=True)

class Handler(socketserver.StreamRequestHandler):
	def handle(self):
		self.wfile.write(b'220 sink\r\n')
		while True:
			line = self.rfile.readline()
			if not line:
				return
			cmd = line[:4].upper()
			if cmd == b'DATA':
				self.wfile.write(b'354 go\r\n')
				data = b''
				while True:
					l = self.rfile.readline()
					if l in (b'.\r\n', b'.\n', b''):
						break
					data += l
				with open(f'{out_dir}/{time.time():.6f}.eml', 'wb') as f:
					f.write(data)
				self.wfile.write(b'250 OK\r\n')
			elif cmd == b'QUIT':
				self.wfile.write(b'221 bye\r\n')
				return
			else:
				self.wfile.write(b'250 OK\r\n')

socketserver.ThreadingTCPServer.allow_reuse_address = True
socketserver.ThreadingTCPServer(('127.0.0.1', port), Handler).serve_forever()
