tests, reset_password first steps
This commit is contained in:
@@ -5,6 +5,7 @@ from uuid import uuid4
|
||||
from src.logging import daemon_logger
|
||||
from src.logging.logger import message_id_ctx
|
||||
from src.messaging.rabbitmq_client import rabbitmq_client
|
||||
from src.service.email.email_reset import ResetEmailSender
|
||||
from src.service.email.email_welcome import DaemonEmailSender
|
||||
|
||||
|
||||
@@ -55,23 +56,37 @@ class WelcomeEmailConsumer:
|
||||
await self.process_message(message)
|
||||
|
||||
class ResetEmailConsumer:
|
||||
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.channel = None
|
||||
self.queue = None
|
||||
|
||||
|
||||
self.daemon = ResetEmailSender()
|
||||
|
||||
|
||||
async def setup(self) -> None:
|
||||
self.channel = await rabbitmq_client.get_channel()
|
||||
await self.channel.set_qos(prefetch_count=10)
|
||||
self.queue = await self.channel.get_queue("queue_reset_email")
|
||||
|
||||
|
||||
|
||||
async def process_message(self, message) -> None:
|
||||
message_id_ctx.set(str(uuid4()))
|
||||
async with message.process():
|
||||
async with message.process(ignore_processed=True):
|
||||
data = json.loads(message.body)
|
||||
daemon_logger.info(f"Обрабатываю: {data}, метка: {message.routing_key}")
|
||||
try:
|
||||
await self.daemon.send_email(data.get("email"), data.get("temp_password"))
|
||||
except (
|
||||
smtplib.SMTPServerDisconnected,
|
||||
smtplib.SMTPConnectError,
|
||||
TimeoutError,
|
||||
ConnectionRefusedError,
|
||||
) as exc:
|
||||
daemon_logger.exception(f"transient error, retrying: {exc!r}")
|
||||
await message.nack(requeue=True)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
daemon_logger.exception(f"permanent error, sending to DLQ: {exc!r}")
|
||||
await message.nack(requeue=False)
|
||||
|
||||
async def start_consuming(self)->None:
|
||||
|
||||
|
||||
@@ -20,9 +20,9 @@ class EmailProducer:
|
||||
|
||||
await self._publish({"email":email}, routing_key="email.welcome")
|
||||
|
||||
async def send_reset_email(self, email:str)->None:
|
||||
|
||||
await self._publish({"email":email}, routing_key="email.reset")
|
||||
async def send_reset_email(self, email: str, temp_password: str) -> None:
|
||||
|
||||
await self._publish({"email": email, "temp_password": temp_password}, routing_key="email.reset")
|
||||
|
||||
async def _publish(self,data:dict, routing_key:str)->None:
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
import smtplib
|
||||
import ssl
|
||||
from email.message import EmailMessage
|
||||
|
||||
from src.models.configs_read.env import env_settings
|
||||
from src.service.email.jinja_env import jinja_env
|
||||
|
||||
|
||||
class ResetEmailSender:
|
||||
|
||||
async def send_email(self, target_email: str, temp_password: str) -> None:
|
||||
context = ssl.create_default_context()
|
||||
with smtplib.SMTP_SSL(
|
||||
env_settings.SMTP_SERVER, env_settings.EMAIL_PORT, context=context
|
||||
) as server:
|
||||
server.login(env_settings.EMAIL_LOGIN, env_settings.EMAIL_PASSWORD)
|
||||
msg = await self.build_email_message(target_email, temp_password)
|
||||
server.send_message(msg)
|
||||
|
||||
async def build_email_message(self, target_email: str, temp_password: str) -> EmailMessage:
|
||||
template = jinja_env.get_template("reset.html")
|
||||
html_body = template.render(temp_password=temp_password)
|
||||
|
||||
text_body = (
|
||||
"Пароль от вашей учётной записи в «The DisExcel» был сброшен.\n\n"
|
||||
f"Временный пароль: {temp_password}\n\n"
|
||||
"Рекомендуем сменить его на свой сразу после входа в аккаунт. "
|
||||
"Если вы не запрашивали сброс пароля, срочно свяжитесь с поддержкой."
|
||||
)
|
||||
|
||||
msg = EmailMessage()
|
||||
msg["to"] = target_email
|
||||
msg["from"] = env_settings.EMAIL_LOGIN
|
||||
msg["subject"] = "Пароль сброшен"
|
||||
msg.set_content(text_body)
|
||||
msg.add_alternative(html_body, subtype="html")
|
||||
return msg
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<tr>
|
||||
<td style="padding:20px; text-align:center;">
|
||||
<span style="display:block; margin:0 0 4px 0; color:#9ca3af; font-size:12px; text-transform:uppercase; letter-spacing:0.05em;">Новый пароль</span>
|
||||
<span style="display:inline-block; font-family: 'Courier New', monospace; font-size:20px; font-weight:700; color:#111827; letter-spacing:0.05em;">Тест1234!</span>
|
||||
<span style="display:inline-block; font-family: 'Courier New', monospace; font-size:20px; font-weight:700; color:#111827; letter-spacing:0.05em;">{{ temp_password }}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Reference in New Issue
Block a user