2010-04-12 3 views
0

J'ai ce problème inhabituel avec mailing de mon application. Au début, ça ne fonctionnait pas (être incapable de relayer les erreurs de la merde) de toute façon j'ai ajouté l'authentification correcte et ça marche. Mon problème est maintenant, si j'essaie d'envoyer environ 300 emails (chacun avec une pièce jointe de 500k) l'application commence à traîner environ 95% à travers le processus.Problème de performance avec System.Net.Mail

Voici une partie de mon code qui est appelé pour chaque courrier à envoyer

Using mail As New MailMessage() 
      With mail 
       .From = New MailAddress(My.Resources.EmailFrom) 
       For Each contact As Contact In Contacts 
        .To.Add(contact.Email) 
       Next 
       .Subject = "Accounting" 
       .Body = My.Resources.EmailBody 
       'Back the stream up to the beginning orelse the attachment 
       'will be sent as a zero (0) byte file. 
       attachment.Seek(0, SeekOrigin.Begin) 
       .Attachments.Add(New Attachment(attachment, String.Concat(Item.Year, Item.AttachmentType.Extension))) 
      End With 
      Dim smtp As New SmtpClient("192.168.1.2") 
      With smtp 
       .DeliveryMethod = SmtpDeliveryMethod.Network 
       .UseDefaultCredentials = False 
       .Credentials = New NetworkCredential("username", "password") 
       .Send(mail) 
      End With 
     End Using 
     With item 
      .SentStatus = True 
      .DateSent = DateTime.Now.Date 
      .Save() 
     End With 
     Return 

Je pensais, puis-je préparer simplement tous les mails et les ajouter à une collection puis ouvrez un conenction SMTP et juste itérer la collection, en appelant l'envoi comme celui-ci

Using mail As New MailMessage() 
... 
MailCollection.Add(mail) 

End Using 

... 

       Dim smtp As New SmtpClient("192.168.1.2") 
       With smtp 
        .DeliveryMethod = SmtpDeliveryMethod.Network 
        .UseDefaultCredentials = False 
        .Credentials = New NetworkCredential("username", "password") 

        For Each mail in MainCollection 
          .Send(mail) 
        Next 

       End With 
+0

Avez-vous déjà résolu ce problème avec succès? Avez-vous encore besoin d'aide pour cela? – jcolebrand

Répondre

1

les limites que vous rencontrez sont prolly appliquées par le serveur SMTP, pas votre code. Les serveurs SMTP sont très vulnérables aux spams et disposent donc de mécanismes permettant de prévenir de tels abus. Envoyer chaque email individuellement ne fonctionne pas toujours, vous êtes en concurrence avec d'autres mécanismes plus sophistiqués.

Mais techniquement, oui, vous pouvez écrire un code qui les envoie individuellement.

+0

Je pensais la même chose (abus de spam). –

+1

Si vous êtes complètement local, vous devriez être en mesure de contrôler le taux d'accélération sur le serveur Exchange quelque part. De plus, si vous envoyez seulement une fois par mois, mettez juste un délai entre chaque envoi, peut-être 5 ou 10 secondes environ. Une troisième option, que la plupart des gens n'aiment pas, vous pouvez envoyer à personne (ou vous-même), puis lot BCC à des personnes du même domaine. La même partie de domaine est importante car elle ne crée qu'un seul message SMTP. –

+0

Chris, vos messages sont un pur plaisir. BCC est en fait une excellente option, et peut-être que le PO devrait l'utiliser (peut-être que les destinataires ne veulent pas être exposés). –

0

Pour la taille et le nombre dont vous parlez, mon conseil est de les déposer dans un dossier SMTP accessible et de laisser le serveur SMTP livrer à partir de ce dossier. Ce sera plus rapide et plus sain. L'allocation de 500 Ko en mémoire nécessite un peu de ressources, et l'allocation de 300 Mo à la mémoire est d'environ 200 Mo de RAM (surcharge pour conserver les ressources, créer un nouveau message à chaque fois, ouvrir des bibliothèques, etc.). Donc, une deuxième question est peut votre serveur gérer cela? Juste une observation.

+0

Oui, le serveur peut gérer le chargement. Et la quantité de mails à envoyer n'excédera pas 700 et le processus sera une fois par mois ... puis-je déposer dans le dossier SMTP du serveur Exchange? Où puis-je trouver des informations à ce sujet. –

+0

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.pickupdirectorylocation.aspx ~ et bien que ce soit plus ancien, il vous donne un bon départ dans la bonne direction (et vous voulez pouvoir pour gérer cela dans n'importe quel environnement IIS ouais?) ~ http://support.microsoft.com/kb/247958 ~ Aussi, c'est le moment où vous devez obtenir votre sysadmin impliqué. Vous allez travailler avec Exchange maintenant, et donc cela doit aussi être configuré (mais ça vaut le coup). – jcolebrand

Questions connexes