Bonjour à vous,
Je cherche désespérément à construire un formulaire d’envoi d’un message par e-mail basique, accompagné d’un ( Google recaptcha ) dont voici l’ensemble du code (je précise que je n’ai rien inventé, je copie ce que je trouve sur le net), je pense que lorsque la solution sera trouvée, ça pourra servir aux autres webmasters :
Ajout d’un nouveau fichier de classe au dossier Modèles et nommé EmailFormModel.cs
La vue Contact version simplifiée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.ComponentModel.DataAnnotations; namespace Web_essai_MVC.Models { public class EmailFormModel { [Required, Display(Name = "Nom & Prénom")] public string FromName { get; set; } [Required, Display(Name = "Adresse e-mail"), EmailAddress] [RegularExpression(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$", ErrorMessage = "Adresse e-mail invalide.")] public string FromEmail { get; set; } [Required] public string Message { get; set; } } }
Le fichier HomeController.cs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 @model Web_essai_MVC.Models.EmailFormModel @{ /**/ ViewBag.Title = "Contact"; } // j'ai peut-être un soucis avec (FormSubmit) comment le noter dans la ligne ci-dessous ? @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "idForm" })) { @Html.AntiForgeryToken() <h3>Formulaire...</h3> <div class="form-group"> @Html.LabelFor(m => m.FromName, new { @class = "col-md-6 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.FromName, new { @class = "form-control" }) <span style="color:red;"> @Html.ValidationMessageFor(m => m.FromName)</span> </div> </div> <div class="form-group"> @Html.LabelFor(m => m.FromEmail, new { @class = "col-md-6 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.FromEmail, new { @class = "form-control" }) <span style="color:red;"> @Html.ValidationMessageFor(m => m.FromEmail)</span> </div> </div> <div class="form-group"> @Html.LabelFor(m => m.Message, new { @class = "col-md-6 control-label" }) </div> <div class="col-md-10"> @Html.TextAreaFor(m => m.Message, new { @class = "form-control" }) <span style="color:red;">@Html.ValidationMessageFor(m => m.Message)</span> </div> <div class="form-group"> <div class="col-md-10"> <br /> <div> <div> <div class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxxx"></div> <span style="display:inline-block; font-size:20px;margin:20px 0;padding:20px;border:1px solid #fff"> @ViewBag.Message </span> <br /> <input id="btnSubmit" type="submit" class="btn btn-default" value="Envoyer" /> </div> <script src='https://www.google.com/xxxx'></script> </div> <script> $("#idForm").submit(function () { if ($('#idForm').valid()) { $("#btnSubmit").attr("disabled", "disabled"); return true; } }); </script> </div> </div> } @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
Tous ça fonctionne bien je reçois le mail….MAIS !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Net; using System.Net.Mail; using Web_essai_MVC.Models; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Web_essai_MVC.Controllers { public class HomeController : Controller { public ActionResult Index() { return View(); } public ActionResult Contact() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Contact(EmailFormModel model) { if (ModelState.IsValid) { var body = "<p>Adresse e-mail : {0} ({1})</p><br/><p> Message :</p><br/><p>{2}</p>"; var message = new MailMessage(); message.To.Add(new MailAddress("Contact@xxxxxxx.fr")); message.Subject = "Message en provenance du site d'xxxxx..."; message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message); message.IsBodyHtml = true; using (var smtp = new SmtpClient()) { // les paramètres smtp sont dans le fichier web.config await smtp.SendMailAsync(message); return RedirectToAction("SenD"); } } return View(model); } public ActionResult SenD() { return View(); } } }
Que je valide ou pas le captcha google l’e-mail part quand même….Voici le code, car mon malheur c’est que je ne sais pas comment le traiter ?
Comment faire en sorte que mon code dans le HomeControllers, soit prit en compte avant l’envoie de l’e-mail ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 [HttpPost] public ActionResult FormSubmit() // FormSubmit nest pas reconnu par HomeControllers { //Validez Google recaptcha ici var response = Request["g-recaptcha-response"]; string secretKey = "xxxxxxxxxxxxxxxxxx"; var client = new WebClient(); var result = client.DownloadString(string.Format("https://www.google.com/xxxxxxx", secretKey, response)); var obj = JObject.Parse(result); var status = (bool)obj.SelectToken("success"); ViewBag.Message = status ? "Google reCaptcha validé" : "Google reCaptcha non validé"; }
J'ai essayé de mettre le code du captcha dans le fichier (EmailFormModel.cs ) mais sans succès.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public ActionResult Contact() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Contact(EmailFormModel model) { if (ModelState.IsValid && statut) // status nest pas reconnus { //Validez Google recaptcha ici var response = Request["g-recaptcha-response"]; string secretKey = "xxxxxxxxxxxxxxxxxx"; var client = new WebClient(); var result = client.DownloadString(string.Format("https://www.google.com/xxxxxxx", secretKey, response)); var obj = JObject.Parse(result); var status = (bool)obj.SelectToken("success"); ViewBag.Message = status ? "Google reCaptcha validé" : "Google reCaptcha non validé"; var body = "<p>Adresse e-mail : {0} ({1})</p><br/><p> Message :</p><br/><p>{2}</p>"; var message = new MailMessage(); message.To.Add(new MailAddress("message@xxxxxx.fr")); message.Subject = "Message en provenance du site d'xxxxx..."; message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message); message.IsBodyHtml = true; using (var smtp = new SmtpClient()) { // les paramètres smtp sont dans le fichier web.config await smtp.SendMailAsync(message); return RedirectToAction("SenD"); } } return View(model); } public ActionResult SenD() { return View(); }
Je fini par tout mélanger.
C’est tellement plus agréable d’avoir à valider un formulaire avec ce type de captcha.
A défaut d’aide, ou puis-je trouver l’information ?
Par avance, merci à mon sauveur.
Bruno
Partager