It's possible, but you need to be prepared to do some customization since there is no really easy way to switch it out. 😊
First, you need to create a model that inherits the EmailTemplateActorModel
and overrides the FromEmail
property. You could validate it, use a selection factory to limit the choices or use a JsonIgnoreAttribute
and ScaffoldColumnAttribute
to hide it (this would be a bit more effort). I went with some simple validation as an example:
[Serializable]
public class ValidateFromEmailTemplateActorModel : EmailTemplateActorModel
{
[RegularExpression("^[A-Za-z0-9._%+-]+@jakejon.es$", ErrorMessage = "The email address must be from a jakejon.es domain.")]
public override string FromEmail { get; set; }
}
Now create a property for this, note the EditorHintAttribute
which we'll reference in the next step:
[EditorHint("ValidateFromEmailTemplateActorEditor")]
[PropertyDefinitionTypePlugIn(DisplayName = "Message Template")]
public class ValidateFromPropertyEmailTemplateActorList : PropertyGenericList<ValidateFromEmailTemplateActorModel> {}
Next, we add an editor descriptor. This is exactly the same as the default Optimizely CMS one (the EmailTemplateActorCollectionEditorDescriptor
) but uses our new model type (and the UI hint from above):
[EditorDescriptorRegistration(TargetType = typeof(IEnumerable<ValidateFromEmailTemplateActorModel>), UIHint = "ValidateFromEmailTemplateActorEditor")]
public class ValidateFromEmailTemplateActorCollectionEditorDescriptor : CollectionEditorDescriptor<ValidateFromEmailTemplateActorModel>
{
public ValidateFromEmailTemplateActorCollectionEditorDescriptor()
{
ClientEditingClass = "epi-forms/contentediting/editors/EmailTemplateActorEditor";
}
public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable<Attribute> attributes)
{
GridDefinition.GridSettings["richTextColumns"] = new[] { "body" };
base.ModifyMetadata(metadata, attributes);
}
}
Finally, we need to add a new submission actor that uses our property (and therefore new model). This can just inherit the SendEmailAfterSubmissionActor
with the property type being overridden:
public class ValidateFromSendEmailAfterSubmissionActor : SendEmailAfterSubmissionActor
{
public override Type PropertyType => typeof(ValidateFromPropertyEmailTemplateActorList);
}
If you run at this point you'll have 2 different submission actors on your Settings tab, the bottom one should apply the validation. You may need to add some translations to your language XMLs for everything to show up looking nice.
This blog post covers hiding the default send email submission actor: https://www.getadigital.com/blog/replacing-built-in-email-actor-with-custom-implementation-in-episerver-forms, it's easy enough just requires one more EditorDescriptor.
Good luck!
In Forms the editors can choose to 'Send email after form submission' and then insert a From mailaddress.
We see that this often goes wrong. An e-mail address is entered which is not supported by the mail server (not the same domain as the website itself).
what is the best way to avoid this?
Can this field be disabled; offer a dropdown with options or provide the form with a validation on this?