Skip to content

Instantly share code, notes, and snippets.

@bitcynth
Created January 21, 2019 10:08
Show Gist options
  • Save bitcynth/757b3f97db4a76d11ce16f714b049782 to your computer and use it in GitHub Desktop.
Save bitcynth/757b3f97db4a76d11ce16f714b049782 to your computer and use it in GitHub Desktop.
import dns.resolver
import socket
import ssl
FROM_ADDR = 'cynthia@example.com'
TO_ADDR = 'meow@example.com'
msg_helo = 'HELO msg\r\n'
msg_from = 'MAIL FROM:<{}>\r\n'
msg_rcpt = 'RCPT TO:<{}>\r\n'
msg_starttls = 'STARTTLS\r\n'
msg_quit = 'QUIT\r\n'
msg_data = 'DATA\r\n'
msg_content = """From: <{}>
To: <{}>
Date: Mon, 25 January 2019 4:20:00 -0000
Subject: {}
{}
.
"""
context = ssl.create_default_context()
def get_host(addr):
parts = addr.split('@')
mx = dns.resolver.query(parts[1], 'MX')
for m in mx:
print(m)
return str(mx[0].exchange)[:-1]
def recv(s):
d = s.recv(1024)
print(d.decode('ascii'))
return d
def send(s, msg):
print(msg)
s.send(msg.encode('ascii'))
def send_email(to_addr, from_addr, content, subject, use_starttls=False, port=25):
to_host = get_host(to_addr)
print(to_host)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
s.connect((to_host, port))
recv(s)
send(s, msg_helo)
recv(s)
if use_starttls:
send(s, msg_starttls)
recv(s)
s = context.wrap_socket(s, server_hostname=to_host)
send(s, msg_from.format(from_addr))
recv(s)
send(s, msg_rcpt.format(to_addr))
recv(s)
send(s, msg_data)
recv(s)
send(s, msg_content.format(from_addr, to_addr, subject, content))
send(s, msg_quit)
s.close()
send_email(TO_ADDR, FROM_ADDR, 'hi', 'hello')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment