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)

|