There is an article over a DZone today "What if your contact form fails?". The article discusses what to do if the contact form on your website fails to send a message. The approach they suggest is to display a message to the user saying it failed, and presenting them with a mailto link so they can send you an email themselves.
This is one approach to the failed contact form problem, but it isn't going to help much if the problem is actually with your email address. For example, you may have exceeded your disk quota, or you might have a badly configured mail server.
Another problem with the mail solution is that it requires the user to perform another action. They've gone to the trouble of filling out a contact form. If that fails they might not bother to send to send you an email too (although the suggested approach in the article does reduce the effort required).
An Alternative Approach
So what other approaches are there? What I do is store all contact form information in a database. Below is the SQL to create the basic messages table:
CREATE TABLE messages (
id int auto_increment NOT NULL,
sent timestamp NOT NULL,
sender varchar(255) NOT NULL,
message text,
PRIMARY KEY(id)
);
Then when a contact form gets submitted you can store the information in the database before sending an email. Below is some sample PHP code, using PDO to access the database:
// Get the form data
$sender = $_POST['sender'];
$message = $_POST['message'];
// Add the message to the database
$query = "INSERT INTO messages(sender, message) VALUES (:sender, :message);
$stmt = $pdo->prepare($query);
$stmt->bindParam(':sender', $sender, PDO::PARAM_STR);
$stmt->bindParam(':message', $message, PDO::PARAM_STR);
$stmt->execute();
// Send the mail
mail("me@my.domain", "Contact Form Message", $message, "From: {$sender}");
All that is left to do is create an admin page that lists all messages, and allows us to delete them. We could even include a link to the admin page in the emails we send to ourselves. By using this approach we never lose the message content, even if the mail call fails, because they all get stored in the database. All we need to do is check the admin page every so often and we'll soon see if there are any new messages there.
Of course, this approach doesn't have to be used in isolation. We can combine it with the approach suggested in the DZone article, and present the user with a mail link if sending the mail does fail. If the user decides not to send a mail though, we haven't lost anything.