Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Eu uso a seguinte classe para enviar um email com um anexo:
Imports System.Net.mail
Public Class email
Public Shared Sub enviaMensagemEmail(ByVal from As String, ByVal recepient As String, ByVal bcc As String, ByVal cc As String, ByVal subject As String, ByVal body As String, ByVal servidorSMTP As String, ByVal anexo As String)
Dim mMailMessage As New MailMessage()
mMailMessage.From = New MailAddress(from)
mMailMessage.To.Add(New MailAddress(recepient))
If Not bcc Is Nothing And bcc <> String.Empty Then
mMailMessage.Bcc.Add(New MailAddress(bcc))
End If
If Not cc Is Nothing And cc <> String.Empty Then
mMailMessage.CC.Add(New MailAddress(cc))
End If
mMailMessage.Subject = subject
mMailMessage.Body = body
mMailMessage.IsBodyHtml = True
mMailMessage.Priority = MailPriority.High
If Not anexo Is Nothing Then
mMailMessage.Attachments.Add(New Attachment(anexo))
End If
mMailMessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess
Dim mSmtpClient As New SmtpClient(servidorSMTP)
Dim status As New System.Net.Mail.SmtpStatusCode
mSmtpClient.Send(mMailMessage)
End Sub
End Class
Esse anexo, é um backup zipado da base access que ele está fazendo muito bem.
A questão é que este arquivo zipado, após o envio do email é inútil.
Quando mando apagar o arquivo após a chamada da classe acima, o vb.net me retorna um erro dizendo que o arquivo não pode ser apagado pq está sendo usado por um processo.
Obviamente, esse processo é o envio via smtp do arquivo que ainda está sendo processado.
Gostaria de saber se tem como saber quando o processo foi finalizado, para que eu possa excluir esse arquivo?
Mesmo problema.
"O processo não pode acessar o arquivo 'D:\Documentos\Visual Studio 2005\Projects\ControleRGI\ControleRGI\bin\Debug\backdados\backDados18_12_2008 00-03-40.gz' porque ele está sendo usado por outro processo."
Mesmo usando o bloco try como o sugerido:
Imports System.Net.mail
Imports System.IO
Public Class email
Public Shared Sub enviaMensagemEmail(ByVal from As String, ByVal recepient As String, ByVal bcc As String, ByVal cc As String, ByVal subject As String, ByVal body As String, ByVal servidorSMTP As String, ByVal anexo As String)
Try
Dim mMailMessage As New MailMessage()
mMailMessage.From = New MailAddress(from)
mMailMessage.To.Add(New MailAddress(recepient))
If Not bcc Is Nothing And bcc <> String.Empty Then
mMailMessage.Bcc.Add(New MailAddress(bcc))
End If
If Not cc Is Nothing And cc <> String.Empty Then
mMailMessage.CC.Add(New MailAddress(cc))
End If
mMailMessage.Subject = subject
mMailMessage.Body = body
mMailMessage.IsBodyHtml = True
mMailMessage.Priority = MailPriority.High
If Not anexo Is Nothing Then
mMailMessage.Attachments.Add(New Attachment(anexo))
End If
mMailMessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess
Dim mSmtpClient As New SmtpClient(servidorSMTP)
Dim status As New System.Net.Mail.SmtpStatusCode
mSmtpClient.Send(mMailMessage)
mMailMessage = Nothing
mSmtpClient = Nothing
Catch ex As Exception
MsgBox(ex)
Finally
File.Delete(anexo)
End Try
End Sub
End Class
Não conheço uma solução para isso. Uma forma seria criar um serviço que de tempo em tempo tenta apagar os arquivos.
Abraços...
Só abusando um pouco... como eu faria esse serviço?
feche as instâncias dos objetos MailMessage e SmtpClient
coloca no bloco finally para garantir:
mMailMessage.Dispose();
mMailMessage = null;
mSmtpClient = null;
depois disso é só chamar o delete
veja esse tópico tb.: http://forum.imasters.com.br/index.php?showtopic=288309
sobre criar serviços: http://www.macoratti.net/vbn5_csw.htm, mas para este caso creio que não seja necessário, pois fechando as instâncias já vai liberar o arquivo para delete ou outro tipo de uso.
Deu certo, muito obrigado, eriva_br só tive que usar:
mMailMessage.Dispose()
mMailMessage = Nothing
mSmtpClient = Nothing
Pq o vb não tava reconhecendo o NULL
Agora vou testar se ele não está enviando o arquivo corrompido e tals... mas isso é outra história.
Obrigado a todos!
Tecnicamente após o envio (Send) poderia exclui-lo. Mas caso ainda o smtp esteja utilizando pode fugir do controle do framework.
Tente utilizar um try, catch e finally e coloque o código de exclusão no finally. Mas para não perder seu arquivo verifique que não houve nenhum erro no bloco try antes de excluir o arquivo.
Abraços...