stranck-dev in drew-dev #17
|
@ -167,3 +167,4 @@ furizon_webinit_riverside2023.tar.gz
|
||||||
diomerdas
|
diomerdas
|
||||||
furizon.net/site/*
|
furizon.net/site/*
|
||||||
furizon.net.zip
|
furizon.net.zip
|
||||||
|
stuff/secrets.py
|
||||||
|
|
3
app.py
3
app.py
|
@ -12,7 +12,7 @@ from io import BytesIO
|
||||||
from asyncio import Queue
|
from asyncio import Queue
|
||||||
from messages import LOCALES
|
from messages import LOCALES
|
||||||
import sqlite3
|
import sqlite3
|
||||||
from sanic.log import logger
|
from sanic.log import logger, logging
|
||||||
|
|
||||||
app = Sanic(__name__)
|
app = Sanic(__name__)
|
||||||
app.static("/res", "res/")
|
app.static("/res", "res/")
|
||||||
|
@ -45,6 +45,7 @@ async def clear_session(request, exception):
|
||||||
@app.before_server_start
|
@app.before_server_start
|
||||||
async def main_start(*_):
|
async def main_start(*_):
|
||||||
logger.info(f"[{app.name}] >>>>>> main_start <<<<<<")
|
logger.info(f"[{app.name}] >>>>>> main_start <<<<<<")
|
||||||
|
logger.setLevel(LOG_LEVEL)
|
||||||
|
|
||||||
app.config.REQUEST_MAX_SIZE = PROPIC_MAX_FILE_SIZE * 3
|
app.config.REQUEST_MAX_SIZE = PROPIC_MAX_FILE_SIZE * 3
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
from sanic.log import logging
|
||||||
|
LOG_LEVEL = logging.DEBUG
|
||||||
|
|
||||||
API_TOKEN = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
API_TOKEN = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
||||||
ORGANIZER = 'furizon'
|
ORGANIZER = 'furizon'
|
||||||
EVENT_NAME = 'overlord'
|
EVENT_NAME = 'overlord'
|
||||||
|
@ -25,6 +28,9 @@ SMTP_HOST = 'host'
|
||||||
SMTP_PORT = 0
|
SMTP_PORT = 0
|
||||||
SMTP_USER = 'user'
|
SMTP_USER = 'user'
|
||||||
SMTP_PASSWORD = 'pw'
|
SMTP_PASSWORD = 'pw'
|
||||||
|
EMAIL_SENDER_NAME = "Fantastic Furcon Wow"
|
||||||
|
EMAIL_SENDER_MAIL = "no-reply@thisIsAFantasticFurconWowItIsWonderful.cuteFurries.ovh"
|
||||||
|
SMPT_CLIENT_CLOSE_TIMEOUT = 60 * 15 # 15 minutes
|
||||||
|
|
||||||
FILL_CACHE = True
|
FILL_CACHE = True
|
||||||
CACHE_EXPIRE_TIME = 60 * 60 * 4
|
CACHE_EXPIRE_TIME = 60 * 60 * 4
|
||||||
|
@ -111,11 +117,6 @@ CATEGORIES_LIST_MAP = {
|
||||||
'dailys': []
|
'dailys': []
|
||||||
}
|
}
|
||||||
|
|
||||||
SPONSORSHIP_COLOR_MAP = {
|
|
||||||
'super': (251, 140, 0),
|
|
||||||
'normal': (142, 36, 170)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create a bunch of "room" items which will get added to the order once somebody gets a room.
|
# Create a bunch of "room" items which will get added to the order once somebody gets a room.
|
||||||
# Map item_name -> room capacity
|
# Map item_name -> room capacity
|
||||||
ROOM_CAPACITY_MAP = {
|
ROOM_CAPACITY_MAP = {
|
||||||
|
|
|
@ -1,13 +1,60 @@
|
||||||
from sanic import Sanic
|
from sanic import Sanic
|
||||||
|
from sanic.log import logger
|
||||||
|
import ssl
|
||||||
|
from ssl import SSLContext
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
from messages import ROOM_ERROR_TYPES
|
from messages import ROOM_ERROR_TYPES
|
||||||
import smtplib
|
import smtplib
|
||||||
from messages import *
|
from messages import *
|
||||||
from config import SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD
|
from config import *
|
||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
|
from threading import Timer, Lock
|
||||||
|
|
||||||
async def send_unconfirm_message (room_order, orders):
|
def killSmptClient():
|
||||||
|
global sslLock
|
||||||
|
global sslTimer
|
||||||
|
global smptSender
|
||||||
|
sslTimer.cancel()
|
||||||
|
sslLock.acquire()
|
||||||
|
if(smptSender is not None):
|
||||||
|
logger.debug('[SMPT] Closing smpt client')
|
||||||
|
smptSender.quit() # it calls close() inside
|
||||||
|
smptSender = None
|
||||||
|
sslLock.release()
|
||||||
|
|
||||||
|
async def openSmptClient():
|
||||||
|
global sslLock
|
||||||
|
global sslTimer
|
||||||
|
global sslContext
|
||||||
|
global smptSender
|
||||||
|
sslTimer.cancel()
|
||||||
|
sslLock.acquire()
|
||||||
|
if(smptSender is None):
|
||||||
|
logger.debug('[SMPT] Opening smpt client')
|
||||||
|
client : smtplib.SMTP = smtplib.SMTP(SMTP_HOST, SMTP_PORT)
|
||||||
|
client.starttls(context=sslContext)
|
||||||
|
client.login(SMTP_USER, SMTP_PASSWORD)
|
||||||
|
smptSender = client
|
||||||
|
sslLock.release()
|
||||||
|
sslTimer = createTimer()
|
||||||
|
sslTimer.start()
|
||||||
|
|
||||||
|
def createTimer():
|
||||||
|
return Timer(SMPT_CLIENT_CLOSE_TIMEOUT, killSmptClient)
|
||||||
|
sslLock : Lock = Lock()
|
||||||
|
sslTimer : Timer = createTimer()
|
||||||
|
sslContext : SSLContext = ssl.create_default_context()
|
||||||
|
smptSender : smtplib.SMTP = None
|
||||||
|
|
||||||
|
async def sendEmail(message : MIMEMultipart):
|
||||||
|
await openSmptClient()
|
||||||
|
logger.debug(f"[SMPT] Sending mail {message['From']} -> {message['to']} '{message['Subject']}'")
|
||||||
|
sslLock.acquire()
|
||||||
|
smptSender.sendmail(message['From'], message['to'], message.as_string())
|
||||||
|
sslLock.release()
|
||||||
|
|
||||||
|
async def send_unconfirm_message(room_order, orders):
|
||||||
memberMessages = []
|
memberMessages = []
|
||||||
|
|
||||||
issues_plain = ""
|
issues_plain = ""
|
||||||
|
@ -32,17 +79,15 @@ async def send_unconfirm_message (room_order, orders):
|
||||||
message = MIMEMultipart("alternative")
|
message = MIMEMultipart("alternative")
|
||||||
message.attach(plain_text)
|
message.attach(plain_text)
|
||||||
message.attach(html_text)
|
message.attach(html_text)
|
||||||
message['Subject'] = '[Furizon] Your room cannot be confirmed'
|
message['Subject'] = f'[{EMAIL_SENDER_NAME}] Your room cannot be confirmed'
|
||||||
message['From'] = 'Furizon <no-reply@furizon.net>'
|
message['From'] = f'{EMAIL_SENDER_NAME} <{EMAIL_SENDER_MAIL}>'
|
||||||
message['To'] = f"{member.name} <{member.email}>"
|
message['To'] = f"{member.name} <{member.email}>"
|
||||||
memberMessages.append(message)
|
memberMessages.append(message)
|
||||||
|
|
||||||
if len(memberMessages) == 0: return
|
if len(memberMessages) == 0: return
|
||||||
|
|
||||||
with smtplib.SMTP_SSL(SMTP_HOST, SMTP_PORT) as sender:
|
for message in memberMessages:
|
||||||
sender.login(SMTP_USER, SMTP_PASSWORD)
|
await sendEmail(message)
|
||||||
for message in memberMessages:
|
|
||||||
sender.sendmail(message['From'], message['to'], message.as_string())
|
|
||||||
|
|
||||||
def render_email_template(title = "", body = ""):
|
def render_email_template(title = "", body = ""):
|
||||||
tpl = Environment(loader=FileSystemLoader("tpl"), autoescape=False).get_template('email/comunication.html')
|
tpl = Environment(loader=FileSystemLoader("tpl"), autoescape=False).get_template('email/comunication.html')
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
python3 app.py 2>&1 | tee -a log.txt
|
|
@ -0,0 +1,32 @@
|
||||||
|
import smtplib
|
||||||
|
import ssl
|
||||||
|
|
||||||
|
from email.mime.text import MIMEText
|
||||||
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
|
||||||
|
from secrets import *
|
||||||
|
|
||||||
|
SMTP_HOST = 'smtp.office365.com'
|
||||||
|
SMTP_USER = 'webservice@furizon.net'
|
||||||
|
SMTP_PORT = 587
|
||||||
|
|
||||||
|
plain_body = "Test aaaa"
|
||||||
|
|
||||||
|
plain_text = MIMEText(plain_body, "plain")
|
||||||
|
message = MIMEMultipart("alternative")
|
||||||
|
message.attach(plain_text)
|
||||||
|
message['Subject'] = '[Furizon] This is a test!'
|
||||||
|
message['From'] = 'Furizon <webservice@furizon.net>'
|
||||||
|
message['To'] = f"Luca Sorace <strdjn@gmail.com>"
|
||||||
|
|
||||||
|
print("Start")
|
||||||
|
context = ssl.create_default_context()
|
||||||
|
print("Context created")
|
||||||
|
with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as sender:
|
||||||
|
print("Created sender obj")
|
||||||
|
sender.starttls(context=context)
|
||||||
|
print("Tls started")
|
||||||
|
sender.login(SMTP_USER, SMTP_PASSWORD)
|
||||||
|
print("Logged in")
|
||||||
|
print(sender.sendmail(message['From'], message['to'], message.as_string()))
|
||||||
|
print("Mail sent")
|
|
@ -10,13 +10,13 @@
|
||||||
.container { max-width: 40em; padding: 1em; margin: 0 auto; }
|
.container { max-width: 40em; padding: 1em; margin: 0 auto; }
|
||||||
.title { font-size: 1.75em; margin-bottom: 1.2em; color: #e1e6eb; margin-top: 0; font-family: sans-serif; }
|
.title { font-size: 1.75em; margin-bottom: 1.2em; color: #e1e6eb; margin-top: 0; font-family: sans-serif; }
|
||||||
.main-content { margin-top: 0; font-style: normal; font-weight: 400; font-family: sans-serif;}
|
.main-content { margin-top: 0; font-style: normal; font-weight: 400; font-family: sans-serif;}
|
||||||
.con-logo { height:2em;}
|
.con-logo { height:3em;}
|
||||||
.link { text-decoration: none; background-color: #1095c1; color: #fff; padding: 1em; border-radius: 5px; font-weight: 600; }
|
.link { text-decoration: none; background-color: #1095c1; color: #fff; padding: 1em; border-radius: 5px; font-weight: 600; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<img src="https://reg.furizon.net/res/furizon.png" class="con-logo">
|
<img src="https://reg.furizon.net/res/furizon.png" alt="con_logo" title="con_logo" class="con-logo">
|
||||||
<div>
|
<div>
|
||||||
<h2 class="title">{{title}}</h2>
|
<h2 class="title">{{title}}</h2>
|
||||||
<p class="main-content">{{body}}</p>
|
<p class="main-content">{{body}}</p>
|
||||||
|
|
Loading…
Reference in New Issue