#!/usr/bin/env python from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email import encoders import smtplib, os """ export ENV_EMAIL_SENDER='Chorke Inc';\ export ENV_EMAIL_FROM='Chorke Inc';\ export ENV_EMAIL_TO='Academia';\ export ENV_EMAIL_SUBJECT='Subject for Debug Email';\ export ENV_EMAIL_BODY='Body for Debug Email';\ \ export ENV_SMTP_USER='no-reply@chorke.org.bd';\ export ENV_SMTP_HOST='mail.chorke.org.bd';\ export ENV_SMTP_PASS='p@$$w0rd';\ export ENV_SMTP_PORT='587';\ export ENV_SMTP_DBUG='1';\ export ENV_SMTP_TTLS='1';\ (curl -s 'https://cdn.chorke.org/exec/cli/python/finology/commons/sendmail.py.txt')|python """ class EmailParams: def __init__(self): env = os.environ self.init_parmas(env) def init_parmas(self, env): self.email_subject = env.get('ENV_EMAIL_SUBJECT', '') self.email_sender = env.get('ENV_EMAIL_SENDER', '') self.email_body = env.get('ENV_EMAIL_BODY', '') self.email_from = env.get('ENV_EMAIL_FROM', '') self.email_to = env.get('ENV_EMAIL_TO', '') self.eamil_cc = env.get('ENV_EMAIL_CC', '') if bool(self.email_sender) and not(bool(self.email_from)): self.email_from = self.email_sender if bool(self.email_from) and not(bool(self.email_sender)): self.email_sender = self.email_from def print_env(self, debug = False): if debug: print("ENV_EMAIL_SUBJECT: {0}\nENV_EMAIL_BODY : [[\n{1}\n]]\n".format(self.email_subject, self.email_body)) print("ENV_EMAIL_FROM : {0}\nENV_EMAIL_TO : {1}\n".format(self.email_from, self.email_to)) class SMTPParams: def __init__(self): env = os.environ self.init_parmas(env) def init_parmas(self, env): self.smtp_host = env.get('ENV_SMTP_HOST', '') self.smtp_port = env.get('ENV_SMTP_PORT', '') self.smtp_user = env.get('ENV_SMTP_USER', '') self.smtp_pass = env.get('ENV_SMTP_PASS', '') self.smtp_ttls = env.get('ENV_SMTP_TTLS', 0) def print_env(self, debug = False): if debug: password = "".ljust(len(self.smtp_user), "*") print("ENV_SMTP_USER : {0}\nENV_SMTP_PASS : {1}".format(self.smtp_user, password)) print("ENV_SMTP_HOST : {0}\nENV_SMTP_PORT : {1}\nENV_SMTP_TTLS : {2}\n".format(self.smtp_host, self.smtp_port, self.smtp_ttls)) class SMTPClient: def __init__(self, params: SMTPParams): self.session = smtplib.SMTP(params.smtp_host, int(params.smtp_port)) self.session.connect(params.smtp_host, int(params.smtp_port)) self.session.ehlo() if bool(params.smtp_ttls): self.session.starttls() self.session.ehlo() self.session.login(params.smtp_user, params.smtp_pass) self.session.set_debuglevel(1) self.smtp = params def send(self, params: EmailParams): message = MIMEMultipart() message.attach(MIMEText(params.email_body, 'plain')) message.add_header('Subject', params.email_subject) message.add_header('Reply-To', params.email_sender) message.add_header('From', params.email_from) message.add_header('To', params.email_to) self.session.sendmail(params.email_from, params.email_to, message.as_string()) self.session.quit() @staticmethod def print_params(mail: EmailParams, smtp: SMTPParams, debug = False): mail.print_env(debug) smtp.print_env(debug) @staticmethod def init(debug = False): mail = EmailParams() smtp = SMTPParams() SMTPClient.print_params(mail, smtp, debug) try: client = SMTPClient(smtp) client.send(mail) except Exception as e: print("[ERROR]: Email sending failure!\n{0}".format(e)) def main(): env = os.environ debug = bool(env.get('ENV_SMTP_DBUG', 0)) SMTPClient.init(debug) if __name__ == "__main__": main()