# Устранение неполадок &kmail;

## Введение в &akonadi;

&kmail; активно развивается с 1997 года. За эти годы появилось множество ошибок, и большинство из них уже решено. Информация о старых ошибках содержится на странице пользовательской базы данных &kde; «KMail/FAQ, подсказки и советы». Также посетите главную страницу отслеживания ошибок &kde;, чтобы узнать историю более свежих ошибок.

В настоящий момент (2021) многие из проблем, с которыми сталкиваются пользователи &kmail;, связаны с сервером &akonadi;. &akonadi; — это вспомогательное приложение, работающее как промежуточное звено между &kmail; (и другими приложениями для управления личными данными) и фоновой службой базы данных общего назначения (наиболее распространённый вариант — это «mysqld»). Оно также упрощает обмен данными между процессами различных частей программ для управления личными данными. В зависимости от параметров системы &akonadi; может запускаться во время процедуры загрузки или входа в систему. Также программа может запускаться только после программы для управления личными данными (например, &kmail;, &kaddressbook; или &kontact;).

Предусмотрены две программы, позволяющие взаимодействовать с сервером &akonadi; напрямую: `akonadictl` (программа для управления через терминал) и `akonadiconsole` (программа с графическим интерфейсом). Далее представлена краткая информация об обеих программах.

### Программа управления Akonadictl

Отчёт о состоянии &akonadi; Отчёт о состоянии &akonadi;

Отчёт о состоянии Akonadictl, запущено 32 агента

На снимке экрана изображена одна из команд, которой возможно воспользоваться в программе `akonadictl`. Далее представлены все команды, которые распознаёт `akonadictl`.

    ~$ akonadictl start

Запускает сервер &akonadi;.

    ~$ akonadictl stop

Останавливает сервер &akonadi;.

    ~$ akonadictl restart

Перезапускает сервер &akonadi;.

    ~$ akonadictl status

Выводит отчёт о состоянии, проиллюстрированный на предыдущем снимке экрана.

    ~$ akonadictl instances

Выводит список экземпляров сервера &akonadi; (возможна одновременная работа нескольких экземпляров).

    ~$ akonadictl vacuum

Очищает хранилище данных &akonadi; или хотя бы пытается выполнить очистку.

    ~$ akonadictl fsck

Выполняет проверку целостности файла. Выводимые этой командой данные могут быть достаточно объёмными, особенно если в &kmail; были добавлены собственные папки. Воспользуйтесь этой версией команды (передав выведенные данные к конвейеру grep) для проверки целостности базы данных &akonadi; без генерации лишних данных.

    ~ $ akonadictl fsck 2
    >&1 | grep ^Found
    Found 0 external files.
    Found 0 external parts.
    Found no unreferenced external files.
    Found 0 parts to be moved to external files
    Found 0 parts to be moved to database
    Found 6 collections without RID.
    Found 0 items without RID.
    Found 0 dirty items.

RID — это аббревиатура от RemoteId, названия именуемого поля в таблицах базы mysql. Если есть хотя бы одна запись без RID, есть небольшая проблема, которую следует исправить. Подробнее в разделах «Невозможно извлечь элемент из модуля» и «Исправление записей &kmail; «в обработке» далее.

### Программа Akonadiconsole

Внешний вид akonadiconsole Внешний вид akonadiconsole

Работа Akonadiconsole

Программа `akonadiconsole` предлагает двенадцать различных «окон» внутренней части программ для управления личными данными. Ниже приведено краткое описание для каждой панелей просмотра.

Вкладка Agents.

- Здесь представлен список агентов пользователя (обработчиков).

Вкладка Browse.

- На этой вкладке представлено описание различных коллекций данных, которые сопровождает &akonadi;, организованное в древовидную иерархию, где показано, сколько записей хранится в каждой коллекции.

Вкладка Debugger.

- Здесь возможно включить или выключить режим отладчика и просмотреть журнал отладочных сообщений.

Вкладка Logging.

- Эта вкладка позволяет просмотреть сообщения, отправляемые разными компонентами &akonadi;.

Вкладка DB Browser.

- Эта вкладка позволяет просматривать базы данных mysql. В базе данных представлено множество разных таблиц.

Вкладка DB Console.

- Здесь возможно послать запрос базе данных mysql.

Вкладка Query Debugger.

- На этой вкладке возможно включить или отключить отладочные запросы к базе данных. &kmail; отправляет запросы в базу данных mysql много раз всего за несколько секунд; выходные данные могут занимать большой объём.

Вкладка Job Tracker.

- Программы для управления личными данными выполняют различные функции, инициируя «задачи». Эта вкладка позволяет включить или выключить слежение за этими задачами.

Вкладка Resources Schedulers.

- Эта вкладка позволяет увидеть, какие ресурсы требуются при вызове определённой функции &PIM;. Список ресурсов &akonadi; в используемой системе расположен в каталоге `~/.config/akonadi/`.

Вкладка Notification Monitor.

- Эта вкладка позволяет просматривать уведомления, отправленные разными ресурсами &akonadi;.

Вкладка Item Search.

- Эта вкладка позволяет осуществлять общий поиск. Этот поиск возможно ограничить календарём, контактами, письмом электронной почты или заметкой.

Вкладка Monitors.

- Здесь представлен список всех средств наблюдения, запущенных в &akonadi;, а также их свойства. Наблюдение ведётся за агентами, ресурсами и некоторыми программами.

## При входе в папку &IMAP; появляется сообщение об ошибке «Невозможно извлечь элемент из серверной части»

Для этого есть как минимум две возможные причины. Далее представлены некоторые обходные пути.

Обходной путь 1

- - Измените `~/.local/share/akonadi/mysql.conf`

  - В разделе [mysql] добавьте: `binlog_format=row`

  Если это не помогает, попробуйте второй обходной путь:

Обходной путь 2

- Этот способ заключается в простом перезапуске приложения, чтобы &kmail; смог получить все необходимые данные. Вот возможные шаги:

  Воспользуйтесь комбинацией клавиш &Alt;F2 (&krunner;) или &konsole;, чтобы ввести команду ``kquitapp kmail``, подождите минуту, введите команду ``akonadictl stop``. Ещё раз подождите, введите команду ``akonadictl start``, подождите немного и введите команду ``kmail``. Этот способ завершает работу &kmail; (закрывает все окна), останавливает модуль обработки данных &kmail;, запускает модуль обработки данных &kmail; и перезапускает &kmail;. Наличие стабильного Интернет-соединения значительно повышает шансы на успех. Иногда достаточно просто ввести команду ``kquitapp kmail``, немного подождать и заново запустить &kmail;. Иногда требуется несколько перезапусков. Неизвестно, в чём причина этого, но при плохом Интернет-соединении такое происходит с большей вероятностью.

Обратитесь также к следующему пункту о том, как akonadiconsole может помочь.

## Письма не отправляются, несмотря на отсутствие сообщений об ошибке

Если &kmail; не отправляет письма без сообщений об ошибках, возможно, «завис» ответственный за отправку писем агент. Сначала необходимо убедиться, что имеется надлежащее сетевое подключение для отправки писем.

Чтобы исправить это, попробуйте прервать текущее действие и перезапустить его. Для начала закройте &kmail; с помощью &krunner; (&Alt;F2) или &konsole;, куда следует ввести: ``kquitapp kmail``. Обратите внимание, что стандартное закрытие приложения с помощью &Alt;F4 или Файл Выход не поможет. Подождите минуту и снова запустите &kmail;. Затем запустите akonadiconsole с помощью &krunner; (&Alt;F2) или &konsole;. Откройте Агент диспетчера почты, щёлкните правой кнопкой мыши и в открывшемся контекстном меню отмените текущее действие. Возможно, появится несколько всплывающих окон с сообщениями об ошибке. Вернитесь в &kmail; и воспользуйтесь пунктом меню Файл Отправить из очереди. Теперь всё должно работать. Если это не помогло, вместо отмены текущего действия попробуйте переключить статус подключения Агента диспетчера почты или перезагрузить элементы, о которых описано в обходном пути 2 в проблеме, рассмотренной ранее.

Akonadiconsole может быть весьма полезен в ряде ситуаций, поскольку он показывает все агенты, отдельные компоненты серверной части &kmail;. Возможно останавливать и запускать их, переводить в автономный режим, прерывать текущие действия и так далее. Это может быть очень полезно, когда появляются проблемы при работе с &kmail;.

Иногда Агент диспетчера почты перестаёт функционировать, потому что демон dbus (средство системного уровня для межпроцессных коммуникаций) неправильно работает. Наилучшим выходом из этой ситуации будет перезапуск системы. Демон dbus запускается одним из первых при запуске рабочей среды &kde;, поэтому его нельзя просто закрыть и перезапустить, от него зависит вся среда &plasma;.

## «Невозможно извлечь элемент из модуля ... [LRCONFLICT]»

Эта проблема напрямую связана с ошибкой &akonadi; #283682, которая вызывает проблемы с &kmail; с октября 2011 года. Существует проблема синхронизации и координации в асинхронной обработке фильтров писем. Время от времени правило фильтрации, по которым письма перемещаются в другие папки, «подвисает» и создаёт несколько записей в базе данных для письма, которое требуется переместить. При попытке открытия второй копии такого письма появляется сообщение о том, что «Невозможно получить запись из модуля обработки ... [LRCONFLICT]». Подобное фантомное сообщение невозможно переместить в корзину или удалить с помощью встроенных функций &kmail;, но избавиться от него всё же возможно. Далее представлен способ, позволяющий сделать это.

1. Для начала закройте &kmail;. Возможно, в этом нет необходимости, но лучше предотвратить нежелательные последствия.

2. С помощью `akonadictl` возможно узнать, сколько сообщений повреждено.

       ~ $ akonadictl fsck 2
       >&1 | grep ^Found
       Found 6 external files.
       Found 6 external parts.
       Found no unreferenced external files.
       Found 0 parts to be moved to external files
       Found 0 parts to be moved to database
       Found 6 collections without RID.
       Found 9 items without RID.
       Found 0 dirty items.

   В этом экземпляре найдено девять дублирующихся элементов (без RID).

3. Необходимо знать, как напрямую подключаться к серверу mysql. Чтобы это сделать, воспользуйтесь командами `ps` и `grep`.

       ~ $ ps ux | grep mysql
       david     8788  0.2  0.9 3736292 153936 ?      Sl   06:45   0:16 /usr/sbin/mysqld
       --defaults-file=/home/david/.local/share/akonadi/mysql.conf
       --datadir=/home/david/.local/share/akonadi/db_data/
       --socket=/run/user/1000/akonadi/mysql.socket
       --pid-file=/run/user/1000/akonadi/mysql.pid
       david    24275  0.0  0.0   8056  2144 pts/1    S+   08:24   0:00 grep --colour=auto mysql

4. Вызовите программу-сервер mysql с помощью данных сокета, полученных на шаге 3, и введите три команды mysql, представленные ниже.

       ~ $ mysql --socket=/run/user/1000/akonadi/mysql.socket                 <==
       Welcome to the MariaDB monitor.  Commands end with ; or \g.
       Your MariaDB connection id is 114
       Server version: 10.5.10-MariaDB Source distribution

       Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

       Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

       MariaDB [(none)]> use akonadi;                                         <==
       Reading table information for completion of table and column names
       You can turn off this feature to get a quicker startup with -A

       Database changed
       MariaDB [akonadi]> delete from pimitemtable where remoteid is NULL;    <==
       Query OK, 9 rows affected (0.003 sec)

       MariaDB [akonadi]> \q                                                  <==
       Bye

   Этими тремя командами mysql являются «use akonadi;», «delete from pimitemtable where remoteid is NULL;» и «\q». После команды «mysql --socket= ...» откроется диалог с сервером mysql (или «MariaDB»), который покажет запрос относительно команды — >. Здесь представлен весь диалог. Введённые пользователем строки обозначены символами «<==».

После перезапуска &kmail; эти сообщения-дубликаты исчезнут. Они были лишь фантомами, вызванными NULL-указателями в таблицах базы данных mysql.

## Поддержание чистоты областей вспомогательного хранилища данных &kmail;

&kmail; хранит данные в нескольких разных местах на используемом устройстве. Большинство этих мест расположены где-то в каталоге `~/.local/share/`. Например, в большинстве дистрибутивов Linux Локальные папки находятся в `~/.local/share/local-mail/` . &akonadi; хранит большую часть своих данных в `~/.local/share/akonadi/` .

    ~ $ cd .local/share/akonadi
    ~/.local/share/akonadi $ ls
    Akonadi.error      db_data  file_db_data     mysql.conf  socket-localhost-default
    Akonadi.error.old  db_misc  file_lost+found  search_db

`Akonadi.error` и `Akonadi.error.old` — это файлы журнала, которые создаются, когда &akonadi; перезапускается. Текстовый файл `mysql.conf` — это конфигурационный файл, который работает в качестве модуля &akonadi;. Два каталога, `db_data` и `search_db`, содержат данные самих таблиц базы данных mysql. В каталоге `db_data` также содержится несколько файлов журнала mysql, которые могут быть полезны при возникновении проблем с &akonadi;.

В двух каталогах, `file_db_data` и `file_lost+found`, содержатся вспомогательные данные, которые связаны с асинхронной обработкой. &akonadi; не выполняет автоматическую чистку каталога `file_lost+found`, поэтому, вероятно, время от времени придётся удалять файлы из него вручную (например, с помощью &dolphin;). &akonadi; предпринимает попытку очистить каталог `file_db_data` после объединения всего его данных с файлами основной базы данных, но иногда в каталоге остаётся мусор. Чтобы исправить это, если это случится, воспользуйтесь командой

    find .local/share/akonadi/file_db_data/ -type f | xargs rm

(если каталог `file_db_data` уже чистый, команда «find» возвратит ошибку).

## Исправление записей &kmail; «в обработке»

Проблема напрямую связана с ошибкой &akonadi; #436550, которая стала известна в апреле 2021 года. Эта проблема является результатом записей «в обработке», случайно обнаруженных в `akonadictl fsck`.

    ~ $ akonadictl fsck 2
    >&1 | grep ^Found
    Found 5 external files.
    Found 5 external parts.
    Found no unreferenced external files.
    Found 0 parts to be moved to external files
    Found 0 parts to be moved to database
    Found 6 collections without RID.
    Found 0 items without RID.
    Found 750 dirty items.

Флажок «в обработке» для элементов в pimitemtable (одна из таблиц базы данных &akonadi;) используется для управления некоторыми аспектами асинхронной обработки. Для него устанавливается значение «true», когда есть операции для определённого письма. Чаще всего флажок «в обработке» удаляется через одну-две секунды после того, как заканчивается соответствующая операция.

По не совсем очевидным причинам флажок «в обработке» может быть установлен для десятков и даже сотен писем, как было показано выше. Когда такое происходит, автоматический механизм чистки флажков «зависает» и не может восстановиться. Основная причина появления флажка «в обработке» в таком случае является то, что программа неправильно устанавливает значение поля «remoteid», что делает получение флажка «в обработке» в &kmail; невозможным, несмотря на то, что письмо всё ещё находится на диске, но &kmail; не может его найти.

Возможно, у этой проблемы есть лучшее решение. Если вам удалось решить её оптимальнее, сообщите об этом авторам документации, чтобы усовершенствовать её. Приведённый ниже метод поможет исправить ошибки в базе данных, но он требует довольно много ручной работы.

1. Закройте &kmail; и остановите сервер &akonadi; с помощью команды в терминале: `akonadictl stop` .

2. Создайте резервную копию всех своих электронных писем, для этого рекомендуется воспользоваться экспортом данных PIM. Либо возможно воспользоваться &ark; для создания архива или &dolphin; для создания копии каталога `~/.local/share/local-mail/` где-нибудь на жёстком диске. Наиболее смелые пользователи могут просто переименовать каталог локальных папок в что-нибудь наподобие `local-mail-save` . Убедитесь в наличии резервной копии своих писем перед тем, как продолжить.

3. Рекомендуется также создать резервную копию всех созданных фильтров и убедиться в возможности восстановить созданные вручную папки отправленной почты, папки черновиков или папки шаблонов, связанных с профилями &kmail;. На следующем шаге все пользовательские папки почты будут удалены. поэтому придётся кое-что исправлять после того, как &akonadi; перестроит свои таблиц базы данных.

4. Теперь удалите все папки в каталоге `local-mail` или переименуйте каталог как-нибудь, например, `local-mail-save`. Запустите &kmail;. Это заставит &akonadi; удалить все записи базы данных, связанные с электронной почтой. Отобразятся другие названия папок, но они исчезнут, когда &akonadi; закончит удалять все элементы «в обработке» (и вообще все элементы).

5. Закройте &kmail; и остановите работу сервера &akonadi;, как показано в шаге 1, затем восстановите резервную копию писем, созданную в шаге 2 в каталоге `~/.local/share/local-mail/`.

6. Снова запустите &kmail; и принудите &akonadi; повторно синхронизировать базу данных. Наиболее простой способ сделать это — это воспользоваться пунктом меню &Ctrl;L Файл Проверить почту; &akonadi; автоматически повторно синхронизирует все папки при получении писем. Это займёт несколько минут в зависимости от того, сколько писем было сохранено в папках &kmail;. Когда процесс обновления будет завершён, все элементы «в обработке» исчезнут.

7. Последний этап — восстановление правил фильтрации почты, резервная копия которых была создана на шаге 3, а также проверка, правильно ли установлены параметры всех собственных папок (Папка отправленных писем и так далее) для используемых профилей. Потребуется сбросить все свойства вручную созданных папок. Кроме того, возможно появление уведомления о непрочитанных письмах, которые тоже нужно будет убрать. Зато таблицы базы данных &akonadi; снова будут чистыми.