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:
[s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]]) |
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().
s[, charset[, errors]]) |
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''.
[splitchars]) |
La classe Header fornisce anche un numero di metodi per supportare gli operatori standard e funzioni built-in.
) |
str(aHeader)
.
) |
other) |
other) |
Il modulo email.Header fornisce anche le seguenti utili funzioni.
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')]
decoded_seq[, maxlinelen[, header_name[, continuation_ws]]]) |
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.