2023-09-23 12:43:44 +07:00

155 lines
4.7 KiB
Python

import os
import random
import ssl
import smtplib
from dotenv import load_dotenv
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
load_dotenv()
app = Flask(__name__)
INPUT_IMG_PATH = "images/main/shannon.jpg" # image path
OUTPUT_IMG_NAME = "black-man-wearing-suit.jpg" # name of the file to be added in the email
# this is actually useless cuz Pillow has provided a thumbnail function to keep the aspect ratio
def resize(in_width, in_height):
out_width = 270
out_height = in_height * (out_width / in_width)
out_size = (int(out_width), int(out_height))
return out_size
def add_textimg(text, code):
path = f"images/output/pos-{str(code)}.jpg"
try:
img = Image.open(INPUT_IMG_PATH)
new_size = resize(img.width, img.height)
img = img.resize(new_size)
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.getenv("EMAIL_SENDER")
mail_password = os.getenv("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.getenv("HOST") if os.getenv("HOST") is not None else "smtp.gmail.com"
mail_port = os.getenv("PORT") if os.getenv("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=OUTPUT_IMG_NAME))
# 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)