This plugin allows you to add an email contact form to your website., (*1)
Requirements
This plugin requires Craft CMS 4.0.0+ or 5.0.0+., (*2)
Installation
You can install this plugin from the Plugin Store or with Composer., (*3)
From the Plugin Store
Go to the Plugin Store in your projectâs Control Panel and search for âContact Formâ. Then click on the âInstallâ button in its modal window., (*4)
With Composer
Open your terminal and run the following commands:, (*5)
# go to the project directory
cd /path/to/my-project.test
# tell Composer to load the plugin
composer require craftcms/contact-form
# tell Craft to install the plugin
php craft plugin/install contact-form
Usage
Your contact form template can look something like this:, (*6)
The only required fields are fromEmail and message. Everything else is optional., (*7)
Redirecting after submit
If you have a redirect hidden input, the user will get redirected to it upon successfully sending the email. The following variables can be used within the URL/path you set:, (*8)
{fromName}
{fromEmail}
{subject}
For example, if you wanted to redirect to a contact/thanks page and pass the senderâs name to it, you could set the input like this:, (*9)
On your contact/thanks.html template, you can access that from parameter using craft.app.request.getQueryParam():, (*10)
<p>Thanks for sending that in, {{ craft.app.request.getQueryParam('from') }}!</p>
Note that if you donât include a redirect input, the current page will get reloaded., (*11)
Displaying flash messages
When a contact form is submitted, the plugin will set a notice (Craft 4) or success (Craft 5+) flash message on the user session. You can display it in your template like this:, (*12)
If you have a primary âMessageâ field, you should name it message[body], like in that example., (*14)
An email sent with the above form might result in the following message:, (*15)
⢠Name: John Doe
⢠Email: example@email.com
⢠Phone: (555) 123-4567
⢠Services: Design, Development
Hey guys, I really loved this simple contact form (I'm so tired of agencies
asking for everything but my social security number up front), so I trust
you guys know a thing or two about usability.
I run a small coffee shop and we want to start attracting more freelancer-
types to spend their days working from our shop (and sipping fine coffee!).
A clean new website with lots of social media integration would probably
help us out quite a bit there. Can you help us with that?
Hope to hear from you soon.
Cathy Chino
By default, thereâs no restriction on which keys can be included on message. You can limit which fields are allowed using the allowedMessageFields setting in config/contact-form.php:, (*16)
If you create a config file in your config/ folder called contact-form.php, you can override
the pluginâs settings in the Control Panel. Since that config file is fully multi-environment aware, this is
a handy way to have different settings across multiple environments., (*17)
Hereâs what that config file might look like along with a list of all of the possible values you can override., (*18)
In this example if toEmail does not exist or fails validation (it was tampered with), the plugin will fallback to the âTo Emailâ defined in the plugin settings, so you must have that defined as well., (*22)
File attachments
If you would like your contact form to accept file attachments, follow these steps:, (*23)
Go to Settings â Contact Form in the Control Panel, and make sure the plugin is set to allow attachments.
Make sure your opening HTML <form> tag contains enctype="multipart/form-data".
Add a <input type="file" name="attachment"> to your form.
If you want to allow multiple file attachments, use multiple <input type="file" name="attachment[]" multiple> inputs.
Ajax form submissions
You can optionally post contact form submissions over Ajax if youâd like. Just send a POST request to your site with all of the same data that would normally be sent:, (*24)
$('#my-form').submit(function(ev) {
// Prevent the form from actually submitting
ev.preventDefault();
// Send it to the server
$.post({
url: '/',
dataType: 'json',
data: $(this).serialize(),
success: function(response) {
$('#thanks').text(response.message).fadeIn();
},
error: function(jqXHR) {
// The response body will be an object containing the following keys:
// - `message` â A high level message for the response
// - `submission` â An object containing data from the attempted submission
// - `errors` â An object containing validation errors from the submission, indexed by attribute name
alert(jqXHR.responseJSON.message);
}
});
});
The afterValidate event
Modules and plugins can be notified when a submission is being validated, providing their own custom validation logic, using the afterValidate event on the Submission model:, (*25)
use craft\contactform\models\Submission;
use yii\base\Event;
// ...
Event::on(Submission::class, Submission::EVENT_AFTER_VALIDATE, function(Event $e) {
/** @var Submission $submission */
$submission = $e->sender;
// Make sure that `message[Phone]` was filled in
if (empty($submission->message['Phone'])) {
// Add the error
// (This will be accessible via `message.getErrors('message.phone')` in the template.)
$submission->addError('message.phone', 'A phone number is required.');
}
});
The beforeSend event
Modules and plugins can be notified right before a message is sent out to the recipients using the beforeSend event. This is also an opportunity to flag the message as spam, preventing it from getting sent:, (*26)
use craft\contactform\events\SendEvent;
use craft\contactform\Mailer;
use yii\base\Event;
// ...
Event::on(Mailer::class, Mailer::EVENT_BEFORE_SEND, function(SendEvent $e) {
$isSpam = // custom spam detection logic...
if ($isSpam) {
$e->isSpam = true;
}
});
The afterSend event
Modules and plugins can be notified right after a message is sent out to the recipients using the afterSend event., (*27)
use craft\contactform\events\SendEvent;
use craft\contactform\Mailer;
use yii\base\Event;
// ...
Event::on(Mailer::class, Mailer::EVENT_AFTER_SEND, function(SendEvent $e) {
// custom logic...
});