Spaces:
Paused
Paused
File size: 4,771 Bytes
84d1443 04dab42 46eb21b 4b6b291 bdcdf69 4b6b291 44b039f 997c360 46eb21b c415a14 84d1443 997c360 46eb21b 44b039f 997c360 20fe538 84d1443 997c360 ac10a27 20fe538 04dab42 20fe538 04dab42 46eb21b 04dab42 46eb21b 04dab42 46eb21b 04dab42 46eb21b 04dab42 46eb21b 04dab42 997c360 46eb21b 997c360 bdcdf69 ac10a27 bdcdf69 997c360 46eb21b 997c360 bdcdf69 46eb21b bdcdf69 46eb21b ac10a27 46eb21b ac10a27 fd66b99 e298590 fd66b99 bdcdf69 fd66b99 bdcdf69 46eb21b fd66b99 bdcdf69 fd66b99 46eb21b bdcdf69 04dab42 46eb21b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import logging
import re
import requests
from fastapi import FastAPI
from pydantic import BaseModel, Field
import uvicorn
# =======================
# Configuration Settings
# =======================
# URL of the SMTP API endpoint (hosted on Vercel)
SMTP_API_URL = "https://smtp-server-ten.vercel.app/smtp" # <--- change this to your deployed Vercel endpoint
# =======================
# Logging Configuration
# =======================
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger("bot_server")
# =======================
# Global Conversation State
# =======================
# Maps sender's WhatsApp number to conversation data.
conversations = {}
# =======================
# Helper Functions
# =======================
# Regex for validating email addresses
EMAIL_REGEX = re.compile(r"^[^@]+@[^@]+\.[^@]+$")
def validate_email(email: str) -> bool:
return re.match(EMAIL_REGEX, email) is not None
def send_email_via_api(from_addr: str, to_addr: str, subject: str, body: str) -> bool:
"""
Calls the external SMTP API endpoint to send an email.
"""
payload = {
"from": from_addr,
"to": to_addr,
"subject": subject,
"body": body,
}
logger.debug("Calling SMTP API with payload: %s", payload)
try:
response = requests.post(SMTP_API_URL, json=payload, timeout=10)
response.raise_for_status()
result = response.json()
logger.info("SMTP API response: %s", result)
return result.get("success", False)
except Exception as e:
logger.error("Error calling SMTP API: %s", e)
return False
# =======================
# Pydantic Models for Bot Requests
# =======================
class Text(BaseModel):
body: str
class Message(BaseModel):
text: Text
class BotRequest(BaseModel):
from_: str = Field(..., alias="from")
message: Message
# =======================
# FastAPI Bot Application
# =======================
app = FastAPI()
@app.post("/bot")
async def bot_endpoint(request_data: BotRequest):
payload = request_data.dict(by_alias=True)
logger.debug("Received request payload: %s", payload)
sender_number = request_data.from_
message_body = request_data.message.text.body.strip()
logger.info("Processing message from %s: '%s'", sender_number, message_body)
state = conversations.get(sender_number, {})
if not state:
conversations[sender_number] = {"step": "from"}
response_msg = "Welcome to SMTP Assistant! Please provide your 'From' email address."
else:
step = state.get("step")
logger.debug("Current step for %s: %s", sender_number, step)
if step == "from":
if validate_email(message_body):
state["from"] = message_body
state["step"] = "to"
response_msg = "Thanks! Now, please provide the recipient's email address."
else:
response_msg = "Invalid email format. Please provide a valid 'From' email address."
elif step == "to":
if validate_email(message_body):
state["to"] = message_body
state["step"] = "subject"
response_msg = "Great! Please provide the email subject."
else:
response_msg = "Invalid email format. Please provide a valid recipient email address."
elif step == "subject":
state["subject"] = message_body
state["step"] = "body"
response_msg = "Almost done! Please provide the email body."
elif step == "body":
state["body"] = message_body
from_addr = state.get("from")
to_addr = state.get("to")
subject = state.get("subject")
body = state.get("body")
logger.info("Attempting to send email from %s to %s with subject '%s'", from_addr, to_addr, subject)
if send_email_via_api(from_addr, to_addr, subject, body):
response_msg = f"Email sent successfully from {from_addr} to {to_addr}."
else:
response_msg = "Failed to send email. Please try again later."
del conversations[sender_number]
logger.info("Cleared conversation state for %s", sender_number)
else:
response_msg = "Unrecognized step. Let's start over. Please provide your 'From' email address."
conversations[sender_number] = {"step": "from"}
logger.debug("Response message to %s: %s", sender_number, response_msg)
return {"status": "success", "message": response_msg}
if __name__ == "__main__":
uvicorn.run("bot_server:app", host="0.0.0.0", port=5000, reload=True)
|