122 lines
4.4 KiB
Python
122 lines
4.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test Email Script — Service Finder
|
|
====================================
|
|
Tests the EmailManager by sending a test email using the configured provider.
|
|
Reads all settings from .env automatically via the app's Settings class.
|
|
|
|
Usage:
|
|
# Test with configured provider (Brevo API / SMTP):
|
|
docker compose exec sf_api python3 /app/test_email.py
|
|
|
|
# Test with local Mailpit (no real email sent, no TLS needed):
|
|
docker compose exec sf_api /bin/sh -c " \
|
|
SMTP_HOST=sf_mailpit SMTP_PORT=1025 SMTP_USER= SMTP_PASSWORD= \
|
|
EMAIL_PROVIDER=smtp TEST_RECIPIENT=kincses@gmail.com \
|
|
python3 /app/test_email.py"
|
|
|
|
# Test with Brevo API directly:
|
|
docker compose exec sf_api /bin/sh -c " \
|
|
EMAIL_PROVIDER=brevo_api TEST_RECIPIENT=kincses@gmail.com \
|
|
python3 /app/test_email.py"
|
|
|
|
Environment check:
|
|
- EMAIL_PROVIDER=smtp → uses SMTP
|
|
- EMAIL_PROVIDER=brevo_smtp → uses Brevo SMTP relay
|
|
- EMAIL_PROVIDER=brevo_api → uses Brevo REST API
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import asyncio
|
|
import logging
|
|
|
|
# Ensure the backend package is importable
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
# ── Load .env but do NOT override already-set env vars ──
|
|
from dotenv import load_dotenv
|
|
env_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '.env')
|
|
load_dotenv(env_path, override=False) # override=False = respect existing env vars
|
|
|
|
# ── Logging setup ──
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s [%(name)s] %(levelname)s: %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S',
|
|
)
|
|
logger = logging.getLogger("TestEmail")
|
|
|
|
async def main():
|
|
"""Send a test email and report the result."""
|
|
print("=" * 70)
|
|
print(" SERVICE FINDER — EMAIL TEST SCRIPT")
|
|
print("=" * 70)
|
|
|
|
# ── 1. Show current email configuration ──
|
|
provider = os.getenv("EMAIL_PROVIDER", "smtp")
|
|
print(f"\n📧 Current EMAIL_PROVIDER: {provider}")
|
|
print(f" SMTP_HOST: {os.getenv('SMTP_HOST', '(not set)')}")
|
|
print(f" SMTP_PORT: {os.getenv('SMTP_PORT', '(not set)')}")
|
|
print(f" SMTP_USER: {os.getenv('SMTP_USER', '(not set)')}")
|
|
print(f" MAIL_FROM: {os.getenv('MAIL_FROM', '(not set)')}")
|
|
print(f" MAIL_FROM_NAME: {os.getenv('MAIL_FROM_NAME', '(not set)')}")
|
|
|
|
# Brevo-specific checks
|
|
brevo_api_key = os.getenv("BREVO_API_KEY")
|
|
brevo_smtp_user = os.getenv("BREVO_SMTP_USER")
|
|
brevo_smtp_pass = os.getenv("BREVO_SMTP_PASSWORD")
|
|
if provider == "brevo_api":
|
|
print(f" BREVO_API_KEY: {'✅ Set' if brevo_api_key else '❌ NOT SET'}")
|
|
elif provider == "brevo_smtp":
|
|
print(f" BREVO_SMTP_USER: {'✅ Set' if brevo_smtp_user else '❌ NOT SET'}")
|
|
print(f" BREVO_SMTP_PASSWORD: {'✅ Set' if brevo_smtp_pass else '❌ NOT SET'}")
|
|
|
|
# ── 2. Recipient ──
|
|
recipient = os.getenv("TEST_RECIPIENT") or os.getenv("INITIAL_ADMIN_EMAIL") or "kincses@valami.hu"
|
|
print(f"\n📨 Test recipient: {recipient}")
|
|
|
|
# ── 3. Import and send ──
|
|
print("\n⏳ Sending test email...\n")
|
|
|
|
try:
|
|
from app.services.email_manager import EmailManager
|
|
|
|
result = await EmailManager.send_email(
|
|
recipient=recipient,
|
|
template_key="test",
|
|
variables={
|
|
"first_name": "Teszt",
|
|
"link": "https://dev.servicefinder.hu/dashboard",
|
|
},
|
|
lang="hu",
|
|
)
|
|
|
|
print(f"\n{'=' * 70}")
|
|
print(f" 📬 EMAIL RESULT")
|
|
print(f"{'=' * 70}")
|
|
print(f" Status: {result.get('status', 'unknown')}")
|
|
print(f" Provider: {result.get('provider', 'unknown')}")
|
|
if result.get('message_id'):
|
|
print(f" MessageID: {result['message_id']}")
|
|
if result.get('message'):
|
|
print(f" Message: {result['message']}")
|
|
print(f"{'=' * 70}\n")
|
|
|
|
if result.get("status") == "success":
|
|
print("✅ TEST PASSED — Email sent successfully!")
|
|
return 0
|
|
else:
|
|
print(f"❌ TEST FAILED — {result.get('message', 'Unknown error')}")
|
|
return 1
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ CRITICAL ERROR: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return 1
|
|
|
|
if __name__ == "__main__":
|
|
exit_code = asyncio.run(main())
|
|
sys.exit(exit_code)
|