1 (07.09.2012 17:02:43 отредактировано kom-pik)

Появилась задача что бы при настройке почтового клиента создавались стандартные папки
- Входящие
- Отправленные
- Исходящие
- удаленные
Реализовал это путем добавления отдельных секций в dovecot.conf

 protocol imap {
  mail_plugins = autocreate
}
plugin {
  autocreate = INBOX.Sent
  autocreate2 = INBOX.Deleted
  autocreate3 = INBOX.Spam
  autocreate4 = INBOX.Junk Mail
  autosubscribe = INBOX.Sent
  autosubscribe2 = INBOX.Deleted
  autosubscribe3 = INBOX.Spam
  autosubscribe4 = INBOX.Junk Mail
}

Дописал INBOX. т.к. использую префикс INBOX.
Создал autocreate_plugin.so в /usr/lib/dovecot/modules/imap с содержимым

/* Copyright (C) 2007 Timo Sirainen, LGPLv2.1 */

/*
   export DOVECOT=~/src/dovecot-1.1.0
   gcc -fPIC -shared -g -Wall -I$DOVECOT -I$DOVECOT/src/lib \
     -I$DOVECOT/src/lib-storage -I$DOVECOT/src/lib-mail \
     -I$DOVECOT/src/lib-imap -DHAVE_CONFIG_H \
     autocreate-plugin.c -o autocreate_plugin.so

   Usage:

   plugin {
     autocreate = Trash
     autocreate2 = Spam
     #autocreate3 = ..etc..
     autosubscribe = Trash
     autosubscribe2 = Spam
     #autosubscribe3 = ..etc..
   }
*/

#include "lib.h"
#include "mail-storage.h"
#include "mail-namespace.h"

#include <stdlib.h>

const char *autocreate_plugin_version = PACKAGE_VERSION;

static void (*autocreate_next_hook_mail_namespaces_created)
   (struct mail_namespace *ns);

static void autocreate_mailboxes(struct mail_namespace *namespaces)
{
   struct mail_namespace *ns;
   char env_name[20];
   const char *name;
   unsigned int i;

   i = 1;
   name = getenv("AUTOCREATE");
   while (name != NULL) {
      ns = mail_namespace_find(namespaces, &name);
      if (ns != NULL) {
         (void)mail_storage_mailbox_create(ns->storage,
                       name, FALSE);
      }

      i_snprintf(env_name, sizeof(env_name), "AUTOCREATE%d", ++i);
      name = getenv(env_name);
   }
}

static void autosubscribe_mailboxes(struct mail_namespace *namespaces)
{
   struct mail_namespace *ns;
   char env_name[20];
   const char *name;
   unsigned int i;

   i = 1;
   name = getenv("AUTOSUBSCRIBE");
   while (name != NULL) {
      ns = mail_namespace_find(namespaces, &name);
      if (ns != NULL)
         (void)mailbox_list_set_subscribed(ns->list, name, TRUE);

      i_snprintf(env_name, sizeof(env_name), "AUTOSUBSCRIBE%d", ++i);
      name = getenv(env_name);
   }
}

static void
autocreate_mail_namespaces_created(struct mail_namespace *namespaces)
{
   if (autocreate_next_hook_mail_namespaces_created != NULL)
      autocreate_next_hook_mail_namespaces_created(namespaces);

   autocreate_mailboxes(namespaces);
   autosubscribe_mailboxes(namespaces);
}

void autocreate_plugin_init(void);
void autocreate_plugin_deinit(void);

void autocreate_plugin_init(void)
{
   autocreate_next_hook_mail_namespaces_created =
      hook_mail_namespaces_created;
   hook_mail_namespaces_created = autocreate_mail_namespaces_created;
}

void autocreate_plugin_deinit(void)
{
   hook_mail_namespaces_created =
      autocreate_next_hook_mail_namespaces_created;
} 

P. S. Это описал если кому интересно и нужно

Если прописать

  autocreate = INBOX.Исходящие
  autocreate2 = INBOX.Спам
  autosubscribe = INBOX.Исходящие
  autosubscribe2 = INBOX.Спам

Почтовый клиент выдает иероглифы т.к. dovecot использует кодировку UTF7

Вопрос следующий, можно ли dovecot научить использовать UTF8, где можно прописать, возможно ли вообще это?