improve email

This commit is contained in:
CHIEFSOFT\ameye
2025-09-05 19:29:28 -04:00
parent 399ccc25ee
commit 78dd6fec6e
5 changed files with 208 additions and 16 deletions
+2 -1
View File
@@ -8,7 +8,8 @@ class SettingsItemsData:
data = {
"site_title": {"name": 'Title', "controls": 'TEXT', "active": True, "list_order": 0},
"site_description": {"name": 'Description', "controls": 'TEXTAREA', "active": True, "list_order": 1},
"site_logo_text": {"name": 'Logo Text', "controls": 'TEXT', "active": True, "list_order": 2},
"site_logo_text": {"name": 'Logo Text', "controls": 'TEXT', "active": True, "list_order": 2,
"extra": {"maxlength": 25}},
"site_contact_email": {"name": 'Email', "controls": 'TEXT', "active": True, "list_order": 3},
"site_contact_phone": {"name": 'Phone', "controls": 'TEXT', "active": True, "list_order": 4},
}
+6 -1
View File
@@ -453,7 +453,12 @@ def common_practice():
# return jsonify(result)
# ===================================================
# Health Check Endpoint
@api.route("/testemail", methods=["GET"])
def email_check():
data ={}
AccountService.process_test_email(data)
return {"status": "ok"}, 200
# Health Check Endpoint
@api.route("/health", methods=["GET"])
+112 -13
View File
@@ -14,6 +14,11 @@ from werkzeug.security import generate_password_hash, check_password_hash
from app.api.schemas.user import UserSchema
from app.api.schemas.start_profile import StartProfileSchema
from flask_mail import Mail, Message
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import datetime
import jwt
import random
@@ -21,6 +26,11 @@ from app.config import Config
class AccountService(BaseService):
JWT_SECRET_KEY = Config.JWT_SECRET_KEY
SEND_EMAIL_FROM = Config.SEND_EMAIL_FROM
SEND_EMAIL_PASS = Config.SEND_EMAIL_PASS
THIS_SITE_URL = Config.THIS_SITE_URL
@staticmethod
def process_bar_request(data):
@@ -51,22 +61,20 @@ class AccountService(BaseService):
uid = str(validated_data.get('uid'))
member_data = Members.get_member_by_uid(uid)
option_name = member_data.option_name # "Free Trial"
option_name = member_data.option_name # "Free Trial"
if option_name is not None and option_name != "":
next_bill = f"Bill: {member_data.next_billing}"
view_sub = "Account"
bill_style=" next_billing "
bill_style = " next_billing "
else:
option_name = "Free Trial"
next_bill = f"Ends: {member_data.trial_end}"
view_sub = "Upgrade Account"
view_sub = "Upgrade Account"
bill_style = " billing "
contacts_count =0 # random.randint(0, 10)
appointments_count =0
site_traffic_count =0
contacts_count = 0 # random.randint(0, 10)
appointments_count = 0
site_traffic_count = 0
bar_data = {
"last_update": datetime.datetime.utcnow(),
@@ -74,9 +82,11 @@ class AccountService(BaseService):
{"id": "1", "description": "Contacts", "last_update": "10-10-2010 11:00 AM",
"value": contacts_count, "data_span": 'Last 2 months', "link": "/contacts", "extra_style": ''},
{"id": "2", "description": "Appointments", "last_update": "10-12-2010 11:30 AM",
"value": appointments_count, "data_span": 'Last 14 days', "link": "/appointments", "extra_style": ''},
"value": appointments_count, "data_span": 'Last 14 days', "link": "/appointments",
"extra_style": ''},
{"id": "3", "description": "Site Traffic", "last_update": "10-10-2010 11:30 AM",
"value": site_traffic_count, "data_span": 'Past 12 hours', "link": "/reports/traffic", "extra_style": ''},
"value": site_traffic_count, "data_span": 'Past 12 hours', "link": "/reports/traffic",
"extra_style": ''},
{"id": "4", "description": view_sub, "last_update": "10-12-2010 11:30 AM",
"value": option_name, "data_span": next_bill, "link": "/subscription",
"extra_style": bill_style}
@@ -322,7 +332,6 @@ class AccountService(BaseService):
db.session.rollback()
return ResponseHelper.internal_server_error()
@staticmethod
def process_payments_data(data):
@@ -345,7 +354,7 @@ class AccountService(BaseService):
'option_name': t.option_name,
'option_type': t.option_type,
'payment_uid': t.payment_uid,
'amount': round( t.amount*0.01, 2),
'amount': round(t.amount * 0.01, 2),
'status': t.status,
'added': t.added
})
@@ -373,4 +382,94 @@ class AccountService(BaseService):
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
db.session.rollback()
return ResponseHelper.internal_server_error()
return ResponseHelper.internal_server_error()
@staticmethod
def process_test_email(data):
logger.info(f"Email Test Enter", exc_info=True)
AccountService.send_register_mail('ameye@chiefsoft.com', 'pend-uid---', 100, 'olutest', 'Ameyetest')
logger.info(f"Email Test", exc_info=True)
def send_register_mail(signup_email, pending_uid, pending_id, firstname, lastname):
pending_member = {
"email": signup_email,
"pending_uid": pending_uid,
"first_name": firstname,
"last_name": lastname,
"pending_id": pending_id,
}
jwt_part = jwt.encode(
{"user": pending_member, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=3330)},
AccountService.JWT_SECRET_KEY, algorithm='HS256'
)
panel_url = panel_url = AccountService.THIS_SITE_URL # "https://qa-panel.mermsemr.com"
link_url = str(panel_url) + '/csignup/' + jwt_part
msg_body = f"""
Hello {firstname},
You received this message for account verification
Follow the link:{link_url}
For any Support
Reach Out
support@mermsemr.com
"""
sender_email = AccountService.SEND_EMAIL_FROM
sender_password = AccountService.SEND_EMAIL_PASS
receiver_email = signup_email
subject = "Verify your MERMS(AI) Account Setup"
body = msg_body
html_body = f"""\
<html>
<head></head>
<body style="font-size:14px;line-height:1.5;">
<table width="550px" border="0" cellpadding="3" cellspacing="3" background-color="#F0F8FF" style="font-size:16px">
<tr>
<td style="text-align:center">
<img style="width:150px; height:auto;" src="mermsemr.com/images/logo-pink.png" />
</td>
</tr>
<tr>
<td>
Hello <b>{firstname}!</b>
</td>
</tr>
<tr>
<td>
You have received this message for your account verification<br>
</td>
</tr>
<tr>
<td>
Follow the link: <a href="{link_url}">link</a> to complete the verification process.<br>
</td>
</tr>
</table>
</body>
</html>
"""
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender_email
msg['To'] = receiver_email
msg.attach(MIMEText(html_body, 'html')) # or 'html' for HTML content
try:
# For Gmail, use 'smtp.gmail.com' and port 587 (TLS) or 465 (SSL)
# For other providers, consult their documentation for SMTP server and port
server = smtplib.SMTP('smtp.gmail.com', 587)
# server.starttls() # Enable TLS encryption
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print("Email sent successfully!")
except Exception as e:
print(f"Error sending email: {e}")
logger.error(f"Error sending email: {e}")
finally:
server.quit() # Close the connection
+86
View File
@@ -132,6 +132,92 @@ class BaseService:
server.quit() # Close the connection
def send_verify_signup_mail(signup_email, pending_uid, pending_id, firstname, lastname):
pending_member = {
"email": signup_email,
"pending_uid": pending_uid,
"first_name": firstname,
"last_name": lastname,
"pending_id": pending_id,
}
jwt_part = jwt.encode(
{"user": pending_member, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=3330)},
BaseService.JWT_SECRET_KEY, algorithm='HS256'
)
panel_url = panel_url = BaseService.THIS_SITE_URL # "https://qa-panel.mermsemr.com"
link_url = str(panel_url) + '/csignup/' + jwt_part
msg_body = f"""
Hello {firstname},
You received this message for account verification
Follow the link:{link_url}
For any Support
Reach Out
support@mermsemr.com
"""
sender_email = BaseService.SEND_EMAIL_FROM
sender_password = BaseService.SEND_EMAIL_PASS
receiver_email = signup_email
subject = "Verify your MERMS(AI) Account Setup"
body = msg_body
html_body = f"""\
<html>
<head></head>
<body style="font-size:14px;line-height:1.5;">
<table width="550px" border="0" cellpadding="3" cellspacing="3" background-color="#F0F8FF" style="font-size:16px">
<tr>
<td style="text-align:center">
<img style="width:150px; height:auto;" src="mermsemr.com/images/logo-pink.png" />
</td>
</tr>
<tr>
<td>
Hello <b>{firstname}!</b>
</td>
</tr>
<tr>
<td>
You have received this message for your account verification<br>
</td>
</tr>
<tr>
<td>
Follow the link: <a href="{link_url}">link</a> to complete the verification process.<br>
</td>
</tr>
</table>
</body>
</html>
"""
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = sender_email
msg['To'] = receiver_email
msg.attach(MIMEText(html_body, 'html')) # or 'html' for HTML content
try:
# For Gmail, use 'smtp.gmail.com' and port 587 (TLS) or 465 (SSL)
# For other providers, consult their documentation for SMTP server and port
server = smtplib.SMTP('smtp.gmail.com', 587)
# server.starttls() # Enable TLS encryption
server.login(sender_email, sender_password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print("Email sent successfully!")
except Exception as e:
print(f"Error sending email: {e}")
logger.error(f"Error sending email: {e}")
finally:
server.quit() # Close the connection
@classmethod
def validate_data(cls, data, schema):
"""
+2 -1
View File
@@ -167,7 +167,8 @@ class RegisterService(BaseService):
email = validated_data.get('email')
regData = MembersPending.add_members_pending( firstname, lastname, email)
send_register_mail(regData.email, regData.uid, regData.id, firstname, lastname)
BaseService.send_verify_signup_mail(regData.email, regData.uid, regData.id, firstname, lastname)
# send_register_mail(regData.email, regData.uid, regData.id, firstname, lastname)
response_data = {
"pending_id": regData.id,