| import gradio as gr |
| from newsletter import generate_newsletter |
| from mcp_client import DEFAULT_TOPICS |
| from email_client import send_email_via_mcp |
| import os |
| import requests |
|
|
| |
| def get_subscribers_from_django(): |
| try: |
| res = requests.get("https://davebohnert.pythonanywhere.com/daveblog/api/subscribers/") |
| res.raise_for_status() |
| data = res.json() |
| return data.get("emails", []) |
| except Exception as e: |
| print("β Error fetching subscribers from Django:", e) |
| return [] |
|
|
| |
| def prepare_inputs(topic_input, region, hours): |
| if topic_input.strip(): |
| topics = [t.strip() for t in topic_input.split(",") if t.strip()] |
| else: |
| topics = DEFAULT_TOPICS |
|
|
| markdown_text, md_path, pdf_path = generate_newsletter(topics, region, hours) |
|
|
| md_path = os.path.relpath(md_path, start=os.getcwd()) |
| pdf_path = os.path.relpath(pdf_path, start=os.getcwd()) |
|
|
| return markdown_text, md_path, pdf_path |
|
|
| |
| def send_newsletter_email(markdown_text, subject, recipient, sender_email=None, smtp_password=None): |
| if recipient.strip(): |
| bcc_list = [r.strip() for r in recipient.split(",") if r.strip()] |
| else: |
| bcc_list = get_subscribers_from_django() |
| if not bcc_list: |
| raise ValueError("No recipients provided and no fallback subscribers found.") |
|
|
| smtp_login = sender_email or os.getenv("DEFAULT_SENDER_EMAIL", "dave.bohnert77@gmail.com") |
| visible_sender = f"DataDave Newsletter <{smtp_login}>" |
|
|
| smtp_password = smtp_password or os.getenv("DEFAULT_SMTP_PASSWORD", "jqgi udjp bgxx gynk") |
| smtp_host = os.getenv("SMTP_HOST", "smtp.gmail.com") |
| smtp_port = int(os.getenv("SMTP_PORT", "587")) |
| subject = subject or "π° AI Newsletter" |
|
|
| return send_email_via_mcp( |
| markdown_content=markdown_text, |
| subject=subject, |
| recipient=bcc_list, |
| sender_email=visible_sender, |
| smtp_login=smtp_login, |
| smtp_password=smtp_password, |
| smtp_host=smtp_host, |
| smtp_port=smtp_port, |
| ) |
|
|
|
|
| |
| with gr.Blocks() as demo: |
| gr.Markdown("## ποΈ EU AI Regulation Weekly") |
|
|
| with gr.Row(): |
| topic_input = gr.Textbox( |
| label="Topics (comma-separated)", |
| value="", |
| placeholder="e.g. AI, GDPR, AI Act, AI regulation, DORA, NIS2..." |
| ) |
| region = gr.Textbox(label="Region", value="Europe") |
| hours = gr.Number(label="Lookback Hours", value=168) |
|
|
| with gr.Row(): |
| preview = gr.Textbox(label="Newsletter Preview", lines=30) |
| md_file = gr.File(label="π Download Markdown") |
| pdf_file = gr.File(label="π¨οΈ Download PDF", file_types=[".pdf"], interactive=True) |
|
|
| with gr.Row(): |
| recipient_email = gr.Textbox( |
| label="π© Recipient Email(s)", |
| placeholder="Leave empty to send to all subscribers" |
| ) |
| sender_email = gr.Textbox(label="π€ Sender Email", placeholder="your.email@gmail.com") |
| smtp_password = gr.Textbox(label="π SMTP Password", type="password") |
| subject = gr.Textbox(label="π Subject", value="π° Your AI Newsletter") |
|
|
| btn = gr.Button("π¬ Generate Newsletter") |
| btn.click( |
| fn=prepare_inputs, |
| inputs=[topic_input, region, hours], |
| outputs=[preview, md_file, pdf_file], |
| preprocess=False |
| ) |
|
|
| send_btn = gr.Button("βοΈ Send Newsletter via Email (BCC)") |
| send_btn.click( |
| fn=send_newsletter_email, |
| inputs=[preview, subject, recipient_email, sender_email, smtp_password], |
| outputs=[] |
| ) |
|
|
| |
| if __name__ == "__main__": |
| demo.launch(server_name="0.0.0.0", server_port=int(os.environ.get("PORT", 7860))) |
| print("β
App has started on port", os.environ.get("PORT", 7860)) |
|
|