Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Можно заглянуть в реализацию sort_and_deliver и найти там подтверждение догадки.
В delivery->mailbox по умолчанию передается [null]. Таким образом, задача сводится к тому, чтобы, проанализировав заголовки сообщения, передать в delivery->mailbox имя каталога IMAP. Заголовки сообщения функция insert_messages получает в виде структуры headerfields.
После того как исходные данные для определения каталога назначения и параметр, в который нужно передать имя каталога, определены, можно реализовать функцию, которая и будет выполнять эту задачу.
Вызов функции будет выглядеть так:
trace(TRACE_DEBUG,
"%s, %s: calling sort_and_deliver for useridnr [%llu]",
__FILE__, __func__, useridnr);
dsn_result = sort_and_deliver(tmpmsgidnr, msgsize, useridnr, db_get_mailbox_from_filters(useridnr, headerfields, delivery->mailbox));
Прототип функции, который мы поместим в db.h:
char *db_get_mailbox_from_filters(u64_t useridnr, struct list *headerfields, const char *mailbox);
При реализации функции необходимо использовать следующую таблицу:
CREATE TABLE dbmail_filters (
user_id INT8 REFERENCES dbmail_users(user_idnr) ON DELETE CASCADE ON UPDATE CASCADE,
filter_id INT8,
filter_field varchar(128) NOT NULL,
filter_value varchar(255) NOT NULL,
mailbox varchar(100) NOT NULL,
PRIMARY KEY (user_id, filter_id)
);
CREATE INDEX dbmail_user_id_idx ON dbmail_filters(user_id);
CREATE INDEX dbmail_filter_id_idx ON dbmail_filters(filter_id);
В качестве образца чтения таблицы из БД можно использовать функцию db_get_users_from_clientid из db.c. В результате реализация функции db_get_mailbox_from_filters в файле db.c будет выглядеть так:
char *db_get_mailbox_from_filters(u64_t useridnr, struct list *headerfields, const char *mailbox)
{
trace(TRACE_MESSAGE, "%s, %s: default mailbox [%s]", __FILE__, __func__, mailbox);
if (mailbox == NULL)
{
unsigned i = 0;
unsigned num_filters = 0;
snprintf(query, DEF_QUERYSIZE,
"SELECT filter_field, filter_value, mailbox FROM dbmail_filters WHERE user_id = '%llu' ORDER BY filter_id",