[PYTHON] Mailman liefert alle E-Mails, die von einem bestimmten Mailserver gesendet wurden

Überblick

Wenn Sie eine Mailingliste mit Mailman betreiben, möchten Sie möglicherweise alle aus Ihrer Organisation gesendeten E-Mails akzeptieren und zustellen. Zum Beispiel, wenn Sie Mailman als Kontaktstelle für Ihre Organisation verwenden. In diesem Artikel werden wir das Modul zur Beurteilung von Moderatoren von Mailman erweitern, um zu erklären, wie alle von einem bestimmten Mailserver gesendeten E-Mails akzeptiert und zugestellt werden.

Hintergrund

Um E-Mails von Teilnehmern zu erhalten, die keine Mailinglisten sind, wenn Sie eine Mailingliste mit Mailman ausführen, setzen Sie entweder (1) die Option generic_nonmember_action auf "Approve" oder (2) die Option accept_these_nonmembers auf einen geeigneten regulären Ausdruck. Es gibt Optionen wie. Ersteres (1) akzeptiert jedoch alle E-Mails, und letzteres (2) stützt sich auch auf den leicht zu fälschenden Header From, wodurch er für Spam anfällig wird.

In diesem Artikel,

  1. Der von den Mitgliedern Ihrer Organisation verwendete Postausgangsserver ist behoben.
  2. Jeder Mailserver auf der Route vom Postausgangsserver zu Mailman kann als vertrauenswürdig eingestuft werden.

Basierend auf der Annahme, dass wir basierend auf dem Inhalt des Headers "Received" die Einstellung einführen, um alle vom sendenden Mailserver gesendeten E-Mails zuzustellen.

Einstellungsbeispiel

Geben Sie den folgenden Code als "/ usr / lib / mailman / Mailman / Handlers / TrustedServerModerate.py" ein. Bitte lesen Sie den Pfad / usr / lib / mailman / entsprechend Ihrer Umgebung.

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)

Schreiben Sie dann die folgenden drei Spezifikationen in / etc / mailman / mm_cfg.py. Geben Sie zunächst die IP-Adresse des Postausgangsservers an, der von den Mitgliedern wie folgt verwendet wird.

TRUSTEDREMOTESERVER = [ "192.168.10.1",
                        "192.168.10.2" ]

Darüber hinaus wird in den Einstellungen dieses Artikels anhand der hier angegebenen Via-Informationen des sendenden Mailservers festgelegt, ob E-Mails zugestellt werden sollen oder nicht. Daher muss der Postausgangsserver nur die E-Mails akzeptieren, die durch die Methode wie SMTP AUTH authentifiziert wurden.

Geben Sie zweitens die IP-Adresse eines bekannten und vertrauenswürdigen Mailservers vom Postausgangsserver an, um Mailman wie folgt zu erreichen:

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

Beachten Sie, dass ein bekannter und vertrauenswürdiger Mailserver die IP-Adresse des Servers enthalten muss, auf dem Mailman ausgeführt wird.

Wenn am Anfang der Zeichenfolge ein ^ steht, wird dies als regulärer Ausdruck interpretiert, sodass die obige Spezifikation der folgenden Spezifikation entspricht.

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

Drittens geben Sie an, dass Sie das obige Modul anstelle von "Mailman / Handlers / Moderate.py" verwenden möchten, das mit Mailman selbst geliefert wird.

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

Kommentar

Im obigen Einstellungsbeispiel werden E-Mails, die auf der folgenden Route gesendet wurden, akzeptiert und zugestellt.

MUA
 ↓
Postausgangsserver(192.168.10.1 oder 2)
 ↓
Relay Mail Server(192.168.10.3 oder 4)
 ↓
Mailman-Server(192.168.10.5)

Im Fall der folgenden Route wird sie jedoch nicht zugestellt, da die Benutzerauthentifizierung durch den sendenden Mailserver nicht durchgeführt wurde.

MUA
 ↓
Unbekannter Mailserver
 ↓
Postausgangsserver(192.168.10.1 oder 2)
 ↓
Relay Mail Server(192.168.10.3 oder 4)
 ↓
Mailman-Server(192.168.10.5)

Im Fall der folgenden Route wird sie auch nicht geliefert, da die Möglichkeit besteht, dass der empfangene Header gefälscht ist.

MUA
 ↓
Postausgangsserver(192.168.10.1 oder 2)
 ↓
Unbekannter Mailserver
 ↓
Relay Mail Server(192.168.10.3 oder 4)
 ↓
Mailman-Server(192.168.10.5)

Das heißt, der sendende Mailserver, der Relay-Mailserver und der Mailman-Server stehen unter der Kontrolle der eigenen Organisation, und die Routeninformationen werden unter der Annahme extrahiert, dass der vom Mailserver hinzugefügte empfangene Header zuverlässig ist und der sendende Mailserver verwendet wird. Es ist so eingestellt, dass nur vom Benutzer authentifizierte E-Mails zugestellt werden.

Recommended Posts

Mailman liefert alle E-Mails, die von einem bestimmten Mailserver gesendet wurden
Mailman liefert alle von DKIM signierten E-Mails, die von einer bestimmten Domain gesendet wurden
Richten Sie mit Twisted einen Mailserver ein
Senden Sie eine Nachricht von Slack an einen Python-Server
Erstellen Sie ein Konto aus dem Aufbau eines CentOS-Mailservers