89 lines
3.2 KiB
Python
89 lines
3.2 KiB
Python
import smtplib
|
|
from email.mime.text import MIMEText
|
|
from email.mime.multipart import MIMEMultipart
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
from jinja2 import Template
|
|
from config import Config
|
|
from database import subscribers_collection, articles_collection
|
|
|
|
|
|
def send_newsletter(max_articles=10):
|
|
"""Send newsletter to all subscribers with AI-summarized articles"""
|
|
if not Config.EMAIL_USER or not Config.EMAIL_PASSWORD:
|
|
print("Email credentials not configured")
|
|
return
|
|
|
|
# Get latest articles with AI summaries from database
|
|
cursor = articles_collection.find(
|
|
{'summary': {'$exists': True, '$ne': None}}
|
|
).sort('created_at', -1).limit(max_articles)
|
|
|
|
articles = []
|
|
for doc in cursor:
|
|
articles.append({
|
|
'title': doc.get('title', ''),
|
|
'author': doc.get('author'),
|
|
'link': doc.get('link', ''),
|
|
'summary': doc.get('summary', ''),
|
|
'source': doc.get('source', ''),
|
|
'published_at': doc.get('published_at', '')
|
|
})
|
|
|
|
if not articles:
|
|
print("No articles with summaries to send")
|
|
return
|
|
|
|
# Load email template
|
|
template_path = Path(__file__).parent.parent / 'templates' / 'newsletter_template.html'
|
|
with open(template_path, 'r', encoding='utf-8') as f:
|
|
template_content = f.read()
|
|
|
|
template = Template(template_content)
|
|
|
|
# Prepare template data
|
|
now = datetime.now()
|
|
template_data = {
|
|
'date': now.strftime('%A, %B %d, %Y'),
|
|
'year': now.year,
|
|
'article_count': len(articles),
|
|
'articles': articles,
|
|
'unsubscribe_link': 'http://localhost:3000', # Update with actual unsubscribe link
|
|
'website_link': 'http://localhost:3000'
|
|
}
|
|
|
|
# Render HTML
|
|
html_content = template.render(**template_data)
|
|
|
|
# Get all active subscribers
|
|
subscribers_cursor = subscribers_collection.find({'status': 'active'})
|
|
subscribers = [doc['email'] for doc in subscribers_cursor]
|
|
|
|
# Send emails
|
|
for subscriber in subscribers:
|
|
try:
|
|
msg = MIMEMultipart('alternative')
|
|
msg['Subject'] = f'Munich News Daily - {datetime.now().strftime("%B %d, %Y")}'
|
|
msg['From'] = f'Munich News Daily <{Config.EMAIL_USER}>'
|
|
msg['To'] = subscriber
|
|
msg['Date'] = datetime.now().strftime('%a, %d %b %Y %H:%M:%S %z')
|
|
msg['Message-ID'] = f'<{datetime.now().timestamp()}.{subscriber}@dongho.kim>'
|
|
msg['X-Mailer'] = 'Munich News Daily'
|
|
|
|
# Add plain text version as fallback
|
|
plain_text = "This email requires HTML support. Please view it in an HTML-capable email client."
|
|
msg.attach(MIMEText(plain_text, 'plain', 'utf-8'))
|
|
|
|
# Add HTML version
|
|
msg.attach(MIMEText(html_content, 'html', 'utf-8'))
|
|
|
|
server = smtplib.SMTP(Config.SMTP_SERVER, Config.SMTP_PORT)
|
|
server.starttls()
|
|
server.login(Config.EMAIL_USER, Config.EMAIL_PASSWORD)
|
|
server.send_message(msg)
|
|
server.quit()
|
|
|
|
print(f"Newsletter sent to {subscriber}")
|
|
except Exception as e:
|
|
print(f"Error sending to {subscriber}: {e}")
|