Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
AWS Lambda Function to send SMTP Email
import smtplib
import os
def send_email(host, port, username, password, subject, body, mail_to, mail_from = None, reply_to = None):
if mail_from is None: mail_from = username
if reply_to is None: reply_to = mail_to
message = """From: %s\nTo: %s\nReply-To: %s\nSubject: %s\n\n%s""" % (mail_from, mail_to, reply_to, subject, body)
print (message)
server = smtplib.SMTP(host, port)
server.login(username, password)
server.sendmail(mail_from, mail_to, message)
return True
except Exception as ex:
print (ex)
return False
def lambda_handler(event, context):
# initialize variables
username = os.environ['USERNAME']
password = os.environ['PASSWORD']
host = os.environ['SMTPHOST']
port = os.environ['SMTPPORT']
mail_from = os.environ.get('MAIL_FROM')
mail_to = os.environ['MAIL_TO'] # separate multiple recipient by comma. eg: ","
origin = os.environ.get('ORIGIN')
origin_req = event['headers'].get('Host')
reply_to = event['queryStringParameters'].get('reply')
subject = event['queryStringParameters']['subject']
body = event['body']
# vaildate cors access
cors = ''
if not origin:
cors = '*'
elif origin_req in [o.strip() for o in origin.split(',')]:
cors = origin_req
# send mail
success = False
if cors:
success = send_email(host, port, username, password, subject, body, mail_to, mail_from, reply_to)
# prepare response
response = {
"isBase64Encoded": False,
"headers": { "Access-Control-Allow-Origin": cors }
if success:
response["statusCode"] = 200
response["body"] = '{"status":true}'
elif not cors:
response["statusCode"] = 403
response["body"] = '{"status":false}'
response["statusCode"] = 400
response["body"] = '{"status":false}'
return response

This comment has been minimized.

Copy link
Owner Author

commented Aug 5, 2017

Environment Variables

PASSWORD: { app-specific-password }
MAIL_FROM: Alias Name <> (Optional)
MAIL_TO: Recipient1 <>, Recipient2 <>
ORIGIN:, (Optional)

Query Params

subject="System Notice"
reply="" (Optional)

Request Body

[ Email Text Message ]

This comment has been minimized.

Copy link
Owner Author

commented Aug 15, 2017

Replace the string 'Host' with 'origin' at line number 32


This comment has been minimized.

Copy link

commented Apr 16, 2018

Hi you may use below codes for creating multiple backups in a day with instance name:

import boto3
import collections
import datetime
import sys
import pprint

ec = boto3.client('ec2')
#image = ec.Image('id')

def lambda_handler(event, context):

reservations = ec.describe_instances(
        {'Name': 'tag-key', 'Values': ['odd', 'Odd']},
    'Reservations', []
print "Hello",
for h in reservations:
    print h
instances = sum(
        [i for i in r['Instances']]
        for r in reservations
    ], [])

print "Found %d instances that need backing up" % len(instances)

to_tag = collections.defaultdict(list)

for instance in instances:
        retention_days = [
            int(t.get('Value')) for t in instance['Tags']
            if t['Key'] == 'Retention'][0]
    except IndexError:
        retention_days = 7

    #for dev in instance['BlockDeviceMappings']:
    #    if dev.get('Ebs', None) is None:
    #        continue
    #    vol_id = dev['Ebs']['VolumeId']
    #    print "Found EBS volume %s on instance %s" % (
    #        vol_id, instance['InstanceId'])

        #snap = ec.create_snapshot(
        #    VolumeId=vol_id,
        #create_image(instance_id, name, description=None, no_reboot=False, block_device_mapping=None, dry_run=False)
        # DryRun, InstanceId, Name, Description, NoReboot, BlockDeviceMappings
        create_time =
        create_fmt = create_time.strftime('%H-%M-%S--%Y-%m-%d')
        #Variables for storing ec2 Instance Name and ec2 Instance ID
        ec2_Instance_Name = ''
        ec2_Instance_ID = ''
        ec2_Instance_ID = instance['InstanceId']
        ec2_Instance_Name = get_instance_name(ec2_Instance_ID)
        AMIid = ec.create_image(InstanceId=instance['InstanceId'], Name="Lambda - " + instance['InstanceId'] + " " + ec2_Instance_Name + " (Odd) from " + create_fmt, Description="Lambda created AMI of instance " + instance['InstanceId'] + " from " + create_fmt, NoReboot=True, DryRun=False)

        print "Retaining AMI %s of instance %s for %d days" % (

print to_tag.keys()

for retention_days in to_tag.keys():
    delete_date = + datetime.timedelta(days=retention_days)
    delete_fmt = delete_date.strftime('%m-%d-%Y')
    print "Will delete %d AMIs on %s" % (len(to_tag[retention_days]), delete_fmt)

            {'Key': 'DeleteOn', 'Value': delete_fmt},

Function to get Instance Name

def get_instance_name(fid):
# When given an instance ID as str e.g. 'i-1234567', return the instance 'Name' from the name tag.
ec2 = boto3.resource('ec2')
ec2instance = ec2.Instance(fid)
instancename = ''
for tags in ec2instance.tags:
if tags["Key"] == 'Name':
instancename = tags["Value"]
return instancename


This comment has been minimized.

Copy link

commented Apr 16, 2018

can anyone help me to generate summary in mail for daily backup detail.
AMI Name and Backup Status.


This comment has been minimized.

Copy link
Owner Author

commented Aug 22, 2018

Good one to note 🎉 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.