8
votes

Envoi de 20 000 courriels avec ASP.NET

J'écris une demande qui devra envoyer une quantité massive de courriels à nos étudiants qui seront sélectionnés dans notre base de données (chaque courrier électronique sera personnalisé dans la mesure où ils incluront leur nom, leur cours d'étude, etc. Donc, il doit être envoyé un à la fois).

Je pourrais faire cette boucle sur un SmtpClient, mais j'ai bien peur que, avec les chiffres que j'essayais d'envoyer, je vais finalement rencontrer des problèmes de délai ou mon fil étant tué à cause du manque de ressources de la machine.

À ce stade, je cherche simplement des suggestions d'une meilleure façon de gérer cela, ou si la boucle sur SmtpClient est une solution OK, comment je devrais continuer à gérer pour empêcher ce que j'ai affiché ci-dessus.

Un service Web serait-il une meilleure alternative?

S'il vous plaît conseiller, TIA


2 commentaires

Vous devez aller avec quelques outils tiers


Vous n'avez pas besoin d'aller avec des outils tiers


5 Réponses :


6
votes

OK, d'abord - c'est à peine massif, j'ai géré 50 000 emails +

Laissez les courriels être écrit dans un dossier - répertoire. Ensuite, utilisez le service SMTP local que vous pouvez installer, le pointant dans le dossier en tant que répertoire de prise en charge. Cela s'assurera au moins que vous avez un tampon décent entre (c'est-à-dire que vous pouvez terminer le côté ASP.NET, tandis que les courriels ne sont pas envoyés à ce moment-là).


5 commentaires

Eh bien, le premier problème qui me vient à l'esprit est que tous nos étudiants utilisent une "3ème partie" pour leur email (tous utilisant le même), qui a notre serveur Exchange White répertorié comme "un expéditeur OK". Malheureusement, je n'ai pas accès au serveur Exchange pour lui dire de chercher les courriels de ce "dossier" ... c'est tout sur les épaules de notre infrastructure. Je n'ai pas non plus accès à ajouter le serveur Web en tant que "OK Sender" sur notre 3ème partie (où toutes les adresses e-mail sont) ... Vous ne pouvez donc pas l'utiliser comme serveur SMTP. Si j'ai créé un service Web pour gérer l'envoi des courriels via notre échange ...


En fait, où est le problème? Sérieusement ... Le service SMTP local peut être configuré pour (a) utiliser le serveur Exchange comme relais et (b) authentifier là-bas à l'aide d'un nom d'utilisateur et d'un mot de passe, comme vous le feriez avec votre service SMTP normal.


Votre réponse ne fournit aucune solution que ce soit, à la place, vous demandez simplement plus de questions. Avez-vous pensé que 20 000 utilisateurs soient tous 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'emails.


@Helen - Ceci est retardé. Désolé. Un serveur de messagerie à l'aide d'un relais enverra tous les courriels via un serveur comme n'importe quel autre. Voilà comment cela fonctionne. Il a le même expéditeur pour tous les 20.000 e-mails et le serveur de messagerie découvrira où envoyer des choses. Si vous ne savez pas comment Email fonctionne, Helen, je vous suggère de vous lever et de lire les bases d'abord, au lieu de poster un commentaire insensé. Tout serveur de messagerie (le serveur Exchange dans ce cas) est capable de savoir où envoyer un email.


Oui, c'est ainsi que nous le faisons, en utilisant la fonction PickUpDirectory de SmtpClient. Le répertoire est rempli de courriels nommés par GUID. Ensuite, copiez-les vers le répertoire de ramassage «réel» qui échange utilise (nous utilisons le répertoire temporaire au cas où les bombes de processus de génération à mi-chemin, nous n'avons pas envoyé de courriers électroniques par erreur et ne peuvent que supprimer et redémarrer), Ensuite, l'échange les suce - pas de soucis sur la surcharge, l'échange est suffisamment intelligent pour seulement aspirer quelques-uns à la fois (bien que cela soit configurable).



0
votes

Vous pouvez utiliser JavaScript sur une minuterie pour demander au script qui envoie un courrier dans de petits morceaux qui ne tiennent pas du temps. Ensuite, vous appelleriez le script du navigateur. Ajouter une barre de progression, une authentification, etc.


0 commentaires

11
votes

Ma suggestion serait de lottez cela. N'essayez pas d'exécuter le code ASP.NET pour créer des courriels de 20k et envoyez-les comme vous êtes lié au délai d'attente et aux problèmes de performance de Runinto. Au lieu de cela, renseignez une table avec le destinataire, le sujet, le corps et commencer un processus de lot à partir d'un service Windows. De cette façon, votre code est exécuté de manière à gérer le décalage, au lieu d'avoir une page Web attendre la demande de retour.


5 commentaires

Cette approche semble prometteuse. Je sauve déjà les courriels dans une table. Désolé pour une question noobaine, mais comment puis-je appeler ce service Windows pour l'avoir initié à l'envoi des courriels et, de même, comment puis-je reporter au client que ceux-ci ont été envoyés avec succès et lesquels ont échoué du service Windows?


Vous ne devriez pas appeler le service Windows. Il suffit de laisser courir. Le service pourrait être conçu pour vérifier votre table et voir s'il y a des travaux à faire. S'il y a des courriels qui n'ont pas été envoyés, alors les harceler et les envoyer. Fondamentalement, le service devrait être conçu pour interroger ce tableau à 5 minutes environ. (Notez que vous devriez mettre un drapeau de BOOL sur cette table indiquant si cela a été envoyé et à des fins de préformation, indice sur le drapeau BOOL.) Maintenant, lorsque vous interrogez la table pour tous les articles non envoyés, si le nombre est supérieur à celui de la Le service commence par courrier électronique. En ce qui concerne le rapport sur le client


mon dernier commentaire a été coupé. En ce qui concerne les rapports revenus au client, vous pouvez délimiter votre journal sur une page Web indiquant la météo ou non un email a été envoyé. Cet affichage doit être divisé en deux vues. envoyé et insensé. (Prudent avec celui-ci car il pourrait s'agir d'une longue charge avec 20k enregistrements).


Une autre question rapide sur le service Windows. Comment puis-je le casser pour que cela n'essaye pas d'envoyer tous les courriels de 20k + à la fois? Je pense que je peux finalement courir dans le même problème ou le même problème, à moins que je ne le faisais dans des "morceaux" comme quelqu'un d'autre suggérait ici ....


Votre question est rapide par la beauté de cette conception. Parce que vous ne faisez que faire la queue des courriels. Vous pouvez ajuster la requête que le service fonctionne jamais 5 minutes pour sélectionner Top 100 * à partir de mymailtable où NotSent = True. De cette façon, tous les 5 min ou quel que soit l'intervalle que vous créez, le service enverra 100 courriels.



0
votes

Vous n'avez pas besoin d'un service Web, mais plutôt un moyen de lotter les courriels dans une file d'attente (peut-être une table "e-mail_queue" dans la DB). Ensuite, un service Windows exécuté sur un serveur pourrait lire la file d'attente de première entrée / première sortie à des morceaux raisonnables à un moment envoyé au SMTPCLIPT, en supprimant les éléments de la file d'attente, car ils sont traités. Vous auriez probablement besoin d'exécuter certaines mesures pour déterminer quelle serait la taille et le retard du morceau pour votre serveur de messagerie.


0 commentaires

2
votes

Qu'en est-il de l'utilisation de Mail de base de données Fourni par SQL Server lui-même. Vous pouvez toujours utiliser ASP.NET mais le courrier électronique sera envoyé par SQL Server et tout ce que vous devez appeler la procédure stockée et laisser les choses sur SQL Server.

Je ne recommanderais pas l'option de lot puisqu'il n'y aura pas d'optimisation ni de file d'attente, sauf si vous n'avez pas besoin de faire beaucoup d'efforts pour le faire.

L'outil de messagerie de base de données fournit également une file d'attente et des options prioritaires. Si un problème survient, l'e-mail sera à nouveau en file d'attente et envoyé plus tard, mais les autres seront toujours envoyés.

Il est appelé Mail de base de données dans SQL Server 2008 et SQL Mail dans les versions précédentes.

Pour plus d'informations, veuillez vérifier les liens ci-dessous:


3 commentaires

Cette chose est simplement nulle et ne devrait jamais avoir été dans SQL Server pour commencer par.


Ignorer TomTom - il est né ivre! Avez-vous vu certains de ses autres commentaires?


Je peux convenir qu'un programme d'envoi de courrier ne devrait probablement pas faire partie d'un serveur de base de données, mais le fait demeure que c'est. Cela pourrait être une bonne solution pour l'OP.