2009-06-04 9 views
0

essaie d'envoyer de manière asynchrone un e-mail avec une pièce jointe en utilisant la classe SMPTClient de .net:Erreur envoi de courrier de manière asynchrone

SmtpClient smtp = new SmtpClient(MailServer); 

       smtp.SendAsync(mailMsg, ""); 

       smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback); 

       mailMsg.Dispose(); 

Je dois supprimer le fichier de pièce jointe de mon serveur dès que le mail est envoyé avec succès.

private static void MailSentCallback(object sender, AsyncCompletedEventArgs e) 
     { 
      File.Delete(myAttachment); 
     } 

Mais quand cette méthode est appelée, je suis obtenir une erreur: « Le processus ne peut pas accéder au fichier « myAttachment » parce qu'il est utilisé par un autre processus. » En outre, le courrier n'est pas remis. Si j'utilise la méthode Send au lieu de SendAsync, la distribution du courrier fonctionne.

Que manque-t-il ici?

Merci d'avoir lu!

Répondre

1

En outre, ne pas Dispose() le message où vous le faites, car à ce stade, il n'a pas encore été «envoyé» ... vous êtes potentiellement potentiellement corrompre le message pendant que le SmtpClient est en train de le traiter. Maintenant, en ce qui concerne votre problème réel, j'ai eu le même problème, et de mémoire le fichier est toujours détenu par le SmtpClient pendant le rappel, donc vous ne pouvez vraiment pas le supprimer. Je pense qu'attacher un fichier dans le système de fichiers est vraiment mieux que si c'est un fichier persistant. Si vous essayez d'envoyer un fichier temporaire, chargez-le dans un MemoryStream et créez un Attachment à partir de cela. Il me vient à l'esprit que peut-être vous pouvez résoudre le problème de suppression des pièces jointes en premier jetant l'objet Attachment dans votre gestionnaire de rappel, avant d'essayer de supprimer le fichier ... bien que je testerais très soigneusement que cela ne provoquer d'autres effets secondaires.

+0

merci jerryjvl ...! Utilise maintenant Memorystream et l'attacher à un message à la volée .... fonctionne comme un charme sans aucun "fichier est utilisé par d'autres processus" erreurs ... merci encore! –

1

Tout d'abord, vous devez câbler le SendCompletedEventHandler AVANT de faire SendAsync. -à-dire:

//Wire up SendCompetedEventHandler 
smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback); 
//Send the Message 
smtp.SendAsync(mailMsg, ""); 

En second lieu, où est myAttachment déclarée? Quelle est sa portée? D'accord, tout d'abord, comme le dit mundeep, connectez le gestionnaire d'événements avant l'appel SendAsync

+0

merci pour votre entrée mundeep! –

Questions connexes