Skip to content
Snippets Groups Projects
Commit d83e3ef0 authored by Simon Künzel's avatar Simon Künzel
Browse files

Implement emails for feedback

parent 36de7152
No related branches found
No related tags found
No related merge requests found
......@@ -137,6 +137,9 @@ ERROR_MAIL_RECEIVERS = ["videoag-it@lists.fsmpi.rwth-aachen.de"]
ERROR_MAIL_WINDOW_SIZE_SECONDS = 5 * 60
ERROR_MAIL_MAX_MAILS_IN_WINDOW = 3
FEEDBACK_MAIL_RECEIVERS = ["video@fsmpi.rwth-aachen.de"]
# LDAP_HOST = "auth.fsmpi.rwth-aachen.de"
LDAP_PORT = 636
LDAP_GROUPS = ["fachschaft"]
......
from api.miscellaneous.util import (DEBUG_ENABLED, SCHEDULER, ERROR_NOTIFIER)
from api.miscellaneous.util import (DEBUG_ENABLED, SCHEDULER, MAIL_SENDER, ERROR_NOTIFIER)
from api.miscellaneous.rate_limiter import IntervalRateLimiter, HostBasedCounterRateLimiter, create_configured_host_rate_limiters
from api.miscellaneous.diagnostics import DIAGNOSTICS_TRACKER, DiagnosticsCounter, DiagnosticsDataProvider
from videoag_common.miscellaneous import *
from flask import request
import re
from api.miscellaneous import MAIL_SENDER
from api.routes import *
......@@ -9,8 +10,7 @@ FEEDBACK_EMAIL_REGEX = "\\S+@\\S+\\.\\S+"
FEEDBACK_EMAIL_PATTERN = re.compile(FEEDBACK_EMAIL_REGEX)
FEEDBACK_TEXT_MAX_LENGTH = 16384
FEEDBACK_MIN_PAGE_SIZE = 10
FEEDBACK_MAX_PAGE_SIZE = 500
_FEEDBACK_MAIL_RECEIVERS = api.config["FEEDBACK_MAIL_RECEIVERS"]
@api_route("/feedback/new", "PUT",
......@@ -27,4 +27,14 @@ def api_route_feedback_new():
if email is not None and not FEEDBACK_EMAIL_PATTERN.fullmatch(email):
raise json_request.get("email").raise_error(f"Does not match pattern {FEEDBACK_EMAIL_REGEX}")
return {}, HTTP_501_NOT_IMPLEMENTED # TODO send email
if not MAIL_SENDER.is_enabled():
raise ApiClientException(ERROR_FEEDBACK_DISABLED)
MAIL_SENDER.send_plain_mail(
subject="Video AG Feedback",
message=text,
receiver_addrs=_FEEDBACK_MAIL_RECEIVERS,
sender_name=f"\"{("Anonymous" if email is None else email)} (via Video AG Website)\"",
reply_to_addr=email
)
return {}, HTTP_202_ACCEPTED
......@@ -39,7 +39,8 @@ from .errors import (
ERROR_TOO_MANY_SUGGESTIONS,
ERROR_SITE_IS_READONLY,
ERROR_SITE_IS_DISABLED,
ERROR_SITE_IS_OVERLOADED
ERROR_SITE_IS_OVERLOADED,
ERROR_FEEDBACK_DISABLED,
)
from .json import (
CJsonValue,
......
......@@ -73,6 +73,8 @@ ERROR_SITE_IS_DISABLED = ApiError("site_is_disabled", HTTP_503_SERVICE_UNAVAILAB
"The site is currently disabled")
ERROR_SITE_IS_OVERLOADED = ApiError("site_is_overloaded", HTTP_503_SERVICE_UNAVAILABLE,
"Your request failed, as the site is currently experiencing a lot of traffic")
ERROR_FEEDBACK_DISABLED = ApiError("feedback_disabled", HTTP_503_SERVICE_UNAVAILABLE,
"Feedback is currently disabled")
ALL_ERRORS_RANDOM = [
ERROR_BAD_REQUEST(),
......
......@@ -34,12 +34,22 @@ class MailSender:
"""
return self._smtp_host is not None
def send_plain_mail(self, subject: str, message: str, receiver_addrs: list[str], sender_name: str or None = None):
def send_plain_mail(self,
subject: str,
message: str,
receiver_addrs: list[str],
sender_name: str or None = None,
reply_to_addr: str or None = None):
mime_msg = MIMEText(message)
mime_msg["Subject"] = subject
mime_msg["From"] = sender_name
mime_msg["To"] = ", ".join(receiver_addrs)
if sender_name is not None:
mime_msg["From"] = sender_name
if reply_to_addr is not None:
mime_msg["Reply-To"] = reply_to_addr
self.send_formatted_mail(mime_msg, receiver_addrs)
def send_formatted_mail(self, message: email.message.Message, receiver_addrs: list[str] or None = None):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment