Created
May 3, 2016 12:33
-
-
Save jrialland/e5d634775e31472463a1c85b759dae3f to your computer and use it in GitHub Desktop.
python send smtp emails
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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