|
|
""" |
|
|
Personalized Email Generator |
|
|
Creates truly personalized emails by matching CLIENT offerings with PROSPECT needs |
|
|
""" |
|
|
import logging |
|
|
from typing import Dict, Optional |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
class PersonalizedEmailGenerator: |
|
|
"""Generates personalized B2B emails based on client-prospect fit""" |
|
|
|
|
|
def generate_email( |
|
|
self, |
|
|
client_profile: Dict, |
|
|
prospect_profile: Dict, |
|
|
contact: Dict |
|
|
) -> Dict: |
|
|
""" |
|
|
Generate highly personalized email |
|
|
|
|
|
Args: |
|
|
client_profile: CLIENT company info (what they offer) |
|
|
prospect_profile: PROSPECT company info (their pain points) |
|
|
contact: Decision maker contact info (name, title, email) |
|
|
|
|
|
Returns: |
|
|
{ |
|
|
'subject': str, |
|
|
'body': str, |
|
|
'to': str, |
|
|
'from': str |
|
|
} |
|
|
""" |
|
|
print(f"\n[EMAIL GEN] Generating personalized email") |
|
|
print(f"[EMAIL GEN] Client: {client_profile.get('name')}") |
|
|
print(f"[EMAIL GEN] Prospect: {prospect_profile.get('name')}") |
|
|
print(f"[EMAIL GEN] Contact: {contact.get('name')} ({contact.get('title')})") |
|
|
|
|
|
|
|
|
client_name = client_profile.get('name', 'Our Company') |
|
|
prospect_name = prospect_profile.get('name', 'Your Company') |
|
|
contact_name = contact.get('name', 'Hello') |
|
|
contact_title = contact.get('title', 'Team Member') |
|
|
contact_email = contact.get('email', 'contact@example.com') |
|
|
|
|
|
|
|
|
first_name = contact_name.split()[0] if contact_name and contact_name != 'Hello' else 'there' |
|
|
|
|
|
|
|
|
client_offerings = client_profile.get('offerings', []) |
|
|
client_value_props = client_profile.get('value_propositions', []) |
|
|
client_description = client_profile.get('description', '') |
|
|
|
|
|
|
|
|
prospect_pains = prospect_profile.get('pain_points', []) |
|
|
prospect_industry = prospect_profile.get('industry', 'your industry') |
|
|
prospect_size = prospect_profile.get('size', 'your company size') |
|
|
|
|
|
|
|
|
subject = self._generate_subject( |
|
|
client_name, |
|
|
prospect_name, |
|
|
prospect_industry, |
|
|
contact_title |
|
|
) |
|
|
|
|
|
|
|
|
body = self._generate_body( |
|
|
client_name=client_name, |
|
|
client_description=client_description, |
|
|
client_offerings=client_offerings, |
|
|
client_value_props=client_value_props, |
|
|
prospect_name=prospect_name, |
|
|
prospect_industry=prospect_industry, |
|
|
prospect_size=prospect_size, |
|
|
prospect_pains=prospect_pains, |
|
|
contact_first_name=first_name, |
|
|
contact_title=contact_title |
|
|
) |
|
|
|
|
|
|
|
|
client_domain = client_profile.get('domain', 'example.com') |
|
|
from_email = f"partnerships@{client_domain}" if client_domain else "partnerships@example.com" |
|
|
|
|
|
result = { |
|
|
'subject': subject, |
|
|
'body': body, |
|
|
'to': contact_email, |
|
|
'from': from_email, |
|
|
'client': client_name, |
|
|
'prospect': prospect_name, |
|
|
'contact': contact_name |
|
|
} |
|
|
|
|
|
print(f"[EMAIL GEN] Subject: {subject}") |
|
|
print(f"[EMAIL GEN] To: {contact_email}") |
|
|
print(f"[EMAIL GEN] Email generated successfully\n") |
|
|
|
|
|
return result |
|
|
|
|
|
def _generate_subject( |
|
|
self, |
|
|
client_name: str, |
|
|
prospect_name: str, |
|
|
industry: str, |
|
|
title: str |
|
|
) -> str: |
|
|
"""Generate personalized subject line""" |
|
|
|
|
|
|
|
|
if 'CEO' in title or 'Founder' in title: |
|
|
return f"{prospect_name} + {client_name}: Scaling {industry} Operations" |
|
|
elif 'VP' in title or 'Chief' in title: |
|
|
return f"Helping {prospect_name} Improve Customer Experience" |
|
|
elif 'Director' in title or 'Head' in title: |
|
|
return f"Quick question about {prospect_name}'s customer strategy" |
|
|
else: |
|
|
return f"{prospect_name}: Customer Experience Partnership" |
|
|
|
|
|
def _generate_body( |
|
|
self, |
|
|
client_name: str, |
|
|
client_description: str, |
|
|
client_offerings: list, |
|
|
client_value_props: list, |
|
|
prospect_name: str, |
|
|
prospect_industry: str, |
|
|
prospect_size: str, |
|
|
prospect_pains: list, |
|
|
contact_first_name: str, |
|
|
contact_title: str |
|
|
) -> str: |
|
|
"""Generate personalized email body""" |
|
|
|
|
|
|
|
|
opening = f"Hi {contact_first_name}," |
|
|
|
|
|
|
|
|
if 'CEO' in contact_title or 'Founder' in contact_title: |
|
|
intro = f"\n\nAs {contact_title} of {prospect_name}, you're likely focused on scaling operations while maintaining quality." |
|
|
elif 'VP' in contact_title or 'Chief' in contact_title: |
|
|
intro = f"\n\nAs {contact_title}, you're probably looking for ways to improve {prospect_name}'s customer experience and operational efficiency." |
|
|
else: |
|
|
intro = f"\n\nI wanted to reach out regarding {prospect_name}'s customer experience strategy." |
|
|
|
|
|
|
|
|
if client_description: |
|
|
client_intro = f"\n\n{client_name} {client_description[:200]}" |
|
|
elif client_offerings: |
|
|
client_intro = f"\n\n{client_name} provides {client_offerings[0][:150]}" |
|
|
else: |
|
|
client_intro = f"\n\n{client_name} helps {prospect_industry} companies improve their operations." |
|
|
|
|
|
|
|
|
value_section = "\n\nWe've helped similar companies" |
|
|
|
|
|
if prospect_pains and len(prospect_pains) > 0: |
|
|
|
|
|
main_pain = prospect_pains[0] |
|
|
value_section += f" tackle challenges like:\n• {main_pain}" |
|
|
|
|
|
|
|
|
if len(prospect_pains) > 1: |
|
|
value_section += f"\n• {prospect_pains[1]}" |
|
|
elif client_value_props: |
|
|
|
|
|
value_section += ":\n" |
|
|
for prop in client_value_props[:2]: |
|
|
if len(prop) < 150: |
|
|
value_section += f"• {prop}\n" |
|
|
else: |
|
|
|
|
|
value_section += " improve customer satisfaction and operational efficiency." |
|
|
|
|
|
|
|
|
if prospect_size and 'employee' in str(prospect_size).lower(): |
|
|
cta = f"\n\nGiven {prospect_name}'s size and growth trajectory, I think there might be a good fit here." |
|
|
else: |
|
|
cta = f"\n\nI think there might be a good fit between {client_name} and {prospect_name}." |
|
|
|
|
|
cta += f"\n\nWould you have 15 minutes next week for a quick call to explore if we can help {prospect_name}?" |
|
|
|
|
|
|
|
|
signoff = f"\n\nBest regards,\n{client_name} Partnerships Team" |
|
|
|
|
|
|
|
|
footer = f"\n\n---\nThis email was sent on behalf of {client_name}.\nTo unsubscribe, reply with \"unsubscribe\"." |
|
|
|
|
|
|
|
|
body = opening + intro + client_intro + value_section + cta + signoff + footer |
|
|
|
|
|
return body |
|
|
|
|
|
|
|
|
|
|
|
_email_generator = None |
|
|
|
|
|
|
|
|
def get_email_generator() -> PersonalizedEmailGenerator: |
|
|
"""Get singleton instance""" |
|
|
global _email_generator |
|
|
if _email_generator is None: |
|
|
_email_generator = PersonalizedEmailGenerator() |
|
|
return _email_generator |
|
|
|