Module formulaires & mail
Base commune : FormSurfaceController<TModel>
Controllers/FormSurfaceController.cs est le base generique de tous les formulaires (hors inscription JEMA qui a son propre controller). TModel : IFormViewModel, new().
Action Submit ([HttpPost], [ValidateAntiForgeryToken]) :
- Si
ModelStateinvalide ->CurrentUmbracoPage(). - Anti-spam honeypot : si
model.MiddleNameest rempli -> log de l'IP/user-agent +RedirectToCurrentUmbracoPage()sans envoi. - Sinon
HandleValidSubmit(model, CurrentPage as IEmailSettings), puisTempData["FormSuccess"] = trueet redirect.
Chaque formulaire concret override HandleValidSubmit.
Formulaires existants
| Controller | View model | Action |
|---|---|---|
ContactFormSurfaceController | ContactFormViewModel | SendContactFormToClientAsync puis envoi a chaque emailSettings.EmailTo |
ContactCraftsmanFormSurfaceController | ContactCraftsmanFormViewModel | SendContactCraftsmanFormToCraftsmanAsync (a l'artisan) puis aux EmailTo |
NewsletterController | (email + culture) | Opt-in newsletter via API Infomaniak (voir i18n-content.md) |
JemaRegistrationController | JemaRegistrationRequestRecord | Inscription JEMA (voir jema.md) |
Les libelles de champs viennent du dictionnaire (Forms.Generic.*, Forms.Jema.*).
EmailService (Services/EmailService.cs)
Centralise tout l'envoi via FluentEmail + RazorRenderer. Construit a la creation deux SmtpSender :
- principal (
SmtpOptions) pour les formulaires de contact ; - JEMA (
JemaSmtpOptions) pour les inscriptions/rappels (isJema: true).
SendEmailAsync(IFluentEmail, EmailSettingsRecord?, bool isJema) :
- choisit l'expediteur/
FromselonisJema; - applique sujet/CC depuis
emailSettings; - prefixe le sujet
[DEV]ou[STAGING]hors production ; - envoie et logge le resultat (succes/echec).
Methodes par cas d'usage (contact, contact artisan, confirmations et rappels JEMA). Chaque methode :
- construit la liste de champs (
EmailField) traduits viaGetDictionaryValue(key, culture); - construit le HTML des champs (
BuildFieldsHtml/BuildContactFieldsHtml/ tables de rappel) ; - remplace les tokens du contenu editorial (
ReplaceTokens:{donnees},{prenom},{nom},{nom-complet},{email}, ...) ; - construit le modele d'email et appelle
UsingTemplateFromEmbedded("Web.Mailing.Templates.<X>.cshtml", model, assembly, true).
Templates (Mailing/Templates/, embarques)
ContactRedCraftsman.cshtml,ContactCraftsman.cshtml: formulaires de contact.GenericJemaRegistrationConfirmation.cshtml: confirmation d'inscription JEMA (visiteur + artisan).JemaReminderCraftsman.cshtml,JemaReminderVisitor.cshtml: rappels JEMA.
Les templates sont declares <EmbeddedResource Include="Mailing\Templates\**" /> dans Web.csproj. Modeles associes dans Mailing/Models/ (EmailTemplateBaseModel, ContactEmailModel, JemaRegistrationConfirmationModel, JemaReminderEmailModel, JemaReminderVisitorEmailModel, EmailField).
Reglages email (composition)
Destinataires (EmailTo/Cc/Bcc), sujet et contenu (avec tokens) sont saisis par l'editeur dans la composition emailSettings (IEmailSettings) de la page portant le formulaire, et jemaRegistrationConfirmationEmailSettings pour les confirmations/rappels JEMA.
Configuration SMTP
Options/SmtpOptions.cs definit deux classes : SmtpOpions (section Smtp) et JemaSmtpOptions (section Smtp:Jema). En dev, SMTP local (localhost:25, smtp4dev). Les credentials reels sont injectes par environnement, jamais committes.

