Application console C # pour envoyer des e-mails à des heures programmées
J'ai une console C# une application qui s'exécute sur Windows Server 2003 dont le but est de lire un tableau appelé les Notifications et un champ appelé "NotifyDateTime" et envoyez un e-mail lorsque que le temps est atteint. Je l'ai programmé via le Planificateur de Tâches à exécuter toutes les heures, vérifier pour voir si le NotifyDateTime chutes au sein de l'heure, et ensuite envoyer les notifications.
Il semble que parce que j'ai la date de notification/reprises dans la base de données qu'il doit y avoir une meilleure façon que de la re-exécution de cette chose toutes les heures.
Est-il un processus léger/console application, j'ai pu quitter en cours d'exécution sur le serveur qui lit dans la journée de notifications à partir de la table et les questions exactement quand ils sont dus?
J'ai pensé service, mais qui semble exagéré.
source d'informationauteur Caveatrob
Vous devez vous connecter pour publier un commentaire.
Vous essayez de mettre en œuvre de scrutin approche, où un travail est suivi d'un dossier en DB pour toute modification.
Dans ce cas, nous essayons de frapper DB pour le temps périodique, si le retard d'une heure réduit à 1 min plus tard, sur scène, alors cette solution se tourne vers la performance goulot de bouteille.
Approche 1
Pour ce scénario, veuillez utiliser la File d'attente en fonction de l'approche afin d'éviter tout problème, vous pouvez également augmenter l'échelle certain nombre de cas, si vous envoyez tellement de mails.
Je comprends il y a un programme de mises à jour NotifyDateTime dans un tableau, le même programme peut pousser un message à la File d'attente de l'informer qu'il y a une notification à manipuler.
Il y a un service windows s'occuper de cette file d'attente pour tous les messages entrants, quand il y a un message, il effectue les opérations nécessaires (c'est à dire l'envoi d'e-mail).
Approche 2
http://msdn.microsoft.com/en-us/library/vstudio/zxsa8hkf(v=vs. 100).aspx
vous pouvez également appeler le code C# de procédure Stockée SQL Server si vous utilisez MS SQL Server. mais dans ce cas vous faites usage de votre processus de SQL server pour envoyer un mail, ce qui n'est pas une bonne pratique.
Cependant, vous pouvez invoquer un service web OU un service WCF qui permet d'envoyer des e-mails.
Mais Approche 1 est exempt d'erreur, Évolutive , d'un Suivi, Asynchrone , et n'a pas de mal à votre base de données OU une APPLICATION, vous avez les différents processus pour envoyer l'email.
Files d'attente
Utilisation MSMQ qui fait partie de windows server
Vous pouvez également essayer https://www.rabbitmq.com/dotnet.html
Pré-tâches planifiées (indéfini de fois) sont généralement une douleur à manipuler, par opposition aux tâches planifiées où Quartz.NET semble bien adapté.
En outre, une autre distinction doit être faite entre le feu et oublier pour des tâches qui ne devraient pas être interrompue/changement (ex. tentatives, notifications) et les tâches qui doivent être gérés de manière active (ex. campagne ou communications).
Pour le feu et oublier les tâches de type d'un message de la file d'attente est bien adapté. Si la destination n'est pas fiable, vous devrez opter pour réessayer (ex. essayez d'envoyer (max deux fois), recommencer après 5 minutes, essayez d'envoyer (max deux fois), recommencer après 15 minutes) au moins doivent préciser message TTL avec un envoi et de relancer la file d'attente. Voici une explication avec un lien vers le code de l'installation d'une nouvelle tentative au niveau de la file d'attente
La gestion de pré-programmé tâches nécessitent l'utilisation d'une base de données de la file d'attente de l'approche (Cliquez ici pour un article sur CodeProject de la conception d'une base de données de la file d'attente des tâches planifiées)
. Cela vous permettra de mettre à jour, supprimer ou réorganiser les notifications qui vous est donnée de garder une trace de la propriété des identificateurs (ex. spécifier un id utilisateur et vous pouvez supprimer toutes les notifications en attente lorsque l'utilisateur ne devraient plus recevoir de notifications comme étant décédée/désabonné)
Prévue e-mail tâches (y compris toutes les tâches de communication) nécessitent plus fine de contrôle (expiration, réessayer et mécanismes de délai d'attente). La meilleure approche à adopter ici est de construire une machine d'état qui est en mesure de traiter la tâche de messagerie par le biais de ses étapes (de l'expiration, de pré-validation, pré-mailing mesures telles que la création de modèles, inline css, faire des liens absolus, l'ajout de suivi des objets pour ouvrir le suivi, le raccourcissement des liens pour le suivi des clics, post-validation et l'envoi et la tentative).
J'espère que vous êtes conscient que la .NET SmtpClient n'est pas entièrement compatible avec les spécifications MIME et que vous devriez être à l'aide de SAAS, fournisseur de messagerie tels que Amazon SES, Mandrill, Mailgun, Client.io ou Sendgrid. Je vous suggère de regarder Mandrill ou Mailgun. Aussi, si vous avez un peu de temps, jetez un oeil à MimeKit que vous pouvez utiliser pour construire des messages MIME pour les fournisseurs de permettre d'envoyer des premières e-mail et ne prend pas nécessairement en charge des choses comme des pièces ou des en-têtes personnalisés/signature DKIM.
J'espère que cela vous met sur la bonne voie.
Modifier
Vous aurez à utiliser un service de sondage, à des intervalles spécifiques (ex. 15 secondes ou 1 minute). La charge de base de données peut être un peu estompé par la caisse une certaine quantité de tâches à échéance à un moment et de garder un pool interne de messages en raison de l'envoi (avec un délai de mécanisme en place). Quand il n'y a pas de messages renvoyés, juste en mode "veille" le scrutin à un moment. J'aimerais vous conseille contre la construction d'un tel système contre une seule table dans une base de données au lieu de la conception d'un indépendant, e-mail système de programmation que vous pouvez intégrer avec.
Je voudrais le transformer en un service à la place.
Vous pouvez utiliser le Système.Le filetage.Minuterie gestionnaire d'événement pour chaque les horaires.
Tâches planifiées peuvent être programmées pour exécuter une seule fois à un moment précis (par opposition à l'heure, à la journée, etc.), donc, une option serait de créer la tâche planifiée lorsque le champ spécifique dans votre base de données change.
Vous ne mentionnez pas la base de données que vous utilisez, mais certaines bases de données soutiennent l'idée d'un déclencheur, par exemple en SQL: http://technet.microsoft.com/en-us/library/ms189799.aspx
Si vous savez quand les e-mails doivent être envoyés à l'avance de temps, alors je suggère que vous utilisez une attente sur un événement de la poignée avec le délai d'attente. À minuit, regardez le tableau, puis d'attendre sur un événement de la poignée avec le délai expire lors de la prochaine e-mail doit être envoyé. Après l'envoi de l'e-mail de nouveau attendre avec le délai fixés sur la base de la prochaine courrier doit être envoyé.
Aussi, selon votre description, cela devrait probablement être mis en œuvre comme un service, mais il n'est pas nécessaire.
J'ai eu affaire avec le même problème il y a trois ans. J'ai changé le processus plusieurs fois avant qu'il a été assez bon, je vais te dire pourquoi:
Première mise en œuvre a l'aide de daemon d'hébergement web qui a appelé le site web IIS. Le site vérifié l'IP de l'appelant et de vérifier ensuite la base de données et envoyer des e-mails. C'était jusqu'à ce qu'un jour, lorsque j'ai reçu un beaucoup de très sale e-mails de la part des utilisateurs que j'ai totalement spammé à leurs boîtes aux lettres. L'inconvénient de maintenir l'e-mail dans la base de données et l'envoi d'e-mail SMTP est qu'il y a RIEN qui assurent DB à la transaction SMTP. Vous n'êtes jamais sûr si le mail a été envoyé avec succès ou non. L'envoi d'e-mail peut être réussie, peut a échoué ou il peut être des faux positifs ou il peut être un faux négatif (SMTP client vous dit, que le courriel n'a pas été envoyée, mais il était). Il y avait un problème avec le serveur SMTP et le serveur a retourné false(e-mail envoyez pas), mais le courriel a été envoyé. Le démon était à la réexpédition du courrier électronique toutes les heures toute la journée devant la sale e-mails s'affiche.
Deuxième mise en œuvre: Pour lutter contre le spam, j'ai changé l'algorithme, que le courrier électronique est considéré comme pour être envoyé même si elle n'a pas (mon e-mail de notification n'était pas trop important). Mon premier conseil est: "Ne pas lancer le démon trop souvent, parce que ce faux négatif d'erreur smtp permet aux utilisateurs de colère."
Après plusieurs mois il y avait quelques modifications sur le serveur et le démon ne fonctionnait pas bien. J'ai eu l'idée de la stackoverflow: lier l' .NET de la minuterie à l'application web de domaine. Ce n'était pas une bonne idée, car il semble, qu'IIS pouvez redémarrer l'application de temps en temps en raison de fuites de mémoire et la minuterie se déclenche jamais si les redémarrages sont le plus souvent à des graduations minuteur.
La dernière application. Planificateur de tâche de Windows à chaque heure des feux de python lot qui lire le site web local. Ce feu ASP.NET code. L'avantage est que le temps le planificateur de tâches windows appeler le local lot et site web de manière fiable. IIS ne se bloque pas, il a redémarrer capacité. La minuterie site est la partie de mon site web, il est toujours l'un des projets. (vous pouvez utiliser la console app au lieu de cela). Simple est le mieux. Il fonctionne, tout simplement!
Votre premier choix est la bonne option à mon avis. Le Planificateur de tâches est le MS recommandé de réaliser périodiquement des emplois. En outre, il est flexible, peut rapports d'échecs à l'ops, est optimisé et amortis parmi toutes les tâches dans le système, ...
La création de n'importe quelle console-type d'application qui s'exécute tous les temps est fragile. Il peut être arrêté par quelqu'un, a besoin d'un seesion, ne redémarre pas automatiquement, ...
L'autre option est de créer une sorte de service. C'est la garantie d'être en cours d'exécution de tous les temps, qui permettrait au moins de travail. Mais quelle a été votre motivation?
"Il semble que parce que j'ai la date de notification/reprises dans la base de données qu'il doit y avoir une meilleure façon que de la re-exécution de cette chose tout à l'heure."
Oh ouais optimisation... Si vous voulez ajouter une nouvelle façon permanente service en cours d'exécution sur votre ordinateur afin de vous éviter une potentiellement unrequired requête SQL à chaque heure? Le remède semble pire que le mal pour moi.
Et je n'ai pas mentionné tous les inconvénients du service. D'une part, votre tâche n'utilise pas de ressources quand il ne fonctionne pas. C'est très simple, léger, et la requête efficace (à condition que vous ayez le droit de l'indice).
D'autre part, si votre service de plante, il est probablement parti pour de bon. Elle doit trouver un moyen pour être averti des nouveaux e-mails qui peuvent être envoyés plus tôt que ce qui est actuellement prévu. Il utilise en permanence les ressources de l'ordinateur, comme la mémoire. Pire, il peut contenir des fuites de mémoire.
Je pense que le rapport coût/bénéfice est très faible pour toute solution autre que la simple tâche périodique.