Server di posta (Email)
Esistono diversi protocolli per lo scambio di posta:
Nel seguito tratteremo i server seguenti:
POSTFIX (1/9)
Consiste in una moltitudine di programmi ciascuno specializzato in una fase del trattamento dei messaggi di posta elettronica smistati. Questo lo differenzia dal più largamente utilizzato e famoso (ma vecchio) Sendmail, il primo server SMTP Unix impiegato su larga scala. La scelta di modularizzarne il funzionamento è dovuta a considerazioni di:
POSTFIX (2/9)
File di configurazione principale: /etc/postfix/main.cf
Considereremo la configurazione più semplice, quella di un server per un solo dominio internet (niente domini virtuali) con autenticazione IP, che cioè tiene conto solamente dell'indirizzo IP di provenienza del messaggio.
Un esempio:
myhostname = brillante.route-add.net
POSTFIX (3/9)
Spiegazione delle voci di configurazione:
myhostname = brillante.route-add.netmyorigin = $mydomain
Dominio dal quale appaiono provenire i messaggi inviati dalla macchina sulla quale Postfix è in esecuzione
mydestination = localhost,
$myhostname, $mydomain
Lista dei domini che questo server
considera i destinatari finali dei messaggi ricevuti
relayhost = relay.eurnetcity.net
Server SMTP al quale inviare i messaggi che non sono destinati al dominio per il quale qeusto server è responsabile
POSTFIX (4/9)
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU Linux)
Presentazione del server alla richiesta di servizio da parte di un client o di un altro server che intende spedire della posta; esempio:
[aselli@castrum
~]$ telnet diamante 25
Trying 192.168.1.9...
Connected to diamante.
Escape character is '^]'.
220 brillante.route-add.net ESMTP Postfix (Debian/GNU Linux)
QUIT
221 Bye
Connection closed by foreign host.
[aselli@castrum ~]$
alias_maps = hash:/etc/aliases
Tabella con alias specifica per Postfix. Esempio di una sua riga:
webmaster: root
alias_database =
hash:/etc/aliases
Altra tabella di alias, simile alla precedente ma che permette di specificare una moltitudine di tabelle, come servizi NIS ove disponibili oltre a semplici file locali. Esempio:
alias_maps =
dbm:/etc/aliases,
nis:mail.aliases
POSTFIX (5/9)
mynetworks = 127.0.0.0/8, 192.168.1.0/28
Reti dalle quali il server SMTP accetta messaggi diretti a qualsiasi altro dominio internet
inet_interfaces = all
Indirizzi IP dai quali il server accetta richieste di connessione
Tipi di errore che il server notifica all'utente "postmaster" ogni volta che si verificano:
POSTFIX (6/9)
header_checks = regexp:/etc/postfix/header_checks
File dove leggere di particolari intestazioni nei messaggi in arrivo che "tradiscono" un messaggio che si vuole sia respinto dal server. sempio:
/^Subject: .*Porn.*/ REJECT
mailbox_transport
=
cyrus
Metodo di consegna dei messaggi ricevuti destinati ad utenti del dominio per il quale questo server è responsabile. Se assente, i messaggi vengono messi nella casella di posta dell'utente destinatario in formato Unix-MBOX nel file /var/mail/$UTENTE
message_size_limit
=
1048576
Limite nelle dimensioni di un messaggio inviato al server prima che questo sia respinto perché troppo grande.
POSTFIX (7/9)
Ora vediamo qualche esempio su come si comporta Postfix al variare di alcune delle voci elencate sopra.
notify_classes
=
bounce,
2bounce,
delay, policy, protocol, resource, software
Il server è configurato per impedire il "relay", cioè che da dominio1 si contatti il server su dominio2 perché invii un messaggio ad un utente di dominio3. Quando si tenta di farlo, il server invia un codice d'errore (di tipo "policy") al mittente e il messaggio seguente all'utente "postmaster" del proprio dominio contentente la trascrizione dei comandi che ha scambiato con il client o il server che l'ha contattato:
From: Mail
Delivery System
<MAILER-DAEMON@brillante.route-add.net>
To: Postmaster <postmaster@route-add.net>
Date: Sun, 7 Mar 2004 10:42:20 +0100 (CET)
Subject: Postfix SMTP server: errors from unknown[61.173.40.131]
Transcript of session follows.
Out: 220 brillante.route-add.net ESMTP Postfix (Debian/GNU Linux)
In: HELO 1911PJTH.vicp.net
Out: 250 brillante.route-add.net
In: MAIL From: <bdrmlvr@aol.com>
Out: 250 Ok
In: RCPT To:<bingbing_3@juno.com>
Out: 554 <bingbing_3@juno.com>: Recipient address rejected: Relay access
denied
In: QUIT
Out: 221 Bye
POSTFIX (8/9)
header_checks = regexp:/etc/postfix/header_checks
Se nel file /etc/postfix/header_checks compare una riga come la seguente:
/^To:
.*trappola@route-add\.net.*/ REJECT
l'invio di un messaggio a
trappola@route.add.net
provocherà un errore che
sarà documentato in
questo modo:
POSTFIX (9/9)
From: Mail Delivery System <MAILER-DAEMON@brillante.route-add.net>
To: Postmaster <postmaster@route-add.net>
Date: Wed, 10 Mar 2004 18:47:31 +0100 (CET)
Subject: Postfix SMTP server: errors from unknown[195.166.233.52]
Transcript of session follows.
Out: 220 brillante.route-add.net ESMTP Postfix (Debian/GNU Linux)
In: EHLO ADJULS
Out: 250-brillante.route-add.net
Out: 250-PIPELINING
Out: 250-SIZE 1048576
Out: 250-VRFY
Out: 250-ETRN
Out: 250-XVERP
Out: 250 8BITMIME
In: RSET
Out: 250 Ok
In: MAIL FROM:<silasmonvete2004@primposta.com>
Out: 250 Ok
In: RCPT TO:<trappola@route-add.net>
Out: 250 Ok
In: DATA
Out: 354 End data with <CR><LF>.<CR><LF>
Out: 550 Error: Message content rejected
In: QUIT
Out: 221 Bye
QPOPPER (1/2)
È un server molto semplice da configurare. I suoi valori preimpostati sono tali che anche con un file di configurazione vuoto si può permettere agli utenti che dispongono di un account sulla macchina sulla quale gira il server POP3 di accedere alla mailbox in formato Unix-MBOX, ossia ai file /var/mail/$UTENTE. Nel seguito vedremo un esempio di una sessione POP3 da terminale.
QPOPPER (2/2)
aselli@castrum ~$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Qpopper (version 4.0.5) at castrum starting. <19797.1079551626@castrum>
USER nicola
+OK Password required for nicola.
PASS Inindovinabile
+OK nicola has 1 visible message (0 hidden) in 760 octets.
LIST
+OK 1 visible messages (760 octets)
1 760
.
TOP 1 1
+OK Message follows
Return-Path: <aselli@route-add.net>
Delivered-To: nicola@localhost.localdomain
Received: from localhost (localhost [127.0.0.1])
by marana (Postfix) with ESMTP id EF8EA403A
for <nicola@localhost>; Wed, 17 Mar 2004 18:24:14 +0100 (CET)
Date: Wed, 17 Mar 2004 18:24:14 +0100 (CET)
From: Alessandro Selli <aselli@route-add.net>
To: nicola@localhost.localdomain
Subject: Prova
Message-ID: <Pine.LNX.4.58.0403171823430.19245@castrum>
Content-Type: TEXT/PLAIN; charset=US-ASCII
Status: RO
Provola.
.
QUIT
+OK Pop server at castrum signing off.
Connection closed by foreign host.
CYRUS (1/5)
IMAP4 è un protocollo
ricco, pensato
per lo scambio di messaggi di tipo generico, usato soprattutto per la
posta elettronica e per gli articoli dei newsgroup ma utilizzabile per
altre cose. Permette di creare e gestire directory su server
remoti dove scrivere, archiviare, leggere, spostare o cancellare
messaggi. Uno dei server disponibili su Linux e altri Unix
è
Cyrus. Una sua configurazione essenziale per essere usato con la
sola posta elettronica ha queste righe nel file /etc/imapd.conf:
configdirectory: /var/lib/cyrus
defaultpartition: default
partition-default: /var/spool/cyrus/mail
admins: cyrus
allowanonymouslogin: no
umask: 077
CYRUS (2/5)
CYRUS (3/5)
Per poter usare i servizi del server IMAP
bisogna creare un utente con il programma "cyradm".
Contrariamente al server POP3 Qpopper, il server Cyrus non ha
bisogno che l'utente di una certa casella IMAP sia un reale utente del
sistema ospite: Cyrus usa un suo proprio database degli utenti e delle
password corrispondenti. Segue un esempio di creazione di un
utente, l'utente "sviluppatore":
[root@server ~]# cyradm -user root localhost
localhost password:
localhost> createmailbox user.sviluppatore
localhost> listmailbox
localhost> INBOX user.sviluppatore
localhost> quit
[root@server ~]#
CYRUS (4/5)
Cyrus usa il formato MAILDIR per
stoccare i messaggi, non il MBOX come Qpopper; questo vuol dire che
invece di un file contenente tutti i messaggi esiste, per ciascun
utente, una directory che contiene tanti file quanti sono i messaggi.
Ad esempio:
[root@server ~]# ls /var/spool/cyrus/mail/user/aselli
1104. 1276. 1411. 1472. 1491. 1572. 1726. cyrus.cache
1141. 1280. 1412. 1474. 1507. 1582. 1738. cyrus.header
1149. 1294. 1432. 1483. 1552. 1584. 1752. cyrus.index
1207. 1401. 1433.
1486.
1553. 1585. 646. cyrus.seen
Altri dati riguardanti il nome preimpostato delle directory create dagli utenti esisteni e i diritti di lettura/scrittura/altro stanno nel file:
[root@server ~]#
cat /var/lib/cyrus/mailboxes
user.aselli default aselli lrswipcda
user.sviluppatore
default sviluppatore lrswipcda
Segue un esempio di accesso al servizio IMAP4 da un terminale a caratteri verso il server sul computer "diamante":
CYRUS (5/5)
aselli@castrum ~$ telnet diamante 143
Trying 192.168.1.9...
Connected to diamante.
Escape character is '^]'.
* OK diamante Cyrus IMAP4 v1.5.19 server ready
0001 LOGIN sviluppatore Inindovinabile
0001 OK User logged in
0011 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS X-NON-HIERARCHICAL-RENAME NO_ATOMIC_RENAME UNSELECT X-NETSCAPE
0011 OK Completed
001A SELECT INBOX
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)]
* 30 EXISTS
* 2 RECENT
* OK [UNSEEN 29]
* OK [UIDVALIDITY 1076531885]
001A OK [READ-WRITE] Completed
002A FETCH 2 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])
* 2 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS (DATE FROM)] {80}
Date: Sat, 6 Mar 2004 15:56:43 +0100
From: Antonio Marchigiano <antomarchi@giano.it>
)
002A OK Completed
002B LOGOUT
* BYE LOGOUT received
002B OK Completed
Connection closed by foreign host.