Usei abordagens um pouco diferentes, mas que resolveu o que precisava.
CONFIGURAÇÃO E MÓDULOS
------------------------------------------------------------------------------------------------
Módulos ativos e configuração do Postfix:
svrpostfix:/etc/postfix # postconf -m
btree
cidr
environ
hash
internal
ldap
mysql
nis
pcre
proxy
regexp
sdbm
static
tcp
Unix
svrpostfix:/etc/postfix # postconf -n
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
allow_min_user = no
biff = no
bounce_queue_lifetime = 1d
broken_sasl_auth_clients = yes
canonical_maps =
command_directory = /usr/sbin
config_directory = /etc/postfix
content_filter = smtp-amavis:[127.0.0.1]:10024
daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
defer_transports =
disable_dns_lookups = no
disable_mime_output_conversion = no
disable_vrfy_command = yes
enable_original_recipient = no
home_mailbox = Maildir/
html_directory = /usr/share/doc/packages/postfix-doc/html
inet_protocols = ipv4
mail_spool_directory = /var/mail
mailbox_command = /usr/lib/dovecot/deliver
mailbox_size_limit = 0
mailbox_transport =
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
masquerade_classes = envelope_sender, header_sender, header_recipient
masquerade_domains =
masquerade_exceptions = root
maximal_backoff_time = 4000s
maximal_queue_lifetime = 1d
message_size_limit = 15728640
message_strip_characters = \0
minimal_backoff_time = 300s
mydestination = $myhostname, localhost, localhost.localdomain,
localhost.$myhostname
mydomain = dominio.com
myhostname = svrpostfix.dominio.com.br
mynetworks = 127.0.0.0/8, 10.1.11.0/24
mynetworks_style = class
myorigin = svrpostfix.dominio.com.br
newaliases_path = /usr/bin/newaliases
proxy_read_maps = $canonical_maps $lmtp_generic_maps
$local_recipient_maps $mydestination $mynetworks $recipient_bcc_maps
$recipient_canonical_maps $relay_domains $relay_recipient_maps
$relocated_maps $sender_bcc_maps $sender_canonical_maps $smtp_generic_maps
$smtpd_sender_login_maps $transport_maps $virtual_alias_domains
$virtual_alias_maps $virtual_mailbox_domains $virtual_mailbox_maps
$smtpd_sender_restrictions
queue_run_delay = 300s
readme_directory = /usr/share/doc/packages/postfix-doc/README_FILES
recipient_bcc_maps =
proxy:mysql:/etc/postfix/mysql/recipient_bcc_maps_domain.cf,
proxy:mysql:/etc/postfix/mysql/recipient_bcc_maps_user.cf
recipient_delimiter = +
relay_domains = $mydestination,
proxy:mysql:/etc/postfix/mysql/relay_domains.cf
sample_directory = /usr/share/doc/packages/postfix-doc/samples
sender_bcc_maps =
proxy:mysql:/etc/postfix/mysql/sender_bcc_maps_domain.cf,
proxy:mysql:/etc/postfix/mysql/sender_bcc_maps_user.cf
sender_canonical_maps =
sendmail_path = /usr/sbin/sendmail
setgid_group = maildrop
smtp_data_init_timeout = 240s
smtp_data_xfer_timeout = 600s
smtp_enforce_tls = no
smtp_sasl_auth_enable = no
smtp_use_tls = no
smtpd_client_restrictions =
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_enforce_tls = no
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,permit_sasl_authenticated,
check_helo_access pcre:/etc/postfix/helo_access.pcre
smtpd_recipient_restrictions = reject_unknown_sender_domain,
reject_unknown_recipient_domain, reject_non_fqdn_sender,
reject_non_fqdn_recipient, reject_unlisted_recipient,
check_policy_service inet:127.0.0.1:7777, permit_mynetworks,
permit_sasl_authenticated, reject_unauth_destination,
reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname,
check_policy_service inet:127.0.0.1:10031
smtpd_reject_unlisted_recipient = yes
smtpd_reject_unlisted_sender = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = no
smtpd_sasl_local_domain =
smtpd_sasl_path = ./dovecot-auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sender_login_maps =
proxy:mysql:/etc/postfix/mysql/sender_login_maps.cf
smtpd_sender_restrictions = permit_mynetworks,
reject_sender_login_mismatch, permit_sasl_authenticated
smtpd_tls_CAfile = /etc/ssl/certs/iRedMail_CA.pem
smtpd_tls_cert_file = /etc/ssl/certs/iRedMail_CA.pem
smtpd_tls_key_file = /etc/ssl/private/iRedMail.key
smtpd_tls_loglevel = 0
smtpd_tls_security_level = may
smtpd_use_tls = no
strict_8bitmime = no
strict_rfc821_envelopes = no
tls_random_source = dev:/dev/urandom
transport_maps = proxy:mysql:/etc/postfix/mysql/transport_maps_user.cf,
proxy:mysql:/etc/postfix/mysql/transport_maps_domain.cf,
proxy:hash:/etc/postfix/transport
unknown_local_recipient_reject_code = 550
virtual_alias_domains =
virtual_alias_maps =
proxy:mysql:/etc/postfix/mysql/virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/mysql/domain_alias_maps.cf,
proxy:mysql:/etc/postfix/mysql/catchall_maps.cf,
proxy:mysql:/etc/postfix/mysql/domain_alias_catchall_maps.cf,
ldap:/etc/postfix/ldap.accounts, hash:/etc/postfix/virtual_alias_domains
virtual_gid_maps = static:303
virtual_mailbox_base = /vmail
virtual_mailbox_domains =
proxy:mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf,
proxy:ldap:/etc/postfix/ldap.accounts
virtual_minimum_uid = 303
virtual_transport = dovecot
virtual_uid_maps = static:303
Busca de endereços de email no Active Directory, abordagem #1:
------------------------------------------------------------------------------------------------
Testei duas configurações, com a finalidade de para buscar endereços de emails
válidos no Active Directory. Na primeira abordagem, para cada mensagem recebida
é feita uma busca no Active Directory:
svrpostfix:/etc/postfix # cat main.cf | grep ldap.accou
virtual_alias_maps =
proxy:mysql:/etc/postfix/mysql/virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/mysql/domain_alias_maps.cf,
proxy:mysql:/etc/postfix/mysql/catchall_maps.cf,
proxy:mysql:/etc/postfix/mysql/domain_alias_catchall_maps.cf,
ldap:/etc/postfix/ldap.accounts, hash:/etc/postfix/virtual_alias_domains
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf,
proxy:ldap:/etc/postfix/ldap.accounts
svrpostfix:/etc/postfix # cat ldap.accounts
server_host = ldap://IP.DC.Y.Z:3268
search_base = dc=dominio,dc=com,dc=br
version = 3
query_filter = (&(objectClass=user)(mail=%s))
result_attribute = sAMAccountName
result_format = %[email protected]
bind = yes
bind_dn = [email protected]
bind_pw = <Senha KeePass>
timeout = 20
Busca de endereços de email no Active Directory, abordagem #2:
------------------------------------------------------------------------------------------------
A segunda abordagem, que se mostrou mais efetiva, faz a busca agendada no AD de
todas as contas de emails ativos (principal, aliases e grupos) e criar um mapa
local para o transporte. A vantagem é a diminuição do tráfego junto aos
controladores de domínio, fazendo apenas duas consultas ao dia e em horários
não-conflitantes com usuários. É usado um script em Perl que faz a alimentação
desse arquivo (abaixo):
use Net::LDAP;
use Net::LDAP::Control::Paged;
use Net::LDAP::Constant ( "LDAP_CONTROL_PAGED" );
$VALID = "/etc/postfix/transport";
$dc1="controlador1.dominio.com.br";
$dc2="controlador2.dominio.com.br";
$hqbase="dc=dominio,dc=com,dc=br";
$user="CN=Serviços SMTP Active
Directory,OU=OU-Servicos,DC=dominio,DC=com,DC=br";
$passwd="<Senha KeePass>";
$noldapserver=0;
$ldap = Net::LDAP->new($dc1) or
$noldapserver=1;
if ($noldapserver == 1) {
$ldap = Net::LDAP->new($dc2) or
die "Error connecting to specified domain controllers $@ \n";
}
$mesg = $ldap->bind ( dn => $user,
password =>$passwd);
if ( $mesg->code()) {
die ("error:", $mesg->code(),"\n","error name:
",$mesg->error_name(),
"\n", "error text: ",$mesg->error_text(),"\n");
}
$page = Net::LDAP::Control::Paged->new( size => 990 );
@args = ( base => $hqbase,
filter => "(& (mailnickname=*) (| (&(objectCategory=person)
(objectClass=user)(!(homeMDB=*))(!(msExchHomeServerName=*)))
(&(objectCategory=person)(objectClass=user)(|(homeMDB=*)
(msExchHomeServerName=*)))(&(objectCategory=person)(objectClass=contact))
(objectCategory=group)(objectCategory=publicFolder)(objectClass=msExchDynamicDistributionList)
))",
control => [ $page ],
attrs => "proxyAddresses",
);
my $cookie;
while(1) {
my $mesg = $ldap->search( @args );
foreach my $entry ( $mesg->entries ) {
my $name = $entry->get_value( "cn" );
foreach my $mail ( $entry->get_value( "proxyAddresses" ) ) {
if ( $mail =~ s/^(smtp|SMTP)://gs ) {
push(@valid, $mail." smtp:exchange\n");
}
}
}
$mesg->code and last;
my($resp) = $mesg->control( LDAP_CONTROL_PAGED ) or last;
$cookie = $resp->cookie or last;
$page->cookie($cookie);
}
if ($cookie) {
$page->cookie($cookie);
$page->size(0);
$ldap->search( @args );
die("LDAP query unsuccessful");
}
open VALID, ">$VALID" or die "CANNOT OPEN $VALID $!";
print VALID @valid;
close VALID;
Trecho do arquivo criado pelo script getadsmtp.pl:
------------------------------------------------------------------------------------------------
svrpostfix:/etc/postfix # cat transport
[email protected] smtp:exchange
[email protected] smtp:exchange
[email protected] smtp:exchange
[email protected] smtp:exchange
(...)
[email protected] smtp:exchange
[email protected] smtp:exchange
[email protected] smtp:exchange
[email protected] smtp:exchange
Agendamento para busca de emails e atualização do mapa
------------------------------------------------------------------------------------------------
30 12,18 * * * /etc/postfix/getadsmtp.pl >/dev/null
40 12,18 * * * /usr/sbin/postmap /etc/postfix/transport >/dev/null
-----Mensagem original-----
De: [email protected]
[mailto:[email protected]] Em nome de vic
Enviada em: terça-feira, 23 de agosto de 2011 14:47
Para: Grupo de Usuarios Postfix do Brasil
Assunto: Re: [Postfix-BR] RES: RES: RES: Postfix com MySQL: como entregar parte
localmente e o restante em outro servidor
Em ter 23 ago 2011, às 12:47:27, Adauto Soares da Silva escreveu:
> Eu tinha até testado dessa forma, mas acabo recebendo o erro abaixo depois
> de excluir a entrada e recarregar o Postfix:
>
> 5.1.1 <[email protected]>: Recipient address rejected:
> User unknown in virtual mailbox table;
>
> Continua nesse erro 550 e fiz vários ajustes no transporte. Fica como se o
> Postfix o ignorasse. Eu te agradeço pela ajuda e tem razão sobre VIRTUAL. O
> man dele explicita sobre o redirecionamento pra outro domínio, não para o
> mesmo servidor. Eu tinha testado com live.com.
>
> # @domain address, address, ...
> # Redirect mail for other users in domain to
> address.
>
> O transporte é que está pegando.
>
Para resolver o erro de usuário não existe, basta você adicionar no seu
virtual_mailbox_maps e virtual_mailbox_domains um hash ou consulta no seu
servidor exchange para que o postfix saiba os usuários que existem lá.
--
vic
http://choppnerd.com
_______________________________________________
Postfix-BR mailing list
[email protected]
http://listas.softwarelivre.org/mailman/listinfo/postfix-br
Essa mensagem e anexos são endereçados exclusivamente ao remetente acima
indicado, podendo conter dados confidenciais. É proibido a pessoas não
autorizadas, sob qualquer forma ou pretexto, utilizá-los, divulgá-los,
alterá-los, de forma impressa ou copiada, total ou parcialmente. Caso tenha a
recebido erroneamente, por favor, notifique o remetente e providencie imediata
exclusão da original e de qualquer cópia. O uso impróprio será tratado conforme
as normas da empresa e da legislação em vigor.
Esta mensagem expressa o posicionamento pessoal do remetente e não reflete
necessariamente a opinião da Mútua.
_______________________________________________
Postfix-BR mailing list
[email protected]
http://listas.softwarelivre.org/mailman/listinfo/postfix-br