#!/usr/bin/perl # # mailer.pl -- Um programa simples para enviar dados de um form para # um endereco de e-mail # # http://www.jmarshall.com/easy/cgi/portuguese/ # # IMPORTANTE: CERTIFIQUE-SE DE QUE ESSES DOIS VALORES ESTEJAM # SETADOS CORRETAMENTE PARA VOCE! $mailprog= "/usr/lib/sendmail" ; $recipient= "yourname\@yourhost.com" ; # certifique-se de colocar \ antes de @ # Obter as variaveis de entrada CGI %in= &getcgivars ; # Abrir o processo de mailing open(MAIL, "|$mailprog $recipient") || &HTMLdie("Couldn't send the mail (couldn't run $mailprog).") ; # Imprimir a informacao do header $ENV{'HTTP_REFERER'} || ($ENV{'HTTP_REFERER'}= "your Web site") ; print MAIL "Subject: Form data from the Web\n\n", "The following data was entered at $ENV{'HTTP_REFERER'}:\n\n" ; # Encontrar o tamanho do maior nome de campo, para formatar; incluir # na contagem o caractere ':' $maxlength= 0 ; foreach (keys %in) { $maxlength= length if length > $maxlength ; } $maxlength++ ; # Imprimir cada variavel CGI recebida pelo script, uma por linha. # Isso apenas imprime os campos em ordem alfabetica. Para definir sua # propria ordem, use algo como # foreach ('nome', 'sobrenome', 'fone', 'endereco1', ... ) { foreach (sort keys %in) { # Se um campo tem caracteres newline, provavelmente e' um bloco # de texto; indentar. if ($in{$_}=~ /\n/) { $in{$_}= "\n" . $in{$_} ; $in{$_}=~ s/\n/\n /g ; $in{$_}.= "\n" ; } # Separar com virgulas as selecoes multiplas $in{$_}=~ s/\0/, /g ; # Imprimir os campos, alinhando as colunas printf MAIL "%-${maxlength}s %s\n", "$_:", $in{$_} ; } # Fechar o processo e enviar os dados close(MAIL) ; # Imprimir uma resposta HTML para o usuario print <

Your data has been sent.

EOF exit ; #-------------- inicio do modulo &getcgivars(), copiado ------------- # Ler todas as variaveis CGI para dentro de um array associativo. # Se multiplos campos de entrada tiverem o mesmo nome, serao concatenados em # um elemento do array e delimitados com o caractere \0 (isso falha se # a entrada contiver algum caractere \0, muito improvavel mas # conceitualmente possivel). # Atualmente suporta apenas Content-Type de application/x-www-form-urlencoded. sub getcgivars { local($in, %in) ; local($name, $value) ; # Primeiro, ler a cadeia inteira de variaveis CGI e armazenar em $in if ( ($ENV{'REQUEST_METHOD'} eq 'GET') || ($ENV{'REQUEST_METHOD'} eq 'HEAD') ) { $in= $ENV{'QUERY_STRING'} ; } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { if ($ENV{'CONTENT_TYPE'}=~ m#^application/x-www-form-urlencoded$#i) { length($ENV{'CONTENT_LENGTH'}) || &HTMLdie("No Content-Length sent with the POST request.") ; read(STDIN, $in, $ENV{'CONTENT_LENGTH'}) ; } else { &HTMLdie("Unsupported Content-Type: $ENV{'CONTENT_TYPE'}") ; } } else { &HTMLdie("Script was called with unsupported REQUEST_METHOD.") ; } # Resolver e decodificar pares nome/valor em %in foreach (split('&', $in)) { s/\+/ /g ; ($name, $value)= split('=', $_, 2) ; $name=~ s/%(..)/chr(hex($1))/ge ; $value=~ s/%(..)/chr(hex($1))/ge ; $in{$name}.= "\0" if defined($in{$name}) ; # concatenar multiplas vars $in{$name}.= $value ; } return %in ; } # Morrer, colocando na saida a pagina de erro HTML # Se nao houver $title, usar um titulo default sub HTMLdie { local($msg,$title)= @_ ; $title || ($title= "CGI Error") ; print < $title

$title

$msg

EOF exit ; } #-------------- fim do modulo &getcgivars() --------------------------