64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
# Copyright (C) 2020 by Maike <maike@systemli.org>
|
|
# 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>
|
|
#
|
|
# SPDX-License-Identifier: 0BSD
|
|
|
|
from logging import getLogger
|
|
from smtplib import SMTPException
|
|
|
|
from kibicara import email
|
|
from kibicara.config import config
|
|
from kibicara.model import Hood
|
|
from kibicara.platformapi import Censor, Spawner
|
|
from kibicara.platforms.email.model import Email, EmailSubscribers
|
|
from kibicara.webapi.admin import to_token
|
|
|
|
logger = getLogger(__name__)
|
|
|
|
|
|
class EmailBot(Censor):
|
|
def __init__(self, hood):
|
|
super().__init__(hood)
|
|
self.enabled = hood.email_enabled
|
|
|
|
@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()
|
|
|
|
async def run(self):
|
|
"""Loop which waits for new messages and sends emails to all subscribers."""
|
|
while True:
|
|
message = await self.receive()
|
|
logger.debug(
|
|
'Received message from censor ({0}): {1}'.format(
|
|
self.hood.name, message.text
|
|
)
|
|
)
|
|
for subscriber in await EmailSubscribers.objects.filter(
|
|
hood=self.hood
|
|
).all():
|
|
token = to_token(email=subscriber.email, hood=self.hood.id)
|
|
body = (
|
|
'{0}\n\n--\n'
|
|
+ '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)
|
|
try:
|
|
logger.debug('Trying to send: \n{0}'.format(body))
|
|
email.send_email(
|
|
subscriber.email,
|
|
'Kibicara {0}'.format(self.hood.name),
|
|
body=body,
|
|
)
|
|
except (ConnectionRefusedError, SMTPException):
|
|
logger.exception('Sending email to subscriber failed.')
|
|
|
|
|
|
spawner = Spawner(Hood, EmailBot)
|