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.";
}
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.