Skip to content

Instantly share code, notes, and snippets.

@zengxs
Last active June 8, 2019 01:48
Show Gist options
  • Save zengxs/b0768f2f2a5cd766b81c75df41c63449 to your computer and use it in GitHub Desktop.
Save zengxs/b0768f2f2a5cd766b81c75df41c63449 to your computer and use it in GitHub Desktop.
A simple smtps, imaps proxy server
#!/usr/bin/env python3
# support python 3.5 or later, use python standard library only
import asyncio
import ssl
async def dial(client_conn, server_conn):
async def io_copy(reader, writer):
while True:
data = await reader.read(32)
if not data:
break
writer.write(data)
writer.close()
asyncio.ensure_future(io_copy(client_conn[0], server_conn[1]))
asyncio.ensure_future(io_copy(server_conn[0], client_conn[1]))
async def handle_smtp_connection(reader, writer):
server_conn = await asyncio.open_connection(
# you can change the dest smtp server hostname
host="smtp.yandex.ru",
port=465,
ssl=ssl.create_default_context(),
)
asyncio.ensure_future(dial((reader, writer), server_conn))
async def handle_imap_connection(reader, writer):
server_conn = await asyncio.open_connection(
# you can change the dest imap server hostname
host="imap.yandex.ru",
port=993,
ssl=ssl.create_default_context(),
)
asyncio.ensure_future(dial((reader, writer), server_conn))
def main():
loop = asyncio.get_event_loop()
ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
# load your domain's ssl certificate
# recommend let's encrypt
ssl_ctx.load_cert_chain('ssl.crt', 'ssl.key')
smtp_server = asyncio.start_server(
handle_smtp_connection,
host='0.0.0.0',
port=465,
ssl=ssl_ctx,
)
imap_server = asyncio.start_server(
handle_imap_connection,
host='0.0.0.0',
port=993,
ssl=ssl_ctx,
)
try:
smtp_server = loop.run_until_complete(smtp_server)
imap_server = loop.run_until_complete(imap_server)
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
smtp_server.close()
imap_server.close()
loop.close()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment