mailcap — Manejo de archivos Mailcap

Código fuente: Lib/mailcap.py

Obsoleto desde la versión 3.11, se eliminará en la versión 3.13: El módulo mailcap está obsoleto (ver PEP 594 para más detalles). El módulo mimetypes proporciona una alternativa.


Los archivos Mailcap se utilizan para configurar cómo las aplicaciones compatibles con MIME, como los lectores de correo y los navegadores web, reaccionan a los archivos con diferentes tipos de MIME. (El nombre «mailcap» se deriva de la frase «capacidad de correo»). Por ejemplo, un archivo mailcap puede contener una línea como video/mpeg; xmpeg %s. Luego, si el usuario encuentra un mensaje de correo electrónico o documento web con el tipo MIME: mimetype: video / mpeg, %s será reemplazado por un nombre de archivo (generalmente uno que pertenezca a un archivo temporal) y el programa xmpeg se puede iniciar automáticamente para ver el archivo.

El formato mailcap está documentado en RFC 1524, «Un mecanismo de configuración de agente de usuario para información de formato de correo multimedia», pero no es un estándar de Internet. Sin embargo, los archivos mailcap son compatibles con 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.11: Para evitar problemas de seguridad con los metacaracteres de shell (símbolos que tienen efectos especiales en una línea de comando de shell), findmatch se negará a inyectar caracteres ASCII que no sean alfanuméricos y @+=:,./-_ en la línea de comando retornada.

Si aparece un carácter no permitido en filename, findmatch siempre retornará (None, None) como si no se hubiera encontrado ninguna entrada. Si dicho carácter aparece en otro lugar (un valor en plist o en MIMEtype), findmatch ignorará todas las entradas mailcap que utilicen ese valor. Se generará un warning en cualquier caso.

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'})