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

1"""Email handler""" 

2 

3import smtplib 

4from email.mime.text import MIMEText 

5from dotenv import load_dotenv 

6from flask import session 

7from itsdangerous.url_safe import URLSafeSerializer 

8 

9from core import shared 

10import uuid 

11 

12load_dotenv() 

13 

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")) 

18 

19 

20def generate_otp(): 

21 """Generates an OTP using UUID""" 

22 return str(uuid.uuid4().int)[:6] 

23 

24 

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) 

31 

32 if shared.getenv("IS_TEST") == "True": 

33 return 

34 

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 """ 

52 

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 

58 

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()) 

63 

64 print(f"Styled OTP email sent to {recipient}") 

65 

66 

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()) 

75 

76 print(f"Email sent to {recipients}")