Skip to content

Instantly share code, notes, and snippets.

@jrialland
Created May 3, 2016 12:33
Show Gist options
  • Save jrialland/e5d634775e31472463a1c85b759dae3f to your computer and use it in GitHub Desktop.
Save jrialland/e5d634775e31472463a1c85b759dae3f to your computer and use it in GitHub Desktop.
python send smtp emails
#!/usr/bin/env python2
# -*- encoding:utf-8 -*-
import sys
import os
import os.path
import smtplib
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email import Encoders
from email.header import Header
from email.utils import COMMASPACE, formatdate
import logging
DEFAULT_MIMETYPE = 'application/octet-stream'
def strip_html(htmltext):
from HTMLParser import HTMLParser
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.fed = []
def handle_data(self, d):
self.fed.append(d)
def get_data(self):
return ''.join(self.fed)
s = MLStripper()
s.feed(htmltext)
return s.get_data()
class Attachment:
def __init__(self, filename, data, mimetype=DEFAULT_MIMETYPE):
self.filename = filename,
self.data = data
self.mimetype = mimetype
def __repr__(self):
return "<Attachment(filename='{0}',mimetype='{1}')>".format(self.filename, self.mimetype)
@classmethod
def fromFile(klass, filename):
return Attachment(filename=os.path.basename(filename), data=open(filename, 'rb').read())
@classmethod
def fromStringIO(klass, filename, data, mimetype=DEFAULT_MIMETYPE):
return Attachment(filename, data.read(), mimetype)
def send_email(sender, recipient, title, text, html=False, ccs=[], attachments=[], smtpHost='localhost', smtpPort=25, username=None, password='', isTls=True):
if type(recipient) == str:
recipient = [recipient]
msg = MIMEMultipart()
msg['Subject'] = Header(title, 'utf-8')
msg.preamble = title
msg['From'] = sender
msg['To'] = COMMASPACE.join(recipient)
msg['Date'] = formatdate(localtime=True)
if html:
msg.attach(MIMEText(text, 'html'))
msg.attach(MIMEText(strip_html(text), 'plain'))
else:
msg.attach(MIMEText(text))
for attachment in attachments:
ma, mb = attachment.mimetype.split('/')
part = MIMEBase(ma, mb)
part.set_payload(attachment.data)
Encoders.encode_base64(part)
part.add_header(
'Content-Disposition', 'attachement; filename="{0}"'.format(attachment.filename))
msg.attach(part)
server = smtplib.SMTP(smtpHost, smtpPort)
server.set_debuglevel(1)
if isTls:
try:
server.starttls()
except Exception:
logging.debug('starttls failed')
if username:
server.login(username, password)
server.sendmail(sender, recipient, msg.as_string())
server.quit()
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
parameters = {}
for key, value in [map(str.strip, x.split('=')) for x in sys.argv[1:]]:
if key and value:
parameters[key] = value
for k in ['sender', 'recipient', 'title']:
if not k in parameters:
logging.error("The '{0}' parameter is mandatory".format(k))
sys.exit(-1)
if 'file' in parameters:
parameters['text'] = open(parameters['file'], 'rb').read()
del parameters['file']
else:
parameters['text'] = sys.stdin.read()
if 'attachments' in parameters:
a = []
for filename in map(str.strip,parameters['attachments'].split(',')):
a.append(Attachment.fromFile(filename))
parameters['attachments'] = a
if 'html' in parameters:
parameters['html'] = parameters['html'] in ('true', 'True')
logging.debug(repr(parameters))
send_email(**parameters)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment