improve email
This commit is contained in:
@@ -8,7 +8,8 @@ class SettingsItemsData:
|
|||||||
data = {
|
data = {
|
||||||
"site_title": {"name": 'Title', "controls": 'TEXT', "active": True, "list_order": 0},
|
"site_title": {"name": 'Title', "controls": 'TEXT', "active": True, "list_order": 0},
|
||||||
"site_description": {"name": 'Description', "controls": 'TEXTAREA', "active": True, "list_order": 1},
|
"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_email": {"name": 'Email', "controls": 'TEXT', "active": True, "list_order": 3},
|
||||||
"site_contact_phone": {"name": 'Phone', "controls": 'TEXT', "active": True, "list_order": 4},
|
"site_contact_phone": {"name": 'Phone', "controls": 'TEXT', "active": True, "list_order": 4},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -453,7 +453,12 @@ def common_practice():
|
|||||||
|
|
||||||
# return jsonify(result)
|
# 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
|
# Health Check Endpoint
|
||||||
@api.route("/health", methods=["GET"])
|
@api.route("/health", methods=["GET"])
|
||||||
|
|||||||
+112
-13
@@ -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.user import UserSchema
|
||||||
from app.api.schemas.start_profile import StartProfileSchema
|
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 datetime
|
||||||
import jwt
|
import jwt
|
||||||
import random
|
import random
|
||||||
@@ -21,6 +26,11 @@ from app.config import Config
|
|||||||
|
|
||||||
|
|
||||||
class AccountService(BaseService):
|
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
|
@staticmethod
|
||||||
def process_bar_request(data):
|
def process_bar_request(data):
|
||||||
@@ -51,22 +61,20 @@ class AccountService(BaseService):
|
|||||||
uid = str(validated_data.get('uid'))
|
uid = str(validated_data.get('uid'))
|
||||||
member_data = Members.get_member_by_uid(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 != "":
|
if option_name is not None and option_name != "":
|
||||||
next_bill = f"Bill: {member_data.next_billing}"
|
next_bill = f"Bill: {member_data.next_billing}"
|
||||||
view_sub = "Account"
|
view_sub = "Account"
|
||||||
bill_style=" next_billing "
|
bill_style = " next_billing "
|
||||||
else:
|
else:
|
||||||
option_name = "Free Trial"
|
option_name = "Free Trial"
|
||||||
next_bill = f"Ends: {member_data.trial_end}"
|
next_bill = f"Ends: {member_data.trial_end}"
|
||||||
view_sub = "Upgrade Account"
|
view_sub = "Upgrade Account"
|
||||||
bill_style = " billing "
|
bill_style = " billing "
|
||||||
|
|
||||||
contacts_count =0 # random.randint(0, 10)
|
contacts_count = 0 # random.randint(0, 10)
|
||||||
appointments_count =0
|
appointments_count = 0
|
||||||
site_traffic_count =0
|
site_traffic_count = 0
|
||||||
|
|
||||||
|
|
||||||
bar_data = {
|
bar_data = {
|
||||||
"last_update": datetime.datetime.utcnow(),
|
"last_update": datetime.datetime.utcnow(),
|
||||||
@@ -74,9 +82,11 @@ class AccountService(BaseService):
|
|||||||
{"id": "1", "description": "Contacts", "last_update": "10-10-2010 11:00 AM",
|
{"id": "1", "description": "Contacts", "last_update": "10-10-2010 11:00 AM",
|
||||||
"value": contacts_count, "data_span": 'Last 2 months', "link": "/contacts", "extra_style": ''},
|
"value": contacts_count, "data_span": 'Last 2 months', "link": "/contacts", "extra_style": ''},
|
||||||
{"id": "2", "description": "Appointments", "last_update": "10-12-2010 11:30 AM",
|
{"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",
|
{"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",
|
{"id": "4", "description": view_sub, "last_update": "10-12-2010 11:30 AM",
|
||||||
"value": option_name, "data_span": next_bill, "link": "/subscription",
|
"value": option_name, "data_span": next_bill, "link": "/subscription",
|
||||||
"extra_style": bill_style}
|
"extra_style": bill_style}
|
||||||
@@ -322,7 +332,6 @@ class AccountService(BaseService):
|
|||||||
db.session.rollback()
|
db.session.rollback()
|
||||||
return ResponseHelper.internal_server_error()
|
return ResponseHelper.internal_server_error()
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def process_payments_data(data):
|
def process_payments_data(data):
|
||||||
|
|
||||||
@@ -345,7 +354,7 @@ class AccountService(BaseService):
|
|||||||
'option_name': t.option_name,
|
'option_name': t.option_name,
|
||||||
'option_type': t.option_type,
|
'option_type': t.option_type,
|
||||||
'payment_uid': t.payment_uid,
|
'payment_uid': t.payment_uid,
|
||||||
'amount': round( t.amount*0.01, 2),
|
'amount': round(t.amount * 0.01, 2),
|
||||||
'status': t.status,
|
'status': t.status,
|
||||||
'added': t.added
|
'added': t.added
|
||||||
})
|
})
|
||||||
@@ -373,4 +382,94 @@ class AccountService(BaseService):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"An error occurred: {str(e)}", exc_info=True)
|
logger.error(f"An error occurred: {str(e)}", exc_info=True)
|
||||||
db.session.rollback()
|
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
|
||||||
|
|||||||
@@ -132,6 +132,92 @@ class BaseService:
|
|||||||
server.quit() # Close the connection
|
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
|
@classmethod
|
||||||
def validate_data(cls, data, schema):
|
def validate_data(cls, data, schema):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -167,7 +167,8 @@ class RegisterService(BaseService):
|
|||||||
email = validated_data.get('email')
|
email = validated_data.get('email')
|
||||||
|
|
||||||
regData = MembersPending.add_members_pending( firstname, lastname, 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 = {
|
response_data = {
|
||||||
"pending_id": regData.id,
|
"pending_id": regData.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user