Use logo1.png in emails, inline mail_style.css, attach summary as MD
Mirror and run GitLab CI / build (push) Has been cancelled
Ruff / ruff (push) Has been cancelled

This commit is contained in:
admin
2026-06-14 15:24:08 +00:00
parent 917a7b8f2f
commit fb1dc3324d
5 changed files with 66 additions and 190 deletions
+8 -64
View File
@@ -4,71 +4,15 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Error Notification</title>
<link rel="stylesheet" type="text/css" href="{css_path}">
<style>
body {{
font-family: Arial, sans-serif;
line-height: 1.5;
background-color: #ffffff;
color: #333;
margin: 0;
padding: 20px;
}}
.container {{
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}}
h1 {{
font-size: 1.5em;
margin-top: 0;
}}
p {{
margin: 10px 0;
font-size: 1em;
}}
.error-message, .success-message {{
padding: 10px 0;
margin-bottom: 15px;
font-size: 1em;
}}
.error-message {{
color: #721c24;
}}
.success-message {{
color: #7C6DA0;
}}
.contact {{
margin-top: 15px;
font-size: 1em;
color: #333;
}}
.contact a {{
color: #0056b3;
text-decoration: none;
}}
.contact a:hover {{
text-decoration: underline;
}}
.disclaimer {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
.signature {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
{email_css}
</style>
</head>
<body>
<div class="container">
<h1 style="color: #7C6DA0;">Error Notification</h1>
<p>Dear user:</p>
{email_logo}
<h1>Error Notification</h1>
<p>Dear user,</p>
<p>An error occurred while processing your audio file. This means that something went wrong during the processing of your file, and it could not be completed successfully.</p>
<p class="error-message">Error details: {exception}</p>
<p>Please check the file and try again. If the problem persists, our support team is here to help.</p>
@@ -78,10 +22,10 @@
<div class="disclaimer">
<p>Please note that our support team does not have the ability to fix processing errors directly or access the files you have uploaded. They can provide guidance and help troubleshoot any issues you may encounter.</p>
</div>
<div class="signature">
<p>Thank you for using our transcription service!</p>
<p>A.P.Strom</p>
</div>
<div class="signature">
<p>Thank you for using our transcription service!</p>
<p>A.P.Strom</p>
</div>
</div>
</body>
</html>
+4 -60
View File
@@ -4,71 +4,15 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Transcript Ready</title>
<link rel="stylesheet" type="text/css" href="{css_path}">
<style>
body {{
font-family: Arial, sans-serif;
line-height: 1.5;
background-color: #ffffff;
color: #333;
margin: 0;
padding: 20px;
}}
.container {{
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}}
h1 {{
font-size: 1.5em;
margin-top: 0;
}}
p {{
margin: 10px 0;
font-size: 1em;
}}
.error-message, .success-message {{
padding: 10px 0;
margin-bottom: 15px;
font-size: 1em;
}}
.error-message {{
color: #721c24;
}}
.success-message {{
color: #7C6DA0;
}}
.contact {{
margin-top: 15px;
font-size: 1em;
color: #333;
}}
.contact a {{
color: #0056b3;
text-decoration: none;
}}
.contact a:hover {{
text-decoration: underline;
}}
.disclaimer {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
.signature {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
{email_css}
</style>
</head>
<body>
<div class="container">
<h1 style="color: #7C6DA0;">Transcript Ready</h1>
<p>Dear user:</p>
{email_logo}
<h1>Transcript Ready</h1>
<p>Dear user,</p>
<p>Your file has been successfully processed, and the transcript is now ready. The transcript of your audio or video file is attached to this email.</p>
<p>We hope you find the transcript useful. If you have any questions or need further assistance, please do not hesitate to contact our support team.</p>
<div class="contact">
+4 -59
View File
@@ -5,69 +5,14 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload Successful</title>
<style>
body {{
font-family: Arial, sans-serif;
line-height: 1.5;
background-color: #ffffff;
color: #333;
margin: 0;
padding: 20px;
}}
.container {{
width: 100%;
max-width: 600px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
}}
h1 {{
font-size: 1.5em;
margin-top: 0;
}}
p {{
margin: 10px 0;
font-size: 1em;
}}
.error-message, .success-message {{
padding: 10px 0;
margin-bottom: 15px;
font-size: 1em;
}}
.error-message {{
color: #721c24;
}}
.success-message {{
color: #7C6DA0;
}}
.contact {{
margin-top: 15px;
font-size: 1em;
color: #333;
}}
.contact a {{
color: #0056b3;
text-decoration: none;
}}
.contact a:hover {{
text-decoration: underline;
}}
.disclaimer {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
.signature {{
margin-top: 20px;
font-size: 1em;
color: #333;
}}
{email_css}
</style>
</head>
<body>
<div class="container">
<h1 style="color: #7C6DA0;">Upload Successful</h1>
<p>Dear user:</p>
{email_logo}
<h1>Upload Successful</h1>
<p>Dear user,</p>
<p>Your file has been successfully uploaded and is now in our processing queue. This means that our system has received your file, and it is waiting to be processed. We will handle your file as soon as possible.</p>
<p class="success-message">Your current position in the queue is: {queue_position}. This is the order in which your file will be processed. We appreciate your patience as we work through the queue.</p>
<p>We will notify you once your file has been processed. If you have any urgent needs or further questions, feel free to reach out to our support team.</p>
+39 -4
View File
@@ -7,6 +7,7 @@ Supports both plain text and HTML email bodies.
Template placeholders are primarily filled via environment variables.
"""
import base64
import os
import smtplib
import logging
@@ -53,6 +54,33 @@ def get_email_config():
}
def _load_css(path: str) -> str:
"""
Load CSS file content if it exists.
"""
if not path or not os.path.exists(path):
return ""
with open(path, "r", encoding="utf-8") as f:
return f.read()
def _logo1_inline_html() -> str:
"""
Return an inline <img> tag for logo1.png as base64.
Falls back to empty string if not found.
"""
logo_path = os.getenv("EMAIL_LOGO_PATH", "/app/src/misc/logo1.png")
if not os.path.exists(logo_path):
return ""
try:
with open(logo_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("utf-8")
return f'<img src="data:image/png;base64,{b64}" alt="A.P.Strom" style="max-width:180px; display:block; margin:0 auto 10px auto;"/>'
except Exception:
return ""
def build_template_context(**runtime_kwargs: Any) -> Dict[str, Any]:
"""
Build a context dict for templates from:
@@ -61,13 +89,20 @@ def build_template_context(**runtime_kwargs: Any) -> Dict[str, Any]:
Environment variables:
- EMAIL_CONTACT_ADDRESS: value for {contact_email}
- EMAIL_CSS_PATH: value for {css_path}
Runtime kwargs are merged on top (e.g. queue_position, exception).
- EMAIL_CSS_PATH: path to mail_style.css (optional; we inline it)
- EMAIL_LOGO_PATH: path to logo1.png (default: /app/src/misc/logo1.png)
"""
# Load and inline mail_style.css for consistent email styling
css_path = os.getenv("EMAIL_CSS_PATH", "/app/src/misc/mail_style.css")
css_text = _load_css(css_path)
# Build inline logo HTML
logo_html = _logo1_inline_html()
ctx: Dict[str, Any] = {
"contact_email": os.getenv("EMAIL_CONTACT_ADDRESS", "support@example.com"),
"css_path": os.getenv("EMAIL_CSS_PATH", ""),
"email_css": css_text,
"email_logo": logo_html,
}
# Runtime values override env if provided
+11 -3
View File
@@ -39,7 +39,7 @@ def get_queue_position(task_id: str) -> int:
def send_initial_email(to: str, queue_pos: int):
"""
Send initial confirmation email with queue position using HTML template.
Static placeholders (contact_email, css_path) come from env via load_template.
Static placeholders (contact_email, css, logo) come from env via load_template.
"""
subject = "ScrAIbe: Your transcription request has been received"
@@ -89,7 +89,7 @@ def send_success_email(
):
"""
Send final email with transcript and attachments using HTML template.
Static placeholders (contact_email, css_path) come from env via load_template.
Static placeholders (contact_email, css, logo) come from env via load_template.
"""
subject = "ScrAIbe: Your transcript is ready"
@@ -141,7 +141,7 @@ def send_success_email(
def send_error_email(to: str, error_message: str, task_id: str):
"""
Send error notification email using HTML template.
Static placeholders (contact_email, css_path) come from env via load_template.
Static placeholders (contact_email, css, logo) come from env via load_template.
"""
subject = "ScrAIbe: Error with your transcription request"
@@ -271,6 +271,14 @@ def process_transcription_task(
json.dump(json_data, f, indent=2, ensure_ascii=False)
attachments.append(json_path)
# MD summary (only when summary is available)
if summary_text:
md_path = tempfile.mktemp(suffix=".md")
with open(md_path, "w", encoding="utf-8") as f:
f.write("# Summary\n\n")
f.write(summary_text)
attachments.append(md_path)
# 5) Send success email
send_success_email(
to=email_to,