Tabela de conteúdo |
O Debian tem o dovecot na versão 1.0.15 e o backports com mais configurações está na versão 1.2.11 que corrige diversos pequenos problemas como múltiplos campos de senha e melhor definição para quotas, por isso vamos utilizá-lo.
# apt-get install -t lenny-backports dovecot-pop3d dovecot-imapd
feito isso, vamos configurá-lo.
Os arquivos de configuração do Dovecot ficam em /etc/dovecot, nossa intensão é ativar o POP3/IMAP, para isso vamos definir algumas coisas:
com isso em mente vamos editar o arquivo:
# vim/etc/dovecot/dovecot.conf
protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl = yes
ssl_ca_file = /etc/ssl/certs/cacert.pem
ssl_cert_file = /etc/ssl/certs/postfix-crt.pem
ssl_key_file = /etc/ssl/private/postfix-key.pem
verbose_ssl = no
mail_location = maildir:/home/vmail/ufms.br/%u
mail_uid = 500
mail_gid = 500
mail_privileged_group = vmail
first_valid_uid = 500
last_valid_uid = 500
first_valid_gid = 500
last_valid_gid = 500
protocol imap {
mail_max_userip_connections = 10
mail_plugins = quota imap_quota trash
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
mail_plugins = quota
}
protocol managesieve {
}
protocol lda {
postmaster_address = postmaster@ufms.br
mail_plugins = quota trash
sendmail_path = /usr/lib/sendmail
auth_socket_path = /var/run/dovecot/auth-master
}
auth default {
mechanisms = plain login
passdb ldap {
args = /etc/dovecot/dovecot-ldap.conf
}
passdb ldap {
args = /etc/dovecot/dovecot-ldap.conf
}
user = root
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0660
user = vmail
group = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
}
}
}
dict {
quota = pgsql:/etc/dovecot/dovecot-dict-quota.conf
expire = pgsql:/etc/dovecot/dovecot-dict-quota.conf
}
dict_db_config = /etc/dovecot/dovecot-db.conf
plugin {
quota = dict:user::proxy::quota
quota_rule2 = Trash:storage=10240
trash = /etc/dovecot/dovecot-trash.conf
expire = Trash 7 Spam 30
expire_dict = proxy::expire
}
alguns arquivos são adicionais nesta configuração, vamos a eles:
# vim /etc/dovecot/dovecot-ldap.conf
uris = ldaps://ldap.dominio.br dn = cn=reader,dc=dominio,dc=br dnpass = SENHA debug_level = 0 auth_bind = yes auth_bind_userdn = uid=%u,ou=people,dc=dominio,dc=br ldap_version = 3 base = dc=dominio,dc=br scope = subtree user_attrs = mailQuotaSize=quota=maildir:storage user_filter = (&(objectClass=qmailUser)(uid=%u)(mail=*@dominio.br)(accountStatus=active)) pass_attrs = uid=user,userPassword=password pass_filter = (&(objectClass=qmailUser)(uid=%u)(mail=*@dominio.br)(accountStatus=active)) default_pass_scheme = SSHA
isso vai fazer com que sejam buscados os usuários %u cujo e-mail tenha o domínio em questão e a conta esteja ativa. Agora vamos a configuração de quota:
connect = host=localhost dbname=quotadb user=quota password=SENHA
map {
pattern = priv/quota/storage
table = quota
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota
username_field = username
value_field = messages
}
map {
pattern = shared/expire/$user/$mailbox
table = expires
value_field = expire_stamp
fields {
username = $user
mailbox = $mailbox
}
}
e essas informações podem estar tanto no MySQL quanto no PostgreSQL, a tabela por padrão fica:
CREATE TABLE quota ( username varchar(100) not null, bytes bigint not null default 0, messages integer not null default 0, primary key (username) );
e a tabela de expiração:
CREATE TABLE expires ( username varchar(75) not null, mailbox varchar(255) not null, expire_stamp integer not null, primary key (username, mailbox) );
se estivermos usando o PostgreSQL em especial é necessário ainda adicionar as seguintes triggers:
CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION merge_quota() RETURNS TRIGGER AS $$
BEGIN
IF NEW.messages < 0 OR NEW.messages IS NULL THEN
-- ugly kludge: we came here from this function, really do try to insert
IF NEW.messages IS NULL THEN
NEW.messages = 0;
ELSE
NEW.messages = -NEW.messages;
END IF;
return NEW;
END IF;
LOOP
UPDATE quota SET bytes = bytes + NEW.bytes,
messages = messages + NEW.messages
WHERE username = NEW.username;
IF found THEN
RETURN NULL;
END IF;
BEGIN
IF NEW.messages = 0 THEN
INSERT INTO quota (bytes, messages, username)
VALUES (NEW.bytes, NULL, NEW.username);
ELSE
INSERT INTO quota (bytes, messages, username)
VALUES (NEW.bytes, -NEW.messages, NEW.username);
END IF;
return NULL;
EXCEPTION WHEN unique_violation THEN
-- someone just inserted the record, update it
END;
END LOOP;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER mergequota BEFORE INSERT ON quota
FOR EACH ROW EXECUTE PROCEDURE merge_quota();
para as quotas e para a expiração:
CREATE OR REPLACE FUNCTION merge_expires() RETURNS TRIGGER AS $$
BEGIN
UPDATE expires SET expire_stamp = NEW.expire_stamp
WHERE username = NEW.username AND mailbox = NEW.mailbox;
IF FOUND THEN
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER mergeexpires BEFORE INSERT ON expires
FOR EACH ROW EXECUTE PROCEDURE merge_expires();
pronto, vamos agora para a última configuração no Dovecot em si:
# vim /etc/dovecot/dovecot-trash.conf
1 Spam 2 Trash 3 Sent 3 Sent Messages
que define a ordem que as mensagens devem ser apagadas na expiração e a configuração do BDB usado no Dovecot:
# vim /etc/dovecot/dovecot-db.conf
set_tx_max 1000
agora é necessário criar um um usuário para manipular este e-mails, o usuário será chamado de vmail, nas configurações vocês viram que definimos um uid/gid como 500, então:
# mkdir /srv/domains # groupadd -g 500 vmail # useradd -d /srv/domains -g vmail -r -u 500 vmail
feito isso, podemos reinicializar o Dovecot para funcionar como POP3/IMAP para nosso domínio.
Para testar se tudo deu certo, podemos conectar via telnet no serviço e testar a autenticação:
# 'telnet localhost 143 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready. a login USUARIO SENHA <ENTER>
se a resposta for algo como:
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST- EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST- STATUS QUOTA] Logged in
onde o que mais importa é o a OK que significa que o login foi bem sucedido.
Primeiro editamos o arquivo /etc/ssl/openssl.cnf com as nossas configurações. Depois seguimos os passos abaixo.
# /usr/lib/ssl/misc/CA.sh -newca
# /usr/lib/ssl/misc/CA.sh -newreq
# /usr/lib/ssl/misc/CA.sh -sign
depois disso vamos copiar as chaves para seus locais corretos:
# cp demoCA/cacert.pem /etc/ssl/certs/ # openssl rsa -in newkey.pem -out postfix-key.pem # mv postfix-key.pem /etc/ssl/private/ # mv newcert.pem /etc/ssl/certs/postfix-crt.pem # chown root.root /etc/ssl/private/postfix-key.pem # chmod 400 /etc/ssl/private/postfix-key.pem
pronto, as chaves foram geradas.
Edite o arquivo /etc/dovecot/dovecot.conf e adicione a o protocolo managesieve na lista de protocolos:
protocols = imap imaps pop3 pop3s managesieve
altere o seu managesieve de forma a ativá-lo da forma desejada, no nosso caso, queremos que ele rode somente em localhost e se identifique como Cyrus:
protocol managesieve {
listen = localhost:2000
managesieve_implementation_string = Cyrus timsieved v2.2.19
}
como nosso Webmail é local, deixamos o sieve ativo somente para localhost.
Na configuração dos plugins é necessário adicionar as seguintes linhas:
sieve=/home/vmail/dominio.br/%u/dovecot.sieve sieve_dir=/home/vmail/dominio.br/%u/sieve sieve_before = /etc/dovecot/sieve/global/dovecot.sieve
adapte para o seu caso, lembrando que: %d pode ser utilizado para capturar o domínio, para quem utiliza multi-domínios.
Muitas pessoas utilizam o procmail para entregar os e-mails classificados como Spam para seus usuários, já que estamos usando LDA, vamos configurar o Sieve para entrega-los no local correto.
Primero precisamos dizer ao LDA que ele vai utilizar o sieve como plugin, adicione na lista de plugins do LDA o seguinte:
mail_plugins = ... sieve
e defina onde vai ficar o script global de Sieve (também dentro de LDA):
sieve_global_path = /etc/dovecot/sieve/global/dovecot.sieve
depois disso nós configuramos o script para entregar o Spam na caixa de Spam:
# vim /etc/dovecot/sieve/global/dovecot.sieve
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
fileinto "Junk";
}
Agora altere as permissões de leitura para que o usuário vmail possa manipular este arquivo:
# chown -R vmail:vmail /etc/dovecot/sieve/global/ # chmod -R 770 /etc/dovecot/sieve/global/
reinicialize o Dovecot:
# /etc/init.d/dovecot restart
pronto.
--Brivaldo 17h56min de 4 de agosto de 2010 (UTC)