email template

This commit is contained in:
debu-2 2026-10-05 21:00:05 +05:30
parent ebbb582e99
commit 2451045693
15 changed files with 447 additions and 156 deletions

View file

@ -17,77 +17,43 @@ def build_employee_invitation_email(
member_first_name: str,
member_email: str,
manager_name: str,
manager_email: str,
company_domain: str,
login_url: str,
initial_password: str,
force_password_change: bool,
invite_url: str,
expires_hours: int = 48,
) -> tuple[str, str, str]:
first_name = member_first_name.strip() or "there"
organization = company_domain.strip()
manager = manager_name.strip() or "Your administrator"
manager_address = manager_email.strip()
security_note = (
"For your security, you will be asked to create a new password "
"immediately after your first sign-in."
if force_password_change
else (
"We recommend updating your password after your first sign-in "
"from your account settings."
)
)
subject = f"{manager} invited you to join {organization}"
why_received = (
f"You are receiving this because {manager} invited you to a work email "
f"account at {organization} on {BRAND_NAME}. It was sent to the personal "
f"email address your administrator provided so you can complete your "
f"first sign-in."
)
unexpected_contact = (
f"If you were not expecting this invitation, please contact "
f"{manager} at {manager_address}."
if manager_address
else "If you were not expecting this invitation, please contact your administrator."
)
body_text = (
f"Hello {first_name},\n\n"
f"{why_received}\n\n"
f"Organization: {organization}\n"
f"Work email address: {member_email}\n"
f"Sign-in page: {login_url}\n\n"
f"Sign-in credentials\n"
f" Email: {member_email}\n"
f" Initial password: {initial_password}\n\n"
f"{security_note}\n\n"
f"{unexpected_contact}\n\n"
f"{manager} invited you to join {organization}.\n\n"
f"Your work email:\n"
f"{member_email}\n\n"
f"Set up your account:\n"
f"{invite_url}\n\n"
f"This invitation expires in {expires_hours} hours.\n\n"
f"If you weren't expecting this invitation,\n"
f"you can safely ignore this email.\n\n"
f"—\n"
f"{BRAND_NAME}\n"
f"{login_url.rsplit('/login', 1)[0] or login_url}\n"
f"This is a one-time account notification from {BRAND_NAME} on behalf of "
f"{organization}. You cannot unsubscribe from required account emails."
f"This invitation was sent because {manager} created an account "
f"for you at {organization}."
)
preheader = (
f"{manager} invited you to join {organization}. "
f"Use the sign-in details below to access your work inbox."
f"Set up your work email account."
)
safe_first = _escape(first_name)
safe_manager = _escape(manager)
safe_org = _escape(organization)
safe_email = _escape(member_email)
safe_password = _escape(initial_password)
safe_login = _escape(login_url)
safe_manager_email = _escape(manager_address)
safe_invite = _escape(invite_url)
safe_preheader = _escape(preheader)
safe_security = _escape(security_note)
safe_unexpected = _escape(unexpected_contact)
safe_why_received = _escape(why_received)
body_html = f"""<!DOCTYPE html>
<html lang="en">
@ -142,63 +108,43 @@ def build_employee_invitation_email(
</tr>
<tr>
<td style="padding:28px 32px 8px;">
<p style="margin:0 0 16px;font-size:16px;line-height:1.65;color:#080821;">
<p style="margin:0 0 24px;font-size:16px;line-height:1.65;color:#080821;">
Hello {safe_first},
</p>
<p style="margin:0 0 24px;font-size:15px;line-height:1.7;color:#67677a;">
{safe_why_received}
</p>
<table role="presentation" width="100%" cellspacing="0" cellpadding="0"
style="margin:0 0 24px;background-color:#fff3ef;border:1px solid #ffe1d8;border-radius:14px;">
<tr>
<td style="padding:18px 20px;">
<p style="margin:0 0 12px;font-size:12px;font-weight:700;letter-spacing:0.4px;
text-transform:uppercase;color:#c85e49;">Account details</p>
<table role="presentation" width="100%" cellspacing="0" cellpadding="0"
style="font-size:14px;line-height:1.6;color:#080821;">
<tr>
<td style="padding:4px 0;color:#67677a;width:130px;vertical-align:top;">Organization</td>
<td style="padding:4px 0;font-weight:600;">{safe_org}</td>
</tr>
<tr>
<td style="padding:4px 0;color:#67677a;vertical-align:top;">Work email</td>
<td style="padding:4px 0;font-weight:600;">{safe_email}</td>
</tr>
<tr>
<td style="padding:4px 0;color:#67677a;vertical-align:top;">Initial password</td>
<td style="padding:4px 0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
font-weight:600;letter-spacing:0.3px;">{safe_password}</td>
</tr>
</table>
<p style="margin:0 0 8px;font-size:12px;font-weight:700;letter-spacing:0.4px;
text-transform:uppercase;color:#c85e49;">Your work email</p>
<p style="margin:0;font-size:15px;font-weight:600;color:#080821;">{safe_email}</p>
</td>
</tr>
</table>
<table role="presentation" cellspacing="0" cellpadding="0" style="margin:0 0 24px;">
<tr>
<td style="border-radius:12px;background-color:#080821;">
<a href="{safe_login}" style="display:inline-block;padding:14px 24px;font-size:15px;
<a href="{safe_invite}" style="display:inline-block;padding:14px 24px;font-size:15px;
font-weight:700;color:#ffffff;text-decoration:none;border-radius:12px;">
Sign in to {BRAND_NAME}
Set up your account
</a>
</td>
</tr>
</table>
<p style="margin:0 0 16px;font-size:14px;line-height:1.65;color:#67677a;">
{safe_security}
This invitation expires in {expires_hours} hours.
</p>
<p style="margin:0;font-size:14px;line-height:1.65;color:#67677a;">
{safe_unexpected}
If you weren&apos;t expecting this invitation,<br />
you can safely ignore this email.
</p>
</td>
</tr>
<tr>
<td style="padding:20px 32px 28px;border-top:1px solid #f0ebe7;background-color:#faf8f6;">
<p style="margin:0 0 6px;font-size:12px;line-height:1.6;color:#888795;">
{BRAND_NAME} · {BRAND_HANDLE}
</p>
<p style="margin:0;font-size:12px;line-height:1.6;color:#a8a4ae;">
One-time account notification from {BRAND_NAME} on behalf of {safe_org}.
{" Questions? Reply to " + safe_manager_email + "." if manager_address else ""}
This invitation was sent because {safe_manager} created an account
for you at {safe_org}.
</p>
</td>
</tr>