mirror of
https://github.com/Laurent2916/mailman3_webhook_archiver.git
synced 2024-11-23 06:38:46 +00:00
✨ add archiver
This commit is contained in:
parent
454d21e89d
commit
d58952246e
102
mailman3_webhook_archiver/__init__.py
Normal file
102
mailman3_webhook_archiver/__init__.py
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
"""Archiver sending notifications to an HTTP webhook."""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from configparser import NoOptionError
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from mailman.config import config
|
||||||
|
from mailman.config.config import external_configuration
|
||||||
|
from mailman.interfaces.archiver import IArchiver
|
||||||
|
from zope.interface import implementer
|
||||||
|
|
||||||
|
logger = logging.getLogger("mailman.archiver.webhook")
|
||||||
|
|
||||||
|
|
||||||
|
@implementer(IArchiver)
|
||||||
|
class WebhookArchiver:
|
||||||
|
"""Archiver sending notifications to an HTTP webhook."""
|
||||||
|
|
||||||
|
name = "mailman3_webhook_archiver"
|
||||||
|
is_enabled = False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def list_url(mlist):
|
||||||
|
"""Return the url to the top of the list's archive.
|
||||||
|
|
||||||
|
The archiver is not web-accessible, return None.
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def permalink(mlist, msg):
|
||||||
|
"""Return the url to the message in the archive.
|
||||||
|
|
||||||
|
The archiver is not web-accessible, return None.
|
||||||
|
"""
|
||||||
|
return
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
"""Initialize the archiver, parse mailman configuration file.
|
||||||
|
|
||||||
|
The configuration file is located at /etc/mailman3/mailman-webhook-archiver.cfg
|
||||||
|
"""
|
||||||
|
# read mailman configuration file
|
||||||
|
archiver_config = external_configuration(config.archiver.mailman3_webhook_archiver.configuration)
|
||||||
|
|
||||||
|
# parse webhook url
|
||||||
|
self.url = archiver_config.get("global", "url")
|
||||||
|
logger.debug(f"webhook url: {self.url}")
|
||||||
|
|
||||||
|
# parse webhook key
|
||||||
|
self.key = archiver_config.get("global", "key")
|
||||||
|
logger.debug(f"webhook key: {self.key}")
|
||||||
|
|
||||||
|
try: # parse webhook spam filter option
|
||||||
|
self.filter_spam = archiver_config.get("global", "filter_spam")
|
||||||
|
logger.debug(f"filter_spam: {self.filter_spam}")
|
||||||
|
except (KeyError, NoOptionError):
|
||||||
|
self.filter_spam = False
|
||||||
|
logger.debug("filter_spam option not found, set to False")
|
||||||
|
|
||||||
|
try: # parse webhook monitored lists
|
||||||
|
lists = archiver_config.get("global", "monitored_lists")
|
||||||
|
self.monitored_lists = [lst.strip() for lst in lists.split(",")]
|
||||||
|
logger.debug(f"monitored_lists: {self.monitored_lists}")
|
||||||
|
except (KeyError, NoOptionError):
|
||||||
|
self.monitored_lists = None
|
||||||
|
logger.debug("monitored_lists option not found, set to None")
|
||||||
|
|
||||||
|
def archive_message(self, mlist, msg) -> None:
|
||||||
|
"""Get message from mailman and notify webhook."""
|
||||||
|
# check if message is from monitored list
|
||||||
|
if self.monitored_lists and mlist.list_name not in self.monitored_lists:
|
||||||
|
logger.debug(f"{mlist.list_name} list is not monitored lists")
|
||||||
|
return
|
||||||
|
|
||||||
|
# retreive email subject
|
||||||
|
subject = msg["subject"] if "subject" in msg else "No subject"
|
||||||
|
logger.debug(f"subject: {subject}")
|
||||||
|
|
||||||
|
# check if message is spam
|
||||||
|
if self.filter_spam and str(subject).startswith("[SPAM"):
|
||||||
|
logger.debug("message is spam")
|
||||||
|
return
|
||||||
|
|
||||||
|
# build HTTP request body
|
||||||
|
data = {
|
||||||
|
"body": f"You got mail !<br/>{msg['from']}: {subject}",
|
||||||
|
"key": self.key,
|
||||||
|
}
|
||||||
|
|
||||||
|
# send request to webhook
|
||||||
|
response = requests.post(
|
||||||
|
url=self.url,
|
||||||
|
timeout=5,
|
||||||
|
json=data,
|
||||||
|
)
|
||||||
|
|
||||||
|
# check response
|
||||||
|
if response.status_code != 200:
|
||||||
|
logger.error(f"Error while sending message: {response.text}")
|
||||||
|
else:
|
||||||
|
logger.debug("Message sent to webhook !")
|
Loading…
Reference in a new issue