bluebeandatachatbot / src /email_utils.py
krinya's picture
Trigger rebuild - small comment update
16ab289
Raw
History Blame Contribute Delete
6.63 kB
import os
import base64
from datetime import datetime
import pytz
import sib_api_v3_sdk
from sib_api_v3_sdk.rest import ApiException
### Email Utility Functions ###
def load_email_template():
"""Load the HTML email template"""
try:
template_path = 'src/email_template/email_template.html'
with open(template_path, 'r', encoding='utf-8') as file:
return file.read()
except FileNotFoundError:
print("Email template file not found.")
return None
def send_email(to_email, subject, html_content, to_name="Valued Customer", cc_list=None):
"""Send email using the Brevo (Sendinblue) API"""
try:
api_key = os.getenv("BREVO_API_KEY")
if not api_key:
raise Exception("BREVO_API_KEY environment variable not set.")
configuration = sib_api_v3_sdk.Configuration()
configuration.api_key["api-key"] = api_key
api_instance = sib_api_v3_sdk.TransactionalEmailsApi(sib_api_v3_sdk.ApiClient(configuration))
sender = {"name": "Blue Bean Data", "email": "info@bluebeandata.com"}
to = [{"email": to_email, "name": to_name}]
cc = []
if cc_list:
for cc_email in cc_list:
cc.append({"email": cc_email})
send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(
to=to,
sender=sender,
subject=subject,
html_content=html_content,
cc=cc if cc else None
)
try:
response = api_instance.send_transac_email(send_smtp_email)
return True
except ApiException as e:
print(f"Brevo API Exception: {e}")
return False
except Exception as e:
print(f"Error sending email with Brevo: {str(e)}")
return False
def _embed_logo_in_template(template):
"""Replaces the logo placeholder with a web-hosted image URL."""
logo_url = "https://huggingface.co/spaces/krinya/bluebeandatachatbot/resolve/main/src/email_template/bluebeanlogo.png"
return template.replace("__LOGO_SRC__", logo_url)
def send_user_welcome_email(email, name="Valued Customer", notes=""):
"""Send a welcome email to the user and a notification to the company."""
try:
template = load_email_template()
if not template:
return False
template_with_logo = _embed_logo_in_template(template)
# Handle name display - use generic greeting if no name provided
if not name or name.strip().lower() in ['name not provided', 'not provided', '']:
greeting = "Greetings,"
display_name = "Valued Customer"
else:
greeting = f"Dear {name},"
display_name = name
# Build user info section dynamically
user_info_items = [f"<li><b>Email:</b> {email}</li>"]
if display_name != "Valued Customer":
user_info_items.append(f"<li><b>Name:</b> {display_name}</li>")
if notes and notes.strip() and notes.strip().lower() not in ['not provided', 'none', '']:
# Format notes nicely for email display
formatted_notes = notes.replace('\n', '<br>')
user_info_items.append(f"<li><b>Conversation Context:</b> {formatted_notes}</li>")
user_info_html = "\n ".join(user_info_items)
user_content = f"""
<p>{greeting}</p>
<p>Thank you for your interest in Blue Bean Data! We're excited to connect with you.</p>
<p>Our team specializes in:</p>
<ul>
<li>Data Strategy & Consulting</li>
<li>BI & Dashboards</li>
<li>Data Pipeline Development</li>
<li>AI & Automation</li>
</ul>
<p>We've received your details and will be in touch shortly. For your records, here is the information you provided:</p>
<ul>
{user_info_html}
</ul>
<p>Best regards,<br>The Blue Bean Data Team</p>
"""
user_subject = "Thank You for Connecting with Blue Bean Data!"
button_html = '<a href="www.bluebeandata.com" class="button">Visit Our Website</a>'
user_html = template_with_logo.replace("__TITLE__", user_subject) \
.replace("__CONTENT__", user_content) \
.replace("__BUTTON_HTML__", button_html)
company_email = os.getenv("COMPANY_EMAIL")
cc_emails = [company_email] if company_email and company_email.lower() != email.lower() else []
return send_email(email, user_subject, user_html, to_name=display_name, cc_list=cc_emails)
except Exception as e:
print(f"Error in send_user_welcome_email: {str(e)}")
return False
def send_unknown_question_email(question):
"""Send an email to the company with a question the chatbot couldn't answer."""
try:
company_email = 'menyhert.kristof@gmail.com'
if not company_email:
print("COMPANY_EMAIL environment variable not set. Cannot send unknown question email.")
return False
template = load_email_template()
if not template:
return False
template_with_logo = _embed_logo_in_template(template)
amsterdam_tz = pytz.timezone('Europe/Amsterdam')
timestamp = datetime.now(amsterdam_tz).strftime('%Y-%m-%d %H:%M:%S %Z')
subject = "Chatbot Alert: Unknown Question"
content = f"""
<p><strong>The AI assistant was unable to answer the following question:</strong></p>
<div style="background-color: #f8f9fa; padding: 15px; border-left: 4px solid #3364D1; margin: 15px 0;">
<p style="font-style: italic; margin: 0;">"{question}"</p>
</div>
<p>This might be an opportunity to update the knowledge base or add new content to better serve future inquiries.</p>
<p><small><b>Timestamp:</b> {timestamp}</small></p>
<p>Best regards,<br>Blue Bean Data AI Assistant</p>
"""
html_body = template_with_logo.replace("__TITLE__", subject) \
.replace("__CONTENT__", content) \
.replace("__BUTTON_HTML__", "")
return send_email('menyhert.kristof@gmail.com', subject, html_body, to_name="Blue Bean Data Team", cc_list=[company_email])
except Exception as e:
print(f"Error in send_unknown_question_email: {str(e)}")
return False