Usuário com melhor resposta
Mover arquivo após enviá-lo por email

Pergunta
-
Boa tarde pessoal.
Estou com a seguinte situação:
Criei um código para monitorar uma pasta de xml's e ao ser gerada uma nova nota fiscal, esse xml é gravado nessa pasta monitorada. Então meu código vem e anexa esse xml e dispara o email automaticamente (o erp não faz isso de forma automática, então eu automatizei). Mover arquivos é tranquilo, assim como gerar o email e anexar. O meu problema está ao fazer essas 2 operações sequencialmente, pois ao anexar o arquivo, o mesmo fica preso na thread de envio de email e aí eu não consigo mover ele para a pasta de processados.
Para facilitar o entendimento, estou colocando o código aqui:
Sub LeXML() Dim semailDestino As String = "" Dim sNF As String = "" Dim sDestinatario As String = "" Dim sDataNF As String = "" Dim sCorpoEmail As String = "" Dim sTituloEmail As String = "" Dim sPDF As String = "" Dim sHost As String = "smtp_server", sPort As String = "587" Dim sEmail As String = "nfe@email.com.br" Dim sSenha As String = "senha" Dim sArrayXML As String() Dim sXMLAux As String = "" Dim sArrayPDF As String() Dim sPDFAux As String = "" tssSituacao.Text = "Executando" tssSituacao.ForeColor = Color.DarkGreen Dim sPasta As New DirectoryInfo(Me.txtPastaMonitorada.Text) If Not sPasta.Exists Then sPasta.Create() End If tssProgressBar.Value = 0 tssProgressBar.Maximum = sPasta.GetFiles("*.xml").Count + 1 For Each sfile As FileInfo In sPasta.GetFiles("*.xml") tssProgressBar.Value = tssProgressBar.Value + 1 Dim Ds As New DataSet Ds.ReadXml(sfile.FullName) Dim bdsAux As New BindingSource bdsAux.DataSource = Ds bdsAux.DataMember = "dest" semailDestino = bdsAux.Current("email").ToString sDestinatario = bdsAux.Current("xNome").ToString & " - " & bdsAux.Current("CNPJ").ToString bdsAux.DataMember = "ide" sNF = bdsAux.Current("nNF").ToString sDataNF = bdsAux.Current("dhEmi").ToString sCorpoEmail = "Segue em anexo XML e Danfe da NF: " & sNF & " de " & sDataNF & " - destinado a: " & sDestinatario & vbCrLf & vbCrLf & "Obrigada" & vbCrLf & "Funcionária - Empresa" sTituloEmail = "DANFE e XML " & sNF lstHistorico.Items.Add(Now & " - Enviando email para " & sDestinatario & " - " & semailDestino & " NF:" & sNF & " de " & sDataNF) sPDF = sfile.DirectoryName & "\" & "DANFE_" & sfile.Name.Replace(".xml", ".pdf") sXMLAux = sXMLAux & "|" & sfile.FullName sPDFAux = sPDFAux & "|" & sPDF SmtpEmail(sHost, sPorta, sEmail, sSenha, semailDestino, sTituloEmail, sCorpoEmail, sfile.FullName, sPDF) Next 'Aqui começa a parte onde quero mover o arquivo. 'nesse sleep eu tentei "esperar" o processo terminar e liberar o aruqivo, mas não surtiu muito efeito ou não esperei o suficiente... System.Threading.Thread.Sleep(300000) ' pausa por x minuto sArrayXML = sXMLAux.Split("|") sArrayPDF = sPDFAux.Split("|") Dim sAux As String = sPasta.FullName & "\PROCESSADOS" sPasta = Nothing For i = 1 To sArrayXML.Count Dim sFileXML As New FileInfo(sArrayXML(i)) Dim sFilepdf As New FileInfo(sArrayPDF(i)) Dim sPasta2 As New DirectoryInfo(sAux) If Not sPasta2.Exists Then sPasta2.Create() End If sFileXML.MoveTo(sPasta2.FullName & "\PROCESSADO_" & sFileXML.Name) sFilepdf.MoveTo(sPasta2.FullName & "\PROCESSADO_" & sFilepdf.Name) Next 'fim do trecho que tenta mover o arquivo. tssSituacao.Text = "Aguardando" tssSituacao.ForeColor = Color.Red tssProgressBar.Maximum = 100 tssProgressBar.Value = 0 End Sub
E aqui eu mostro como eu envio o email, através de uma função async, pois foi o único jeito que consegui enviar um email através dos servidores da locaweb:
Async Sub SmtpEmail(sHost As String, sPort As String, sEmail As String, sSenha As String, sDestinatario As String, sTituloEmail As String, sCorpoEmail As String, sXML As String, sPDF As String) Using smtp As New System.Net.Mail.SmtpClient() smtp.Host = sHost smtp.Port = sPort smtp.EnableSsl = True smtp.UseDefaultCredentials = False smtp.Credentials = New System.Net.NetworkCredential(sEmail.ToString, sSenha.ToString) Using mail As New System.Net.Mail.MailMessage() mail.From = New System.Net.Mail.MailAddress(sEmail) mail.[To].Add(New System.Net.Mail.MailAddress(sDestinatario)) mail.Bcc.Add(New System.Net.Mail.MailAddress(sEmail)) mail.Subject = sTituloEmail mail.Body = sCorpoEmail mail.Attachments.Add(New System.Net.Mail.Attachment(sXML)) mail.Attachments.Add(New System.Net.Mail.Attachment(sPDF)) Await smtp.SendMailAsync(mail) mail.Dispose() 'aqui eu tentei liberar os arquivos, mas não deu certo tb. End Using smtp.Dispose() End Using End Sub
Será que alguém aqui consegue me ajudar com esse problema de processos travando arquivos?
Att.
Giovani
Respostas
-
Bom dia pessoal.
Desculpem a demora em dar atenção ao tópico.
Eu resolvi a situação mudando a forma de abordagem, onde eu movi primeiro o arquivo para a pasta e depois enviei por email.
O problema que eu estava tendo era referente ao anexar o arquivo e enviar por email, após o envio, eu não conseguia mais mover o arquivo ou renomeá-lo. O erro que dava era que "uma outra thread está usando o arquivo". Eu estava tentando descobrir um jeito de após o envio do email, desbloquear o arquivo dessa thread. Mas não consegui, nem após o envio, usando o dispose no mail message.
Enfim, o problema só foi resolvido ao mudar a abordagem. Mas seria interessante descobrir uma forma de desbloquear o arquivo após um envio de email para programações futuras.
Obrigado.
- Marcado como Resposta Guilherme Macedo SModerator segunda-feira, 19 de junho de 2017 13:19
Todas as Respostas
-
Boa tarde, Giovani Rodrigues.
Você conseguiu resolver o problema? Se ainda não, pode explicar um pouco melhor, para que possamos te ajudar? -
-
Bom dia pessoal.
Desculpem a demora em dar atenção ao tópico.
Eu resolvi a situação mudando a forma de abordagem, onde eu movi primeiro o arquivo para a pasta e depois enviei por email.
O problema que eu estava tendo era referente ao anexar o arquivo e enviar por email, após o envio, eu não conseguia mais mover o arquivo ou renomeá-lo. O erro que dava era que "uma outra thread está usando o arquivo". Eu estava tentando descobrir um jeito de após o envio do email, desbloquear o arquivo dessa thread. Mas não consegui, nem após o envio, usando o dispose no mail message.
Enfim, o problema só foi resolvido ao mudar a abordagem. Mas seria interessante descobrir uma forma de desbloquear o arquivo após um envio de email para programações futuras.
Obrigado.
- Marcado como Resposta Guilherme Macedo SModerator segunda-feira, 19 de junho de 2017 13:19
-
Ótimo Giovani Rodrigues ;)