Ir ao conteúdo

SMTP com Winsock no Visual Basic


Pulllga

Posts recomendados

Postado

Olá, sou o Pulllga,

Estou com um problema, eu implementei e-mail usando Winsock na minha aplicação, no começo funcionava perfeito, mas depois de um tempo parou de funcionar, não vejo nada de errado.

A função "Base64Encode" é pra criptografar o usuário e senha na base 64.

O problema, é que eu consigo iniciar, faço a conexão e o servidor me retorna o código 220, mas quando faço a verificação do código para enviar a segunda parte, ocorre tudo bem, mas parece que o Winsock não envia o comando "HELO", ai fica parado no 220!!!

A variável dados é o único comando no DataArrival do Winsock, ela armazena a resposta do servidor.

Alguém consegue ver o erro do script?

Lembrando que ele funcionou por um tempo e depois parou!!!

Grato pela ajuda. :D:D:D

Private Sub timMai_Timer()

On Error GoTo MailErro

If inicializa > 10 Then

'Termina a conexão com o servidor

If (Mid(dados, 1, 3) = "250") And (xver = 11) Then

winEma.SendData ("QUIT" + Chr(13))

xver = xver + 1

If opcaoe(8) <> True Then

DoEvents

MsgBox ("Mensagem Enviada!")

DoEvents

End If

timMai.Enabled = False

End If

'Manda . para o servidor indicando o fim da mensagem

If (xver = 10) Then

winEma.SendData ("." + Chr(13))

xver = xver + 1

End If

'Envia a mensagem

If marMsg = 1 Then

If (Mid(dados, 1, 3) = "354") And (xver = 9) Then

'Envia mensagem com statisticas do No-Break

winEma.SendData (msgTexto + Chr(13) + msgFal + Chr(13))

xver = xver + 1

End If

Else

If (Mid(dados, 1, 3) = "354") And (xver = 9) Then

'Envia mensagem simples

winEma.SendData (msgTexto + Chr(13))

xver = xver + 1

End If

End If

'Envia o assunto da mensagem

If (Mid(dados, 1, 3) = "354") And (xver = 8) Then

winEma.SendData ("Subject: Falha de Equipamento!" + Chr(13))

xver = xver + 1

End If

'Envia DATA para o servidor para iniciar a transmissão da mensagem

If (Mid(dados, 1, 3) = "250") And (xver = 7) Then

winEma.SendData ("DATA" + Chr(13))

xver = xver + 1

End If

'Envia RCPT TO: para o servidor + nome do destinatario

If (Mid(dados, 1, 3) = "250") And (xver = 6) Then

winEma.SendData ("RCPT TO: <" + msgPara + ">" + Chr(13))

xver = xver + 1

End If

'Envia MAIL FROM: para o servidor + dominio e E-Mail do remetente

If (Mid(dados, 1, 3) = "235") And (xver = 5) Then

winEma.SendData ("MAIL FROM: <" + Mid(emaSMTP, InStr(1, emaSMTP, "@", 1), Len(emaSMTP)) + ":" + emaSMTP + ">" + Chr(13))

xver = xver + 1

End If

'Envia a senha do usuário criptografado na base64 para o servidor

If (Mid(dados, 1, 3) = "334") And (xver = 4) Then

winEma.SendData (Base64Encode(senSMTP) + Chr(13))

xver = xver + 1

End If

'Envia o nome do usuário já criptografado na base64 para o servidor smtp

If (Mid(dados, 1, 3) = "334") And (xver = 3) Then

winEma.SendData (Base64Encode(usuSMTP) + Chr(13))

xver = xver + 1

End If

'Envia AUTH LOGIN para iniciar autenticação

If (Mid(dados, 1, 3) = "250") And (xver = 2) Then

winEma.SendData ("AUTH LOGIN" + Chr(13))

xver = xver + 1

End If

'Envia HELO para o servidor + o nome do servidor de E-Mail

If (Mid(dados, 1, 3) = "220") And (xver = 1) Then

winEma.SendData ("HELO " + usuSMTP + Chr(13))

xver = xver + 1

End If

'Inicia conexão com o servidor de E-Mail

If xver = 0 Then

winEma.Close

winEma.Connect serSMTP, porSMTP

xver = xver + 1

End If

If winEma.State = 0 Then

End If

'Desliga o timer se não houver resposta do servidor de e-mail e exibe mensagem

If (dados = "") And (xver > 1) Then

timMai.Enabled = False

MsgBox ("Sem conexão com o servidor de E-Mail - " + serSMTP)

winEma.Close

'Zera a variável para tentar novamente

End If

'Verifica por qualquer erro na conexão e fecha a mesma

If (Mid(dados, 1, 1) = "4") Or (Mid(dados, 1, 1) = "5") Then

winEma.Close

MsgBox ("Falha na transmissão, verifique os dados e tente novamente!")

timMai.Enabled = False

Exit Sub

End If

If MDIForm1.winEma.State = 8 Then

MDIForm1.winEma.Close

End If

End If

MailErro:

inicializa = 9

tempBuf2 = ""

End Sub

  • 2 meses depois...
Postado

Olá, ninguém respondeu, eu mesmo descobri, aqui vai a dica:

Esta é a rotina SMTP, é só seguila utilizando o Winsock com os comandos:

winsock.Connect "servidor_smtp",porta

winsock.SendData "string a ser enviada"

winsock.ReadData variável_que_conterá_os_dados_recebidos (Esta propriedade é utilizada dentro do evento DataReceived)

winsock.State -> Propriedade para monitorar o status da conexão

Status de conexão:

0 - Fechado

1 - Aberto

2 - Escutando

3 - Conexão Pendente

4 - Localizando Host

5 - Host Localizado

6 - Conectando

7 - Conectado

8 - Ponto fechando a conexão

9 - Erro

Simplificando, use o winsock para enviar os dados e monitore os códigos recebidos para enviar os dados seguintes, é necessário a implementação de uma função de encriptação na base 64 para o usuário e a senha.

Rotina SMTP

Convenções:

>> Enviado pelo servidor SMTP

<< Enviado ao servidor SMTP

Todos os códigos estã exemplificados em VB

Formato:

>> código de resposta + código humano

<< comando

Rotina:

Cada linha que possui << significa que o comando logo após é para ser enviado com o componente e >> recebido pelo componente do servidor.

1/1 - << winsock.Connect smtp.terra.com.br
1/2 - >> 220 + mensagem

2/1 - << HELO smtp.terra.com.br ou HELO [email][email protected][/email]
2/2 - >> 250 + mensagem

3/1 - << AUTH LOGIN ou AUTH LOGIN PLAIN
3/2 - << Com AUTH LOGIN
3/3 - >> Mensagem criptografada
3/4 - << Enviar usuário criptografado
3/5 - >> Mensagem criptografada
3/6 - << Enviar senha criptografada
3/7 - << Com AUTH LOGIN PLAIN
3/8 - >> Mensagem
3/9 - << Enviar usuário
3/10 - >> Mensagem
3/11 - << Enviar senha
3/12 - >> 235 + mensagem

4/1 - << MAIL FROM: [email][email protected][/email]
4/2 - >> 250 + mensagem

5/1 - << RCPT TO: [email][email protected][/email]
5/2 - >> 250 + mensagem

6/1 - << DATA
6/2 - >> 354 + mensagem
6/3 - << Subject: assunto
6/4 - <<
6/5 - << Mensagem...
6/n - << ...
6/n - << ... Mensagem
6/n+1 - << .
6/n+2 - >> 250 + mensagem

7/1 - << QUIT
7/2 - >> 221

Site encriptador de usuário e senha:

[url]http://ostermiller.org/calc/encode.html[/url]

Divirtam-se, T+ :D:D:D

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!