ENVOI D'EMAILS AVEC LES CLASSES .NET - MAIL MESSAGE
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009
-
22 janv. 2008 à 13:19
ajouini
Messages postés1Date d'inscriptionsamedi 27 avril 2013StatutMembreDernière intervention 2 mai 2013
-
2 mai 2013 à 19:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
ajouini
Messages postés1Date d'inscriptionsamedi 27 avril 2013StatutMembreDernière intervention 2 mai 2013 2 mai 2013 à 19:22
merci de bien vouloir m'aider au niveau de ce message d'erreur "impossible de trouver le fichier C:\mail.ini"
Belouafi
Messages postés6Date d'inscriptionlundi 21 août 2006StatutMembreDernière intervention14 août 2010 14 août 2010 à 20:07
Bonne journée alors :D
wzis612
Messages postés2Date d'inscriptionsamedi 14 août 2010StatutMembreDernière intervention14 août 2010 14 août 2010 à 02:41
j'ai rien dit :p
wzis612
Messages postés2Date d'inscriptionsamedi 14 août 2010StatutMembreDernière intervention14 août 2010 14 août 2010 à 02:38
bonjour,
Ou trouver le mail.ini car cela me fait une erreur ..
Merci
MrCapo
Messages postés2Date d'inscriptionjeudi 14 septembre 2006StatutMembreDernière intervention13 juillet 2009 13 juil. 2009 à 00:03
Mon commentaire vient un peu en retard.
Si j'ai bien suivi le débat.
J'apporte ma connaissance à ce sujet.
Les règles disent qu'il faut vérifier l'état des variables saisies par l'utilisateur, ce qui est fait.
Et aussi et surtout
lors de l'utilisation d'un Stream, il faut toujours mettre l'opération entre un bloque try catch et capter l'exception. Dans ce cas, l'opération d'envoi et une opération d'écriture dans un flux de donnée, de type particulier, mais ça reste une écriture dans un Stream, pareil que dans un fichier. Donc, il faut mettre le send entre try{}catch(){}
Je vous donne le pour quoi:
Imaginer que toutes les variables contiennent les bonnes valeurs, jusqu'à la tout est bon.
Mais, tu n'es pas sure que le serveur ne va pas te répondre, alors il y aura une erreur qui va cracher l'application.
Une écriture dans un fichier est simple, ouvrir, écrire et fermer. Mais si le fichier est réservé par un autre processus, c'est le même cas ici.
Conclusion:
Vérification de variable : IF et TRYPARSE
manipulation d'un stream ==> BLOCK TRY CATCH
cs_badrbadr
Messages postés475Date d'inscriptionjeudi 19 juin 2003StatutMembreDernière intervention 3 novembre 20081 22 janv. 2008 à 20:31
L'utilisation des exceptions diminue les performances de l'application.
C'est un point à considérer.
Belouafi
Messages postés6Date d'inscriptionlundi 21 août 2006StatutMembreDernière intervention14 août 2010 22 janv. 2008 à 20:15
Ceci ce n'est qu'un simple exemple de l'utilisation des classes .NET, si on s'amuse à optimiser il y en tant de chose à faire , exemple :
Pour le contructeur, si tu envoi 300 mais tu va écrire les adresses l'une après l'autre séparées par des virgules.
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 22 janv. 2008 à 20:05
Merci pour ces précisions, je pense que l'appli pour laquelle je traville n'est pas étrangère à cet aprioris. Ca lance des exeptions pour des broutilles et ca plante quand l'objet est null...
En fait ca dépent du contexte, du développeur et de l'utilisateur.
Pour en revenir au code:
les using System.Collections.Generic et System.Text ne sont pas utilisées.
Le '%' et le "C:\\mail.ini" il faut au moins mettre ca en constantes
Encore une chose :
String str = File.ReadAllText("C:\\mail.ini"); ;
String[] f = str.Split('%');
adrMail = new MailAddress(f[0], f[2]);
smtp = new SmtpClient(f[1]);
Pourquoi ne pas les mettres dans une fonction genre LoadParam() qui ne serait appelé que dans le constructeur, comme ca si je fais un evoi de 300 mails ca évite d'aller lire le fichier ini 300 fois...
billou_13
Messages postés860Date d'inscriptionjeudi 4 mars 2004StatutMembreDernière intervention19 août 201429 22 janv. 2008 à 19:29
J'avais oublié la note avec tout ça ^^
billou_13
Messages postés860Date d'inscriptionjeudi 4 mars 2004StatutMembreDernière intervention19 août 201429 22 janv. 2008 à 19:11
Je vais répondre à ta question oximoron.
Tu as tout à fait raison sur le fait que ce n'est pas bon de lancer des exceptions à tout bout de champs. C'est pourquoi il est très important de se poser la question : envoyer une exception ou renvoyer un code erreur.
Je vais donc parler personnellement car ce choix est à la décision de chacun.
Je pense qu'un code erreur ne peut être renvoyé que si le déroulement a été normal et surtout, si l'erreur était à prévoir pour le besoin utilisateur.
Exemple: on te demande de faire un logiciel qui va scanner un fichier formaté de telle facon tout en vérifiant les erreurs possibles (erreur de formatage d'un entier,...). Dans ce cas, il vaut mieux préférer le recours à un code erreur (int.TryParse(...)) plutot que de faire des int.Parse et catcher les erreurs.
Seulement, dans le cas de cette méthode Send(...), c'est bien plus qu'une simple erreur, c'est une erreur qui ne doit jamais arriver. C'est au développeur qui appelle la méthode de vérifier au préalable.
foreach(string curAdr in listeAdresses)
{
if(!string.IsNullOrEmpty(curAdr))
Send(...);
}
Mais aussi, une raison de plus, imagines que quelqu'un utilise cette classe mais qu'il s'en fout du code de retour de la fonction. Il va croire que tout va bien alors que non. En lui envoyant une exception, tu lui indiques une erreur dans son programme: le destinataire ne doit pas être vide.
Voila ce que je pense mais c'est au désir de chacun ^^
Et pour finir, je voudrais faire une proposition qui pourrait combler tout le monde. Pourquoi ne pas enlever complétement ce test et laisser le framework faire ce qu'il veut de cet argument (à voir: http://msdn2.microsoft.com/fr-fr/library/swas0fwc(VS.80).aspx). Car après tout, ce n'est peut être pas à la fonction test de faire ce test mais plutôt à la fonction smtp.Send(mail);
Comme ça, plus de problème ^^
Bonne soirée à tous,
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 22 janv. 2008 à 18:21
bon moi je vais faire mon têtu, mais je vous avoue ne pas trop bien vous suivre:
Vous préférez
try
{
EnvoiMail()
}
catch
{
}
Moi je préfère le 2ème. J'ai déjà eu des cas où une exception était lancé alors que voulais traiter l'erreur moi même, mais j'ai du surchagée la fonction pour faire un test avant le throw ... C'est sur une appli pas forcément géniale au niveau du code avec des try catch dans tous les sens, impriquées, avec des throw new exeption à tous va, donc que je pense que c'est pas forcément mauvais, mais ca peut vite devenir un bordel monstre
Shad78
Messages postés10Date d'inscriptionmardi 13 mars 2007StatutMembreDernière intervention31 juillet 2008 22 janv. 2008 à 17:51
Oui je suis également en faveur de l'exception, c'est à mon avis la meilleure façon de gerer les erreurs en C# et dans tous les langages qui les mettent à disposition.
Comment améliorer un tout petit peu? On pourrait faire une classe qui dérive de System.Exception et utiliser celle ci pour que le développeur qui utilise la classe puisse filtrer les exception sur le type d'exception. (ChipotageLevel = 90).
On pourrait également mettre dans les commentaires XML une balise exception : /// <exception cref="System.Exception">Declenche une exception si aucun destinataire</exception> pour informer ceux qui utiliseront la classe qu'une exception peut être déclenché. (ChipotageLevel = 97)
Sinon c'est une source simple mais claire donc c'est bien :)
A pu qu'à mettre des commentaires XML partout! ;)
Belouafi
Messages postés6Date d'inscriptionlundi 21 août 2006StatutMembreDernière intervention14 août 2010 22 janv. 2008 à 17:31
Bonne idée. Je suis de ton avis.
billou_13
Messages postés860Date d'inscriptionjeudi 4 mars 2004StatutMembreDernière intervention19 août 201429 22 janv. 2008 à 17:27
Bonsoir,
Histoire d'ajouter un protagoniste à votre débat, je voudrais donner mon accord pour l'utilisation de l'exception car il s'agit bien d'un traitement problèmatique qui ne devrait pas être fait, donc une exception. Comme son nom l'indique, c'est une exception qui peut arriver et doit être corriger: on ne doit pas appeler une méthode send mail avec un destinataire vide.
Cependant, (il y a toujours un mais), je voudrais ajouter un petit conseil: tu devrais tester la valeur nulle aussi et envoyé une exception typée. Cela permet aux utilisateurs de ta classe de pouvoir trier les exceptions. Et, de plus, pourquoi ne pas le faire quand le framework nous donne les outils pour ^^
Cela donne donc le code:
if(string.IsNullOrEmpty(Destinataires))
throw new ArgumentException("La liste des destinataires ne peut pas être vide !");
Enfin, ca s'appelle du chipotage à ce niveau ^^ (mais j'aime chipoter)
Bonne soirée à vous,
Belouafi
Messages postés6Date d'inscriptionlundi 21 août 2006StatutMembreDernière intervention14 août 2010 22 janv. 2008 à 17:21
Bon, c'est de la programmation classique enfin de compte, moi j'ai un point de vue c'est minimiser les if dans mes programmes. D'ailleur, un bon programmeur a toujours intêret d'utiliser des try/catch, surtout dans les application qu'il juge instable ( cas des bases de données par exemple ).
Pour cela, je prèfère utiliser des try/catch, pour minimiser les if d'un coté, et pour montrer des fois l'utilité.
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 22 janv. 2008 à 16:18
Warny -> On s'entend sur un point, on n'est pas d'accord ensembble :). Pourquoi je dis ca : Imaginons dans le cas où on utilise une dll externe dont on a pas accès aux sources. Comment voir ce qui est catché ou pas ? Si il y a plusieurs erreurs il faudra faire un test dans le catch pour faire un traitement spé. Et un autre cas, j'utilise une fonction d'une classe un peu plus complexe qui va lancer une throw sur quelque chose qui ne sera pas bloquant alors que je ne veux pas qu'il le fasse.
Pour moi tant qu'on peut faire des tests classiques avec des if on fait ca, les try/catch c'est pour rattraper les erreurs non prévus.
Donc je reste sur ma position (pour l'instant)
Belouafi
Messages postés6Date d'inscriptionlundi 21 août 2006StatutMembreDernière intervention14 août 2010 22 janv. 2008 à 15:36
Ce que vous dites n'est pas tout à fait juste, vu que j'utilise le throw pour qu'elle soit catché dans l'interface graphique et comme ça elle va être gérée comme étant une érreur. Il faut voir le try/catch il est présent dans le code source du bonton envoyer.
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 22 janv. 2008 à 14:16
oximoron -> je ne suis pas d'accord avec toi. L'exception permet de gérer le fait qu'il y ait une erreur et son contenu correctement. Il suffit de faire un try/catch pour gérer l'erreur, c'est à mon sens la meilleure méthode
oximoron
Messages postés149Date d'inscriptionmercredi 23 juillet 2003StatutMembreDernière intervention30 janvier 2009 22 janv. 2008 à 13:19
C'est bien fait mais le throw new Exception quand il n'y pas de destinataire c'est un peu hard, et vu que c'est une classe qui sera utilisé autre part il vaut mieux a mon avis que tu renvoies une valeur genre un enum qui correspond à un type d'erreur.
2 mai 2013 à 19:22
14 août 2010 à 20:07
14 août 2010 à 02:41
14 août 2010 à 02:38
Ou trouver le mail.ini car cela me fait une erreur ..
Merci
13 juil. 2009 à 00:03
Si j'ai bien suivi le débat.
J'apporte ma connaissance à ce sujet.
Les règles disent qu'il faut vérifier l'état des variables saisies par l'utilisateur, ce qui est fait.
Et aussi et surtout
lors de l'utilisation d'un Stream, il faut toujours mettre l'opération entre un bloque try catch et capter l'exception. Dans ce cas, l'opération d'envoi et une opération d'écriture dans un flux de donnée, de type particulier, mais ça reste une écriture dans un Stream, pareil que dans un fichier. Donc, il faut mettre le send entre try{}catch(){}
Je vous donne le pour quoi:
Imaginer que toutes les variables contiennent les bonnes valeurs, jusqu'à la tout est bon.
Mais, tu n'es pas sure que le serveur ne va pas te répondre, alors il y aura une erreur qui va cracher l'application.
Une écriture dans un fichier est simple, ouvrir, écrire et fermer. Mais si le fichier est réservé par un autre processus, c'est le même cas ici.
Conclusion:
Vérification de variable : IF et TRYPARSE
manipulation d'un stream ==> BLOCK TRY CATCH
22 janv. 2008 à 20:31
C'est un point à considérer.
22 janv. 2008 à 20:15
string[] f=(string)(File.ReadAllText("C:\\mail.ini")).split('%');
Pour le contructeur, si tu envoi 300 mais tu va écrire les adresses l'une après l'autre séparées par des virgules.
22 janv. 2008 à 20:05
En fait ca dépent du contexte, du développeur et de l'utilisateur.
Pour en revenir au code:
les using System.Collections.Generic et System.Text ne sont pas utilisées.
Le '%' et le "C:\\mail.ini" il faut au moins mettre ca en constantes
Encore une chose :
String str = File.ReadAllText("C:\\mail.ini"); ;
String[] f = str.Split('%');
adrMail = new MailAddress(f[0], f[2]);
smtp = new SmtpClient(f[1]);
Pourquoi ne pas les mettres dans une fonction genre LoadParam() qui ne serait appelé que dans le constructeur, comme ca si je fais un evoi de 300 mails ca évite d'aller lire le fichier ini 300 fois...
22 janv. 2008 à 19:29
22 janv. 2008 à 19:11
Tu as tout à fait raison sur le fait que ce n'est pas bon de lancer des exceptions à tout bout de champs. C'est pourquoi il est très important de se poser la question : envoyer une exception ou renvoyer un code erreur.
Je vais donc parler personnellement car ce choix est à la décision de chacun.
Je pense qu'un code erreur ne peut être renvoyé que si le déroulement a été normal et surtout, si l'erreur était à prévoir pour le besoin utilisateur.
Exemple: on te demande de faire un logiciel qui va scanner un fichier formaté de telle facon tout en vérifiant les erreurs possibles (erreur de formatage d'un entier,...). Dans ce cas, il vaut mieux préférer le recours à un code erreur (int.TryParse(...)) plutot que de faire des int.Parse et catcher les erreurs.
Seulement, dans le cas de cette méthode Send(...), c'est bien plus qu'une simple erreur, c'est une erreur qui ne doit jamais arriver. C'est au développeur qui appelle la méthode de vérifier au préalable.
foreach(string curAdr in listeAdresses)
{
if(!string.IsNullOrEmpty(curAdr))
Send(...);
}
Mais aussi, une raison de plus, imagines que quelqu'un utilise cette classe mais qu'il s'en fout du code de retour de la fonction. Il va croire que tout va bien alors que non. En lui envoyant une exception, tu lui indiques une erreur dans son programme: le destinataire ne doit pas être vide.
Voila ce que je pense mais c'est au désir de chacun ^^
Et pour finir, je voudrais faire une proposition qui pourrait combler tout le monde. Pourquoi ne pas enlever complétement ce test et laisser le framework faire ce qu'il veut de cet argument (à voir: http://msdn2.microsoft.com/fr-fr/library/swas0fwc(VS.80).aspx). Car après tout, ce n'est peut être pas à la fonction test de faire ce test mais plutôt à la fonction smtp.Send(mail);
Comme ça, plus de problème ^^
Bonne soirée à tous,
22 janv. 2008 à 18:21
Vous préférez
try
{
EnvoiMail()
}
catch
{
}
à ca :
bool lbEnvoiOk = EnvoiMail()
if(!lbEnvoiOk)
{
}
else
{
}
Moi je préfère le 2ème. J'ai déjà eu des cas où une exception était lancé alors que voulais traiter l'erreur moi même, mais j'ai du surchagée la fonction pour faire un test avant le throw ... C'est sur une appli pas forcément géniale au niveau du code avec des try catch dans tous les sens, impriquées, avec des throw new exeption à tous va, donc que je pense que c'est pas forcément mauvais, mais ca peut vite devenir un bordel monstre
22 janv. 2008 à 17:51
Comment améliorer un tout petit peu? On pourrait faire une classe qui dérive de System.Exception et utiliser celle ci pour que le développeur qui utilise la classe puisse filtrer les exception sur le type d'exception. (ChipotageLevel = 90).
On pourrait également mettre dans les commentaires XML une balise exception : /// <exception cref="System.Exception">Declenche une exception si aucun destinataire</exception> pour informer ceux qui utiliseront la classe qu'une exception peut être déclenché. (ChipotageLevel = 97)
Sinon c'est une source simple mais claire donc c'est bien :)
A pu qu'à mettre des commentaires XML partout! ;)
22 janv. 2008 à 17:31
22 janv. 2008 à 17:27
Histoire d'ajouter un protagoniste à votre débat, je voudrais donner mon accord pour l'utilisation de l'exception car il s'agit bien d'un traitement problèmatique qui ne devrait pas être fait, donc une exception. Comme son nom l'indique, c'est une exception qui peut arriver et doit être corriger: on ne doit pas appeler une méthode send mail avec un destinataire vide.
Cependant, (il y a toujours un mais), je voudrais ajouter un petit conseil: tu devrais tester la valeur nulle aussi et envoyé une exception typée. Cela permet aux utilisateurs de ta classe de pouvoir trier les exceptions. Et, de plus, pourquoi ne pas le faire quand le framework nous donne les outils pour ^^
Cela donne donc le code:
if(string.IsNullOrEmpty(Destinataires))
throw new ArgumentException("La liste des destinataires ne peut pas être vide !");
Enfin, ca s'appelle du chipotage à ce niveau ^^ (mais j'aime chipoter)
Bonne soirée à vous,
22 janv. 2008 à 17:21
Pour cela, je prèfère utiliser des try/catch, pour minimiser les if d'un coté, et pour montrer des fois l'utilité.
22 janv. 2008 à 16:18
Pour moi tant qu'on peut faire des tests classiques avec des if on fait ca, les try/catch c'est pour rattraper les erreurs non prévus.
Donc je reste sur ma position (pour l'instant)
22 janv. 2008 à 15:36
22 janv. 2008 à 14:16
22 janv. 2008 à 13:19