Skip to content

Instantly share code, notes, and snippets.

@HalCanary
Last active January 13, 2022 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HalCanary/c9bf00ee260386d6686c1479451daeae to your computer and use it in GitHub Desktop.
Save HalCanary/c9bf00ee260386d6686c1479451daeae to your computer and use it in GitHub Desktop.
send-email
#!/usr/bin/env python3
'''Usage:
{} TO_ADDR SUBJECT CONTENT_TEXT_FILE_PATH [ATTACHMENTS]
'''
import email.message
import email.utils
import os
import smtplib
import sys
import json
SECRETS_FILE = '~/.email_secrets.json'
def make_email(from_addr, to_addr, subject, content=None, attachments=None, headers=None):
msg = email.message.EmailMessage()
msg['Date'] = email.utils.formatdate()
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = to_addr
if headers is not None:
for k, v in headers.items():
msg[k] = v
if content is None:
content = ''
try:
msg.set_content(content, cte="7bit", charset='US‑ASCII')
except:
msg.set_content(content, cte="quoted-printable", charset='UTF-8')
if attachments is not None and len(attachments) > 0:
for attachment in attachments:
with open(attachment, 'rb') as f:
msg.add_attachment(f.read(), 'application', 'octet-stream',
filename=os.path.basename(attachment))
msg.set_boundary('=' * 16)
return msg
def send_email(dst, subject, content, attachments):
with open(os.path.expanduser(SECRETS_FILE), 'rb') as f:
secrets = json.load(f)
with open(content, 'r') as f:
msg = make_email(
secrets['FROM_ADDR'], dst, subject, f.read(), attachments, secrets.get('HEADERS'))
print(str(msg))
s = smtplib.SMTP_SSL(secrets['SMTP_HOST'])
s.login(secrets['SMTP_USER'], secrets['SMTP_PASS'])
s.send_message(msg)
s.quit()
if __name__ == '__main__':
if len(sys.argv) < 4:
sys.stderr.write(__doc__.format(sys.argv[0]))
sys.exit(1)
send_email(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4:])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment