12.2.5 Intestazioni internazionalizzate

La RFC 2822 è lo standard base che descrive il formato dei messaggi email. Deriva dallo standard della vecchia RFC 822 che era ampiamente usata quando la maggior parte delle email erano composte esclusivamente da caratteri ASCII. La RFC 2822 è una specificazione scritta assumendo che le email contenessero solo caratteri ASCII a 7 bit.

Naturalmente, come le email si sono diffuse a livello mondiale, sono diventate internazionalizzate, così che charset specifici per i vari linguaggi possono oggi essere utilizzati nei messaggi di email. Lo standard base richiede ancora che i messaggi di email siano trasferiti utilizzando solo caratteri ASCII a 7 bit, perciò varie RFC sono state scritte per descrivere come codificare mail contenenti caratteri non ASCII in un formato compatibile con la RFC 2822. Queste RFC includono RFC 2045, RFC 2046, RFC 2047 e RFC 2231. Il package email supporta tutti questi standard nei moduli email.Header e email.Charset.

Se si vuole includere caratteri non ASCII nelle intestazioni e nei campi Subject: o To:, si deve utilizzare la classe Header ed assegnare il campo nell'oggetto Message ad un'istanza di Header anziché utilizzare una stringa per il valore dell'intestazione. Per esempio:

>>> from email.Message import Message
>>> from email.Header import Header
>>> msg = Message()
>>> h = Header('p\xf6stal', 'iso-8859-1')
>>> msg['Subject'] = h
>>> print msg.as_string()
Subject: =?iso-8859-1?q?p=F6stal?=

Come fare se si vuole che il campo Subject: contenga un carattere non ASCII? Lo si può fare creando un'istanza di Header e passando l'insieme dei caratteri in cui la stringa è codificata. Quando l'istanza di Message viene convertita in testo, il campo Subject: è stato propriamente codificato secondo la RFC 2047. I lettori di email MIME-consapevoli mostreranno questa intestazione utilizzando l'insieme dei caratteri ISO-8859-1.

Nuovo nella versione 2.2.2.

Di seguito la descrizione della classe Header:

class Header( [s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])
Crea un'intestazione MIME compatibile che può contenere stringhe in differenti insiemi di charset.

L'argomento facoltativo s è il valore iniziale per l'intestazione. Se None (il valore predefinito), non viene impostato il valore iniziale dell'intestazione. Lo si può aggiungere successivamente all'intestazione utilizzando il metodo append(). s può essere una stringa di byte o una stringa Unicode, ma si veda la documentazione del metodo append() per la semantica.

L'argomento facoltativo charset serve per due scopi: ha lo stesso significato dell'argomento charset per il metodo append(). Imposta anche il carattere predefinito per tutte le seguenti chiamate append() che omettono l'argomento charset. Se charset non viene fornito nel costruttore (il caso predefinito), viene utilizzato l'insieme dei caratteri us-ascii sia come charset iniziale per s, che per le seguenti chiamate ad append().

La lunghezza massima della riga può essere specificata esplicitamente tramite maxlinelen. Per separare la prima riga ad un valore minore (per gestire il campo intestazione che non è inclusa in s, per esempio Subject:) passare nel nome del campo in header_name. Il valore perdefinito per varmaxlinelen è 76 ed il valore predefinito per header_name è None, a significare che non viene preso in considerazione per la prima riga di una lunga intestazione separata.

Facoltativamente continuation_ws dovrebbe essere compatibile con la RFC 2822 per quanto riguarda gli spazi vuoti, ossia spazi e codici di controllo come tabulazioni. Questi caratteri saranno considerati come indicativi per la continuazione di una riga.

L'argomento facoltativo errors viene passato direttamente al metodo append().

append( s[, charset[, errors]])
Aggiunge la stringa s all'intestazione MIME.

L'argomento facoltativo charset, se fornito, deve essere un'istanza di Charset (vedere email.Charset) o il nome di un insieme di caratteri, che verrà convertito in un'istanza di Charset. Un valore None (il caso predefinito) significa che verrà utilizzato il charset fornito al costruttore.

s deve essere una stringa di byte o una stringa Unicode. Se è una stringa di byte (cioè isinstance(s, str) è vero), il charset è la codifica di questa stringa di byte e l'eccezione UnicodeError viene sollevata se la stringa non può essere decodificata con quel charset.

Se s è una stringa Unicode, il charset è un suggerimento che specifica l'insieme dei caratteri nella stringa. In questo caso, quando si genera un'intestazione compatibile con la RFC 2822, utilizzando le regole della RFC 2047, la stringa Unicode verrà codificata utilizzando i seguenti charset in ordine: us-ascii, il charset suggerito, utf-8. Viene utilizzato il primo insieme di caratteri che non solleva un'eccezione UnicodeError.

L'argomento facoltativo errors viene passato attraverso ogni chiamata unicode() o ustr.encode(), ed il valore predefinito è ``strict''.

encode( [splitchars])
Codifica un'intestazione di un messaggio in un formato compatibile con le RFC, possibilmente dividendo le linee lunghe ed incapsulando le parti non ASCII in base64 o in codifica quoted-printable. L'argomento facoltativo splitchars è una stringa contenente i caratteri su cui dividere le linee ASCII lunghe, nel supporto approssimativo all'interruzione sintattica di alto livello specificata dalla RFC 2822. Questo non riguarda le linee codificate secondo l'RFC 2047.

La classe Header fornisce anche un numero di metodi per supportare gli operatori standard e funzioni built-in.

__str__( )
Un sinonimo per Header.encode(). Utile per str(aHeader).

__unicode__( )
Un aiuto per la funzione built-in unicode(). Restituisce l'intestazione come stringa Unicode.

__eq__( other)
Questo metodo permette di confrontare due istanze di Header per l'eguaglianza.

__ne__( other)
Questo metodo permette di confrontare due istanze di Header per la disuguaglianza.

Il modulo email.Header fornisce anche le seguenti utili funzioni.

decode_header( header)
Decodifica il valore di un'intestazione del messaggio senza convertire l'insieme dei caratteri. Il valore dell'intestazoine è header.

Questa funzione restituisce una lista di coppie (decoded_string, charset) contenenti ciascuna delle parti dell'intestazione decodificata. charset è None per le parti non codificate dell'intestazione, altrimenti una stringa in caratteri minuscoli contenente il nome dell'insieme dei caratteri specificato nella codifica della stringa.

Ecco un esempio:

>>> from email.Header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[('p\\xf6stal', 'iso-8859-1')]

make_header( decoded_seq[, maxlinelen[, header_name[, continuation_ws]]])
Crea un'istanza di Header da una sequenza di coppie restituite da decode_header().

decode_header() riceve un valore di intestazione e restituisce una sequenza di coppie nel formato (decoded_string, charset) dove charset è il nome dell'insieme dei caratteri.

Questa funzione prende una di queste coppie di sequenze e restituisce un'istanza di Header. Gli argomenti facoltativi maxlinelen, header_name e continuation_ws sono come nel costruttore di Header.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.