2010-04-12 30 views
7

Je suis en train d'écrire une application qui va devoir envoyer une quantité massive d'e-mails à nos étudiants qui seront sélectionnés à partir de notre base de données (chaque email sera personnalisé dans la mesure où nom, cours d'étude, etc ... doit donc être envoyé un à la fois). Je pourrais faire cette boucle sur un SmtpClient, mais j'ai peur qu'avec les nombres que j'essaye d'envoyer, je finirai par rencontrer des problèmes de timeout ou mon thread étant tué en raison du manque de ressources de machine.Envoi de plus de 20 000 emails avec asp.net

En ce moment je cherche juste des suggestions d'une meilleure manière de manipuler ceci, ou si boucle sur SmtpClient est une bonne solution, comment je devrais aller le manipuler pour empêcher ce que j'ai posté ci-dessus.

Un service Web serait-il une meilleure alternative?

S'il vous plaît conseiller, TIA

+0

vous devez aller avec des outils tiers – anishMarokey

+2

vous ne devez pas aller avec une tierce partie outils –

Répondre

11

Ma suggestion serait de mettre cela en lot. N'essayez pas d'exécuter du code ASP.NET pour créer des e-mails de 20 Ko et envoyez-les, car vous risquez d'être confronté à des problèmes de dépassement de délai et de performances. Au lieu de remplir une table avec le destinataire, l'objet, le corps et commencer un processus par lots à partir d'un service Windows. De cette façon, votre code est exécuté de manière à ce que lag puisse être géré, au lieu d'avoir une page Web en attente de la demande de retour.

+0

cette approche semble prometteuse. Je suis déjà en train de sauvegarder les emails dans une table. Désolé pour une question de noobish, mais comment appeler ce service Windows pour l'initier à l'envoi des emails, et de même, comment rapporterais-je au client quels messages ont été envoyés avec succès et lesquels ont échoué du service Windows? – Kyle

+0

vous n'auriez pas à appeler le service Windows. Laisse le courir. Le service pourrait être conçu pour vérifier votre table et voir s'il y a du travail à faire. S'il y a des courriels qui n'ont pas été envoyés, regroupez-les et envoyez-les. Fondamentalement, le service devrait être conçu pour interroger cette table jamais 5 min ou plus. (Notez que vous devriez mettre un drapeau booléen sur cette table en disant s'il a été envoyé et pour des buts de préformance mettre un index sur le drapeau de booléen.) Maintenant quand vous interrogez la table pour tous les articles non envoyés, le service commence par emailing. Pour rapporter au client –

+0

cool. Je vais essayer. merci – Kyle

6

Ok, d'abord - c'est à peine énorme, j'ai manipulé de courriels + 50.000

Que les e-mails sont écrits dans un dossier - répertoire. Ensuite, utilisez le service SMTP local que vous pouvez installer, en le pointant sur le dossier en tant que répertoire de collecte. Cela permettra au moins de s'assurer que vous avez un tampon décent entre les deux (c'est-à-dire que vous pouvez finir le côté asp.net, alors que les emails ne sont pas envoyés à ce moment-là).

+0

Eh bien, le premier problème qui vient à l'esprit est que tous nos étudiants utilisent un "3ème parti" pour leur email (tous utilisant le même), qui a notre serveur d'échange en blanc comme "un expéditeur ok". Malheureusement, je n'ai pas accès au serveur d'échange pour lui demander de récupérer les courriels de ce «dossier» ... tout cela est sur les épaules de notre infrastructure. Je n'ai pas non plus accès à ajouter le serveur web comme un "expéditeur ok" sur notre 3ème partie (où toutes les adresses email sont) ... donc je ne peux pas l'utiliser comme un serveur smtp là-bas. Si j'ai créé un service Web pour gérer l'envoi des courriels à travers notre échange ... cela volerait – Kyle

+0

En fait, où est le problème? Sérieusement ... Le service SMTP LOCAL peut être configuré pour (a) utiliser le serveur d'échange comme relais et (b) s'authentifier là en utilisant un nom d'utilisateur et un mot de passe, comme vous le feriez avec votre service smtp normal. – TomTom

+0

votre réponse ne fournit aucune solution, au lieu de cela, vous posez simplement plus de questions. Vous attendiez-vous à ce que 20 000 utilisateurs soient sur le même fournisseur de messagerie? Votre réponse montre que vous n'avez aucune expérience dans l'envoi de ce type d'e-mails. –

0

Vous pouvez utiliser javascript sur une minuterie pour demander le script qui envoie le courrier en petits morceaux qui ne seront pas expirés. Ensuite, vous appelez le script du navigateur. Ajoutez une barre de progression, une authentification, etc.

0

Vous n'avez pas besoin d'un service Web, mais plutôt d'un moyen de regrouper les e-mails dans une file d'attente (peut-être une table "Email_Queue" dans la base de données). Ensuite, un service Windows s'exécutant sur un serveur pouvait lire la file d'attente selon la méthode du premier entré/premier sorti à des moments raisonnables à un moment donné, en supprimant des éléments de la file d'attente au fur et à mesure de leur traitement. Vous devrez probablement exécuter certaines mesures pour déterminer la taille et le délai de fragmentation de votre serveur de messagerie.

2

En quoi utiliser Base de données outil Mail fourni par SQL Server lui-même. Vous pouvez toujours utiliser asp.net mais Email sera envoyé par SQL Server et tout ce que vous avez à faire appelez la procédure stockée et laissez les choses à SQL Server.

Je ne recommanderais pas l'option de traitement par lots, car il n'y aura pas d'optimisation ou de file d'attente, sauf si vous devez faire beaucoup d'efforts pour le faire. L'outil Courrier de base de données fournit également des options de file d'attente et de priorité. Si un problème survient, l'e-mail sera à nouveau mis en file d'attente et envoyé plus tard, mais les autres seront toujours envoyés.

Il est appelé Database courrier dans SQL Server 2008 et SQL Mail dans les versions précédentes.

Pour plus d'informations, s'il vous plaît vérifier les liens ci-dessous:

+0

Cette chose suce et n'aurait jamais dû être dans SQL Server pour commencer. – TomTom

+0

Qu'est-ce qui suce simplement? – Tarik

+1

s'il vous plaît ignorer TomTom - il est né en état d'ébriété! Avez-vous vu certains de ses autres commentaires? –