Construisez un serveur de messagerie Postfix, démarrez le code Python déclenché par la réception du courrier et envoyez le courrier à Slack (édition de l'environnement local)

Contenu de l'article

Construisez un serveur de messagerie avec Postfix et exécutez votre propre programme côté serveur à chaque fois qu'un courrier est reçu. Le programme auto-conçu utilise le courrier reçu comme données d'entrée et effectue certains traitements. Cela peut être implémenté dans n'importe quel langage, mais dans cet article, nous utiliserons Python pour implémenter la publication sur Slack. Cette fois, le serveur de messagerie est conçu de manière à fonctionner au moins dans l'environnement local, et les e-mails sont envoyés et reçus uniquement dans l'environnement local. Nous ne faisons pas de paramètres détaillés tels que la sécurité.

environnement

Voici les étapes pour CentOS 8 et Ubuntu 20.04. Installez BIND9, Postfix et Dovecot à partir de packages Linux. L'environnement du serveur qui construit le serveur de messagerie est le suivant.

--Nom de domaine: localdomain

Version Python de CentOS


$ python3 -V
Python 3.6.8

Version Python d'Ubuntu


$ python3 -V
Python 3.8.2

Résultat CentOS ifconfig


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

Résultat Ubuntu ifconfig


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  (Boucle locale)
        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

Construire un serveur de messagerie Postfix

Créez un serveur de messagerie Postfix en consultant les deux livres suivants. Étant donné que ces manuels contiennent des procédures de construction et des explications, cet article présente uniquement les procédures requises pour créer un environnement local. Les deux livres utilisent CentOS 5.4, mais cet article réécrit les commandes pour CentOS 8 et Ubuntu 20.04.



Paramètres DNS

Livre "Construction du serveur DNS par BIND9" p.84-p.86

Installez BIND9 en tant qu'utilisateur root. CentOS utilise chroot selon le livre. Ubuntu n'utilise pas de chroot cette fois.

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

Livre "Construction du serveur DNS avec BIND9" p.86, p.96

En tant qu'utilisateur root, modifiez /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

Livre "Construction du serveur DNS avec BIND9" p.87

En tant qu'utilisateur root, modifiez named.conf.

CentOS


editor /etc/named.conf

/etc/named.conf



(Omis)

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; };

(Omis)

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; };
+};

Livre "Construction du serveur DNS avec BIND9" p.89

En tant qu'utilisateur root, vérifiez la syntaxe de named.conf.

CentOS


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

Ubuntu


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

Livre "Construction du serveur DNS avec BIND9" p.89

En tant qu'utilisateur root, créez un nouveau 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

Livre "Construction du serveur DNS avec BIND9" p.91

En tant qu'utilisateur root, définissez les autorisations du fichier de zone.

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

Livre "Construction du serveur DNS avec BIND9" p.93

En tant qu'utilisateur root, vérifiez la syntaxe du fichier de zone.

CentOS


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

Ubuntu


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

Livre "Construction du serveur DNS avec BIND9" p.94

Démarrez BIND en tant qu'utilisateur root.

Commun à CentOS et Ubuntu


#Lorsque vous souhaitez vérifier l'état actuel
systemctl status named.service

#Quand vous voulez commencer après vous être arrêté
systemctl stop named.service
systemctl start named.service

#Lorsque vous souhaitez démarrer automatiquement au démarrage du système d'exploitation
systemctl enable named.service

Livre "Construction du serveur DNS avec BIND9" p.100

Tester le transfert de zone en tant qu'utilisateur root.

CentOS


dig @192.168.79.128 localdomain AXFR

Résultats CentOS


; <<>> 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:Jeu 04 juin 15:35:22 JST 2020
;; XFR size: 6 records (messages 1, bytes 217)

Ubuntu


dig @192.168.79.130 localdomain AXFR

Résultats Ubuntu


; <<>> 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:Jeu 04 juin 15:36:11 JST 2020
;; XFR size: 6 records (messages 1, bytes 217)

Paramètres de Postfix

Livre "Introduction à la pratique de Postfix" p.89

En tant qu'utilisateur root, arrêtez si sendmail est en cours d'exécution.

Commun à CentOS et Ubuntu


ps ax | grep sendmail

Je n'ai rien fait car sendmail ne fonctionnait pas dans l'environnement de cet article.

Livre "Introduction à la pratique de Postfix" p.104

Installez Postfix en tant qu'utilisateur root.

CentOS


yum install postfix

Ubuntu


apt install postfix

Livre "Introduction à la pratique de Postfix" p.105 (CentOS uniquement)

En tant qu'utilisateur root, sélectionnez Postfix avec la commande alternatives.

CentOS


alternatives --config mta

Dans l'environnement de cet article, Postfix était la seule option, donc je n'ai rien fait.

Livre "Introduction à la pratique de Postfix" p.121

En tant qu'utilisateur root, modifiez main.cf.

Commun à CentOS et Ubuntu


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

CentOS

/etc/postfix/main.cf



(Omis)

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

(Omis)

#mydomain = domain.tld
+mydomain = localdomain

(Omis)

-#myorigin = $mydomain
+myorigin = $mydomain

(Omis)

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

(Ajoutez ce qui suit à la fin du fichier)

+# 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

Livre "Introduction à la pratique de Postfix" p.130

Démarrez Postfix en tant qu'utilisateur root.

Commun à CentOS et Ubuntu


#Lorsque vous souhaitez vérifier les paramètres
postfix check

#Lorsque vous souhaitez vérifier l'état actuel
postfix status

#Quand vous voulez commencer après vous être arrêté
postfix stop
postfix start

#Quand tu veux recharger
postfix reload

Livre "Introduction à la pratique de Postfix" p.134

En tant qu'utilisateur général, connectez-vous à SMTP avec telnet et vérifiez le fonctionnement de Postfix.

Commun à CentOS et Ubuntu


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

Si vous obtenez l'erreur suivante sur le chemin,


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

En tant qu'utilisateur root, exécutez ce qui suit (livre "Introduction à la pratique de Postfix" p.142), revenez à un utilisateur général et réexécutez depuis telnet.


postalias /etc/aliases
postfix reload

L'image de l'écran lorsqu'elle est exécutée est la suivante.

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.

Livre "Introduction à la pratique de Postfix" p.141

En tant qu'utilisateur root, définissez le fichier d'alias. En plus de la procédure du livre, spécifiez ici la commande à activer lors de la réception d'un email. Dans cet article, nous allons lancer "/ home / usrname / email_hook / hook" chaque fois que nous recevrons un e-mail. Vous allez créer un fichier nommé ce hook plus tard.

Commun à CentOS et Ubuntu


editor /etc/aliases

CentOS


(Fin de fichier)

# 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

Livre "Introduction à la pratique de Postfix" p.142

En tant qu'utilisateur root, mettez à jour aliases.db et rechargez Postfix.

Commun à CentOS et Ubuntu


postalias /etc/aliases
postfix reload

Paramètres Dovecot

Livre "Introduction à la pratique de Postfix" p.215

Installez Dovecot en tant qu'utilisateur root.

CentOS


yum install dovecot

Ubuntu


apt install dovecot-core dovecot-imapd dovecot-pop3d

Livre "Introduction à la pratique de Postfix" p.222

En tant qu'utilisateur root, modifiez dovecot-openssl.cnf pour votre situation.

CentOS


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

CentOS est comme suit dans mon cas.

/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 n'a pas changé le contenu cette fois.

/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

Livre "Introduction à la pratique de Postfix" p.223

En tant qu'utilisateur root, recréez le certificat.

CentOS


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

Ubuntu a la commande suivante à exécuter, mais je ne l'ai pas exécutée cette fois.


sh /usr/share/dovecot/mkcert.sh

Livre "Introduction à la pratique de Postfix" p.227

En tant qu'utilisateur root, modifiez dovecot.conf.

Commun à CentOS et Ubuntu


editor /etc/dovecot/dovecot.conf

CentOS

/etc/dovecot/dovecot.conf



(Omis)

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

(Ajoutez ce qui suit à la fin du fichier)

+log_path = /var/log/dovecot.log
+disable_plaintext_auth = no    #Autoriser le mot de passe en texte brut pour le moment (non sécurisé)

Ubuntu

/etc/dovecot/dovecot.conf



(Omis)

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

(Ajoutez ce qui suit à la fin du fichier)

+log_path = /var/log/dovecot.log
+disable_plaintext_auth = no    #Autoriser le mot de passe en texte brut pour le moment (non sécurisé)

Livre "Introduction à la pratique de Postfix" p.228

En tant qu'utilisateur root, modifiez l'emplacement de la boîte aux lettres.

Commun à CentOS et Ubuntu


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

CentOS

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



(Omis)

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

(Omis)

Ubuntu était déjà configuré comme prévu, comme indiqué ci-dessous, donc je ne l'ai pas changé.

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



(Omis)

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

(Omis)

Livre "Introduction à la pratique de Postfix" p.229

Démarrez Dovecot en tant qu'utilisateur root.

Commun à CentOS et Ubuntu


#Lorsque vous souhaitez vérifier l'état actuel
systemctl status dovecot.service

#Quand vous voulez commencer après vous être arrêté
systemctl stop dovecot.service
systemctl start dovecot.service

#Lorsque vous souhaitez démarrer automatiquement au démarrage du système d'exploitation
systemctl enable dovecot.service

Livre "Introduction à la pratique de Postfix" p.230

En tant qu'utilisateur root, vérifiez les paramètres de lancement de Dovecot.

Commun à CentOS et Ubuntu


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

Livre "Introduction à la pratique de Postfix" p.231

En tant qu'utilisateur root, vérifiez le port ouvert.

Commun à CentOS et Ubuntu


netstat -ln | grep tcp

Résultats CentOS


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     

Résultats Ubuntu


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     

Livre "Introduction à la pratique de Postfix" p.232

En tant qu'utilisateur général, vérifiez le fonctionnement du serveur POP avec telnet. Avant cela, CentOS nécessitait les actions suivantes en tant qu'utilisateur root:

CentOS


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

Maintenant, démarrez telnet.

Commun à CentOS et Ubuntu


telnet localhost 110

USER usrname

PASS secret

LIST

RETR 1

QUIT

L'image de l'écran lorsqu'elle est exécutée est la suivante.

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.

Ceci termine la construction du serveur de messagerie Postfix.

Implémentation du code qui est activé lors de la réception d'un email

Les travaux ultérieurs seront effectués par des utilisateurs généraux. Il n'y a aucune différence de travail entre CentOS et Ubuntu.

Nous allons créer un sous-répertoire (email_hook) sous le répertoire personnel (/ home / usrname) et placer tous les fichiers ici.


cd
mkdir email_hook
cd email_hook

Le travail ultérieur est effectué sous / home / usrname / email_hook.

Créer une nouvelle commande qui est lancée lorsqu'un e-mail est reçu

Créez un nouveau fichier avec le nom hook (quel que soit le nom) et écrivez-y les commandes.


editor hook

Le contenu de la commande passe le mail reçu par Postfix via le pipeline au code Python hook_slack.py (que nous implémenterons plus tard).


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

Créer un nouveau code Python qui est lancé lorsqu'un e-mail est reçu

Créez-en un nouveau avec le nom de fichier hook_slack.py (le nom de votre choix).


editor hook_slack.py

Le contenu est comme indiqué ci-dessous. Veuillez me pardonner que le code ne se comporte pas très bien. Assurez-vous de définir l'URL appropriée pour les Webhooks entrants Slack.

/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")

    #Créer s'il n'y a pas de répertoire
    directory.mkdir(parents=True, exist_ok=True)

    #Renvoie le nom du fichier journal du chemin complet
    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
    )

    #Créer une console de gestionnaire qui envoie des journaux à la console
    console = logging.StreamHandler()
    console.setLevel(LOG_LEVEL_CONSOLE)
    console_formatter = logging.Formatter(_detail_formatting)
    console.setFormatter(console_formatter)

    #Obtenez un enregistreur et ajoutez un gestionnaire de console
    logger = logging.getLogger(name)
    logger.addHandler(console)
    return console, logger


#Enregistreur
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))}")

    #Recevoir le courrier reçu par Postfix à partir d'une entrée standard
    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 des webhooks entrants Slack
    url = "secret"

    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)

Nous avons préparé les données pour le post-test Slack de hook_slack.py.py.


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:Sujet du post-test Slack
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

Corps de post-test mou
--===============8887878637416477407==--

Exécutons hook_slack.py et testons s'il est publié sur Slack.


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

Un fichier journal a été généré dans le sous-répertoire log et publié dans Slack comme suit:

slack1.png

Nouveau code Python pour envoyer un e-mail de test

Créez-en un nouveau avec le nom de fichier send_testmail.py (le nom de votre choix).


editor send_testmail.py

Le contenu est comme indiqué ci-dessous.

/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):
    #entête
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    #Texte
    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)

Exécutez ce programme pour envoyer un e-mail et tester si le hook se lance.


python3 ./send_testmail.py

Publié dans Slack comme suit:

slack2.png

Liste des choses que je veux faire à l'avenir

--Push mail en utilisant IMAP IDLE

c'est tout.

Recommended Posts

Construisez un serveur de messagerie Postfix, démarrez le code Python déclenché par la réception du courrier et envoyez le courrier à Slack (édition de l'environnement local)
Construction d'environnement Python et TensorFlow
Construisez un serveur de messagerie Postfix, démarrez le code Python déclenché par la réception du courrier et envoyez le courrier à Slack (édition de l'environnement local)
Construction d'environnement de python et opencv
instruction SQL python Extraire par heure
Essayez de créer un environnement python et anaconda sur Mac (avec pyenv, conda)
Créer un environnement Python et transférer des données vers le serveur
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Comment créer un environnement d'exécution Python et Jupyter avec VSCode
Je veux créer un environnement Python
Créez un environnement CentOS Linux 8 avec Docker et démarrez Apache HTTP Server
Essayez de créer un environnement python et anaconda sur Mac (avec pyenv, conda)
Envoyer un message de Slack à un serveur Python
Créer un projet et une application Django dans un environnement virtuel Python et démarrer le serveur
Créer un environnement d'exécution python avec VS Code
Comment créer un bel environnement Python sur un nouveau Mac et installer Jupter Notebook
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Comment créer un environnement Django (python) sur Docker
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Comment créer un environnement Python sur Amazon Linux 2
Comment créer un environnement d'exécution virtuelle pour Python à l'aide de Visual Studio Code et de pipenv sur une machine Windows (également le notebook Jupyter)
Comment démarrer un serveur WEB simple qui peut exécuter des cgi de php et python
[Sakura Rental Server] (Pour les débutants) Comment créer un environnement pour Python, pyenv et Flask. | Pour csh
Comment créer un nouvel environnement virtuel Python sur Ubuntu
Comment créer un environnement de développement de la série Python2.7 avec Vagrant
Créer un environnement Python avec WSL + Pyenv + Jupyter + VSCode
Créez un environnement python sur CentOS 7.7 pour votre serveur domestique
Publier de Python vers Slack
publier sur vim → Python → Slack
Publiez sur Slack avec Python 3
Créer un environnement Python hors ligne
Publier sur Slack en Python
Remarques sur la création d'un environnement LAMP à l'aide de Vagrant et VirtulBox
Créer et tester un environnement CI pour plusieurs versions de Python
Créez un environnement Python 2.7 64 bits avec TDM-GCC et MinGW-w64 sous Windows 7
Créer un environnement de développement local pour Lambda + Python à l'aide de Serverless Framework
Créez un environnement Python sur votre Mac avec Anaconda et PyCharm
Essayez de créer un environnement python avec Visual Studio Code et WSL
Comment créer un environnement Python à l'aide de Virtualenv sur Ubuntu 18.04 LTS
Comment déboguer un programme Python en se connectant à distance à un conteneur Docker dans un environnement WSL2 avec VS Code
Créer un environnement de développement à l'aide de Jupyter et Flask avec Python dans Docker (prend en charge à la fois VS Code / code-server)
Créer un environnement python3 sur CentOS7
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
J'étais accro à la création d'un environnement Python venv avec VS Code
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
Migration de Python2 vers Python3 (Python2 est reconstruit comme un environnement virtuel et coexiste)
Comment installer le package python dans un environnement local en tant qu'utilisateur général
Créez rapidement un environnement python pour le Deep Learning / Data Science (Windows)
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
Construisez Linux sur un environnement Windows. Étapes pour installer Laradock et migrer
Construisez un serveur léger en Python et écoutez les extensions HTTP de Scratch 2