-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathemail_utils.py
More file actions
63 lines (45 loc) · 1.67 KB
/
email_utils.py
File metadata and controls
63 lines (45 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from email import message
from email.message import EmailMessage
import aiosmtplib
from fastapi.templating import Jinja2Templates
from config import settings
templates = Jinja2Templates(directory="templates")
async def send_email(
to_email: str,
subject: str,
plain_text: str,
html_content: str | None = None,
) -> None:
message = EmailMessage()
message["From"] = settings.mail_from
message["To"] = to_email
message["Subject"] = subject
message.set_content(plain_text)
if html_content:
message.add_alternative(html_content, subtype="html")
await aiosmtplib.send(
message,
hostname=settings.mail_server,
port=settings.mail_port,
username=settings.mail_username if settings.mail_username else None,
password=settings.mail_password.get_secret_value() or None,
start_tls=settings.mail_use_tls,
)
async def send_password_reset_email(to_email: str, username: str, token: str) -> None:
reset_url = f"{settings.frontend_url}/reset-password?token={token}"
template = templates.env.get_template("email/password_reset.html")
html_content = template.render(reset_url=reset_url, username=username)
plain_text = f"""Hi {username},
You requested to reset your password. Click the link below to set a new password:
{reset_url}
This link will expire in 1 hour.
If you didn't request this, you can safely ignore this email.
Best regards,
The FastAPI Blog Team
"""
await send_email(
to_email=to_email,
subject="Reset Your Password - FastAPI Blog",
plain_text=plain_text,
html_content=html_content,
)