ticketfrei3/kibicara/platforms/email/bot.py

64 lines
2.3 KiB
Python
Raw Normal View History

2020-07-05 21:49:32 +00:00
# Copyright (C) 2020 by Maike <maike@systemli.org>
2020-07-15 21:50:24 +00:00
# Copyright (C) 2020 by Cathy Hu <cathy.hu@fau.de>
# Copyright (C) 2020 by Thomas Lindner <tom@dl6tom.de>
# Copyright (C) 2020 by Martin Rey <martin.rey@mailbox.org>
2020-07-05 21:49:32 +00:00
#
# SPDX-License-Identifier: 0BSD
2020-10-13 08:35:20 +00:00
from logging import getLogger
from smtplib import SMTPException
2020-07-16 12:29:57 +00:00
from kibicara import email
from kibicara.config import config
2020-07-15 21:50:24 +00:00
from kibicara.model import Hood
from kibicara.platformapi import Censor, Spawner
2020-09-06 17:11:18 +00:00
from kibicara.platforms.email.model import Email, EmailSubscribers
from kibicara.webapi.admin import to_token
2020-07-07 13:28:51 +00:00
logger = getLogger(__name__)
2020-07-05 21:49:32 +00:00
class EmailBot(Censor):
2020-07-15 21:50:24 +00:00
def __init__(self, hood):
super().__init__(hood)
self.enabled = hood.email_enabled
2020-07-05 21:49:32 +00:00
2020-09-06 17:11:18 +00:00
@classmethod
async def destroy_hood(cls, hood):
"""Removes all its database entries."""
for inbox in await Email.objects.filter(hood=hood).all():
await inbox.delete()
for subscriber in await EmailSubscribers.objects.filter(hood=hood).all():
await subscriber.delete()
2020-07-05 21:49:32 +00:00
async def run(self):
"""Loop which waits for new messages and sends emails to all subscribers."""
2020-07-05 21:49:32 +00:00
while True:
message = await self.receive()
2020-07-15 21:50:24 +00:00
logger.debug(
2020-10-12 20:47:06 +00:00
'Received message from censor ({0}): {1}'.format(
self.hood.name, message.text
)
2020-07-15 21:50:24 +00:00
)
for subscriber in await EmailSubscribers.objects.filter(
hood=self.hood
).all():
token = to_token(email=subscriber.email, hood=self.hood.id)
2020-07-15 21:50:24 +00:00
body = (
'{0}\n\n--\n'
2020-10-13 01:27:23 +00:00
+ 'If you want to stop receiving these mails,'
+ 'follow this link: {1}/hoods/{2}/email-unsubscribe?token={3}'
).format(message.text, config['frontend_url'], self.hood.id, token)
2020-07-07 13:28:51 +00:00
try:
logger.debug('Trying to send: \n{0}'.format(body))
2020-07-16 12:29:57 +00:00
email.send_email(
subscriber.email,
2020-10-13 08:12:35 +00:00
'Kibicara {0}'.format(self.hood.name),
body=body,
2020-07-07 13:28:51 +00:00
)
except (ConnectionRefusedError, SMTPException):
2020-10-13 08:12:35 +00:00
logger.exception('Sending email to subscriber failed.')
2020-07-05 21:49:32 +00:00
2020-07-15 21:50:24 +00:00
spawner = Spawner(Hood, EmailBot)