Postfix'i arhitektuuri kirjeldus ja kasutamise keerulisemad võimalused

Allikas: Imre kasutab arvutit
Redaktsioon seisuga 31. mai 2025, kell 17:44 kasutajalt Imre (arutelu | kaastöö) (Uus lehekülg: '===Postfixi arhitektuur=== Abstraktsel tasemel võiks Postfixi tööd iseloomustada sellise skeemiga SISEND VÄLJUND postimasinast saadetud kiri võrgust saabunud kiri --------> järjekorrahaldur --------> smtp, relay, lmtp kohapeal tekitatud edasisuunamine queue manager local, virtual, pipe...')
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)
Mine navigeerimisribaleMine otsikasti

Postfixi arhitektuur

Abstraktsel tasemel võiks Postfixi tööd iseloomustada sellise skeemiga

                     SISEND                                                      VÄLJUND
 
       postimasinast saadetud kiri                                          
             võrgust saabunud kiri   -------->  järjekorrahaldur -------->  smtp, relay, lmtp
 kohapeal tekitatud edasisuunamine                queue manager             local, virtual, pipe
        kohapeal moodustatud teade

kus on üldiselt kujutatud, et Postfixi sisendisse saabuvate kirjadega asub tegelema järjekorrahaldur ning seejärel väljub kiri ühel kuuest näidatud viisil.

Vasakul on loetletud neli erinevat võimalust, kuidas kiri võib jõuda Postfixi töötlemisele

Postimasinast endast saadetud kiri

Nt postimasin seest kasutaja enda poolt saadetud /usr/sbin/sendmail käsuga

 $ echo "kirja sisu" | sendmail -s subjekt mart@loomaaed.tartu.ee

Kirja

  • võrgust saabunud kiri - kõnealune Postfix kuulab arvuti võrguseadme port 25/tcp peal ning üle võrgu pöördub nt teine Postfix
  • kohapeal tekitatud edasisuunamine - nt aliaste lahendamisel
  • kohapeal moodustatud teade - Postfix genereerib oma töö käigus teated, nt nn bounce kirju kui kiri võeti küll töötlemisele nt võrgust, aga kirja töötlemisel selgus, et kirja ei õnnestu edasi saata

Postfix seadistamine

Postfix tööd juhivad kaks peamist seadistusfaili

  • master.conf
  • main.conf

master.conf faili sisu on vaikimisi selline


Keerulisemal juhul nt sisaldab sellist osa

# cat /etc/postfix/master.cf

...
25       inet  n -       -       -       1 postscreen
  -o syslog_name=postfix/postscreen

smtpd       pass  - -       -       -       100      smtpd
  -o content_filter=scan:127.0.0.1:10024
  -o receive_override_options=no_address_mappings
  -o smtpd_discard_ehlo_keywords=silent-discard,dsn
  -o mynetworks=127.0.0.0/8,10.0.0.44

scan      unix  -       -       n       -       31      lmtp
  -o lmtp_send_xforward_command=yes
  -o lmtp_connection_cache_on_demand=no
  -o disable_dns_lookups=yes

26       inet  n -       -       -       100      smtpd
  -o smtpd_tls_dh1024_param_file=${config_directory}/dh1024.pem
  -o content_filter=scan:127.0.0.1:10023
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=inet:192.168.1.252:12345
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
...

kus

  • interneti otsal ('inet') istub port 25 ('smtp') peal postscreen protsess
# find /usr/ -name postscreen
/usr/lib/postfix/sbin/postscreen
  • postfix postscreen manual õpetab, et
  • postscreen annab kirja edasi postfix 'smptd' nimelisele sektsioonile mis on 'pass' tüüpi ja andmed saadetakse programmi smtpd sisendisse
/usr/lib/postfix/sbin/smtpd
  • smtpd programm rakendab -o suvanditega kirjeldatud kontrollid ning pöördub 'scan' nimelisi 'unix' tüüpi sektsiooni poole, täpsustades pöördumist '127.0.0.1:10024' mida kasutab lmtp programm edasi pöördumisel
/usr/lib/postfix/sbin/lmtp
  • lmtp programm pöördub arvutis töötava postfix välise komponendi poole aadressile 127.0.0.1:10024
  • arvutis töötav 127.0.0.1:10024 komponent töötleb sisendi ja tõenäoliselt pöördub tagasi postfix poole pordile 26 vms
  • sarnaselt võib kiri tiirutada veel omajagu postfixi sisemiste komponentide vahel + postfixi väliste juures käies vahepeal

Eposti kirja ja kirja edastamise protokollid

Huvitav asjaolu on, et eposti kirja formaat ja eposti kirjade vahetamine on kirjeldatud erinevates RFC (Request for Comments) tekstides, vastavalt

Kui postiprogrammiga, nt Icedove koostada kiri ja see saata, siis iseenesest saadab klient postimasinale nt sellise teksti

 Message-ID: <4A90629C.6050100@loomaaed.tartu.ee>
 Date: Sun, 23 Aug 2009 00:26:52 +0300
 From: Priit Kask <priit@loomaaed.tartu.ee>
 User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090706)
 MIME-Version: 1.0
 To: Mart Kask <mart@loomaaed.tartu.ee>
 Subject: testkiri
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
 
 Tere!
 
 Ja siit tuleb üks test kiri.
 
 
 Priit

kus

  • read kuni esimese tühja reani moodustavad kirja päised (headers)
  • ülejäänud read moodustavad kirja keha (body)

Kui aga kirja kätte saanud kasutaja vaatab kogu kirja, siis paistab talle kiri selline

 ...

kus kirja algusse seda kirja töötlenud postimasinad lisanud juurde kirjeid

  • Received - iga postimasin lisab reeglina ühe sellise rea (see on üks rida kuna protokolli kohaselt rida jätkub kui järgmine rida algab tühikuga (ingl. k. whitespace))
  • Return-Path - kohaliku kättetoimetamise (ingl. k. local delivery) teinud postimasin lisab nn ümbriku from aadressi

Kõik juurde lisatud andmed on lisatud SMTP protokolli rääkimise alusel, st need kõik väljendavad kirja teekonna erinevatel etappidel kasutatud ümbriku aadresse.

Aadressiklassid

Aadressiklasside (ingl. k. address classes) http://www.postfix.org/ADDRESS_CLASS_README.html abil otsustab Postfix milliseid kirju vastu võtta ja kuidas neid edasi toimetada. Addressklass on määratletud kolme tunnuse alusel

  • klassiga seotud domeenide nimekiri (ingl. k. list of domains that are a member of the class) - nt kõik local_domains, kõik relay_domains
  • vaikimisi edasitoimetamise transport (ingl. k. default delivery transport) - nt local, virtual või relay
  • kirjasaajate nimekiri (ingl. k. list of valid recipient addresses)

Vaikimisi on 2009 aastal Postfixis kasutusel sellised aadressklassid

  • local domain class - canonical domains
  • virtual alias domain class - hosted domains
  • virtual mailbox domain class - hosted domains
  • relay domain class - relay domains
  • default domain class

Mail forwarding domains

Mail forwarding töötab praktiliselt nii nagu nö tavaline alises, kuid

  • sissetulevaid kirju saab käsitleda arvestades @domeeninime ja selle alusel neid eristada (erinevalt tavalisest aliasest, mis võtab vastu kõik mydestination domeenide posti)
  • kirju saab edasi saata suvalisele eposti aadressile, mis esitatakse tavalisel kasutaja@domeeninimi kujul (erinevalt tavalisest aliasest, mille abil saab teha ainult local delivery mydestination domeeninimedele)

Seadistusfailis /etc/postfix/main.cf sobib kasutada selliseid ridu

 # cat mail.cf:
 ...
 virtual_alias_domains = zoopark.tartu.ee loomaaed.tartu.ee
 virtual_alias_maps = hash:/etc/postfix/virtual_alias_map

Failis /etc/postfix/virtual_alias_map sobib kasutada selliseid ridu

 # cat virtual_alias_map
 root@zoopart.tartu.ee zoopark-postmaster@gmail.com
 root@loomaaed.tartu.ee loomaaed-postmaster@gmail.com
 ...

Kasutamiseks tuleb teisendada antud juhul (hash:/) tekstifail Berkeley andmebaasiks öeldes

# postmap /etc/postfix/virtual_alias_map

Tulemusena tekib fail /etc/postfix/virtual_alias_map.db

# file /etc/postfix/virtual_alias_map.db 
/etc/postfix/virtual_alias_map.db: Berkeley DB (Hash, version 9, native byte-order)

Sellise faili sisu saab esitada öeldes

# postmap -s /etc/postfix/virtual_alias_map

Kasulikud lisamaterjalid

Postisüsteemi testimine

TODO

Jõudlus

TODo

Spam

Aadressil http://spamassassin.apache.org/gtube/ on nö standard spammi, mille nt Spamassassin peaks avastama

 XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Katsetamiseks tuleks see järgnevus sisestada kirja eraldi reane reavahetusega lõpus.

Viirus

Aadressil http://www.eicar.org/anti_virus_test_file.htm on nö standardne viirus, mille nt ClamAV peaks avastama

 X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Katsetamiseks tuleks see salvestada tekstifaili reavahetusega lõpus ning lisada kirjale.

Logi ja debugimine

Kui mingil põhjusel on tarvis uurida mõnda parasjagu sabas olevat kirja, siis sobib selleks programm postcat. Tavaliselt saab logist või mailq programmi väljundist teada kirja identifikaatori ning selle abil õnnesub sabast kirjale vastav fail üles leida.

 # mailq
 ....
 C558C4DC80      794 Sat Dec 20 10:18:55  bounce@loomaaed.tartu.ee
           (connect to smtp-gw.loomaaed.tartu.ee[10.0.2.5]: Connection refused)
                                        mart@loomaaed.tartu.ee
 ..
 # find /var/spool/postfix -name C558C4DC80 -ls
 313873    4 -rw-------   1 postfix  postfix       257 Dec 21 23:14 /var/spool/postfix/defer/C/C558C4DC80
 318592    4 -rwx------   1 postfix  postfix      1001 Dec 22 00:20 /var/spool/postfix/deferred/C/C558C4DC80
  • järjekorras oleva kirja sisu esitamine nö inimloetaval kujul
# postcat -q C558C4DC80

Kui on vajadus sabas olev kiri kustutada, siis ei tohiks seda teha niisama failisüsteemist vastavate failide kustutamise teel vaid tuleb kasutada nt programmi postsuper, öeldes

 # postsuper -d C558C4DC80

Piirangute rakendamine töödeldavale epostile

Postfix võimaldab üksikasjaliselt kontrollida, millist eposti süsteem töötlema hakkab, st võtab vastu ning saadab edasi või edasisaatmise asemel teeb local delivery. Käesolevas punktis käsitletavad piirangud on nn before-queue piirangud, st need rakendatakse enne kirja sabasse (ingl. k. queue) võtmist.

Selleks, et paremini mõista Postfix poolt pakutavate piirangute seadistamise võimalusi, kordame üle milline järgnevust sooritatakse vastavalt SMTP protokollile kui postimasina poole pöördub SMTP klient; rea lõpus on märgitud millist Postfixi piirangute nimekirja on mingi andmevahetuse etapi juures võimalik rakendada.

 smtp-client ---> smtp-klient.auul ühendub Postfix serveri 25/tcp pordile   <--- smtpd_client_restrictions
 smtp-server ---> 220 smtp-server.auul ESMTP Postfix (Debian/GNU)        
 smtp-klient ---> EHLO post-klient.auul                                     <--- smtpd_helo_restrictions
 smtp-server ---> 250-smtp-server.auul
                  250-PIPELINING
                  250-SIZE 10240000
                  250-VRFY
                  250-ETRN
                  250-STARTTLS
                  250-ENHANCEDSTATUSCODES
                  250-8BITMIME
                  250 DSN
 smtp-klient ---> MAIL FROM:<priit@loomaaed.tartu.ee> SIZE=325              <--- smtpd_sender_restrictions
                  RCPT TO:<mart@bmail.com> ORCPT=rfc822;mart@bmail.com      <--- smtpd_recipient_restrictions
                  DATA
 smtp-server ---> 250 2.1.0 Ok
                  250 2.1.5.Ok
                  354 End data with <CR><LF>.<CR><LF>
 smtp-klient ---> saadab kirja osa
                  ...

Piirangute nimekiri võib olla mõnel juhul tühi ja mõnel juhul peab kindlasti sisaldama vähemalt kindlaksmääratud piiranguid. Piirangute kontroll toimub selliselt

  • piirangute nimekirjast rakendatakse esimene klappinud piirang, järgmisi selle nimekirja piiranguid ei kontrollita
  • rakendatakse esimene tulemusega (REJECT, DEFER või PERMIT) lõppenud piirangute nimekiri

Kontrolli tulemus rakendatakse peale RCPT TO andmete saamist.

Nt võiks kasutada sellist piirangute nimekirja, selline on nimekiri vaikimisi Debiani Lenny puhul ja väljund on esitatud järjestatuna rakendamise järjekorras

 # postconf | grep smtpd_ | egrep "(_client_|_helo_|_sender_|_recipient_)" | egrep "restrictions "
 smtpd_client_restrictions = 
 smtpd_helo_restrictions = 
 smtpd_sender_restrictions = 
 smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

Siinjuures tuleb tähele panna asjaolu, et igas reeglite nimekirjas on lubatud kasutada ainult teatud kontrolle, kusjuures igas järgmises on lubatud kasutada eelmiste nimekirjade kontrolle. Antud juhul ongi smtpd_recipient_restrictions juures kasutatud permit_mynetworks'i, mis on iseenesest smtpd_client_restrictions nimekirja kontroll, vt http://www.postfix.org/postconf.5.html

Esitatud näites esimesena kehtestatav ning ainuke piirangute nimekiri on smtpd_recipients_restrictions ja mis sisaldab kahte kontrolli

  • permit_mynetworks - lubada saata posti nendest alamvõrkudest, milles asub postimasin
  • reject_unauth_destination - keeldutaks töötlemast posti mida ei ole postimasin seadistatud kas vahendama või millele tegema local deliverit

Mõned allikad soovitavad kõik piirangud seadistada ühe smtpd_recipient_restrictions parameetri abil kuna nii on ehk tagatud parem ülevaatlikkus.

Kasutamine

Aliase olemasolu kontrollimiseks sobib öelda

 # postmap -q mart@loomaaed.tartu.ee pgsql:/etc/postfix/pgsql-local.cf

Kirjade sabast ära saatmiseks

 # postqueue -f

Väljuva kirja ümbriku mail from aadressi muutmine

Süsteemist väljuva posti ümbriku muutmiseks tuleb kasutada mail.cf failis rida

 smtp_generic_maps = hash:/etc/postfix/generic

ning /etc/postfix/generic ise sisaldab näiteks selliseid ridu

 www-data@arvuti.sisedomeen   www-bounce@valisdomeen.ee
 root@arvuti.sisedomee       www-bounce@valisdomeen.ee

Muudatuste kehtestamiseks tuleb generic'ikile vastav andmebaas moodustada käsuga

 # postmap /etc/postfix/generic

ning laadida reload'iga Postfix.

Käskuga postconf estitatakse parasjagu kehtetatud Posfixi seadistused

 # postconf

ning lisades võtme -n esitatakse main.cf failis ilmutatult kasutatud parameetrite väärtused

 # postconf -n

Konkreetse parameetri väärtust saab küsida nii, nt

 # postconf mail_version
 mail_version = 2.5.5

Kirjade töötlemine välise programmiga

Ühel või teisel põhjusel võib olla vaja sellist asjakorraldus, et kas postisüsteemi kõiki või vaid teatud tunnustele vastavaid kirju saaks töödelda välise programmiga. Ja selliselt, et väline programm saab andmeid oma stdio'sse ning järele mõned argumendid. Üheks võimaluseks seda korraldada on kostümiseeritud transporti kirjeldamise abil.

  • /etc/postfix/main.cf faili tuleb lisada rida
 transport_maps = hash:/etc/postfix/transport
  • /etc/postfix/transport failis peab sisalduma nt rida
 loomaaed.tartu.ee pf

ning tuleb öelda

 # postmap /etc/postfix/transport
  • /etc/postfix/master.cf failis peab sisaldub sektsioon
 pf    unix  -       n       n       -       -       pipe   
 flags=RDX user=programmikasutaja argv=/bin/pf.pl ${user} ${domain}

ning kui /bin/pf.pl sisaldab nt

 #!/usr/bin/perl
 open (fh, ">>/tmp/pf.log");
 
 print fh "$ARGV[0]\n";
 print fh "$ARGV[1]\n\n\n";
 
 @read=<STDIN>;
 
 foreach $rida (@read) {
   print fh $rida;
 }

Siis selle faili algusse kirjutatakse epostiaadressi @ märgist vasemale ja paremale jääv osa erinevatele ridadele ning kirja sisu kusjuures lisatakse päisele mõned read vastavalt sellele, mida lipud flags järel ütlevad.

SPF - Sender Policy Framework

SPF (Sender Policy Framework - ingl. k. epost saatja kontrollimise raamistik) http://www.openspf.org/Project_Overview võimaldab saavutada sellised eesmärke

  • kaitsta eposti vastuvõtjat ümbriku from aadressi võltsijate eest (eeldusel, et võltsitava domeeninime omanikud on oma domeenidele kirjeldanud spf kirjed või spf sisuga txt kirjed)
  • kaitsta domeeninime omanikku ümbriku from aadressi võltsijate tegevuse eest, tulemusena ei saa võltsijad saata kontrollimatult adressaatidele võltsitud eposti

SPF tööpõhimõtte kirjeldus

 # apt-get instal spfqtool

Eposti vastuvõtja ettevalmistamine

Postfix sisaldab 'Postfix SMTP access policy delegation' http://www.postfix.org/SMTPD_POLICY_README.html süsteemi, mille abil saab ühendada MTA välise lahendusega, antud juhul SPF'iga, selleks, et teostada täiendavat kontrolli, milliste omadustega kirju saab läbi kõnealuse postisüsteemi saata.

Üheks SPF kasutamise võimaluseks on sama MTA sees pidada Postfixi master deemoni poolt käivitatavat Perli skripti, mida jagatakse postfix-policyd-spf-perl paketina, paigaldamiseks tuleb öelda

 # apt-get install postfix-policyd-spf-perl

Nimesüsteemi ettevalmistamine

TODO

Milter

TODO

Postfix delivery tegemine LDAP kataloogi alusel

Valmistada LDAP kliendi seadistused ette /etc/ldap/ldap.conf failis ja Postfixi jaoks põhimõtteliselt midagi sellist

 # cat /etc/postfix/ldap.cf
 server_host = ldaps://ldap.loomaaed.tartu.ee
 version = 3
 
 search_base = dc=loomaaed,dc=tartu,dc=ee
 query_filter = mail=%s
 result_attribute = sn

kontrolliks sobib küsida

 # postmap -q mart@loomaaed.tartu.ee ldap:/etc/postfix/ldap.cf 
 Kask

Aliases andmebaas

Postfix kasutab aliases andmebaasina Berkeley formaadis faili, mida hallatakse programmiga postalias.

  • andmebaasi genereerimiseks peab olema ettevalmistatud nt sellise seisuga tekstifail
# cat /etc/aliases
priit: priit@loomaaed.tartu.ee

ja sobib ütelda

# postalias /etc/aliases

mille tulemusena moodustatakse fail /etc/aliases.db

  • andmebaasist sissekande pärimiseks sobib ütelda
# postalias -q priit /etc/aliases
priit@loomaaed.tartu.ee
  • kogu andmebaasi sisu esitamiseks sobib öelda
# postalias -s /etc/aliases
  • andmebaasist sissekande kustutamiseks sobib öelda
# postalias -d priit /etc/aliases
  • andmebaasi sissekande lisamiseks sobib öelda
# echo "mart: mart@loomaaed.tartu.ee" | postalias -i /etc/aliases

Aliases andmebaasi ei tehta tavaliselt muudatusi mitte otse vaid esmalt muudetakse vastavat tekstifaili /etc/aliases ning seejärel genereeritakse kogu andmebaas uuesti mis asub failis /etc/aliases.db.

Subject logimine

Selleks, et mail.log faili logitakse lisaks ka läbi käivate kirjade Subject read, sobib tekitada fail sisuga

/etc/postfix/header_checks
/^subject:/ WARN

ning /etc/postfix/main.cf failis kasutada rida

header_checks = regexp:/etc/postfix/header_checks

Kasulikud lisamaterjalid

SendEmail programmi kasutamine

Paigaldamiseks tuleb öelda, kaks viimast on vajalikud tls toe jaoks

# apt-get install sendemail libio-socket-ssl-perl libnet-ssleay-perl

Kirja välja saatmiseks sobib öelda

$ /usr/bin/sendemail -f imre@auul.pri.ee -t imre@auul.pri.ee -u subject -m sisu -s mx1.auul:587 \
  -xu imre@auul.pri.ee -xp parool -o tls=yes
Dec 31 02:23:38 moraal sendemail[19048]: Email was sent successfully!

Kui Postfix ei kasuta korrektse TLS sertifikaati, siis võib olla tarvis seda õpetada, nt paigutada

/usr/lib/ssl/cert.pem

Kui Debian v. 7 Wheezy keskkonnas öeldakse tls=yes puhul

invalid SSL_version specified at /usr/share/perl5/IO/Socket/SSL.pm line 33

siis tuleb teha muudatus

# diff SSL.pm-orig /usr/share/perl5/IO/Socket/SSL.pm 
1490c1490,1492
<           m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i 
---
>           m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i

headeri saatmiseks

-o message-header="From: <imre@auul.pri.ee>"

Kasutajate kirjade debugimine

Vahel võib olla abiks saada võimalikult ehedalt kätte kasutaja kirjavahetus, nt sobib selleks kasutada

# cat /etc/postfix/main.cf
..
sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps.txt

ja

# cat /etc/postfix/sender_bcc_maps.txt
imre.oolberg@moraal.ee imre@localhost

Tulemusena, kui süsteemi siseneb kiri 'mail from' = imre.oolberg@moraal.ee, siis läbib ta süsteemi tavalisel viisil kusjuures koopia temast läheb aadressile imre@localhost. Tõenäoliselt maandub ta lokaalses arvutis faili /var/mail/imre. Sarnaselt toimib recipient_bcc_maps. always_bcc abil saab kogu postimasinat läbiva kirjavahtuse nö kõrvale toimetada

always_bcc = imre@localhost

Kasulikud lisamaterjalid

Ümriku from aadressi asendamine

Olgu ülesanne asendada postimasinat läbi minevate kirjade ümbriku 'mail from' aadress kõigil kirjadel väärtusele forwarder@moraal.ee. Selleks sobib kasutada

# cat /etc/postfix/main.cf
canonical_maps = regexp:/etc/postfix/canonical
canonical_classes = envelope_sender

ning

// forwarder@moraal.ee

Kasulikud lisamaterjalid

Märkused

  • Postimasinas käsurealt kirja saatmiseks sobib öelda nt
$ echo -e "From: priit@loomaaed.tartu.ee\nTo: priit.kask@gmail.com\nSubject: test 17\n\nkirja sisu 17\n" |\
  /usr/sbin/sendmail -f priit@loomaaed.tartu.ee priit.kask@gmail.com

/var/spool/postfix alla sobiva sh sobivate omanike-gruppide-loabittidega kataloogistruktuuri moodustamiseks sobib öelda

# mkdir /var/spool/postfix
# /etc/init.d/postfix check
  • Telnetiga kirja saatmine
imre@haldus:~$ telnet smtp.imool.ee 25
Trying 10.184.32.85...
Connected to smtp.imool.ee.
Escape character is '^]'.
220 smtp1a.aso.ee ESMTP Postfix (Debian/GNU)
helo haldus.imool.ee
250 smtp1a.imool.ee
mail from: imre@haldus.imool.ee
250 2.1.0 Ok
rcpt to: imre.oolberg@imool.ee
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test sisu

.
250 2.0.0 Ok: queued as AA588B0625
quit
221 2.0.0 Bye
Connection closed by foreign host.

Kõigi postimasinasse jõudnud kirjade edasisaatmine välisele catchall aadressile

Tundub, et virtual_maps parameeter on vananenud ja selle asemel soovitatakse kasutada virtual_domain_maps ja virtual_aliases_maps parameetrit, kuid siis ta töötab. /etc/postfix/main.cf failis sobib kasutada rida

# cat /etc/postfix/main.cf
...
virtual_maps = regexp:/etc/postfix/virtual-regexp

ning /etc/postfix/virtual-regexp sisaldab nt sellist rida, regexp map failile ei ole vaja postmap öelda

# cat /etc/postfix/virtual-regexp
/.+@.+/ priit@loomaaed.tartu.ee

Tulemusena, saates suvalisi kirju läbi selle postimasina, saadetakse nad kõik ühele priit@loomaaed.tartu.ee aadressile.

Postscreen

2nd MX

2nd MX ülesanne on võtta kirju vastu ajal, kui primaarne (1nd MX) ei paku teenust. Tavaliselt vaikimisi proovib 2nd MX aegajalt (nt 20 min järel) ja 5 päeva jooksul saata kirju primaarsele edasi. 2nd MX vastutus on, et ta ei võtaks igasugust sodi internetist vastu ja püüaks seda võimalusel 1nd MX peale edasi saata. St parem kui 2nd MX peal töötab vähemalt greylisting, dnsbl ja viirtustõrje. 2nd MX seadistamiseks peab tegema kaks muudatust

  • nimesüsteemis näitama madalama prioriteediga teise MX aadressi, nt
# dig imool.org mx | grep ^imool
imool.org.                 1682    IN      MX      10 mx-1.imool.org.
imool.org.                 1682    IN      MX      20 mx-2.imool.org.
  • seadistama 2nd MX Postfixi tegelema kõnealuse domeeni imool.org kirjadega; 1nd MX Postfix juures ei ole vaja teha mingeid muudatusi

2n MX Postfix juures peab kasutama /etc/postfix/main.cf failis selliseid ridu, lubama imool.org kirjade releetamise üldiselt

relay_domains = /etc/postfix/relay_domainnames
..
relay_recipient_maps = hash:/etc/postfix/relay_recipients_by_domains-txt

kus failide sisu on

# cat /etc/postfix/relay_domainnames
imool.org

ning

# cat /etc/postfix/relay_recipients_by_domains-txt
@imool.org x

ning viimasele failile tuleb moodustada vastav andmebaas

# postmap /etc/postfix/relay_recipients_by_domains-txt

Muudatuste kehtastamiseks tuleb öelda

# systemctl reload postfix

Toodud juhul võtab 2nd MX vastu kõikvõimalikele @imool.org aadressile saadetud kirjad ja püüab võimalusel need edasi saata 1nd MX peale. Tõenäoliselt on palju olematute aadressidega kirju, mille puhul hakkab 2nd MX saatma internetti tagasi vastuseid kohaletoimetamatuse kohta. Sellise olukorra vältimiseks oleks ideaalne kui on 2nd MX peal on kasutada eksisteerivate aadresside nimekiri. Sel juhul saab seda kasutada '@imool.org x' asemel relay_recipient_maps parameetrina, nt

# cat /etc/postfix/relay_recipients_imool.org-txt
priit@imool.org x
mart@imool.org x

Return receipt

Tavaliselt kirja saatja saab öelda oma eposti kliendis standardsel viisil, et kirja saaja saadaks teate kirja kättesaamise kohta. Kirja saaja epostkliendis sellise kirja saamisel tavaliselt avaneb automaatsel täiendav aken ja piisab seal vajutada OK. See info kantakse üle kahe sellise päisega

Return-Receipt-To: imre@auul.pri.ee
Disposition-Notification-To: imre@auul.pri.ee

Täpne olles ei ole see Postfix ega smtp protokolli teema, vaid kahe eposti kliendi vaheline suhtlemine.

Delivery Status Notification

SMTP protokolli DSN (Delivery Status Notification) komponendi abil saab meiliklient öelda eposti serverile, et ta tagastaks eposti kirja kujul kirja saatmise edu kohta teate (alternatiiv oleks minna lugema eposti serveri logi). Selle töötamiseks peab kirja vastu võttes postimasin toetama DSN komponenti (EHLO vastuses on see kirjas) ja meiliklient ütlema midagi sellist

.
ehlo moraal.moraal
250-mail.auul.pri.ee
250-PIPELINING
250-SIZE 20000000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
..

MAIL FROM:<imre@auul.pri.ee> RET=HDRS
...
RCPT TO:<imre@moraal.ee> NOTIFY=SUCCESS,FAILURE
....

kus

  • TODO

Kui kirja saatja ja lõpp-punkti vahel on mitu smtp serverit, siis teatega vastab viimane DSN komponenti toetav süsteem. Mõnel juhul on see päris sügaval vastuvõtva süsteemi sees töötav postimasin. Kui DSN vastus sisaledab palju infot töötleva süsteemi ja kirja teekonna kohta võib olla hea mõte DSN töötlemine ära lõpetada vastuvõtva süsteemi perimeetril.

Selleks sobib kasutada Postfix seadistuses sellist rida

# cat /etc/postfix/main.cf
..
smtpd_discard_ehlo_keyword_address_maps = 
  cidr:/etc/postfix/smtpd_discard_ehlo_keyword_address_maps.txt
...

ja faili /etc/postfix/smtpd_discard_ehlo_keyword_address_maps.txt sisu on

# cat /etc/postfix/smtpd_discard_ehlo_keyword_address_maps.txt sisaldab
10.0.6.0/24      silent-discard
0.0.0.0/0        silent-discard, dsn
::/0             silent-discard, dsn
# postmap /etc/postfix/smtpd_discard_ehlo_keyword_address_maps.txt

kus

  • silent-discard on pseudoparameeter, mis tähistab asjaolu, et mitte logida toimuvat
  • 10.0.6.0/24 - sellest võrgust tulevate pöördumisele näidatakse DSN komponenti
  • muudele pöördumistele ei näidata DSN komponenti

DSN kasutamine Roundcube liidesest paistab välja nii, kirja saatmine

Fail:Dsn-1.gif

kus

  • kiri saadetakse tavalisel viisil + on märgitud DSN (selle tõttu lisab php rakendus SMTP protokolli rääkides RCPT TO aadressi reale 'NOTIFY=SUCCESS,FAILURE'

ning vastuseks tulnud DSN teatega kiri

Fail:Dsn-2.gif

  • vastus on tulnud auul.pri.ee domeeni MX arvutilt, kusjuures vastuses ta räägib millisele oma backendile ta kirja edastas (192.168.1.252); tõenäoliselt ei peaks seda vastuvõtja meilisüsteemi infot nii avalikult jagama; ehk oleks mõistlik, kui DSN tagastab kasutajale tema enda postisüsteem
  • see on tavaline nö MAILER DAEMON kiri, tühja mail from ehk return-path aadressiga

Kasulikud lisamaterjalid

msmtp

msmtp http://msmtp.sourceforge.net/ tarkvara paigaldamiseks sobib öelda

# apt-get install msmtp

Kasutamiseks sobib nt selline seadistusfail

$ cat .msmtprc 
account default
host 127.0.0.1
port 25
logfile /tmp/msmtp.log
from imre@moraal.ee
dsn_notify success,failure

kus

  • host - millise smtp serveri kaudu kiri välja saata
  • from - milline on mail from ja header from eposti aadress
  • dns - lülitatakse sisse dsn notify

kirja saatmiseks

$ echo -e "Subject: Proovi kiri 26\r\n\r\nSee on proovi kirja sisu 26" | msmtp --debug -t imre@auul.pri.ee

sender-dependent-default-transport-maps

TODO

Kasulikud lisamaterjalid

VERP

TODO

Postfixi läbivate kirjade automaatne arhiivimine

TODO

Kasulikud lisamaterjalid

  • The book of Postfix: state-of-the-art message transport (Ralf Hildebrandt, Patrick Koetter) - 2009 aasta seisuga tõenäoliselt parim raamat teemal