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é.
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
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.
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
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
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; };
+};
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
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
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
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
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
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)
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.
Installez Postfix en tant qu'utilisateur root.
CentOS
yum install postfix
Ubuntu
apt install postfix
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.
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
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
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.
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
En tant qu'utilisateur root, mettez à jour aliases.db et rechargez Postfix.
Commun à CentOS et Ubuntu
postalias /etc/aliases
postfix reload
Installez Dovecot en tant qu'utilisateur root.
CentOS
yum install dovecot
Ubuntu
apt install dovecot-core dovecot-imapd dovecot-pop3d
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
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
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é)
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)
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
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
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
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.
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é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é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:
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:
--Push mail en utilisant IMAP IDLE
c'est tout.
Recommended Posts