Coverage for core/email_handler.py: 63%
38 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
1"""Email handler"""
3import smtplib
4from email.mime.text import MIMEText
5from dotenv import load_dotenv
6from flask import session
7from itsdangerous.url_safe import URLSafeSerializer
9from core import shared
10import uuid
12load_dotenv()
14SENDER: str = str(shared.getenv("EMAIL"))
15PASSWORD: str = str(shared.getenv("EMAIL_PASSWORD"))
16SMTP: str = str(shared.getenv("SMTP"))
17COMPANY_NAME: str = str(shared.getenv("COMPANY_NAME"))
20def generate_otp():
21 """Generates an OTP using UUID"""
22 return str(uuid.uuid4().int)[:6]
25def send_otp(recipient):
26 """Sends an OTP"""
27 otp_serializer = URLSafeSerializer(str(shared.getenv("SECRET_KEY", "secret")))
28 otp = generate_otp()
29 print(f"Generated OTP: {otp}")
30 session["OTP"] = otp_serializer.dumps(otp)
32 if shared.getenv("IS_TEST") == "True":
33 return
35 body = f"""
36 <html>
37 <body style="font-family: Arial, sans-serif; text-align: center; padding: 20px; background-color: #f4f4f4;">
38 <div style="max-width: 500px; margin: auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1);">
39 <h2 style="color: #2c3e50;">Skillpilot OTP Verification</h2>
40 <p style="font-size: 16px; color: #333;">Use the OTP below to verify your identity:</p>
41 <div style="font-size: 24px; font-weight: bold; color: #3498db; padding: 10px; background: #ecf0f1; border-radius: 5px; display: inline-block; margin: 10px 0;">
42 {otp}
43 </div>
44 <p style="font-size: 14px; color: #777;">This OTP is valid for a limited time. Do not share it with anyone.</p>
45 <hr style="border: 0; height: 1px; background: #ddd; margin: 20px 0;">
46 <p style="font-size: 14px; color: #777;">If you didn't request this OTP, please ignore this email.</p>
47 <p style="font-size: 14px; color: #555;"><strong>Best Regards,</strong><br>Skillpilot Team</p>
48 </div>
49 </body>
50 </html>
51 """
53 # Set up email headers
54 msg = MIMEText(body, "html")
55 msg["Subject"] = "Skillpilot: OTP Verification"
56 msg["From"] = f"{COMPANY_NAME} <{SENDER}>"
57 msg["To"] = recipient
59 # Send the email
60 with smtplib.SMTP_SSL(SMTP, 465) as smtp_server:
61 smtp_server.login(SENDER, PASSWORD)
62 smtp_server.sendmail(SENDER, recipient, msg.as_string())
64 print(f"Styled OTP email sent to {recipient}")
67def send_email(msg, recipients):
68 """Sends an email"""
69 if shared.getenv("IS_TEST") == "True":
70 return
71 msg["From"] = f"{COMPANY_NAME} <{SENDER}>"
72 with smtplib.SMTP_SSL(SMTP, 465) as smtp_server:
73 smtp_server.login(SENDER, PASSWORD)
74 smtp_server.sendmail(SENDER, recipients, msg.as_string())
76 print(f"Email sent to {recipients}")