[PYTHON] Mailman remet tout le courrier envoyé à partir d'un serveur de messagerie spécifique

Aperçu

Lorsque vous gérez une liste de diffusion avec Mailman, vous souhaiterez peut-être accepter et remettre tout le courrier envoyé depuis votre organisation. Par exemple, si vous utilisez Mailman comme point de contact pour votre organisation. Dans cet article, nous allons étendre le module de jugement du modérateur de Mailman pour expliquer comment accepter et livrer tous les messages postés à partir d'un serveur de messagerie spécifique.

Contexte

Pour recevoir des e-mails de participants non-listes de diffusion lors de l'exécution d'une liste de diffusion avec Mailman, soit (1) définissez l'option generic_nonmember_action sur «Approuver», soit (2) définissez l'option accept_these_nonmembers sur une expression régulière appropriée. Il existe des options telles que. Cependant, le premier (1) accepte tous les e-mails, et le second (2) s'appuie également sur l'en-tête facilement usurpé From, ce qui le rend vulnérable au spam.

Dans cet article,

  1. Le serveur de messagerie sortant utilisé par les membres de votre organisation est fixe.
  2. Tout serveur de messagerie sur la route du serveur de messagerie sortant vers Mailman peut être approuvé.

Sur la base de l'hypothèse que, sur la base du contenu de l'en-tête Received, nous allons introduire le paramètre pour livrer tout le courrier publié à partir du serveur de messagerie d'envoi.

Exemple de réglage

Placez le code comme le suivant comme / usr / lib / mailman / Mailman / Handlers / TrustedServerModerate.py. Veuillez lire le chemin / usr / lib / mailman / comme il convient en fonction de votre environnement.

TrustedServerModerate.py


# Copyright (C) 2015 by TSUCHIYA Masatoshi <[email protected]>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.

"""This module implements server based moderation.  If a user used one
of trusted remote servers to send his/her message, and only if it has
been delivered through trusted local servers, it is approved as a
trusted message.  Otherwise, it will be handled by the default rule of
Mailman.

USAGE:

Add following codes to mm_cfg.py:

TRUSTEDLOCALSERVER = [ "127.0.0.1",
                       "^192\.168\.10\." ]

TRUSTEDREMOTESERVER = [ "192.168.10.1" ]

GLOBAL_PIPELINE[GLOBAL_PIPELINE.index('Moderate')] = 'TrustedServerModerate'

"""

import re
from Mailman import mm_cfg
from Mailman.Handlers.Moderate import process as moderate_process
from Mailman.Logging.Syslog import syslog

def process(mlist, msg, msgdata):
    def extract_ipaddr(str):
        m = re.search('\[(\d+\.\d+\.\d+\.\d+)\]', str)
        if m:
            return m.group(1)
        m = re.search('\[((?:[a-fA-F0-9]{4}:+)+[a-fA-F0-9]{4})\]', str)
        if m:
            return m.group(1)
        if '[IPv6:::1]'in str:
            return '127.0.0.1'
        else:
            return ''

    def matches_p(ipaddr, patterns):
        for pat in patterns:
            if pat.startswith('^'):
                if re.match(pat, ipaddr):
                    return 1
            else:
                if pat==ipaddr:
                    return 1
        return 0

    def trusted_message_p(message):
        received=[extract_ipaddr(x) for x in message.get_all('Received') if re.match("^from", x)]
        syslog('error', 'Servers which deliver this message are %s', ' / '.join(received))
        received.reverse()
        try:
            while received and matches_p(received[-1], mm_cfg.TRUSTEDLOCALSERVER):
                received.pop()
            remote=0
            while received and matches_p(received[-1], mm_cfg.TRUSTEDREMOTESERVER):
                received.pop()
                remote+=1
            if remote > 0:
                if len(received) <= 1:
                    syslog('error', 'This message is trusted')
                    return 1
                else:
                    return 0
            else:
                return 0
        except AttributeError:
            return 0

    if mlist.generic_nonmember_action == 1 and trusted_message_p(msg):
        return
    return moderate_process(mlist, msg, msgdata)

Ensuite, écrivez les trois spécifications suivantes dans / etc / mailman / mm_cfg.py. Tout d'abord, spécifiez l'adresse IP du serveur de messagerie sortant utilisé par les membres comme suit.

TRUSTEDREMOTESERVER = [ "192.168.10.1",
                        "192.168.10.2" ]

En outre, dans les paramètres de cet article, la remise ou non du courrier est déterminée en fonction des informations via du serveur de messagerie d'envoi spécifiées ici. Par conséquent, le serveur de courrier sortant doit accepter uniquement les messages authentifiés par des méthodes telles que SMTP AUTH.

Deuxièmement, spécifiez l'adresse IP d'un serveur de messagerie connu et approuvé du serveur de messagerie sortant pour atteindre Mailman comme suit:

TRUSTEDLOCALSERVER = [ "127.0.0.1",
                       "192.168.10.3",
                       "192.168.10.4",
                       "192.168.10.5" ]

Notez qu'un serveur de messagerie connu et approuvé doit inclure l'adresse IP du serveur sur lequel Mailman s'exécute.

S'il y a un ^ au début de la chaîne de caractères, il sera interprété comme une expression régulière, donc la spécification ci-dessus est équivalente à la spécification suivante.

TRUSTEDREMOTESERVER = [ "^192\.168\.10\.[12]$" ]
TRUSTEDLOCALSERVER  = [ "127.0.0.1", "^192\.168\.10\.[345]$" ]

Troisièmement, spécifiez d'utiliser le module ci-dessus au lieu du Mailman / Handlers / Moderate.py fourni avec Mailman lui-même.

GLOBAL_PIPELINE[GLOBAL_PIPELINE.index('Moderate')] = 'TrustedServerModerate'

Commentaire

Dans l'exemple de configuration ci-dessus, le courrier envoyé par l'itinéraire suivant sera accepté et livré.

MUA
 ↓
Serveur de courrier sortant(192.168.10.1 ou 2)
 ↓
Serveur de messagerie relais(192.168.10.3 ou 4)
 ↓
Serveur Mailman(192.168.10.5)

En revanche, dans le cas de l'itinéraire suivant, il ne sera pas remis car l'authentification de l'utilisateur par le serveur de messagerie expéditeur n'a pas été effectuée.

MUA
 ↓
Serveur de messagerie inconnu
 ↓
Serveur de courrier sortant(192.168.10.1 ou 2)
 ↓
Serveur de messagerie relais(192.168.10.3 ou 4)
 ↓
Serveur Mailman(192.168.10.5)

De plus, dans le cas de l'itinéraire suivant, il ne sera pas livré car il est possible que l'en-tête Received soit falsifié.

MUA
 ↓
Serveur de courrier sortant(192.168.10.1 ou 2)
 ↓
Serveur de messagerie inconnu
 ↓
Serveur de messagerie relais(192.168.10.3 ou 4)
 ↓
Serveur Mailman(192.168.10.5)

Autrement dit, le serveur de messagerie d'envoi, le serveur de messagerie relais et le serveur Mailman sont sous le contrôle de la propre organisation, et les informations d'itinéraire sont extraites en supposant que l'en-tête Received ajouté par le serveur de messagerie est fiable et que le serveur de messagerie d'envoi est utilisé. Il est configuré pour ne livrer que des e-mails authentifiés par l'utilisateur.

Recommended Posts

Mailman remet tout le courrier envoyé à partir d'un serveur de messagerie spécifique
Mailman délivre tous les e-mails signés DKIM publiés à partir d'un domaine particulier
Configurer un serveur de messagerie avec Twisted
Envoyer un message de Slack à un serveur Python
Créer un compte à partir de la création d'un serveur de messagerie CentOS