Ir para conteúdo

Arquivado

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

Wallcrawler

[Resolvido] Enviar email VB.NET

Recommended Posts

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.