Decodificare il subject di una email con Google App Engine

Pubblicato: 13 maggio 2010 in Python
Tag:,

Questo post è un’appendice all’articolo Email in ingresso con Google App Engine.

Ci dovevamo arrivare, prima o poi, ricordo chiaramente di aver parlato di questo medesimo argomento con Max ed il giovane Вячеслав Молотов il 23 febbraio del 1917 in una fabbrica di Pietrogrado.
Il subject di una email non è soggetto (!) alle arcane leggi dell’encoding a cui vengono sottoposti il body e gli allegati per il semplice motivo che lo standard, definito nel famigerato RFC 822, non gli dà il tempo materiale per dichiarare con quale encoding è stato codificato (l’header è semplicemente ‘Subject: ‘ ad inizio riga seguito da una stringa arbitraria). E così per ovviare ai progettisti americani ed americanocentrici si è ricorsi ad un’estensione, definita nell’RFC 2047, nella quale si definisce come cavolo fare a dare ai subject delle email una parvenza umana (e se ci arrabbiamo noi figuratevi un giapponese).

La soluzione è fondamentalmente questa: il subject che contiene caratteri non ASCII si compone così:

=?<charset>?<encoding>?<data>?=

dove con ‘charset’ si intende il charset, con ‘encoding’ si intende ‘Q’ oppure ‘B’ e con ‘data’ si intende il subject vero e proprio codificato in BASE64 se l’encoding è ‘B’ oppure in Quoted Printable se l’encoding è ‘Q’.

Per esempio:

=?ISO-8859-1?Q?Il_colpevole_=E8_il_majordomo?=

Scrivere un parser convincente in qualunque linguaggio è abbastanza semplice, se si usa Python non ce n’è bisogno perché c’è già (copio il codice dai commenti di App Engine Recipe – Receive Mail):

from email.header import decode_header

# Ricordate? in message.subject ci finiva incredibilmente il subject
encodedsubject = decode_header(message.subject)
subj = encodedsubject[0][0] # E potremmo anche finire qui
encoding = encodedsubject[0][1]
if encoding:
    subj = subj.decode(encoding)
if not isinstance(subj, unicode):
    subj = unicode(subj)

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...