ENVIAR E-MAIL

EBOOKREVENDA 02/12/2016 18:28:16
#469377
Estou com a seguinte rotina?

conta todos os arquivos da pasta Enviar e vai incluindo de 1 a 1 no email
For cont = 1 To CStr(contArquivos.Count)
attachment = New System.Net.Mail.Attachment([Ô]Enviar\[Ô] & cont & [Ô].jpg[Ô])
Mail.Attachments.Add(attachment)
Next

[ô]chama a função enviar email com as imagens acima anexas ao email.
SMTP.Send(Mail)


Aqui esta o problema: tento apagar os arquivos da pasta apos enviar porem da erro pois os arquivos ainda estão sendo usados no envio.
Dim contArquivos1 = My.Computer.FileSystem.GetFiles([Ô]Enviar\[Ô]) [ô][ô]conta o numero de arquivos em uma pasta
Dim cont1 As Double
For cont1 = 1 To CStr(contArquivos1.Count)
My.Computer.FileSystem.DeleteFile([Ô]Enviar\[Ô] & cont1 & [Ô].jpg[Ô])
Next



Pensei em um timer para apagar os arquivos apos determinado tempo, mais não posso pois terão novos arquivos na pasta os quais não posso apagar, então a unica solução que busco é como saber se a função SMTP.Send(Mail) já acabou de ser executada, ou seja se os emails já foram enviados.

Software para monitoramento de computadores empresariais.
KERPLUNK 02/12/2016 23:08:50
#469384
Aí está mais um caso clássico da falta de entendimento da OOP. Você está usando um objeto SmtpClient, você precisa que ao terminar de enviar o e-mail, os arquivos que foram anexados sejam apagados. E ao invés de recorrer ao objeto usado(o SmtpClient), você pensa em um timer. Acontece que ele possui um evento [Ô]SendComplete[Ô] que é justamente o que você quer, um evento que é disparado ao terminar de enviar o e-mail. Tudo que você precisa fazer é criar um delegate para esse evento.

..... seu código
......Antes do evento de enviar, adicione o delegate:
AddHandler SMTP.SendCompleted, AddressOf EmailEnviado


E adicionar o método [Ô]EmailEnviado[Ô], onde você vai fazer a deleção dos arquivos:

Private Shared Sub EmailEnviado(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)


O único [Ô]porém[Ô] é que ao invés de utilizar o método síncrono de envio, você vai usar o método assíncrono:

Dim userState As String = [Ô]Mensagem de teste[Ô]
client.SendAsync(Mail, userState)


Se tiver dúvidas, aqui está a documentação, que contém um exemplo disso tudo. Mas por favor, leia toda ela, isso vai pode várias dúvidas que você possa ter, não simplesmente copie e cole código, isso é péssimo para seu aprendizado.
PLUGSOFTSM 05/12/2016 21:21:08
#469428
Isso que o amigo KerpLunk falou é correto e é o modo mais correto pra fazer
Só que o assunto delegates, invoke e thread podem ser um pouco complicados dependendo do grau de conhecimento de cada um
Eu quando tinha esse tipo de dificuldade, antes de dominar bem o assunto delegate, copiava os arquivos para uma pasta temporária e enviava os e-mails a partir daí, elemininado assim o problema de estarem em uso na pasta principal....
Verifique essa solução... poderá te ajudar provisoriamente... e funciona certinho
Faça seu login para responder