import os import random import ssl import smtplib from flask import Flask, jsonify, request from PIL import Image, ImageDraw, ImageFont from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage app = Flask(__name__) def add_textimg(text, code): path = f"images/output/pos-{str(code)}.jpg" try: img = Image.open("images/main/shannon.jpg") draw = ImageDraw.Draw(img) font = ImageFont.truetype("fonts/impact.ttf", 24) text_pos1_center = (img.width - draw.textlength(text, font)) // 2 text_pos2_center = (img.width - draw.textlength(code, font)) // 2 text_pos_bottom = img.height pos1 = (text_pos1_center, text_pos_bottom - 90) pos2 = (text_pos2_center, text_pos_bottom - 60) text_color = (255, 255, 255) draw.text(pos1, text, fill=text_color, font=font) draw.text(pos2, code, fill=text_color, font=font) if not os.path.exists("images/output"): os.mkdir("images/output") img.save(path) img.close() return open(f"images/output/pos-{str(code)}.jpg", "rb").read() except Exception as e: print("Failed to add image") print(str(e)) return None @app.route('/hello', methods=['GET']) def hello(): return "Hello" @app.route('/test/otp', methods=['POST']) def generate_otp(): try: randis = random.randint(1000, 9999) add_textimg(f"Your verification code is", str(randis)) return jsonify({"status": "ok"}) except Exception as e: print("Something went wrong") print(str(e)) return jsonify({"error": str(e)}) @app.route('/send-otp', methods=['POST']) def send_email(): # Create an .env file at the root of this project # There are two values required here, EMAIL_SENDER and EMAIL_PASSWORD # Or you can change the value here and in .env file mail_sender = os.environ.get("EMAIL_SENDER") mail_password = os.environ.get("EMAIL_PASSWORD") mail_receiver = request.args.get('email') # Everyone has a different email host service # By default we use gmail to test our emails mail_host = os.environ.get("HOST") if os.environ.get("HOST") is not None else "smtp.gmail.com" mail_port = os.environ.get("PORT") if os.environ.get("PORT") is not None else 465 if mail_sender is None or mail_password is None: return jsonify({ "status": 400, "error": "Bro did you forget to add the sender email and email password variables?" }), 400 if mail_receiver is None: return jsonify({ "status": 400, "error": "You must include an email address param query to send to email" }), 400 try: randis = random.randint(1000, 9999) # message variable subject = "Confirm your account" msg = """Here's your email confirmation code if you're not the one doing this just ignore it""" zmail = MIMEMultipart() zmail['From'] = mail_sender zmail['To'] = mail_receiver zmail['Subject'] = subject # attach text zmail.attach(MIMEText(msg, 'plain')) # attach picure pict = add_textimg("Your verification code is", str(randis)) zmail.attach(MIMEImage(pict, name="black-man-wearing-suit.jpg")) # creating context context = ssl.create_default_context() # if SSL is a different version, maybe try not using SSL # with smtplib.SMTP(mail_host, mail_port) as smtp: with smtplib.SMTP_SSL(mail_host, mail_port, context=context) as smtp: smtp.login(mail_sender, mail_password) smtp.sendmail(mail_sender, mail_receiver, zmail.as_string()) return jsonify({ "status": 200, "message": "Success sending email", "email": { "sender": mail_sender, "receiver": mail_receiver, "subject": subject, "body": msg } }) except Exception as e: print("Failed to send a email") print(str(e)) return jsonify({ "error": str(e) }), 400 if __name__ == '__main__': app.run(debug=True)