Erstellen Sie einen Postfix-Mailserver, starten Sie den durch den Mailempfang ausgelösten Python-Code und senden Sie die Mail an Slack (lokale Umgebungsversion)

Artikelinhalt

Erstellen Sie einen Mailserver mit Postfix und führen Sie jedes Mal, wenn eine Mail empfangen wird, ein eigenes Programm auf der Serverseite aus. Das selbst erstellte Programm verwendet die empfangene Mail als Eingabedaten und führt einige Verarbeitungen durch. Dies kann in jeder Sprache implementiert werden, aber in diesem Artikel werden wir Python verwenden, um das Posten in Slack zu implementieren. Dieses Mal ist der Mailserver so aufgebaut, dass er zumindest in der lokalen Umgebung funktioniert, und E-Mails werden nur in der lokalen Umgebung gesendet und empfangen. Wir nehmen keine detaillierten Einstellungen wie Sicherheit vor.

Umgebung

Hier sind die Schritte für CentOS 8 und Ubuntu 20.04. Installieren Sie BIND9, Postfix und Dovecot von Linux-Paketen. Die Umgebung des Servers, der den Mailserver erstellt, ist wie folgt.

Python-Version von CentOS


$ python3 -V
Python 3.6.8

Python-Version von Ubuntu


$ python3 -V
Python 3.8.2

CentOS ifconfig Ergebnis


ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.79.128  netmask 255.255.255.0  broadcast 192.168.79.255
        inet6 fe80::59ac:7015:10c9:543c  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:93:f6:a7  txqueuelen 1000  (Ethernet)
        RX packets 914  bytes 156651 (152.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 284  bytes 25365 (24.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:be:03:9b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ubuntu ifconfig Ergebnis


docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:cd:65:85:ad  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.79.130  netmask 255.255.255.0  broadcast 192.168.79.255
        inet6 fe80::f8e9:90fd:cfc4:280e  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:cc:76:18  txqueuelen 1000  (Ethernet)
        RX packets 159457  bytes 233626546 (233.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10206  bytes 690515 (690.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Teilnehmeranschluss zurück)
        RX packets 514  bytes 48478 (48.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 514  bytes 48478 (48.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Erstellen Sie einen Postfix-Mailserver

Erstellen Sie einen Postfix-Mailserver, während Sie sich die folgenden beiden Bücher ansehen. Da diese Bücher Konstruktionsverfahren und Erklärungen enthalten, werden in diesem Artikel nur die Verfahren aufgeführt, die zum Erstellen einer lokalen Umgebung erforderlich sind. Beide Bücher verwenden CentOS 5.4, aber dieser Artikel schreibt die Befehle für CentOS 8 und Ubuntu 20.04 neu.



DNS-Einstellungen

Buch "DNS-Serverkonstruktion von BIND9" S.84-S.86

Installieren Sie BIND9 als Root. CentOS verwendet laut Buch chroot. Ubuntu verwendet diesmal kein Chroot.

CentOS


yum install bind bind-chroot

cd /var/named/chroot/etc
mv /etc/named.conf .
ln -s /var/named/chroot/etc/named.conf /etc/

Ubuntu


apt install bind9 bind9utils

Buch "DNS-Serverkonstruktion mit BIND9" S.86, S.96

Bearbeiten Sie als Root-Benutzer /etc/resolv.conf.


editor /etc/resolv.conf

CentOS

/etc/resolv.conf



# Generated by NetworkManager
search localdomain
-nameserver 192.168.79.2
+nameserver 127.0.0.1

Ubuntu

/etc/resolv.conf



-nameserver 127.0.0.53
+nameserver 127.0.0.1
options edns0
search localdomain

Buch "DNS-Serverkonstruktion mit BIND9" S.87

Bearbeiten Sie als Root-Benutzer die Datei named.conf.

CentOS


editor /etc/named.conf

/etc/named.conf



(Weggelassen)

options {
-        listen-on port 53 { 127.0.0.1; };
+        //listen-on port 53 { 127.0.0.1; };
-        listen-on-v6 port 53 { ::1; };
+        //listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
-        allow-query     { localhost; };
+        //allow-query     { localhost; };

(Weggelassen)

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
+
+zone "localdomain" IN {
+        type master;
+        file "localdomain.zone";
+        allow-update { none; };
+};

Ubuntu


editor /etc/bind/named.conf.local

/etc/bind/named.conf.local



//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
+zone "localdomain" IN {
+        type master;
+        file "localdomain.zone";
+        allow-update { none; };
+};

Buch "DNS-Serverkonstruktion mit BIND9" S.89

Überprüfen Sie als Root-Benutzer die Syntax von named.conf.

CentOS


/usr/sbin/named-checkconf /etc/named.conf

Ubuntu


/usr/sbin/named-checkconf /etc/bind/named.conf

Buch "DNS-Serverkonstruktion mit BIND9" S.89

Erstellen Sie als Root-Benutzer eine neue localdomain.zone.

CentOS


editor /var/named/chroot/var/named/localdomain.zone

/var/named/chroot/var/named/localdomain.zone



$TTL 10800
localdomain. 1D IN SOA ns.localdomain. root.localdomain. (
        2020052601    ; serial
        43200         ; refresh
        5400          ; retry
        3600000       ; expiry
        3600 )        ; minimum

localdomain. 1D IN NS ns.localdomain.

localdomain. 1D IN MX 10 mail01.localdomain.

ns.localdomain. 1D IN A 192.168.79.128
mail01.localdomain. 1D IN A 192.168.79.128

Ubuntu


editor /var/cache/bind/localdomain.zone

/var/cache/bind/localdomain.zone



$TTL 10800
localdomain. 1D IN SOA ns.localdomain. root.localdomain. (
        2020052601    ; serial
        43200         ; refresh
        5400          ; retry
        3600000       ; expiry
        3600 )        ; minimum

localdomain. 1D IN NS ns.localdomain.

localdomain. 1D IN MX 10 mail01.localdomain.

ns.localdomain. 1D IN A 192.168.79.130
mail01.localdomain. 1D IN A 192.168.79.130

Buch "DNS-Serverkonstruktion mit BIND9" S.91

Legen Sie als Root-Benutzer die Berechtigungen für die Zonendatei fest.

CentOS


chmod 640 /var/named/chroot/var/named/localdomain.zone
chown root:named /var/named/chroot/var/named/localdomain.zone
ln -s /var/named/chroot/var/named/localdomain.zone /var/named/

Ubuntu


chmod 640 /var/cache/bind/localdomain.zone
chown root:bind /var/cache/bind/localdomain.zone

Buch "DNS-Serverkonstruktion mit BIND9" S.93

Überprüfen Sie als Root-Benutzer die Syntax der Zonendatei.

CentOS


/usr/sbin/named-checkzone localdomain /var/named/chroot/var/named/localdomain.zone

Ubuntu


/usr/sbin/named-checkzone localdomain /var/cache/bind/localdomain.zone

Buch "DNS-Serverkonstruktion mit BIND9" S.94

Starten Sie BIND als Root.

CentOS und Ubuntu gemeinsam


#Wenn Sie den aktuellen Status überprüfen möchten
systemctl status named.service

#Wenn Sie nach dem Anhalten beginnen möchten
systemctl stop named.service
systemctl start named.service

#Wenn Sie beim Start des Betriebssystems automatisch starten möchten
systemctl enable named.service

Buch "DNS-Serverkonstruktion mit BIND9" S.100

Testzonenübertragung als Root-Benutzer.

CentOS


dig @192.168.79.128 localdomain AXFR

CentOS-Ergebnisse


; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el8 <<>> @192.168.79.128 localdomain AXFR
; (1 server found)
;; global options: +cmd
localdomain.		86400	IN	SOA	ns.localdomain. root.localdomain. 2020052601 43200 5400 3600000 3600
localdomain.		86400	IN	NS	ns.localdomain.
localdomain.		86400	IN	MX	10 mail01.localdomain.
mail01.localdomain.	86400	IN	A	192.168.79.128
ns.localdomain.		86400	IN	A	192.168.79.128
localdomain.		86400	IN	SOA	ns.localdomain. root.localdomain. 2020052601 43200 5400 3600000 3600
;; Query time: 1 msec
;; SERVER: 192.168.79.128#53(192.168.79.128)
;; WHEN:Do 04. Juni 15:35:22 JST 2020
;; XFR size: 6 records (messages 1, bytes 217)

Ubuntu


dig @192.168.79.130 localdomain AXFR

Ubuntu Ergebnisse


; <<>> DiG 9.16.1-Ubuntu <<>> @192.168.79.130 localdomain AXFR
; (1 server found)
;; global options: +cmd
localdomain.		86400	IN	SOA	ns.localdomain. root.localdomain. 2020052601 43200 5400 3600000 3600
localdomain.		86400	IN	NS	ns.localdomain.
localdomain.		86400	IN	MX	10 mail01.localdomain.
mail01.localdomain.	86400	IN	A	192.168.79.130
ns.localdomain.		86400	IN	A	192.168.79.130
localdomain.		86400	IN	SOA	ns.localdomain. root.localdomain. 2020052601 43200 5400 3600000 3600
;; Query time: 3 msec
;; SERVER: 192.168.79.130#53(192.168.79.130)
;; WHEN:Do 04. Juni 15:36:11 JST 2020
;; XFR size: 6 records (messages 1, bytes 217)

Postfix-Einstellungen

Buch "Einführung in die Postfix-Praxis" S.89

Beenden Sie als Root-Benutzer, wenn sendmail ausgeführt wird.

CentOS und Ubuntu gemeinsam


ps ax | grep sendmail

Ich habe nichts getan, weil sendmail in diesem Artikel nicht in der Umgebung funktioniert hat.

Buch "Einführung in die Postfix-Praxis" S.104

Installieren Sie Postfix als Root.

CentOS


yum install postfix

Ubuntu


apt install postfix

Buch "Einführung in die Postfix-Praxis" S.105 (nur CentOS)

Wählen Sie als Root-Benutzer Postfix mit dem Befehl alternatives aus.

CentOS


alternatives --config mta

In der Umgebung dieses Artikels war Postfix die einzige Option, daher habe ich nichts unternommen.

Buch "Einführung in die Postfix-Praxis" S.121

Bearbeiten Sie als Root-Benutzer main.cf.

CentOS und Ubuntu gemeinsam


cd /etc/postfix
cp main.cf main.cf.org
editor main.cf

CentOS

/etc/postfix/main.cf



(Weggelassen)

#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
+myhostname = mail01.localdomain

(Weggelassen)

#mydomain = domain.tld
+mydomain = localdomain

(Weggelassen)

-#myorigin = $mydomain
+myorigin = $mydomain

(Weggelassen)

-mydestination = $myhostname, localhost.$mydomain, localhost
-#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
+#mydestination = $myhostname, localhost.$mydomain, localhost
+mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

(Fügen Sie am Ende der Datei Folgendes hinzu)

+# Allowed to run :include: method in /etc/aliases
+alias_maps = hash:/etc/aliases
+alias_database = hash:/etc/aliases
+allow_mail_to_commands = alias,forward,include
+allow_mail_to_files    = alias,forward,include

Ubuntu

/etc/postfix/main.cf



# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2



# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
-#myhostname = sample.localdomain
+myhostname = mail01.localdomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
-mydestination = mail01.localhost.localdomain, $myhostname, sample, localhost.localdomain, localhost
+mydestination = mail01.localhost.localdomain, $myhostname, mail01, localhost.localdomain, localhost localdomain
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
default_transport = error
relay_transport = error
inet_protocols = all
+allow_mail_to_commands = alias,forward,include
+allow_mail_to_files    = alias,forward,include

Buch "Einführung in die Postfix-Praxis" S.130

Starten Sie Postfix als Root.

CentOS und Ubuntu gemeinsam


#Wenn Sie die Einstellungen überprüfen möchten
postfix check

#Wenn Sie den aktuellen Status überprüfen möchten
postfix status

#Wenn Sie nach dem Anhalten beginnen möchten
postfix stop
postfix start

#Wenn Sie neu laden möchten
postfix reload

Buch "Einführung in die Postfix-Praxis" S.134

Stellen Sie als allgemeiner Benutzer über Telnet eine Verbindung zu SMTP her und überprüfen Sie die Funktion von Postfix.

CentOS und Ubuntu gemeinsam


telnet localhost 25

EHLO localdomain

MAIL FROM:<usrname@localdomain>

RCPT TO:<usrname@localdomain>

DATA

This is test1
This is test2
This is test3
.

NOOP

QUIT

Wenn Sie unterwegs den folgenden Fehler erhalten,


RCPT TO:<usrname@localdomain>
451 4.3.0 <usrname@localdomain>: Temporary lookup failure

Gehen Sie als Root-Benutzer wie folgt vor (Buch "Einführung in die Postfix-Praxis", S. 142), kehren Sie zu einem normalen Benutzer zurück und führen Sie ihn erneut über Telnet aus.


postalias /etc/aliases
postfix reload

Das ausgeführte Bildschirmbild sieht wie folgt aus.

CentOS


[usrname@localhost ~]$ telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail01.localdomain ESMTP Postfix
EHLO localdomain
250-mail01.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
MAIL FROM:<usrname@localdomain>
250 2.1.0 Ok
RCPT TO:<usrname@localdomain>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
This is test1
This is test2
This is test3
.
250 2.0.0 Ok: queued as 39B219AF86
NOOP
250 2.0.0 Ok
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

Ubuntu


usrname@localhost:~$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail01.localdomain ESMTP Postfix (Ubuntu)
EHLO localdomain
250-mail01.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
MAIL FROM:<usrname@localdomain>
250 2.1.0 Ok
RCPT TO:<usrname@localdomain>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
This is test1
This is test2
This is test3
.
250 2.0.0 Ok: queued as 49F8B2F816F8
NOOP
250 2.0.0 Ok
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

Buch "Einführung in die Postfix-Praxis" S.141

Legen Sie als Root-Benutzer die Alias-Datei fest. Geben Sie hier zusätzlich zum Verfahren des Buches den Befehl an, der beim Empfang einer E-Mail aktiviert werden soll. In diesem Artikel starten wir jedes Mal, wenn wir eine E-Mail erhalten, "/ home / usrname / email_hook / hook". Sie werden später eine Datei mit diesem Namen erstellen.

CentOS und Ubuntu gemeinsam


editor /etc/aliases

CentOS


(Ende der Datei)

# Person who should get root's mail
#root:          marc
+root:           usrname
+
+# hook
+usrname: usrname, :include:/home/usrname/email_hook/hook

Ubuntu


# See man 5 aliases for format
postmaster:    root

# Person who should get root's mail
root:           usrname
+
+# hook
+usrname: usrname, :include:/home/usrname/email_hook/hook

Buch "Einführung in die Postfix-Praxis" S.142

Aktualisieren Sie als Root-Benutzer aliases.db und laden Sie Postfix neu.

CentOS und Ubuntu gemeinsam


postalias /etc/aliases
postfix reload

Dovecot-Einstellungen

Buch "Einführung in die Postfix-Praxis" S.215

Installieren Sie Dovecot als Root.

CentOS


yum install dovecot

Ubuntu


apt install dovecot-core dovecot-imapd dovecot-pop3d

Buch "Einführung in die Postfix-Praxis" S.222

Bearbeiten Sie als Root-Benutzer die Datei dovecot-openssl.cnf für Ihre Situation.

CentOS


editor /etc/pki/dovecot/dovecot-openssl.cnf

CentOS ist in meinem Fall wie folgt.

/etc/pki/dovecot/dovecot-openssl.cnf



[ req ]
default_bits = 3072
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
# country (2 letter code)
#C=FI
+C=JP

# State or Province Name (full name)
#ST=
+ST=TOKYO

# Locality Name (eg. city)
#L=Helsinki
+L=Chofu

# Organization (eg. company)
#O=Dovecot
+O=Kanedaq Office

# Organizational Unit Name (eg. section)
OU=IMAP server

# Common Name (*.example.com is also possible)
-CN=imap.example.com
+CN=mail01.localdomain

# E-mail contact
[email protected]
+emailAddress=postmaster@localdomain

[ cert_type ]
nsCertType = server

Ubuntu


editor /usr/share/dovecot/dovecot-openssl.cnf

Ubuntu hat den Inhalt diesmal nicht geändert.

/usr/share/dovecot/dovecot-openssl.cnf



#
# SSLeay configuration file for Dovecot.
#

RANDFILE                = /dev/urandom

[ req ]
default_bits            = 2048
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
prompt                  = no
policy                  = policy_anything
req_extensions          = v3_req
x509_extensions         = v3_req

[ req_distinguished_name ]
organizationName = Dovecot mail server
organizationalUnitName = @commonName@
commonName = @commonName@
emailAddress = @emailAddress@

[ v3_req ]
basicConstraints        = CA:FALSE

Buch "Einführung in die Postfix-Praxis" S.223

Erstellen Sie als Root-Benutzer das Zertifikat neu.

CentOS


sh /usr/share/doc/dovecot/mkcert.sh

Ubuntu muss den folgenden Befehl ausführen, aber ich habe ihn diesmal nicht ausgeführt.


sh /usr/share/dovecot/mkcert.sh

Buch "Einführung in die Postfix-Praxis" S.227

Bearbeiten Sie als Root-Benutzer die Datei dovecot.conf.

CentOS und Ubuntu gemeinsam


editor /etc/dovecot/dovecot.conf

CentOS

/etc/dovecot/dovecot.conf



(Weggelassen)

# Protocols we want to be serving.
#protocols = imap pop3 lmtp
+protocols = pop3

(Fügen Sie am Ende der Datei Folgendes hinzu)

+log_path = /var/log/dovecot.log
+disable_plaintext_auth = no    #Erlauben Sie vorerst ein Nur-Text-Passwort (nicht sicher)

Ubuntu

/etc/dovecot/dovecot.conf



(Weggelassen)

# Enable installed protocols
-!include_try /usr/share/dovecot/protocols.d/*.protocol
+!include_try /usr/share/dovecot/protocols.d/pop3d.protocol

(Fügen Sie am Ende der Datei Folgendes hinzu)

+log_path = /var/log/dovecot.log
+disable_plaintext_auth = no    #Erlauben Sie vorerst ein Nur-Text-Passwort (nicht sicher)

Buch "Einführung in die Postfix-Praxis" S.228

Bearbeiten Sie als Root-Benutzer den Postfachspeicherort.

CentOS und Ubuntu gemeinsam


editor /etc/dovecot/conf.d/10-mail.conf

CentOS

/etc/dovecot/conf.d/10-mail.conf



(Weggelassen)

#mail_location = 
+mail_location = mbox:~/mail:INBOX=/var/mail/%u

(Weggelassen)

Ubuntu wurde bereits wie vorgesehen konfiguriert, wie unten gezeigt, daher habe ich es nicht geändert.

/etc/dovecot/conf.d/10-mail.conf



(Weggelassen)

mail_location = mbox:~/mail:INBOX=/var/mail/%u

(Weggelassen)

Buch "Einführung in die Postfix-Praxis" S.229

Starten Sie Dovecot als Root.

CentOS und Ubuntu gemeinsam


#Wenn Sie den aktuellen Status überprüfen möchten
systemctl status dovecot.service

#Wenn Sie nach dem Anhalten beginnen möchten
systemctl stop dovecot.service
systemctl start dovecot.service

#Wenn Sie beim Start des Betriebssystems automatisch starten möchten
systemctl enable dovecot.service

Buch "Einführung in die Postfix-Praxis" S.230

Überprüfen Sie als Root-Benutzer die Dovecot-Starteinstellungen.

CentOS und Ubuntu gemeinsam


systemctl list-unit-files -t service | grep dovecot

Buch "Einführung in die Postfix-Praxis" S.231

Überprüfen Sie als Root-Benutzer den offenen Port.

CentOS und Ubuntu gemeinsam


netstat -ln | grep tcp

CentOS-Ergebnisse


tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 192.168.79.128:53       0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN     
tcp6       0      0 :::5355                 :::*                    LISTEN     
tcp6       0      0 :::110                  :::*                    LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::53                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
tcp6       0      0 ::1:953                 :::*                    LISTEN     
tcp6       0      0 :::995                  :::*                    LISTEN     

Ubuntu Ergebnisse


tcp        0      0 172.17.0.1:53           0.0.0.0:*               LISTEN     
tcp        0      0 192.168.79.130:53       0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN     
tcp6       0      0 fe80::f8e9:90fd:cfc4:53 :::*                    LISTEN     
tcp6       0      0 ::1:53                  :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
tcp6       0      0 ::1:953                 :::*                    LISTEN     
tcp6       0      0 :::995                  :::*                    LISTEN     
tcp6       0      0 :::110                  :::*                    LISTEN     

Buch "Einführung in die Postfix-Praxis" S.232

Überprüfen Sie als allgemeiner Benutzer den Betrieb des POP-Servers mit Telnet. Zuvor benötigte CentOS als Root-Benutzer die folgenden Aktionen:

CentOS


chmod 0600 /var/mail/*
chmod 0600 /var/spool/mail/*

Starten Sie nun Telnet.

CentOS und Ubuntu gemeinsam


telnet localhost 110

USER usrname

PASS secret

LIST

RETR 1

QUIT

Das ausgeführte Bildschirmbild sieht wie folgt aus.

CentOS


[usrname@localhost ~]$ telnet localhost 110
Trying ::1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
USER usrname
+OK
PASS secret
+OK Logged in.
LIST
+OK 1 messages:
1 463
.
RETR 1
+OK 463 octets
Return-Path: <usrname@localdomain>
X-Original-To: usrname@localdomain
Delivered-To: usrname@localdomain
Received: from localdomain (localhost [IPv6:::1])
	by mail01.localdomain (Postfix) with ESMTP id 39B219AF86
	for <usrname@localdomain>; Thu,  4 Jun 2020 17:52:38 +0900 (JST)
Message-Id: <[email protected]>
Date: Thu,  4 Jun 2020 17:52:38 +0900 (JST)
From: usrname@localdomain

This is test1
This is test2
This is test3
.
QUIT
+OK Logging out.
Connection closed by foreign host.

Ubuntu


usrname@localhost:~$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot (Ubuntu) ready.
USER usrname
+OK
PASS secret
+OK Logged in.
LIST
+OK 1 messages:
1 468
.
RETR 1
+OK 468 octets
Return-Path: <usrname@localdomain>
X-Original-To: usrname@localdomain
Delivered-To: usrname@localdomain
Received: from localdomain (localhost [127.0.0.1])
	by mail01.localdomain (Postfix) with ESMTP id 49F8B2F816F8
	for <usrname@localdomain>; Thu,  4 Jun 2020 17:08:33 +0900 (JST)
Message-Id: <[email protected]>
Date: Thu,  4 Jun 2020 17:08:33 +0900 (JST)
From: usrname@localdomain

This is test1
This is test2
This is test3
.
QUIT
+OK Logging out.
Connection closed by foreign host.

Damit ist der Aufbau des Postfix-Mailservers abgeschlossen.

Implementierung von Code, der beim Empfang einer E-Mail aktiviert wird

Nachfolgende Arbeiten werden von allgemeinen Benutzern durchgeführt. Es gibt keinen Unterschied zwischen CentOS und Ubuntu.

Wir werden ein Unterverzeichnis (email_hook) unter dem Home-Verzeichnis (/ home / usrname) erstellen und alle Dateien hier ablegen.


cd
mkdir email_hook
cd email_hook

Nachfolgende Arbeiten werden unter / home / usrname / email_hook ausgeführt.

Erstellen Sie einen neuen Befehl, der gestartet wird, wenn eine E-Mail empfangen wird

Erstellen Sie eine neue Datei mit dem Namens-Hook (unabhängig vom Namen) und schreiben Sie die Befehle dort.


editor hook

Der Inhalt des Befehls leitet die von Postfix über die Pipeline empfangene E-Mail an den Python-Code hook_slack.py weiter (den wir später implementieren werden).


"|LC_CTYPE='C.UTF-8' /usr/bin/python3 /home/usrname/email_hook/hook_slack.py || true"

Erstellen Sie neuen Python-Code, der beim Empfang einer E-Mail gestartet wird

Erstellen Sie eine neue mit dem Dateinamen hook_slack.py (ein beliebiger Name).


editor hook_slack.py

Der Inhalt ist wie unten angegeben. Bitte verzeihen Sie mir, dass sich der Code nicht sehr gut verhält. Stellen Sie sicher, dass Sie die entsprechende URL für die Slack Incoming Webhooks festlegen.

/home/usrname/email_hook/hook_slack.py



import logging
import os
import sys
import time
import datetime
import json
import email.parser
import urllib.request
import urllib.parse
from pathlib import Path


def make_logfile_path(file):
    directory = Path("/home/usrname/email_hook/log")

    #Erstellen, wenn kein Verzeichnis vorhanden ist
    directory.mkdir(parents=True, exist_ok=True)

    #Gibt den vollständigen Namen der Pfadprotokolldatei zurück
    return directory / os.path.basename(os.path.splitext(file)[0] + datetime.datetime.today().strftime("_%Y%m%d_%H%M%S.log"))


def get_logger(name, filepath):
    LOG_LEVEL_FILE = logging.DEBUG
    LOG_LEVEL_CONSOLE = logging.INFO

    _detail_formatting = "\n%(asctime)s %(levelname)-8s [%(module)s#%(funcName)s %(lineno)d]\n%(message)s"

    logging.basicConfig(
        level=LOG_LEVEL_FILE,
        format=_detail_formatting,
        filename=filepath
    )

    #Erstellen Sie eine Handler-Konsole, die Protokolle an die Konsole sendet
    console = logging.StreamHandler()
    console.setLevel(LOG_LEVEL_CONSOLE)
    console_formatter = logging.Formatter(_detail_formatting)
    console.setFormatter(console_formatter)

    #Holen Sie sich einen Logger und fügen Sie einen Konsolenhandler hinzu
    logger = logging.getLogger(name)
    logger.addHandler(console)
    return console, logger


#Logger
console, logger = get_logger(__name__, make_logfile_path(__file__))


def main():
    start = time.time()
    logger.info(f"hook started : {time.strftime('%d %b %X', time.localtime(start))}")

    #Empfangen Sie von Postfix empfangene E-Mails von der Standardeingabe
    mime_str = sys.stdin.read()
    logger.debug(f"mime_str={mime_str}")
    message = email.parser.Parser().parsestr(mime_str)
    logger.debug(f"message={message}")

    ##URL der Slack Incoming Webhooks
    url = "Geheimnis"

    payload = {}
    logger.debug(f'message.get("Subject")={message.get("Subject")}')
    logger.debug(f"message.get_payload()={message.get_payload()}")
    payload["text"] = message.get("Subject") + "\n" + message.get_payload(0).get_payload()
    logger.debug(f"payload={payload}")

    data = json.dumps(payload).encode("utf-8")
    logger.debug(f"data={data}")

    request = urllib.request.Request(url, data)
    urllib.request.urlopen(request)

    stop = time.time()
    delta = stop - start
    logger.info(f"hook started : {time.strftime('%d %b %X', time.localtime(start))}")
    logger.info(f"hook finished : {time.strftime('%d %b %X', time.localtime(stop))}")
    logger.info("hook duration : {:0.3} seconds".format(delta))

if __name__ == "__main__":
    try:
        main()
    except Exception as ee:
        logger.exception(ee)

Wir haben die Daten für den Slack-Post-Test von hook_slack.py.py vorbereitet.


editor hook_test_stdin.txt

/home/usrname/email_hook/hook_test_stdin.txt



From usrname@localdomain  Wed Jun  3 21:41:32 2020
Return-Path: <usrname@localdomain>
X-Original-To: usrname@localdomain
Delivered-To: usrname@localdomain
Received: from localhost.localdomain (localhost [127.0.0.1])
	by mail01.localdomain (Postfix) with ESMTPS id 9630E40D18C9
	for <usrname@localdomain>; Wed,  3 Jun 2020 21:41:32 +0900 (JST)
Content-Type: multipart/mixed; boundary="===============8887878637416477407=="
MIME-Version: 1.0
Subject:Slack Post Test Proband
From: usrname@localdomain
To: usrname@localdomain
Date: Wed, 03 Jun 2020 12:41:32 -0000
Message-Id: <[email protected]>

--===============8887878637416477407==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

Lockerer Körper nach dem Test
--===============8887878637416477407==--

Lassen Sie uns hook_slack.py ausführen und testen, ob es in Slack veröffentlicht ist.


cat hook_test_stdin.txt | LC_CTYPE='C.UTF-8' /usr/bin/python3 ./hook_slack.py || true

Eine Protokolldatei wurde unter dem Unterverzeichnis log ausgegeben und wie folgt an Slack gesendet:

slack1.png

Neuer Python-Code zum Senden von Test-E-Mails

Erstellen Sie eine neue mit dem Dateinamen send_testmail.py (ein beliebiger Name).


editor send_testmail.py

Der Inhalt ist wie unten angegeben.

/home/usrname/email_hook/send_testmail.py



import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
from email.mime.multipart import MIMEMultipart


def create_message(from_addr, to_addr, subject, body):
    #Header
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    #Text
    msg.attach(MIMEText(body))

    return msg


def send_mail(from_addr, to_addr, body_msg):
    smtpobj = smtplib.SMTP("localhost", 25)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.sendmail(from_addr, to_addr, body_msg.as_string())
    smtpobj.close()


MAIL_ADDRESS = "usrname@localdomain"

from_addr = MAIL_ADDRESS
to_addr = MAIL_ADDRESS
subject = "test mail"
body = "We'll send you a test email."

msg = create_message(from_addr, to_addr, subject, body)
send_mail(from_addr, to_addr, msg)

Führen Sie dieses Programm aus, um eine E-Mail zu senden und zu testen, ob der Hook gestartet wird.


python3 ./send_testmail.py

Gepostet in Slack wie folgt:

slack2.png

Liste der Dinge, die ich in Zukunft tun möchte

das ist alles.

Recommended Posts

Erstellen Sie einen Postfix-Mailserver, starten Sie den durch den Mailempfang ausgelösten Python-Code und senden Sie die Mail an Slack (lokale Umgebungsversion)
Python-Umgebungskonstruktion und TensorFlow
Erstellen Sie einen Postfix-Mailserver, starten Sie den durch den Mailempfang ausgelösten Python-Code und senden Sie die Mail an Slack (lokale Umgebungsversion)
Umgebungskonstruktion von Python und OpenCV
Python SQL-Anweisung Nach Zeit extrahieren
Versuchen Sie, eine Python- und Anaconda-Umgebung auf einem Mac zu erstellen (mit pyenv, conda).
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
[Python] So erstellen Sie eine lokale Webserverumgebung mit SimpleHTTPServer und CGIHTTPServer
So erstellen Sie eine Python- und Jupyter-Ausführungsumgebung mit VSCode
Ich möchte eine Python-Umgebung erstellen
Erstellen Sie mit Docker eine CentOS Linux 8-Umgebung und starten Sie Apache HTTP Server
Versuchen Sie, eine Python- und Anaconda-Umgebung auf einem Mac zu erstellen (mit pyenv, conda).
Senden Sie eine Nachricht von Slack an einen Python-Server
Erstellen Sie ein Django-Projekt und eine Django-Anwendung in einer virtuellen Python-Umgebung und starten Sie den Server
Erstellen Sie eine Python-Ausführungsumgebung mit VS-Code
So erstellen Sie eine schöne Python-Umgebung auf einem neuen Mac und installieren Jupter Notebook
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
So erstellen Sie eine Django (Python) -Umgebung auf Docker
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
So erstellen Sie eine Python-Umgebung unter Amazon Linux 2
So erstellen Sie eine virtuelle Ausführungsumgebung für Python mit Visual Studio Code und pipenv auf einem Windows-Computer (auch Jupyter-Notebook)
So starten Sie einen einfachen WEB-Server, der CGI von PHP und Python ausführen kann
[Sakura Rental Server] (Für Anfänger) So erstellen Sie eine Umgebung für Python, Pyenv und Flask. Für csh
So erstellen Sie eine neue virtuelle Python-Umgebung unter Ubuntu
Erstellen einer Entwicklungsumgebung für die Python2.7-Serie mit Vagrant
Erstellen Sie eine Python-Umgebung mit WSL + Pyenv + Jupyter + VSCode
Erstellen Sie unter CentOS 7.7 eine Python-Umgebung für Ihren Heimserver
Post von Python nach Slack
poste an vim → Python → Slack
Post to Slack mit Python 3
Erstellen Sie die Python-Umgebung offline
Post an Slack in Python
Hinweise zum Erstellen einer LAMP-Umgebung mit Vagrant und VirtulBox
Erstellen und testen Sie eine CI-Umgebung für mehrere Versionen von Python
Erstellen Sie eine 64-Bit-Python 2.7-Umgebung mit TDM-GCC und MinGW-w64 unter Windows 7
Erstellen Sie mit dem Serverless Framework eine lokale Entwicklungsumgebung für Lambda + Python
Erstellen Sie mit Anaconda und PyCharm eine Python-Umgebung auf Ihrem Mac
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
So erstellen Sie eine Python-Umgebung mit Virtualenv unter Ubuntu 18.04 LTS
Debuggen eines Python-Programms durch Remoteverbindung mit einem Docker-Container in einer WSL2-Umgebung mit VS-Code
Erstellen Sie eine Entwicklungsumgebung mit Jupyter und Flask mit Python in Docker (unterstützt sowohl VS Code als auch Code-Server).
Erstellen Sie eine Python3-Umgebung unter CentOS7
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Vorgehensweise zum Erstellen einer virtuellen Python-Umgebung mit VS-Code unter Windows
Migration von Python2 zu Python3 (Python2 wird als virtuelle Umgebung neu erstellt und existiert gleichzeitig)
So installieren Sie das Python-Paket in einer lokalen Umgebung als allgemeiner Benutzer
Erstellen Sie schnell eine Python-Umgebung für Deep Learning / Data Science (Windows)
Ich habe versucht, eine Mac Python-Entwicklungsumgebung mit pythonz + direnv zu erstellen
Erstellen Sie Linux in einer Windows-Umgebung. Schritte zum Installieren und Migrieren von Laradock
Erstellen Sie einen leichtgewichtigen Server in Python und hören Sie sich die HTTP-Erweiterungen von Scratch 2 an