48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
import aiosmtplib
|
|
from email.mime.text import MIMEText
|
|
from email.mime.multipart import MIMEMultipart
|
|
from jinja2 import Environment, FileSystemLoader
|
|
import os
|
|
from app.core.config import settings
|
|
|
|
|
|
class EmailService:
|
|
def __init__(self):
|
|
self.smtp_host = settings.mail_host
|
|
self.smtp_port = settings.mail_port
|
|
self.smtp_user = settings.mail_username
|
|
self.smtp_password = settings.mail_password
|
|
self.from_email = settings.mail_from
|
|
self.from_name = settings.mail_from_name
|
|
|
|
# Set up Jinja2 environment for templates
|
|
template_dir = os.path.join(os.path.dirname(__file__), '..', 'templates')
|
|
self.jinja_env = Environment(loader=FileSystemLoader(template_dir))
|
|
|
|
async def send_email(self, to_email: str, subject: str, template_name: str, template_vars: dict):
|
|
# Render the template
|
|
template = self.jinja_env.get_template(template_name)
|
|
html_content = template.render(**template_vars)
|
|
|
|
# Create message
|
|
msg = MIMEMultipart('alternative')
|
|
msg['Subject'] = subject
|
|
msg['From'] = f"{self.from_name} <{self.from_email}>"
|
|
msg['To'] = to_email
|
|
|
|
# Attach HTML content
|
|
html_part = MIMEText(html_content, 'html')
|
|
msg.attach(html_part)
|
|
|
|
# Send email
|
|
try:
|
|
async with aiosmtplib.SMTP(hostname=self.smtp_host, port=self.smtp_port, use_tls=True) as smtp:
|
|
await smtp.login(self.smtp_user, self.smtp_password)
|
|
await smtp.send_message(msg)
|
|
except Exception as e:
|
|
# Log error, but for now, print
|
|
print(f"Failed to send email: {e}")
|
|
# In production, use logging
|
|
|
|
|
|
email_service = EmailService() |