WINSOCK X EMAIL
Olá pessoal!!!
Estou precisando criar uma rotina para apenas fazer a contagem de quantidades de emails de uma caixa especÃfica, para isto estou usando winsock. Acontece que quando já conectado não estou conseguindo atualizar a contagem, ou seja, se o winsock estiver conectado e esta caixa receber ou deletar algum email ele continua contando a mesma quantidade da primeira consulta. Já tentei winsock.close e realizar conexao de novo porém da um erro.
Segue o código que estou usando:
Estou precisando criar uma rotina para apenas fazer a contagem de quantidades de emails de uma caixa especÃfica, para isto estou usando winsock. Acontece que quando já conectado não estou conseguindo atualizar a contagem, ou seja, se o winsock estiver conectado e esta caixa receber ou deletar algum email ele continua contando a mesma quantidade da primeira consulta. Já tentei winsock.close e realizar conexao de novo porém da um erro.
Segue o código que estou usando:
Dim received As Boolean
Dim Message$
Dim sckError
Private Sub Form_Load()
[ô] LogIn to the server ~ get settings from outlook express
Winsock1.Connect [Ô]imap.bittencourtcardoso.com[Ô], 110
Do Until received: DoEvents: Loop
If sckError Then MsgBox [Ô]An error occured trying to connect to server[Ô]: Exit Sub
sendMsg [Ô]USER promocao@bittencourtcardoso.com[Ô] [ô] Send UserName
If sckError Then MsgBox [Ô]Error with username[Ô]: Exit Sub
sendMsg [Ô]PASS 123456[Ô] [ô] Send Password
If sckError Then MsgBox [Ô]Error with password[Ô]: Exit Sub
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Winsock1.GetData Message$
Select Case Winsock1.Tag
Case [Ô]RETR[Ô]
Put #1, , Message$
If InStr(Message$, vbLf + [Ô].[Ô] + vbCrLf) Then
Close 1
received = True
End If
Case Else
sckError = (Left$(Message$, 3) = [Ô]-ER[Ô])
received = True
End Select
End Sub
Private Sub Winsock1_Close()
Winsock1.Close
End Sub
Private Sub cmdCheckMail_Click()
[ô] Get Number of Messages and total size in bytes
sendMsg [Ô]STAT[Ô]
x = InStr(Message$, [Ô] [Ô]): b = InStrRev(Message$, [Ô] [Ô])
Messages = Val(Mid$(Message$, x + 1, b - x))
Size = Val(Mid$(Message$, b + 1))
MsgBox [Ô]Number of messages to download [Ô] & Messages
[ô] Download all messages
For a = 1 To Messages
[ô] Winsock1_DataArrival will save message as [Ô]Email-1.eml[Ô], [Ô]Email-2.eml[Ô] etc
Winsock1.Tag = [Ô]RETR[Ô]
Open [Ô]C:\Windows\Temp\eMail-[Ô] & a & [Ô].eml[Ô] For Binary Access Write As #1
sendMsg [Ô]RETR [Ô] & a
List1.AddItem [Ô]eMail [Ô] & a & [Ô]: Downloaded[Ô]
Next
Winsock1.Tag = [Ô][Ô]
End Sub
Sub sendMsg(m$)
Winsock1.SendData m$ + vbCrLf
received = False
Do Until received
DoEvents
Loop
End Sub
Você sabe o que o código faz? Compreende o que está acontecendo? Já tentou depurar?
Sim, o código eu entendi, ja depurei também, mas o que eu nao entendi foi o fato da conexão não se atualizar. Quando o winsock está conectado ao meu servidor eu consigo apenas manipular os dados desta primeira conexao.
O erro que acontece é quando tento encerrar a conexao e abrir novamente para tentar atualizar os dados, na verdade não precisaria eu acho que nao precisaria fechar e abrir a conexao para que os dados fossem atualizados.
é o meu primeiro contato com winsock, talvez tenha alguma parâmetro que eu não esteja usando corretamente, mas fiz várias pesquisas e não descobri nada.
O erro que acontece é quando tento encerrar a conexao e abrir novamente para tentar atualizar os dados, na verdade não precisaria eu acho que nao precisaria fechar e abrir a conexao para que os dados fossem atualizados.
é o meu primeiro contato com winsock, talvez tenha alguma parâmetro que eu não esteja usando corretamente, mas fiz várias pesquisas e não descobri nada.
Lógico que precisa! Não é algo [Ô]ativo[Ô] de duas vias. Você abre, pega ou envia dados e acabou. Para buscar dados, ou você envia comandos novamente ou faz todo o processo. Veja o que acontece quando você clica o botão [Ô]cmdCheckMail[Ô], ele envia o comando [Ô]STAT[Ô], o servidor vai enviar de volta os e-mails, que vão ser recebidos no evento DataArrival, que por sua vez salva os emails em arquivos [Ô].eml[Ô]. Então para verificar se tem e-mail, eu colocaria aquela rotina em um timer de x em x segundos ao invés de clicar em um botão.
Exatamente, eu estou acionando o botão indiretamente, através de outra rotina no sistema, inclusive este formulário trabalha invisÃvel. Mas até aà tudo bem, o que eu não consegui resolver foi atualizar as informações como eu falei, eu conecto o winsock tem por exemplo 3 emails lá, eu apago um desses emails e executo o código [Ô]cmdCheckMail[Ô] e ele continua me dizendo que tem 3 emails lá e quando o certo seriam dois.
Você está apagando os e-mails no client ou no server?
Estou apagando no server...
No server? Tem alguma outra aplicação com Winsock que faz isso? Se você está apagando o e-mail no outlook ou qualquer outro que o valha, você não está apagando no server
Eu só estou apagando manualmente para testar.. mas enfim... achei uma solução e já está funcionando aqui. O meu problema era com a conexão/desconexão do winsock, então eu fiz um executável com um timer que chama outro programa, este outro abre a conexao, verifica os emails fecha e vai embora.
Resolvido!
Muito obrigado pelo interesse em ajudar meu caro!!
Resolvido!
Muito obrigado pelo interesse em ajudar meu caro!!
Tópico encerrado , respostas não são mais permitidas