Elektronická pošta

Martin Pulec, martin.pulec@mail.muni.cz

Obsah

Formát elektronické zprávy

Formát zpráv elektronické pošty specifikuje RFC 5322, jenž nahrazuje starší RFC 2822 a 822. Mezi další relevantní dokumenty patří RFC týkající se MIME (viz dále).

Formát adresy

E-mailová adresa se uvádí ve formátu uživatel@doména. Uživatelské jméno je vždy v dané doméně unikátní. Doména bývá zpravidla FQDN jméno daného poštovního systému. Kromě toho je přípustný i formát adresy uživatel@[a.b.c.d], kde a.b.c.d je IP-adresa příjemce.

Formát zprávy

Zpráva se skládá z:

  1. hlaviček – specifikují metainformace k dané zprávě ve formátu název_hlavičky: tělo. Jednotlivé hlavičky jsou oddělené znaky CRLF. (Víceřádkové jsou odsazeny mezerou na počátku každého následujícího řádku, který má být součástí té stejné hlavičky.) Povinná jsou pole FromDate. Hlavičky X-* slouží k přenosu dalších, nestandardních informací. Pro všechny hlavičky musí být použito kódování ASCII (pro přenos jiného například Base64 nebo quoted-printable – viz MIME).
  2. těla – oddělené od hlaviček prázdným řádkem. Může obsahovat i ne-ASCII znaky, pokud je to uvedena MIME hlavička Content-Transfer-Encoding: 8bit. (Dříve se používalo uuencode.)

Příklad zprávy:

Return-path: <xpulec@fi.muni.cz>
Envelope-to: mpulec@localhost
Delivery-date: Sat, 07 Nov 2009 19:52:00 +0100
Received: from localhost ([::1] helo=ntb-deb)
        by ntb-deb with esmtp (Exim 4.69)
        (envelope-from <xpulec@fi.muni.cz>)
        id 1N6qOF-0004Gg-KS
        for mpulec@localhost; Sat, 07 Nov 2009 19:51:59 +0100
Received: from mail.muni.cz [147.251.49.9]
        by ntb-deb with POP3 (fetchmail-6.3.9-rc2)
        for <mpulec@localhost> (single-drop); Sat, 07 Nov 2009 19:51:59 +0100 (CET)
Received: by receive-deliver@arethusa2.fi.muni.cz
        PID 11676 for 207871@mail.muni.cz; Sat, 07 Nov 2009 19:51:29 +0100
Delivered-To: 207871@mail.muni.cz
Received: from anxur.fi.muni.cz (anxur.fi.muni.cz [147.251.48.3])
        by arethusa2.fi.muni.cz (Postfix) with ESMTP id 5F42466C7A7
        for <martin.pulec@mail.muni.cz>; Sat,  7 Nov 2009 19:51:29 +0100 (CET)
Received: from aisa.fi.muni.cz (aisa.fi.muni.cz [147.251.48.1])
        by anxur.fi.muni.cz (Postfix) with ESMTP id 4EA93493730
        for <martin.pulec@mail.muni.cz>; Sat,  7 Nov 2009 19:51:29 +0100 (CET)
Received: from aisa.fi.muni.cz (localhost [127.0.0.1])
        by aisa.fi.muni.cz (8.13.6/8.12.8) with ESMTP id nA7IpRvm120104
        for <martin.pulec@mail.muni.cz>; Sat, 7 Nov 2009 19:51:28 +0100 (MET)
Received: (from xpulec@localhost)
        by aisa.fi.muni.cz (8.13.6/8.12.5/Submit) id nA7IpRrs121090
        for martin.pulec@mail.muni.cz; Sat, 7 Nov 2009 19:51:27 +0100 (MET)
Date: Sat, 7 Nov 2009 19:51:27 +0100 (MET)
From: Martin Pulec <xpulec@fi.muni.cz>
Message-Id: <200911071851.nA7IpRrs121090@aisa.fi.muni.cz>
To: Martin Pulec 
Subject: testovaci e-mail
X-Spam: NO
X-Spam-Rating: 70
Status: RO
Content-Length: 5
Lines: 1

text

Multipurpose Internet Mail Extensions (MIME)

MIME standard rozšiřuje základní formát zpráv tím, že umožňuje posílat zprávy v jiném kódování než ASCII, přidávat ke zprávě přílohy a komponovat zprávu z více částí. MIME definují RFC 2045-2047, 2049, 4289 a 4289. Pokud chceme posílat zprávu využívající toto rozšíření, použijeme tyto hlavičky:

MIME-Version: 1.0
Content-Type: text/plain

Hlavička Content-Type specifikuje daný typ. Existují dvě třídy typů:

V případě multipart typů je v záhlaví zprávy je uveden pouze "kořenový" typ, ostatní podtypy jsou uvedeny v těle zprávy. Pro oddělení jednotlivých částí se používá speciální oddělovač:

Content-Type: multipart/mixed; 
    boundary="----=_Part_60551_16194776.1234419145741"

a v těle:

------=_Part_60551_16194776.1234419145741
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: 8bit

Hezký den,..

Další z MIME rozšíření je možnost posílat i hlavičky v jiném kódování než ASCII.

Schéma doručování e-mailu

Typická souslednost kroků při doručování e-mailu je následující:

  1. Uživatel napíše ve svém poštovním klientu mail. Ten jej předá lokálnímu SMTP serveru.
  2. Místní SMTP server se dotáže DNS serveru příslušného k doméně příjemce na jména SMTP serverů v kategorii MX.
  3. Pokud místní SMTP server získá nějaké MX záznamy, snaží se postupně kontaktovat SMTP servery ve vzestupném pořadí podle čísla v MX záznamu do té doby, než některý akceptuje spojení.
  4. Jestliže neuspěje u žádného MX záznamu (nebo se žádný takový nevyskytuje), pokusí se ještě kontaktovat A nebo AAAA záznam dané domény.
  5. SMTP server příjemce převezme zprávu (pokud byla korektní - určena do jeho domény atp.), kterou zpravidla uloží na místní souborový systém (do souboru, databáze).
  6. příjemce si zprávu přečte buď lokálně (na stejném stroji), případně přes POP3/IMAP. Webmail je do určité míry analogií místního přístupu (kde webová aplikace hraje roli MUA).
odesílatelův MUA --SMTP--> odesílatelův MTA --SMTP--> příjemcův MTA [ --roura--> MDA ] --zápis--> souborový systém
-------lokální_síť_nebo_1_počítač----------|Internet |---------------cílový_systém--------------------------------

Mail User Agent (MUA)

Termínem MUA se označuje koncový uživatelský klient odesílající maily a přistupující k nim. Mezi běžné MUA patří Mutt, Pine nebo Mozilla Thunderbird, ale i webmail.

Mail Transfer Agent (MTA)

MTA je proces (server), jež převezme zprávu od MUA a zajišťuje její doručení. Typicky komunikuje pomocí protokolu SMTP. Běžně používané implementace jsou sendmail, Microsoft Exchange Server, Postfix, Exim nebo qmail.

Mail Delivery Agent (MDA)

MDA slouží k manipulaci se zprávou poté, co je doručena pomocí MTA. Obvykle se používá k třídění pošty do (tematických) schránek. Na UNIXových systémech je nejběžnější procmail, existují však i jiné implementace (např. maildrop).

Simple Mail Transfer Protocol

SMTP je protokol pro komunikaci mezi jednotlivými uzly přenášejícími elektronickou poštu. Původně tento protokol specifikovalo RFC 821, které později nahradilo RFC 2821 (rozšíření ESMTP).

Doručování se řídí informacemi uvedenými obálkou. Tu vytváří příkazy MAIL a RCPT. Chybové zprávy se doručují na adresu obálkového odesílatele, samotná zpráva na adresu obálkového příjemce.

Spojení naváže klientský SMTP server vůči (zpravidla) SMTP serveru příjemce:
220 smtp.there.example.com ESMTP Exim 4.69 Tue, 03 Nov 2009 17:49:16 +0100
> EHLO relay.here.example.org
250-smtp.there.example.com Hello relay.here.example.org [192.0.32.10]
250-SIZE 52428800
250-PIPELINING
250 HELP
> MAIL FROM:<martin@here.example.org>
250 OK
> RCPT TO:<someone@there.example.com>
250 Accepted
> DATA
354 Enter message, ending with "." on a line by itself
> From: Martin Pulec <martin@here.example.org>
> To: Someone <someone@there.example.com>
> Date: Tue, 03 Nov 2008 17:49:11 +0100
> Subject: Test
>
> Hi there,
> ....
> 
> Best regards,
> Martin Pulec.
> .
250 OK id=1N5Mab-0002Wh-1C
> QUIT
221 smtp.there.example.org closing connection

Příkazy SMTP:

> HELP
214-Commands supported:
214 AUTH HELO EHLO MAIL RCPT DATA NOOP QUIT RSET HELP

Vzdálený přístup ke schránce

POP3

IMAP

SPAM

Open relay

DNS-based Blacklisting

Graylisting

Příklad graylistované zprávy:

2009-11-03 18:08:55 1N5MsJ-0002os-22 == martin.pulec@mail.muni.cz R=dnslookup
T=remote_smtp defer (-44): SMTP error from remote mail server after
RCPT TO:<martin.pulec@mail.muni.cz>: host arethusa.fi.muni.cz [147.251.49.9]:
450 4.7.1 <martin.pulec@mail.muni.cz>: Recipient address rejected:
Please_try_again_in_10_minutes_or_so_(g.r_a-y_listed).

Statistické filtrování

EXIM

Nastavení

Konfigurace Eximu se nachází v adresáři /etc/exim4. Původně se jednalo o jeden soubor exim4.conf, ale je možné nastavení rozdělit do podadresářů /etc/exim4/conf.d/*/ (poddadresáře acl, auth, main, retry, rewrite, router, transport). Makrodefinice některých voleb obsahuje zejména soubor main/01_exim4-config_listmacrosdefs:

# List of domains considered local for exim. Domains not listed here
# need to be deliverable remotely.
domainlist local_domains = @:localhost:lab.fi.muni.cz

# List of recipient domains to relay _to_. Use this list if you're -
# for example - fallback MX or mail gateway for domains.
domainlist relay_to_domains = empty

# List of sender networks (IP addresses) to _unconditionally_ relay
# _for_. If you intend to be SMTP AUTH server, you do not need to enter
# anything here.
hostlist relay_from_hosts = 127.0.0.1 : 10.0.20.0/24 : ::1

Doménový koš

Za direktivu local_user (soubor router/900_exim4-config_local_user) umístit následující pravidlo:

catch_all:
  driver = redirect
  data = user@domain

Literatura