mailcap — Manejo de archivos Mailcap

Código fuente: Lib/mailcap.py


Los archivos mailcap se utilizan para configurar la manera en las que aplicaciones conscientes de formatos MIME como lectores de correo y navegadores web reaccionan a archivos con diferentes tipos MIME. (El nombre «mailcap» viene de la frase «mail capability».) Por ejemplo, un archivo mailcap puede contener una linea como video/mpeg; xmpeg %s. Entonces, si el usuario encuentra un mensaje de correo o un documento web con el tipo MIME video/mpeg, %s será reemplazado por un nombre de archivo (por lo general, uno que pertenezca a un archivo temporal) y el programa xmpeg puede ser iniciado de manera automática para visualizar el archivo.

El formato mailcap está documentado en RFC 1524, «A User Agent Configuration Mechanism For Multimedia Mail Format Information», pero no es un estándar de Internet. Sin embargo, los archivos mailcap tienen soporte en la mayoría de los sistemas Unix.

mailcap.findmatch(caps, MIMEtype, key='view', filename='/dev/null', plist=[])

Retorna una tupla; el primer elemento es una cadena que contiene la línea de comando a ser ejecutada (la cual puede ser pasada a la función os.system()), y el segundo elemento es la entrada mailcap para el tipo MIME proporcionado. Si no se encuentra un tipo MIME que coincida, entonces se retornan los valores de (None, None).

key es el nombre del campo deseado, que representa el tipo de actividad a realizar; el valor por defecto es “view”, ya que en el caso más común se quiere simplemente ver el cuerpo de los datos tecleados en MIME. Otros posibles valores podrían ser “compose” y “edit”, si se quisiera crear un nuevo cuerpo del tipo MIME dado o alterar los datos del cuerpo existente. Consulta RFC 1524 para una lista completa de estos campos.

filename es el nombre de fichero que debe ser sustituido por %s en la línea de comandos; el valor por defecto es '/dev/null' que casi seguro no es lo que quieres, así que normalmente lo anularás especificando un nombre de archivo.

plist puede ser una lista que contenga parámetros con nombre; el valor por defecto es simplemente una lista vacía. Cada entrada de la lista debe ser una cadena que contenga el nombre del parámetro, un signo igual ('=') y el valor del parámetro. Las entradas de mailcap pueden contener parámetros con nombre como %{foo}, que serán reemplazados por el valor del parámetro llamado “foo”. Por ejemplo, si la línea de comandos showpartial %{id} %{number} %{total} estaba en un archivo mailcap, y plist estaba establecido como ['id=1', 'number=2', 'total=3'], la línea de comandos resultante sería 'showpartial 1 2 3'.

En un archivo mailcap, el campo «test» puede especificarse opcionalmente para probar alguna condición externa (como la arquitectura de la máquina, o el sistema de ventanas en uso) para determinar si se aplica o no la línea mailcap. La función findmatch() comprobará automáticamente dichas condiciones y omitirá la entrada si la comprobación falla.

Distinto en la versión 3.8.16: To prevent security issues with shell metacharacters (symbols that have special effects in a shell command line), findmatch will refuse to inject ASCII characters other than alphanumerics and @+=:,./-_ into the returned command line.

If a disallowed character appears in filename, findmatch will always return (None, None) as if no entry was found. If such a character appears elsewhere (a value in plist or in MIMEtype), findmatch will ignore all mailcap entries which use that value. A warning will be raised in either case.

mailcap.getcaps()

Retorna un diccionario que mapea los tipos de MIME a una lista de entradas de archivos mailcap. Este diccionario debe ser pasado a la función findmatch(). Una entrada se almacena como una lista de diccionarios, pero no debería ser necesario conocer los detalles de esta representación.

La información se deriva de todos los archivos mailcap que se encuentran en el sistema. Los ajustes en el archivo mailcap del usuario $HOME/.mailcap anularán los ajustes en los archivos mailcap del sistema /etc/mailcap, /usr/etc/mailcap, y /usr/local/etc/mailcap.

Un ejemplo de uso:

>>> import mailcap
>>> d = mailcap.getcaps()
>>> mailcap.findmatch(d, 'video/mpeg', filename='tmp1223')
('xmpeg tmp1223', {'view': 'xmpeg %s'})