Samfredoly commited on
Commit
bdcdf69
·
verified ·
1 Parent(s): 2549bfd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -20
app.py CHANGED
@@ -2,7 +2,8 @@ import logging
2
  import smtplib
3
  import re
4
  from email.mime.text import MIMEText
5
- from flask import Flask, request, jsonify
 
6
  from dotenv import load_dotenv
7
  import os
8
 
@@ -46,27 +47,35 @@ def send_email(from_addr: str, to_addr: str, subject: str, body: str) -> bool:
46
  server.starttls() # Upgrade to TLS
47
  server.login(SMTP_USER, SMTP_PASSWORD)
48
  server.sendmail(from_addr, [to_addr], msg.as_string())
49
-
50
  logger.info(f"Email sent successfully from {from_addr} to {to_addr}")
51
  return True
52
  except Exception as e:
53
  logger.error(f"Error sending email: {e}")
54
  return False
55
 
56
- # Flask app acting as the Bot Brain API
57
- app = Flask(__name__)
 
58
 
59
- @app.route("/bot", methods=["POST"])
60
- def bot():
61
- try:
62
- data = request.json
63
- logger.info("Received request from Node.js server: %s", data)
64
- sender_number = data.get("from", "unknown")
65
- message_body = data.get("message", {}).get("text", {}).get("body", "").strip()
66
- logger.info("Processing message from %s: %s", sender_number, message_body)
67
- except Exception as e:
68
- logger.error("Invalid JSON payload: %s", e)
69
- return jsonify({"status": "error", "message": "Invalid payload"}), 400
 
 
 
 
 
 
 
 
70
 
71
  state = conversations.get(sender_number, {})
72
 
@@ -76,6 +85,7 @@ def bot():
76
  response_msg = "Welcome to SMTP Assistant! Please provide your 'From' email address."
77
  else:
78
  step = state.get("step")
 
79
  if step == "from":
80
  if validate_email(message_body):
81
  state["from"] = message_body
@@ -100,18 +110,21 @@ def bot():
100
  to_addr = state.get("to")
101
  subject = state.get("subject")
102
  body = state.get("body")
 
103
  if send_email(from_addr, to_addr, subject, body):
104
  response_msg = f"Email sent successfully from {from_addr} to {to_addr}."
105
  else:
106
  response_msg = "Failed to send email. Please try again later."
107
- # Clear the conversation state after sending
108
  del conversations[sender_number]
 
109
  else:
110
  response_msg = "Unrecognized step. Let's start over. Please provide your 'From' email address."
111
  conversations[sender_number] = {"step": "from"}
112
 
113
- logger.info("Sending response to Node.js server: %s", response_msg)
114
- return jsonify({"status": "success", "message": response_msg})
115
-
116
  if __name__ == "__main__":
117
- app.run(host="0.0.0.0", port=5000, debug=True)
 
 
2
  import smtplib
3
  import re
4
  from email.mime.text import MIMEText
5
+ from fastapi import FastAPI, HTTPException
6
+ from pydantic import BaseModel, Field
7
  from dotenv import load_dotenv
8
  import os
9
 
 
47
  server.starttls() # Upgrade to TLS
48
  server.login(SMTP_USER, SMTP_PASSWORD)
49
  server.sendmail(from_addr, [to_addr], msg.as_string())
 
50
  logger.info(f"Email sent successfully from {from_addr} to {to_addr}")
51
  return True
52
  except Exception as e:
53
  logger.error(f"Error sending email: {e}")
54
  return False
55
 
56
+ # Pydantic models for request validation
57
+ class Text(BaseModel):
58
+ body: str
59
 
60
+ class Message(BaseModel):
61
+ text: Text
62
+
63
+ class BotRequest(BaseModel):
64
+ from_: str = Field(..., alias="from")
65
+ message: Message
66
+
67
+ # FastAPI app instance
68
+ app = FastAPI()
69
+
70
+ @app.post("/bot")
71
+ async def bot_endpoint(request_data: BotRequest):
72
+ # Log the received request payload
73
+ payload = request_data.dict(by_alias=True)
74
+ logger.debug("Received request payload: %s", payload)
75
+
76
+ sender_number = request_data.from_
77
+ message_body = request_data.message.text.body.strip()
78
+ logger.info("Processing message from %s: '%s'", sender_number, message_body)
79
 
80
  state = conversations.get(sender_number, {})
81
 
 
85
  response_msg = "Welcome to SMTP Assistant! Please provide your 'From' email address."
86
  else:
87
  step = state.get("step")
88
+ logger.debug("Current step for %s: %s", sender_number, step)
89
  if step == "from":
90
  if validate_email(message_body):
91
  state["from"] = message_body
 
110
  to_addr = state.get("to")
111
  subject = state.get("subject")
112
  body = state.get("body")
113
+ logger.info("Attempting to send email from %s to %s with subject '%s'", from_addr, to_addr, subject)
114
  if send_email(from_addr, to_addr, subject, body):
115
  response_msg = f"Email sent successfully from {from_addr} to {to_addr}."
116
  else:
117
  response_msg = "Failed to send email. Please try again later."
118
+ # Clear conversation state after sending
119
  del conversations[sender_number]
120
+ logger.info("Cleared conversation state for %s", sender_number)
121
  else:
122
  response_msg = "Unrecognized step. Let's start over. Please provide your 'From' email address."
123
  conversations[sender_number] = {"step": "from"}
124
 
125
+ logger.debug("Response message to %s: %s", sender_number, response_msg)
126
+ return {"status": "success", "message": response_msg}
127
+
128
  if __name__ == "__main__":
129
+ import uvicorn
130
+ uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True)