Tenir vos visiteurs informés de la disponibilité d'une page par mail.


Description

Lorsque vous créez un site il est possible qu'un utilisateur tente d'accéder à une page ( dans le cas de mon exemple un User Control (.ascx) ) qui n'est pas encore disponible.
J'ai voulu alors créer un code qui puisse informer l'utilisateur que cette page n'existe pas ( fameuse Erreur 404 ) et lui proposer de l'informer par mail de la mise en service de cette page.

Pour l exemple je vais utiliser un User Control , à vous de le modifier si vous voulez qu'il marche avec un frame ou juste une page normale.

Lorsque la page principale tente de charger la page demandée ( dans le querystring par ex. )
elle vérifie que le control ascx existe bien ,
1 ) S'il n'existe pas on redirige l'utilisateur vers une erreur 404 depuis laquelle il pourra enregistrer son email.
2 ) Si le control existe , une fonction va alors vérifier le nombre de fois que la page a été visité ,
si le nombre de visites est null ou egal à 0 , alors on envoie un mail à tout les visiteurs qui l ont demandé.

J'espere avoir été clair. , si vous n'avez rien compris essayez le zip.
Le code a été testé , il marche sur mon serveur personnel sous server 2003.
Le problème que vous pouvez avoir a mon avis viendrait du SmtpMail.Send( "myMail" );

Bon courage !

lunatik

Source / Exemple :


' DANS LE FICHIER DEFAULT.ASPX
namespaces requis : 
           System.Text
           System.IO
           System.Web.Mail

Code :

void Page_Load(object sender, EventArgs e)
	{
		if(Request.QueryString["page"]!=null)
		{
			string DocId	= Request.QueryString["page"];
			if( File.Exists( Server.MapPath("") + "\\" + DocId + ".ascx" ) )
			{
				'Check if file exists
				'on ajoute 1 au compteur.
				'si le compteur est vide ou egal a 0
				'on envoit un mail aux utilisateurs pour
				'les informer de son ajout.
				countPage(DocId);
				mainContent.Controls.Add(Page.LoadControl( DocId + ".ascx" ) );
			}
			else
			{
				mainContent.Controls.Add(Page.LoadControl( "error404.ascx" ) );
			}			
		}
	}
	
	private void countPage( string usercontrol )
	{
		'on verifie l existence du repertoire sinon on le cree
		if( !Directory.Exists( Server.MapPath("") + "\\info_count\\" ) )
		{
			Directory.CreateDirectory( Server.MapPath("") + "\\info_count\\" );
		}
			
		string countFile = Server.MapPath("") + "\\info_count\\" + usercontrol + ".txt";
		if( !File.Exists( countFile ) )
		{
			'si le fichier counter n existe pas, on le cree et on envoit un mail
			StreamWriter writeCount = new StreamWriter( countFile , false );
			writeCount.Write( "1" );
			writeCount.Close();
			
			sendMail( usercontrol );
		}
		else
		{
		
		
			'on stock le nombre de visite dans un entier.
			StreamReader readCount = new StreamReader( countFile );
			int count = 0;
			try
			{
				count = int.Parse( readCount.ReadToEnd() );
			}
			catch
			{
				count = 0;
			}
			
			readCount.Close();
			
			if( count == 0 )
			{
				'si le nombre de visite est egal a 0  on envoit un mail
				sendMail( usercontrol );
			}
			
			'on ajoute 1 aux nombre de visites
			count+=1;
			'on sauvegarde...
			
			StreamWriter writeCount = new StreamWriter( countFile , false );
			writeCount.Write( count.ToString() );
			writeCount.Close();
		}
	}
	
	private void sendMail( string usercontrol )
	{
		'on verifie l existence du repertoire sinon on le cree
		if( !Directory.Exists( Server.MapPath("") + "\\info_mail\\" ) )
		{
			Directory.CreateDirectory( Server.MapPath("") + "\\info_mail\\" );
		}
	
		'on stock le chemin dans un string
		string mailpath = Server.MapPath("") + "\\info_mail\\" + usercontrol + ".txt";
		if( File.Exists( mailpath ) )
		{		
			'on enregistre les mails dans un textbox pour facilement separer chaque ligne.
			string mailList = "";;
			StreamReader readmails = new StreamReader( mailpath );
			mailList = readmails.ReadToEnd();
			readmails.Close();
			
			'on sauvegarde les mails dans un string array (on decoupe a partir de \n )
			string sep = "\n";
			string[] newList = mailList.Split( sep.ToCharArray() );
						
			'et maintenant on envoit un mail a chaque personne dans la liste.
			for( int i = 0 ; i < newList.Length ; i++ )
			{
				if( newList[i].Length >= 2 )
				{
					MailMessage email	= new MailMessage();
					email.From			= "********@domain.com"; // <-- mettez votre email ici
					email.To			= newList[i];
					email.Subject		= "Page disponible !";
					email.Body			= "la page \"machin\" est disponible sur le site \"truc.com\"";
					SmtpMail.SmtpServer = "smtp.*domain*.com" ;  // <-- ici votre server smtp 
					
					SmtpMail.Send( email );
				}
			}			
		}
	}

'DANS LE FICHIER DE L ERREUR :
          namespace requis :
                       System.IO

           code :

	'evenement lors de la creation de la page
		void Page_Load(object sender, EventArgs e)
		{
			'assignement du nom du document a sauvegarder dans un textbox
			'optionel !!
			docid.Text = Request.QueryString["page"];
		}
		
		'sauvegarde du mail dans un document
		private void saveMail(object sender , EventArgs e)
		{
			'verification du contenu du textbox "mail"
			if( !mail.Text.StartsWith(" ") || mail.Text!= "" )
			{ 
				'on verifie que son email est au bon format
				if( mail.Text.LastIndexOf("@") >= 1 )
				{			
				
					'on verifie l existence du repertoire sinon on le cree
					if( !Directory.Exists( Server.MapPath("") + "\\info_mail\\" ) )
					{
						Directory.CreateDirectory( Server.MapPath("") + "\\info_mail\\" );
					}	
					
					string docname	= Request.QueryString["page"];
					string filePath	= Server.MapPath("") + "\\info_mail\\" + docname + ".txt";
					if( !File.Exists( filePath ) )
					{
						'si le fichier qui contient la liste de mail
						'n'existe pas , on le cree.
						StreamWriter writeFile = new StreamWriter( filePath , false );
						writeFile.WriteLine( mail.Text );
						writeFile.Close();
					}
					else
					{
						'Si le fichier existe on ne fait que sauvegarder le mail.
						StreamWriter writeFile = new StreamWriter( filePath , true );
						writeFile.WriteLine( mail.Text );
						writeFile.Close();
					}
					'une fois enregistre on previent l'utlisateur.
					sub_info.Text = "Merci.<br />Vous serez informé dès que le document sera ajouté";
				}
				else
					sub_info.Text = "Veuillez vérifier votre email.";
			}
			else
				sub_info.Text = "Veuillez entrer votre email.";
		}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.