Führen Sie Postfix in WSL ein, um an Office365 adressierte E-Mails weiterzuleiten und mit Python zu verarbeiten

Einführung

Ich musste nachforschen, also habe ich versucht, die gesendete E-Mail weiterzuleiten, zu verarbeiten und dann an Office365 weiterzuleiten.

WSL → Telnet → Mail senden → Postfix → Mit Python verarbeiten → sendmail → Es ist wie in Office365.

Ich verwende WSL (Ubuntu 18.04 LTS) von Windows 10 als Umgebung, da dies nur eine Bestätigung der Implementierungsmethode ist. E-Mails werden auch innerhalb der WSL (localhost) gesendet, und Postfix-Einstellungen werden für die Funktionsprüfung priorisiert.

Umgebung

Ich habe in einer Umgebung begonnen, in der WSL (Ubuntu 18.04 LTS) unter Windows 10 Pro verwendet werden kann.

Installation von WSL (Windows Subsystem für Linux) und Grundeinstellungen von Ubuntu

Referenzierte Informationen

http://www.postfix.org/FILTER_README.html https://qiita.com/kanedaq/items/aab362e20bdafea83fff

Postfix-Installation und Relay-Einstellungen für WSL (Ubuntu 18.04 LTS)

$ sudo apt install postfix
$ sudo cp /etc/postfix/main.cf.proto /etc/postfix/main.cf
$ sudo vi /etc/postfix/main.cf
#Hostname des Mail-Systems (FQDN)
myhostname = hostname.example.jp
#Mail-System-Domainname
mydomain = example.jp
#Domainname (Domainname), der automatisch zugestellt wird, wenn eine E-Mail zugestellt wird
myorigin = $mydomain
#Netzwerkschnittstelle zum Empfangen von E-Mails (alle)
inet_interfaces = all
#Zulässige Netzwerkreichweite
mynetworks = 127.0.0.0/8

#Postfix sendmail Befehl vollständiger Pfad
sendmail_path = /usr/sbin/sendmail
#Vollständiger Pfad des Postfix-Befehls newaliases
newaliases_path = /usr/bin/newaliases
#Vollständiger Pfad des Postfix mailq-Befehls
mailq_path = /usr/bin/mailq
#Gruppe zum Senden von E-Mails und Verwalten von Warteschlangen
setgid_group = postdrop
#Speicherort des Postfix-HTML-Dokuments
html_directory = no
#Postfix manuelle Position
manpage_directory = /usr/share/man
#Speicherort der Postfix-Beispielkonfigurationsdatei
sample_directory = /etc/postfix
#Speicherort der Postfix README-Datei
readme_directory = /usr/share/doc/postfix

#Fügen Sie von hier aus das Ende der Einstellungsdatei hinzu
#Top-Mailserver des Weiterleitungsziels (diesmal Office365)
relayhost = [smtp.office365.com]:587
# SMTP-Aktivieren Sie AUTH
smtp_sasl_auth_enable = yes
#Eine Datei, die die Adresse des Übertragungszielservers sowie den zu authentifizierenden Benutzernamen und das Kennwort beschreibt.
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
#Erlaube keine anonyme Anmeldung
smtp_sasl_security_options = noanonymous
#Filter für SASL-Mechanismus des Zielservers
smtp_sasl_mechanism_filter = LOGIN
#TLS-Verschlüsselung wenn möglich
smtp_tls_security_level = may
#CA-Zertifikat (ca.-certificates)
smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt
$ sudo vi /etc/postfix/sasl_passwd
[smtp.office365.com]:587 Benutzername (E-Mail-Adresse):Passwort
$ sudo chmod 600 /etc/postfix/sasl_passwd
$ sudo postmap hash:/etc/postfix/sasl_passwd
$ sudo service postfix restart
$ tail -f /var/log/mail.log
$ cat /var/log/mail.err
#Überprüfen Sie den Prozess
$ ps aux|grep rsyslog|grep -v grep
#Überprüfen Sie die Einstellungen
$ sudo /usr/sbin/rsyslogd -n -d
$ cat /etc/rsyslog.d/50-default.conf
#Überprüfen Sie den Status
$ sudo /etc/init.d/rsyslog status
#Starten Sie den Prozess
$ sudo /etc/init.d/rsyslog start

error: open database /etc/aliases.db: No such file or directory

#Beenden Sie Postfix und erstellen Sie die Mail-Alias-Datenbank neu und starten Sie sie
$ sudo service postfix stop
$ sudo newaliases
$ sudo service postfix start
#Bestätigung des Vorhandenseins einer Mail-Alias-Datenbank
$ ls /etc/aliases.db

Bestätigung, um die gesendete E-Mail weiterzuleiten und an Office365 weiterzuleiten

$ telnet hostname.example.jp 25
Trying 127.0.1.1...
Connected to hostname.example.jp.
Escape character is '^]'.
220 hostname.example.jp ESMTP Postfix (Ubuntu)
(Eingang) HELO hostname.example.jp
250 hostname.example.jp
(Eingang) MAIL From:Absender-E-Mail-Adresse
250 2.1.0 Ok
(Eingang) RCPT To:Ziel-E-Mail-Adresse
250 2.1.5 Ok
(Eingang) DATA
354 End data with <CR><LF>.<CR><LF>
(Eingang) This is test mail.
(Eingang) .
250 2.0.0 Ok: queued as EAD291C000000084498
(Eingang) quit
221 2.0.0 Bye
Connection closed by foreign host.
$ tail -f /var/log/mail.log
$ cat /var/log/mail.err

Filtern Sie mit dem Python-Programm mit Postfix content_filter

$ sudo apt install python3
$ sudo apt install python3-pip
$ python3 -V
$ pip3 -V
$ cd ~
$ mkdir postfix
$ cd postfix
$ touch transfer_mail.py
$ chmod 755 transfer_mail.py
#!/usr/bin/python3

import sys
import os
import email
import email.parser
from os.path import join, dirname
from subprocess import Popen, PIPE

#Holen Sie sich von der Standardeingabe
mime_str = sys.stdin.read()
# mime_str = open(sys.argv[4]).read()
#Als E-Mail analysieren
message = email.parser.Parser().parsestr(mime_str)
#Datei, die den Inhalt der E-Mail ausspuckt
filepath = join(dirname(__file__), 'result.txt')
#Atme den Inhalt der E-Mail in eine Datei aus
with open(filepath, mode='w') as f:
    #Parameter
    for arg in sys.argv:
        f.write(f"{arg}\n")
    #Mail-Header
    for key in message.keys():
        value = message.get(key)
        f.write(f"{key} : {value}\n")
    #den Inhalt der E-Mail
    payload = message.get_payload()
    f.write(payload)
#Stellen Sie Quelle, Ziel und Betreff ein
message["From"] = sys.argv[1]
message["To"] = sys.argv[2]
message["Subject"] = "Test mail !!!"
#Post weiterleiten
command = ["/usr/sbin/sendmail", "-t", "-oi"]
stdout = ''
stderr = ''
retval = 0
process = Popen(command, stdin=PIPE)
(stdout, stderr) = process.communicate(message.as_string().encode())
retval = process.wait()
if retval == 0:
    sys.exit(0)
else:
    sys.exit(1)
$ sudo vi /etc/postfix/master.cf
# content_Filter angeben
smtp      inet  n       -       n       -       -       smtpd -o content_filter=filter:dummy

# content_Definieren Sie einen Filter (laufender Benutzer, laufendes Programm, Absender, Empfänger, Größe)
filter    unix  -       n       n       -       10      pipe
  flags=Rq user=Benutzer argv=/home/Nutzer/postfix/transfer_mail.py ${sender} ${recipient} ${size}
$ sudo service postfix restart
$ tail -f /var/log/mail.log
$ cat /var/log/mail.err

Bestätigung, dass die gesendete E-Mail weitergeleitet, mit Python verarbeitet und an Office365 weitergeleitet wird

$ telnet hostname.example.jp 25
Trying 127.0.1.1...
Connected to hostname.example.jp.
Escape character is '^]'.
220 hostname.example.jp ESMTP Postfix (Ubuntu)
(Eingang) HELO hostname.example.jp
250 hostname.example.jp
(Eingang) MAIL From:Absender-E-Mail-Adresse
250 2.1.0 Ok
(Eingang) RCPT To:Ziel-E-Mail-Adresse
250 2.1.5 Ok
(Eingang) DATA
354 End data with <CR><LF>.<CR><LF>
(Eingang) This is test mail.
(Eingang) .
250 2.0.0 Ok: queued as EAD291C000000084498
(Eingang) quit
221 2.0.0 Bye
Connection closed by foreign host.
$ cat ~/postfix/result.txt
/home/Nutzer/postfix/transfer_mail.py ← Programm ausgeführt
Absender-E-Mail-Adresse ← Filterparameter 1
Ziel-E-Mail-Adresse ← Filterparameter 2
Größe ← Filterparameter 3
Return-Path : <Relay-E-Mail-Adresse>
Received : from hostname.example.jp (localhost [127.0.0.1])
	by hostname.example.jp (Postfix) with SMTP id 923AE9E00000003FBF1
	for <Ziel-E-Mail-Adresse>; Fri,  9 Oct 2020 23:55:00 +0900 (JST)
Message-Id : <[email protected]>
Date : Fri, 10 Oct 2020 23:55:00 +0900 (JST)
From :Absender-E-Mail-Adresse
This is test mail.(Text)
$ tail -f /var/log/mail.log
Oct 10 23:55:00 hostname postfix/qmgr[10858]: 923AE9E00000003FBF1: from=<Absender-E-Mail-Adresse>, size=362, nrcpt=1 (queue active)
Oct 10 23:55:00 hostname postfix/pipe[10951]: 923AE9E00000003FBF1: to=<Ziel-E-Mail-Adresse>, relay=filter, delay=591, delays=591/0.01/0/0.08, dsn=2.0.0, status=sent (delivered via filter service)
Oct 10 23:55:00 hostname postfix/qmgr[10858]: 923AE9E00000003FBF1: removed
Oct 10 23:55:00 hostname postfix/pickup[10857]: 2047A9F00000003FBF1: uid=1000 from=<Nutzer>
Oct 10 23:55:00 hostname postfix/cleanup[10955]: 2047A9F00000003FBF1: message-id=<[email protected]>
Oct 10 23:55:00 hostname postfix/qmgr[10858]: 2047A9F00000003FBF1: from=<[email protected]>, size=567, nrcpt=1 (queue active)
Oct 10 23:55:00 hostname postfix/smtp[10957]: warning: vstream_tweak_tcp: getsockopt TCP_MAXSEG: Protocol not available
Oct 10 23:55:00 hostname postfix/smtp[10957]: 2047A9F00000003FBF1: to=<Ziel-E-Mail-Adresse>, relay=smtp.office365.com[XXX.XXX.XXX.XXX]:587, delay=1.6, delays=0.03/0.02/1.1/0.4, dsn=2.0.0, status=sent (250 2.0.0 OK <[email protected]> [Hostname=XXXXXXXXXXXXX.xxxxxxxx.xxxx.outlook.com])
Oct 10 23:55:00 hostname postfix/qmgr[10858]: 2047A9F00000003FBF1: removed

abschließend

Ich bin neugierig auf die Warnung vstream_tweak_tcp im Protokoll, aber ich konnte die gesendete E-Mail weiterleiten, verarbeiten und dann an Office365 weiterleiten. Es scheint, dass es zum Zeitpunkt der Entwicklung für die Zusammenarbeit mit anderen Diensten und Untersuchungen verwendet werden kann.

Recommended Posts

Führen Sie Postfix in WSL ein, um an Office365 adressierte E-Mails weiterzuleiten und mit Python zu verarbeiten
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Verarbeiten Sie die mit Redshift entladene gzip-Datei mit Python of Lambda, gzipen Sie sie erneut und laden Sie sie in S3 hoch
Fraktal zum Erstellen und Spielen mit Python
Lesen Sie die CSV-Datei mit Python und konvertieren Sie sie unverändert in DataFrame
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
So starten Sie das Python-Projekt im Jahr 2020 (Windows WSL und Mac Common)
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
MessagePack-Versuchen Sie, Java und Python mit RPC zu verbinden
[Einführung in den Systemhandel] Ich habe einen Stochastic Oscillator mit Python gezeichnet und damit gespielt ♬
Erstellen Sie mit Streamlit schnell ein Python-Datenanalyse-Dashboard und stellen Sie es in AWS bereit
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Prozedur zum Laden von MNIST mit Python und zur Ausgabe an png
Python Ver. Einführung in WebPay mit ein wenig Code
Ich möchte die Optimierung mit Python und CPlex behandeln
Einführung in Pipe Operator und Funktionszusammensetzung in Python (vorläufig)
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Lesen Sie die json-Datei mit Python, formatieren Sie sie und geben Sie json aus
E-Mail Hipchat mit Postfix, Fluentd und Python auf Azure
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
[Python / Ruby] Mit Code verstehen Wie man Daten aus dem Internet abruft und in CSV schreibt
[Python] Was ist ein Tupel? Erklärt, wie man es benutzt und wie man es benutzt, ohne zu tippen.
Vorsichtsmaßnahmen bei der Eingabe von CSV mit Python und der Ausgabe an json, um exe zu erstellen
Einfache Verwendung der Nifty Cloud API mit Botocore und Python
Versuchen Sie es mit GUI, PyQt in Python
Immerhin ist es falsch, mit Python-Subprozess zu katzen.
Bildschirm und geteilter Bildschirm mit Python- und SSH-Anmeldung am Remote-Server
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Wie man Youtube in MP3 konvertiert und es super sicher herunterlädt [Python]
[Lass uns mit Python spielen] Bildverarbeitung zu Monochrom und Punkten
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Objektorientiert in C-Sprache: "○ ✕ game" wurde überarbeitet und nach Python portiert
Konvertieren Sie Videos mit ffmpeg + python + opencv in Schwarzweiß
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Es ist Halloween, also werde ich versuchen, es mit Python zu verstecken
Installieren Sie CaboCha in der Ubuntu-Umgebung und rufen Sie es mit Python auf.
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Übersicht über die virtuelle Python-Umgebung und deren Erstellung
[Python] Was ist Pip? Erläutern Sie die Befehlsliste und deren Verwendung anhand aktueller Beispiele