Upload
otavio-fernandes
View
1.187
Download
2
Embed Size (px)
DESCRIPTION
Apresentação feita no YAPC::Brasil 2009, falando sobre como é poderoso e simples extender as funcinalidades do Amavisd-New, utilizando a sua linguagem padrão de desenvolvimento: Perl.
Citation preview
Extendendoo Amavisd-New
YAPC::Brasil 2009, Rio de Janeiro, RJ
Friday, October 30, 2009
Quem?
Otávio Fernandes;
[email protected] / [email protected]
http://blog.emresumo.com
Líder, São Paulo Perl Mongers;
Friday, October 30, 2009
Minha História com Perl
Final de 2006;
Na época, as minhas principais linguagens eram: C, C++ e Shell Script;
Estava construindo um appliance de Anti-Spam... logo Amavisd-New;
Friday, October 30, 2009
Amavisd-New
A necessidade de entender como este software funciona, foi o que me levou a estudar e amar o Perl;
Perl, não existe melhor linguagem para o tratamento de email;
Friday, October 30, 2009
O que ele é?
Interface entre o MTA e anti-spam/anti-vírus;
Mail part decoder/unpacker;
Quarentenas (SQL/Local/Forward);
Log e Reporting para o SQL;
Friday, October 30, 2009
Quais as vantagens?MUITAS features;
Extensível;
Respeita os padrões (SMTP, MIME, DSN, etc);
Tolerante a falhas:
Verifica o estado de cada operação;
Se houver erro, o email permanece com o MTA;
Friday, October 30, 2009
Performance
Não é tão rápido quando se ele fosse escrito em C;
Porem, permite escalar;
Trabalha com daemons (conforme o setup, você usa mais instâncias);
200ms * N;
Friday, October 30, 2009
Performance Real:1938 msgs/min
Friday, October 30, 2009
Arquitetura do Amavisd / Postfix
Friday, October 30, 2009
Afinal, como extender?
Todos os arquivos de configuração são scripts Perl;
include_config_files("/usr/local/etc/amavis_custom.pm") if ( -e "/usr/local/etc/.pm" );
package Amavis::Custom;
Friday, October 30, 2009
Métodos
new;
checks;
before_send;
after_send;
mail_done;
Friday, October 30, 2009
Exemplo
Friday, October 30, 2009
if ($must_exec_action) { do_log( $cll, "CUSTOM: must_exec_action %d", $must_exec_action );
# redirecting to another recipient $r->recip_addr_modified( $mail_rules->{mailRedirectTo} ) if ( $mail_rules->{mailRedirectTo} );
# rejecting mail for sender if ( $mail_rules->{mailReject} =~ /(true|1)/i ) { do_log( $cll, "CUSTOM: reject this mail for '%s'", ( $mail_rules->{description} ) ? $mail_rules->{description} : 'no_description' ); for my $r ( @{ $msginfo->per_recip_data } ) { $r->add_contents_category( CC_BANNED, 0 ) if !$r->bypass_banned_checks; $r->banning_reason_short( ( $mail_rules->{description} ) ? $mail_rules->{description} : 'no_descption' ); $r->banned_parts( ['MAIL'] ); } $msginfo->add_contents_category( CC_BANNED, 0 ); }}
Friday, October 30, 2009
Testes?
TDD;
Unit Tests;
Testes de Aceitação com Fixtures;
Friday, October 30, 2009
Perguntas?
Friday, October 30, 2009
Obrigado :-)
Friday, October 30, 2009