<!--
     The FreeBSD Italian Documentation Project
-->

<chapter id="sendmail">
  <title>Sendmail</title>

  <sect1 id="sendmail-smtp">
    <title>Simple Mail Transfer Protocol</title>

    <para>SMTP &egrave; il protocollo applicativo responsabile di inoltrare
      sulla rete tutti i messaggi di posta elettronica, Simple Mail Transfer
      Protocol viene definito dalla <ulink
        url="http://www.ietf.org/rfc/rfc0821.txt">RFC 821</ulink> e
      funziona grazie al protocollo trasmissivo TCP, un server SMTP rimane in
      ascolto sulla porta 25 grazie ad una implementazione molto semplice del
      protocollo TCP.  Le componenti principali che consentono di gestire un
      sistema di posta elettronica sono:</para>

    <orderedlist>
      <listitem>
        <para>il <emphasis>Mail Transport Agent</emphasis> (MTA) che si occupa
          di inoltrare i messaggi sulla rete internet verso la loro destinazione
          finale.  L'MTA funziona come un router e una delle pi&ugrave; vecchie
          e funzionali implementazioni di MTA &egrave; Sendmail, si tratta
          infatti dell'applicazione che trasporta circa il 75% del traffico
          e-mail sulla rete internet;</para>
      </listitem>

      <listitem>
        <para>il <emphasis>Delivery Agent</emphasis> &egrave; l'applicazione
          che si occupa di consegnare la posta elettronica nella casella e-mail
          locale (<filename>/var/mail</filename> oppure
          <filename>/var/spool/mail</filename>), le user mail box sono
          essenzialmente dei file di testo che corrispondono al nome dello user
          accont di un sistema &unix;;</para>
      </listitem>

      <listitem>
        <para>il <emphasis>Mail User Agent</emphasis> (MUA) &egrave;
          l'applicazione con la quale si scrivono i messaggi di posta
          elettronica, tra i programmi pi&ugrave; famosi possiamo citare
          <command>Pine</command>, <command>Eudora</command>,
          <command>OutLook</command>;</para>
      </listitem>

      <listitem>
        <para>il <emphasis>Retrival Agent</emphasis> &egrave; una applicazione
          che viene utilizzata da quelle Aziende che ancora non dispongono di
          una connessione fissa alla rete internet, il <emphasis>Retrival
            Agent</emphasis> quindi si occupa di prelevare la posta dalla
          mailbox remota e di consegnarla al server locale.  Fetchmail &egrave;
          una delle applicazione maggiormente utilizzate;</para>
      </listitem>
    </orderedlist>

    <para>il MUA accede al Delivery Agent per visualizzare e/o prelevare i
      messaggi di posta, il messaggio di posta elettronica viene dunque
      composto utilizzando un qualsiasi MUA, in dipendenza della sua
      configurazione, il messaggio viene inoltrato o al processo locale di
      Sendmail (in ascolto sulla porta 587) o al server SMTP che utilizza
      la 25, porta sulla quale l'MTA rimane in ascolto.  L'MTA, a questo punto,
      contatta il server DNS per verificare il campo MX (Mail Exchange) che gli
      consentir&agrave; ruotare il messaggio verso la sua destinazione finale,
      <application>Bind</application> &egrave; una componente molto importante
      per quello che concerne la gestione del processo di consegna dei
      messaggi di posta elettronica.</para>

    <para>Sendmail da decenni &egrave; il server di posta maggiormente
      utilizzato, le sue fortune e la sua storia passano inevitabilmente per
      i molti problemi relativi alla sicurezza che negli anni lo hanno afflitto.
      Negli ultimi anni nel mondo dei sistemisti &unix; si sono affermati
      anche dei nuovi prodotti studiati allo scopo, ma &egrave; proprio
      Sendmail che comunque accompagna la grande maggioranza delle distribuzioni
      &unix; like come &os;.  Nella mia modesta opinione e da vero appassinato
      di Sendmail posso dire che, a torto, questo server di posta elettronica,
      viene considerato difficile da configurare.  In questo capitolo, con un
      po di pazienza da parte del lettore, sar&agrave; possibile capire il
      funzionamento di Sendmail.  Inoltre vedremo come, grazie a pochi comandi,
      configureremo e passeremo alla produzione Sendmail quale efficente ed
      affidabile agente di trasporto per la posta elettronica.</para>
  </sect1>

  <sect1 id="sendmail-freebsd">
    <title>&os; e Sendmail</title>

    <para>Sendmail &egrave; l'<emphasis>MTA</emphasis> nonch&egrave; il
      <emphasis>Delivery Agent</emphasis> che viene inserito come default
      in ogni sistema &os;, nella versione 4.9-STABLE alla data di Novembre
      '2003, &os; viene compilato Sendmail 8.12.10 la cui configurazione di
      default fornisce all'utente un semplice servizio di inoltro dei messaggi
      locali verso gli altri sistemi presenti sulla rete internet.</para>

    <para>Relativamente ai files di configurazione Sendmail utilizza il
      seguente Layout.</para>

    <informaltable>
      <tgroup cols="2" colsep="1" rowsep="1">
        <colspec colname="col0" align="left">

        <colspec colname="col1" align="center">

        <tbody>
          <row>
            <entry align="left" valign="top"><filename>/etc/mail/access</filename></entry>

            <entry align="center" valign="top">database di accesso</entry>
          </row>

          <row>
            <entry align="left" valign="top"><filename>/etc/mail/aliases</filename></entry>

            <entry align="center" valign="top">database degli aliases</entry>
          </row>

          <row>
            <entry align="left" valign="top"><filename>/etc/mail/virtusertable</filename></entry>

            <entry align="center" valign="top">supporto al virtualhosting e al
              reindirizzamento</entry>
          </row>

          <row>
            <entry align="left" valign="top"><filename>/etc/mail/local-host-names</filename></entry>

            <entry align="center" valign="top">lista degli host per i quali
              sendmail accetta la posta</entry>
          </row>

          <row>
            <entry align="left" valign="top"><filename>/etc/mail/sendmail.cf</filename></entry>

            <entry align="center" valign="top">il file di configurazione
              principale di sendmail</entry>
          </row>

          <row>
            <entry align="left" valign="top"><filename>/var/mail</filename></entry>

            <entry align="center" valign="top">mailboxes</entry>
          </row>

          <row>
            <entry align="left" valign="top"><filename>/var/spool/mqueue</filename></entry>

            <entry align="center" valign="top">coda dei messaggi locali</entry>
          </row>

          <row>
            <entry align="left" valign="top"><filename>/etc/mail/freebsd.mc</filename></entry>

            <entry align="center" valign="top">file che il processore
              <emphasis>m4 GNU</emphasis> utilizza per generare il file
              <filename>.cf</filename></entry>
          </row>
        </tbody>
      </tgroup>
    </informaltable>

    <para>&Egrave; necessario dire che Sendmail &egrave; fortemente integrato
      in &os; e viene controllato e configurato da alcuni dei files che
      abbiamo citato precedentemente.  L'obiettivo di questo capitolo &egrave;
      quello di fornire al lettore una piccola guida che consenta agli
      utenti un veloce startup del server di posta elettronica.  Se si decide
      di utilizzare <application>sendmail</application> come server di posta
      elettronica di default &egrave; sempre bene tenere sotto controllo
      l'archivio <emphasis>FreeBSD Security Notifications</emphasis> alla URL
      <ulink
        url="http://lists.freebsd.org/pipermail/freebsd-security-notifications/">http://lists.freebsd.org/pipermail/freebsd-security-notifications/</ulink>.</para>
  </sect1>

  <sect1 id="sendmail-freebsd.mc">
    <title>Il file <filename>/etc/mail/freebsd.mc</filename> (il file
      principale di configurazione)</title>

    <para>Il file di configurazione principale di Sendmail 8.12 &egrave;
      <filename>/etc/mail/sendmail.cf</filename>, questo file pu&ograve;
      essere generato utilizzando il processore <ulink
        url="http://www.gnu.org/software/m4/">m4 GNU</ulink> che legge un
      file di macro di input (<filename>.mc</filename>) e crea un file di
      configurazione in output (<filename>sendmail.cf</filename>) che si basa
      sulle direttive macro predefinite.  Le direttive macro
      <emphasis>m4 GNU</emphasis> di qualsiasi versione di &os; vengono
      salvate nel file <filename>/etc/mail/freebsd.mc</filename>.  Ecco un
      esempio di direttiva macro <emphasis>m4 GNU</emphasis> contenuta nel
      file <filename>/etc/mail/freebsd.mc</filename>.</para>

    <programlisting>`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl</programlisting>

    <para>Questa direttiva produce la seguente riga nel file di configurazione
      <filename>/etc/mail/nomehost.dominio.cf</filename>.</para>

    <programlisting># Virtual user table (maps incoming users)
virtuser hash -o /etc/mail/virtusertable.db</programlisting>

    <para>Conoscendo a priori le caratteristiche e le opzioni di Sendmail
      necessarie all'ambiente di produzione che vogliamo realizzare, &egrave;
      anche possibile definire un piccolo file di macro
      <emphasis>m4 GNU</emphasis> contenente tutte le direttive del caso.  Il
      processore di macro <emphasis>m4 GNU</emphasis> &egrave; case-sensitive,
      &egrave; quindi necessario accertarsi che tutte le direttive utilizzino i
      caratteri opportuni, maiuscoli o minuscoli.  In caso contrario le
      impostazioni non verranno elaborate adeguatamente dal processore
      <emphasis>m4 GNU</emphasis>.  Il file
      <filename>/etc/mail/freebsd.mc</filename> &egrave; gi&agrave; sufficente
      per definire le caratteristiche per un piccolo server.</para>

    <programlisting>divert(-1)
divert(0)
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.10.2.17 2002/11/14 03:21:18 keramida Exp $')
OSTYPE(freebsd4)
DOMAIN(generic)
FEATURE(access_db, `hash -o -T&lt;TMPF&gt; /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')
define(`confCW_FILE', `-o /etc/mail/local-host-names')
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confMAX_MIME_HEADER_LENGTH', `256/128')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
MAILER(local)
MAILER(smtp)</programlisting>

    <para>Un buon amministratore di sistemi e-mail gestisce svariati host e
      quindi utilizza diversi file <filename>/etc/mail/freebsd.mc</filename>
      come se si trattasse di <filename>template</filename>.  Secondo
      consuetudine il postmaster crea diversi file, uno per ogni host che
      amministra, e mantiene un'archivio aggiornato di modelli.  In questo
      database memorizza tutte le modifiche che apporta ai vari sistemi che
      amministra indicandovi anche il numero di versione.  &os;, grazie
      all'integrazione completa con Sendmail, ci aiuter&agrave; a creare in
      maniera veloce ed automatica tutte le versioni ed i file
      <filename>.mc</filename> grazie al comando <command>make</command> che
      dovr&agrave; essere digitato in <filename>/etc/mail</filename>.</para>

    <screen>&prompt.root; <userinput>make</userinput></screen>

    <screen>&prompt.root; <userinput>ls *.mc</userinput>
1 root  wheel  4192 Apr  3 10:55 freebsd.mc
1 root  wheel  3455 Jun 22 11:31 mail.example.org.mc</screen>

    <para>L'esecuzione del comando <command>make</command> ha provveduto a
      generare automaticamente il file
      <filename>/etc/mail/mail.example.org.mc</filename> che contiene tutte le
      direttive necessarie al processore <emphasis>m4 GNU</emphasis> per
      elaborare un nuovo file di configurazione di Sendmail nel formato
      <filename>/etc/mail/nomehost.dominio.cf</filename></para>

    <screen>&prompt.root; <userinput>ls *.cf</userinput>
-rw-r--r--  1 root  wheel  61531 Aug 19 16:35 mail.example.org.cf</screen>

    <screen>&prompt.root; <userinput>cp sendmail.cf sendmail.cf.bak</userinput></screen>

    <screen>&prompt.root; <userinput>cp mail.example.org.cf sendmail.cf</userinput></screen>

    <screen>&prompt.root; <userinput>ls *.cf</userinput>
-rw-r--r--  1 root  wheel  61531 Aug 19 16:35 mail.example.org.cf
-rw-r--r--  1 root  wheel  61531 Aug 19 16:35 sendmail.cf</screen>

    <para>Abbiamo salvato la vecchia configurazione e successivamente abbiamo
      copiato il nuovo file di configurazione di Sendmail assegnandogli in
      nome <filename>/etc/mail/sendmail.cf</filename>, a questo punto non rimane
      che riavviare il servizio</para>

    <screen>&prompt.root; <userinput>make restart</userinput>
Restarting: sendmail sendmail-clientmqueue.</screen>

    <para>La procedura ora descritta pu&ograve; essere automatizzata senza
      dover ricorrere alla copia del file <filename>.cf</filename> sul file
      di configurazione principale <filename>sendmail.cf</filename></para>

    <screen>&prompt.root; <userinput>cd /etc/mail</userinput></screen>

    <screen>&prompt.root; <userinput>make</userinput></screen>

    <screen>&prompt.root; <userinput>make install</userinput>
install -m 444 ns.miohost.net.cf /etc/mail/sendmail.cf
install -m 444 freebsd.submit.cf /etc/mail/submit.cf</screen>

    <screen>&prompt.root; <userinput>make restart</userinput>
Restarting: sendmail sendmail-clientmqueue.</screen>

    <para>Siamo quasi pronti a gestire il nostro piccolo server di posta
      elettronica, ma non dobbiamo dimenticare di impostare i controlli sugli
      accessi e la configurazione che sarà necessaria al nostro sistema per
      avere la capacit&agrave; di ricevere i messaggi inoltrati dalle altre
      macchine presenti sulla rete, per quanto concerne ulteriori informazioni
      sulle direttive <emphasis>m4 GNU</emphasis> &egrave; necessario rifersi
      direttamente al sito di Sendmail alla URLs <ulink
        url="http://www.sendmail.org/m4/readme.html">http://www.sendmail.org/m4/readme.html</ulink>.</para>
  </sect1>

  <sect1 id="sendmail-access">
    <title>Il file <filename>/etc/mail/access</filename> (controlliamo gli
      accessi)</title>

    <para>Il database di accesso, secondo il parere di chi scrive, rappresenta
      una soluzione rapida e veloce per evitare lo spam.  Infatti questo
      database viene utilizzato per controllare l'accesso al nostro server di
      posta elettronica ed identifica singoli host o intere subnet, &os;
      include in ogni sua versione, il file
      <filename>/etc/mail/access.sample</filename>.  Copiamo il file di
      esempio generandone una versione ufficiale per l'utilizzo in
      produzione</para>

    <screen>&prompt.root; <userinput>cp access.sample access</userinput></screen>

    <para>Ora editiamo con il nostro editor di testi preferito il file
      <filename>/etc/mail/access</filename> per autorizzare l'host locale e
      la rete locale al relay della posta</para>

    <programlisting>cyberspammer.com                550 We don't accept mail from spammers
FREE.STEALTH.MAILER@            550 We don't accept mail from spammers
another.source.of.spam          REJECT
example.org                     RELAY
To:miodominio.org               RELAY
vsmtp1.tin.it                   OK
127.0.0.1                       RELAY
localhost                       RELAY
192.168.1                       RELAY</programlisting>

    <para>Abbiamo gi&agrave; accennato della completa integrazione di &os;
      con sendmail, per rendere immediatamente operative le modifiche ci
      serviranno unicamente due comandi</para>

    <screen>&prompt.root; <userinput>make</userinput>
/usr/sbin/makemap hash access.db < access
chmod 0640 access.db</screen>

    <screen>&prompt.root; <userinput>make restart</userinput>
Restarting: sendmail sendmail-clientmqueue</screen>

    <para>Il semplice comando <command>make</command> rigenera il database
      degli accessi mentre il comado <command>make restart</command> riavvia
      l'MTA.</para>
  </sect1>

  <sect1 id="sendmail-local-host-names">
    <title>Il file <filename>/etc/mail/local-host-names</filename> (posta
      locale)</title>

    <para>Sendmail funziona essenzialmente come un router, l'MTA locale
      contatta il server DNS che &egrave; stato definito nel file
      <filename>/etc/resolv.conf</filename> e verifica la presenza del campo
      MX (mail excharger).  I messaggi verranno inoltrati all'host che viene
      definito nel campo MX come autoritativo per il dominio verso il quale
      &egrave; stato indirizzato il messaggio.  Un messaggio e-mail diretto a
      <emphasis>pluto@example.org</emphasis> verr&agrave; consegnato all'host
      indicato nel campo MX che ha autorit&agrave; per il dominio
      <emphasis>example.com</emphasis>.</para>
      
    <programlisting>                IN      MX      10 mail.example.org.
;
ns              IN      A       192.168.0.1
mail            IN      A       192.168.0.4</programlisting>

    <para>Nella gestione del DNS &egrave; da rimarcare che per ogni campo MX
      deve sempre corrispondere un record di tipo A.  Per indicare a Sendmail
      di accettare posta per i domini locali &egrave; necessario creare il file
      <filename>/etc/mail/local-host-names</filename></para>

    <programlisting>localhost
mail.example.org
example.org</programlisting>

    <para>Con questo sistema tutta la posta indirizzata al dominio
      <emphasis>example.org</emphasis> verr&agrave; consegnata all'host
      <emphasis>mail.example.org</emphasis> dove Sendmail eseguir&agrave; il
      local delivery dei messaggi di posta elettronica.  Il server MTA Sendmail
      viene generalmente attivato automaticamente all'avvio del sistema.</para>

    <programlisting>sendmail_enable="YES"</programlisting>

    <para>&Egrave; questa la direttiva contenuta in
      <filename>/etc/rc.conf</filename> che consente di avviare Sendmail in
      maniera automatica con il processo di boot del sistema.</para>
  </sect1>
</chapter>

<!--
     Local Variables:
     mode: sgml
     sgml-indent-data: t
     sgml-omittag: nil
     sgml-always-quote-attributes: t
     sgml-parent-document: ("../book.sgml" "book" "chapter")
     End:
-->
