#! /usr/bin/env python2 import csv from datetime import datetime import io import json import urllib import urllib2 import boto3 from botocore.exceptions import ClientError from config import contact_form_key from config import data_bucket from config import email_destination from config import email_source from config import email_subject from config import recaptcha_endpoint headers = ['Email', 'Role', 'Comment', 'Optin', 'Date & Time'] def form_handler(event, context): """AWS Lambda entry point. """ email = event.get('email') if email and not verify_email(email): return { 'success': False, 'message': 'Please enter a valid email address.'} append_csv(event) send_email(event) return {'success': True} def verify_email(address): """Very simple email address verification. Args: address (str): email address to verify. Returns: bool: verification status. """ parts = address.split('@') return len(parts) == 2 and parts[0] and parts[1] def verify_ham(recaptcha, secret): """Verify with Google Recaptcha this form is not spam. Args: recaptcha (str): Recaptcha response string from front end. secret (str): Recaptcha secret key. Returns: dict: Recaptcha response object """ data = urllib.urlencode({'secret': secret, 'response': recaptcha}) request = urllib2.Request(recaptcha_endpoint, data) response = urllib2.urlopen(request) return json.loads(response.read()) def append_csv(event): """Add a csv row to the s3 object. """ s3 = boto3.resource('s3') key = s3.Object(data_bucket, contact_form_key) try: data = key.get() except ClientError: key.put(Body=b','.join(headers)) data = key.get() read_buffer = io.BytesIO(data['Body'].read()) reader = csv.reader(read_buffer) write_buffer = io.BytesIO() writer = csv.writer(write_buffer) for line in reader: writer.writerow(line) row = [ event.get('email'), event.get('role'), event.get('comment'), event.get('optin'), str(datetime.now())] writer.writerow(row) key.put(Body=write_buffer.getvalue()) def send_email(event): """Send email with data (event) summary. """ body = ( 'Email: {email}\n\n' 'Role: {role}\n\n' 'Optin: {optin}\n\n' 'Comment: {comment}\n\n' 'Received: {now}').format( email=event.get('email', ''), role=event.get('role', ''), optin=event.get('optin', ''), comment=event.get('comment', ''), now=datetime.now()) ses = boto3.client('ses', 'us-east-1') ses.send_email( Source=email_source, Destination={'ToAddresses': [email_destination]}, Message={ 'Subject': { 'Data': email_subject, 'Charset': 'utf-8'}, 'Body': { 'Text': { 'Data': body, 'Charset': 'utf-8'}}}) if __name__ == '__main__': print('Enter test parameters (any value is acceptable)') event = {} event['email'] = raw_input('Email: ') event['role'] = raw_input('Role: ') event['comment'] = raw_input('Comment: ') event['optin'] = raw_input('Opt in: ') while True: email_destination = raw_input('Email destination: ') if email_destination.endswith('@theorchard.com'): break else: print('Must be your work email') print('Sending') form_handler(event, None)