LG_jc.gif (3670 bytes)
 






Atualizada às terças

Programando um cliente de mail - Parte 3

Continuando nosso projeto do programa para enviar e-mails, inicialmente definiremos variáveis para as tres caixas de entrada. Usaremos os nomes
mail(from), mail(to) e mail(subject) para as caixas, respectivamente. A razão pela qual definimos variáveis em forma de "arrays" é devido à facilidade com
que manipulamos estes, além de nos livramos do perigo de termos mais de uma variável com o mesmo nome (especialmente quando o programa começa a ficar muito
grande).

Usaremos também as variáveis mail(host) para o nome do servidor smtp, provavelmente o seu provedor, mail(user) para o seu "username" e mail(addr)
para o seu endereço (tipo user@provedor.dominio). Posteriormente poderemos construir um diálogo que nos permita definir visualmente estas variáveis de
configuração. Por enquanto deixaremos a configuração pré-definida, modificável com um editor de textos.

Os botões "limpa" e "saida" têm funções bastante simples. O primeiro simplesmente apaga todo o texto contido no widget tipo "text" central da nossa
interface. O segundo pode ser a princípio simplesmente um comando "exit". Para a apagar todo o conteúdo do "text", primeiramente definimos um alias para
o widget, digamos "msg", e fazemos "$widget(msg) delete 0.0 end" o comando associado ao botão "limpa".

O botão que realmente faz tudo é o "envia", que deverá contactar o servidor conforme os protocolos descritos na semana passada e enviará todo o texto da mensagem. Dividimos o seu funcionamento em tres procedures: connect, mailcmd e sendmsg (tabela 1).  A proc "connect" efetua a conexão com o servidor,
levando em conta que a porta 25 é a usada para smtp, e configura esse canal para funcionar no modo bloqueado (trava até receber os dados) com armazenamento
de uma linha por vez. Em seguida, "connect" aguarda a mensagem de conexão enviada pelo servidor e retorna.

A proc "mailcmd" envia um comando e aguarda a resposta, simplesmente. Evita que façamos a repetição do mesmo código diversas vezes nas outras procedures.
Finalmente, a procedure "sendmsg" envia cada comando discutido na semana passada: MAIL, RCPT, DATA e em seguida envia todo o conteúdo do corpo da
mensagem, finalizando com um ponto ".".  Essa última procedure será o comando executado pelo botão "envia".

Tabela 1

proc connect {} {
            global mail
            set mail(chan) [socket $mail(host) 25]
            fconfigure $mail(chan) \
                        -blocking 1 -buffering line
            gets $mail(chan)
}

proc mailcmd {s} {
            global mail
            puts $mail(chan) $s
            gets $mail(chan)
}

proc sendmsg {} {
            global mail widget
            connect
            mailcmd "MAIL From: $mail(from)"
            mailcmd "RCPT To: $mail(to)"
            mailcmd "DATA"
            puts $mail(chan) [$widget(msg) get 0.0 end]
            mailcmd "."
            close $mail(chan)
}

Anteriores

Programando um cliente de e-mail (II) (12/10/1999)
Programando um cliente de e-mail (I)
(05/10/1999)
Visual Tcl Parte 3
(28/09/1999)
Visual Tcl Parte 2
(21/09/1999)
O Visual Tcl 
(14/09/99)
Programando para Linux (08/09/1999)