> **Источник:** https://python-all.ru/3.4/library/mailcap.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 19.3. [`mailcap`](https://python-all.ru/3.4/library/mailcap.html#module-mailcap) – Обработка файлов mailcap

**Исходный код:** [Lib/mailcap.py](https://python-all.ru/src/3.4/Lib/mailcap.py)

---

Файлы mailcap используются для настройки того, как MIME-совместимые приложения, такие как почтовые клиенты и веб-браузеры, обрабатывают файлы с различными MIME-типами. (Название «mailcap» происходит от фразы «mail capability».) Например, файл mailcap может содержать строку вида `video/mpeg; xmpeg %s`. Затем, если пользователь встречает электронное письмо или веб-документ с MIME-типом *video/mpeg*, `%s` будет заменён на имя файла (обычно временного), и программа **xmpeg** может быть автоматически запущена для просмотра файла.

Формат mailcap описан в [**RFC 1524**](https://python-all.ru/3.4/library/mailcap.html), «A User Agent Configuration Mechanism For Multimedia Mail Format Information», но не является интернет-стандартом. Однако файлы mailcap поддерживаются в большинстве систем Unix.

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

Возвращает кортеж из двух элементов; первый элемент – строка, содержащая команду для выполнения (которую можно передать в [`os.system()`](https://python-all.ru/3.4/library/os.html#os.system)), а второй элемент – запись mailcap для данного MIME-типа. Если подходящий MIME-тип не найден, возвращается `(None, None)`.

*key* – имя требуемого поля, которое представляет тип выполняемого действия; значение по умолчанию – ‘view’, поскольку в наиболее типичном случае требуется просто просмотреть содержимое данных указанного MIME-типа. Другими возможными значениями могут быть ‘compose’ и ‘edit’, если требуется создать новое содержимое указанного MIME-типа или изменить существующее. Полный список этих полей приведён в [**RFC 1524**](https://python-all.ru/3.4/library/mailcap.html).

*filename* – это имя файла, которое будет подставлено вместо `%s` в командной строке; значение по умолчанию – `'/dev/null'`, что почти наверняка не то, что нужно, поэтому обычно его переопределяют, указав имя файла.

*plist* может быть списком, содержащим именованные параметры; значение по умолчанию – просто пустой список. Каждая запись в списке должна быть строкой, содержащей имя параметра, знак равенства (`'='`) и значение параметра. Записи mailcap могут содержать именованные параметры, например `%{foo}`, которые будут заменены на значение параметра с именем 'foo'. Например, если в файле mailcap была командная строка `showpartial %{id} %{number} %{total}`, и *plist* был установлен в `['id=1', 'number=2', 'total=3']`, то результирующая командная строка была бы `'showpartial 1 2 3'`.

В файле mailcap можно дополнительно указать поле «test» для проверки некоторого внешнего условия (например, архитектуры машины или используемой оконной системы), чтобы определить, применима ли строка mailcap. [`findmatch()`](https://python-all.ru/3.4/library/mailcap.html#mailcap.findmatch) автоматически проверяет такие условия и пропускает запись, если проверка не пройдена.

#### `mailcap.getcaps()`

Возвращает словарь, сопоставляющий MIME-типы со списком записей файла mailcap. Этот словарь должен быть передан функции [`findmatch()`](https://python-all.ru/3.4/library/mailcap.html#mailcap.findmatch). Запись хранится в виде списка словарей, но знать детали этого представления не обязательно.

Информация берётся из всех файлов mailcap, найденных в системе. Настройки в пользовательском файле mailcap `$HOME/.mailcap` переопределяют настройки в системных файлах mailcap `/etc/mailcap`, `/usr/etc/mailcap` и `/usr/local/etc/mailcap`.

Пример использования:

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