2010-12-13 26 views
1

Je construis un site web, et le client veut un "système" de newsletter dessus. Comment envoyer ce type d'e-mails de masse (> 1 000)?Envoyer des emails avec ASP.NET

J'ai lu quelque part que l'utilisation de la méthode sendasync du client smtp fait l'affaire. Mais il me donne constamment une exception "Email faliure". Et, je ne sais pas quoi faire avec cela juste là ...

Ainsi, fondamentalement ma question est, est-ce que c'est bon d'envoyer les email en utilisant la méthode SEND du smtpclient, mais chaque courrier dans son propre fil .

par ex.

NewsletterEmail newsletterEmail = new NewsletterEmail(emailAdress[i], mailSubject, mailBody); 
    Thread t = new Thread(new ThreadStart(newsletterEmail.MakeAndSendEmail)); 
    t.IsBackground = true; 
    t.Start(); 

Répondre

0

J'ai pris deux approches:

1) Lazy, approche bâclée de la configuration du délai d'attente de processus de asp.net assez longtemps pour terminer par Envoyer

2) Créer une application console qui a donné naissance par la application web

+0

application concole? Alors, que dirait l'application console? envoyer tous les e-mails de la base de données avec une petite pause entre les deux? – Andrej

+0

Oui, il exécute l'envoi des emails. Comme il est isolé dans un processus séparé, il n'a aucune incidence sur les performances de votre application Web. Genre de système de traitement distribué d'un pauvre. – bmancini

3

je pense, vous devez repenser votre startegey pour envoyer des courriels en vrac

Création> 1000 threads n'est pas une bonne idée, il peut même planter votre serveur ou il peut rendre votre répondre serveur très lent.

+0

ouais ... tought qui n'a pas été une bonne idée ... lire currenty sur le « répertoire Pickup » bulletin solution envoi ... – Andrej

+0

Il serait possible d'avoir un seul fil d'arrière-plan churn à travers l'envoi de tous les e-mails. Attention cependant, j'ai connu des serveurs ASP.NET pour tuer un thread s'il n'y a pas d'autre activité de serveur après 5 minutes environ. Si cela prend du temps, vous voudriez avoir un autre type de processus pour gérer cela. – jocull

2

Votre meilleur pari serait d'avoir un processus séparé envoyer les e-mails. Soit l'avoir exécuté sur un calendrier pour vérifier les emails qui doivent être envoyés (peut-être stocker les e-mails dans une table?), Ou, si vous n'aimez pas l'idée de processus planifiée, vous pouvez démarrer une application console par votre site web. Une autre chose à garder à l'esprit est que si vous envoyez trop de courriels dans un court laps de temps, il devient très facile d'être sur la liste noire et alors aucun des courriels de votre domaine ne le fera à aucun serveur qui vous avez la liste noire.

3

Informez votre client à propos de Constant Contact. Ils vont gérer cela beaucoup mieux que vous ne pourriez jamais. C'est aussi moins cher que votre temps.

En cas d'échec, vous avez quelques options.

S'ils ont déjà un serveur de messagerie, profitez-en pour diffuser vos e-mails. En d'autres termes, relayer le courrier à travers ce serveur.

Si vous ne pouvez pas faire cela, allez télécharger un serveur de messagerie gratuit. J'utilise hMailserver. Réglez-le et relayez-le.

Si vous ne pouvez pas faire cela, écrivez votre propre moteur de traitement SMTP. N'essayez pas d'envoyer les emails directement depuis ASP.Net. Mettez-les en file d'attente dans une base de données et écrivez un service Windows pour gérer la diffusion du courrier.

L'envoi d'e-mails peut parfois prendre plusieurs secondes par e-mail. Cela pourrait complètement arroser votre site web pendant qu'il essaie de gérer l'envoi de 1000 emails.

Un certain nombre de serveurs de messagerie sont configurés avec une liste grise, ce qui signifie qu'ils vous demandent d'envoyer deux fois le même courrier électronique pour prouver que vous n'êtes pas un spammeur.

Ensuite, obtenir le DNS correctement configuré peut être un PITA. C'est pourquoi je suggère constant contact.J'ai un client qui a pris près de 5 ans pour finalement configurer leur DNS; et oui, je leur ai donné des instructions explicites une fois par an sur ce qu'il faut faire. Le reverse DNS est critique.

Une autre chose est que certains serveurs destinataires ont une limite sur le nombre de threads qu'ils vont accepter de vous à la fois. La plupart des serveurs de messagerie sont conçus pour en tenir compte. Si vous franchissez cette limite, les serveurs receveurs vous considéreront comme un spammeur et prendront les mesures appropriées.

Un autre problème est dans l'envoi à une mauvaise adresse, encore et encore. AOL et d'autres vous considéreront comme un spammeur pour cette seule chose.

Le point est, vous ne voulez vraiment pas écrire cela vous-même.

0

J'ai construit un système similaire il y a un an ou deux. Il y a tellement de choses qui peuvent mal tourner quand vous envoyez un email par programme. Pour cette raison, faites-vous une faveur et séparez les messages du processus de leur envoi. De cette façon, vous pouvez "apprendre" à votre système que "[email protected]" devrait être ignoré ou d'autres situations similaires.

Vous pouvez stocker le message, le sujet ou le niveau de séparation des données souhaité dans la base de données avec un indicateur pour les métadonnées telles que "SentOn", "FailedOn", etc. J'ai envoyé mon message un à un temps pour permettre aux erreurs individuelles d'être stockées et/ou traitées. J'ai utilisé SmtpMail.Send(), mais quelle que soit la méthode que vous choisissez devrait fonctionner tant que vous avez construit quelque chose d'intelligent et récupérable.