Jump to content

Contact form submission - receiving emails twice


SamC
 Share

Recommended Posts

I can't work out what the problem here is. I have a simple contact form:

<?php namespace ProcessWire;

wireIncludeFile("./vendor/vlucas/valitron/src/Valitron/Validator.php");
$captcha = $modules->get("MarkupGoogleRecaptcha");

$contactPageID = '1020';
$contactFormRecipient = 'MY_EMAIL_ADDRESS';

$name = $sanitizer->text($input->post->name);
$email = $sanitizer->email($input->post->email);
$message = $sanitizer->text($input->post->message);

$v = new \Valitron\Validator(array(
    'name' => $name,
    'email' => $email,
    'message' => $message
    )
);

$v->rule('required', ['name', 'email', 'message']);
$v->rule('email', 'email');

if ($input->post->sendMe) {
    if ($v->validate()) {
        if ($captcha->verifyResponse() === true) {

            $message = "
                <html>
                    <body>
                        <p><b>From:</b></p>
                        <p>{$name}</p>
                        <p><b>Email:</b></p>
                        <p>{$email}</p>
                        <p><b>Message:</b></p>
                        <p>{$message}</p>
                    </body>
                </html>
                ";

            $m = $mail->new();

            $m->to($contactFormRecipient)
            ->from($email)
            ->subject('Contact form submission')
            ->bodyHTML($message)
            ->send();


            if ($m->send()) {
                $session->flashMessage = "<h2>Thank you for your message! I will get back to you shortly.</h2>";
                $session->sent = true;
                $session->redirect($pages->get($contactPageID)->url);
            }
            else {
                $session->flashMessage = "<h2>Sorry, an error occured. Please try again.</h2>";
            }

        }
        else {
            $session->flashMessage = '<h2>Recaptcha must be complete.</h2>';
        }
    }
    else {
        $session->flashMessage = 'Please fill out the fields correctly.';
    }
}
?>


<div class="container">
    <div class="row justify-content-between">


        <div class="col-sm-12 col-lg-8 py-3">
            
        <?php if($session->flashMessage):?>
            <div class="alert <?php echo $session->sent ? 'alert-success' : 'alert-danger'?>" role="alert">
                <?php echo $session->flashMessage;?>
            </div>
            <?php endif;?>

            <form id="contact-form" method="post">

            
            <div class="row">
                <div class="form-group col-sm-12 col-lg-6 py-2 <?php echo $v->errors('name') ? 'has-danger' : ''?>">
                    <label for="name">Name (required)</label>
                    <input class="form-control" name="name" id="name" type="text" value="<?php echo $sanitizer->text($input->post->name); ?>">
                </div>

                <div class="form-group col-sm-12 col-lg-6 py-2 <?php echo $v->errors('email') ? 'has-danger' : ''?>">
                    <label for="email">Email (required)</label>
                    <input class="form-control" name="email" id="email" type="text" value="<?php echo $sanitizer->text($input->post->email); ?>">
                </div>
            </div>
            

                <div class="form-group py-2 <?php echo $v->errors('message') ? 'has-danger' : ''?>">
                    <label for="message">Message (required)</label>
                    <textarea class="form-control" name="message" id="message" rows="8"><?php echo $sanitizer->text($input->post->message); ?></textarea>
                </div>

                <div>
                    <!-- Google Recaptcha code START -->
                    <?php echo $captcha->render(); ?>
                    <!-- Google Recaptcha code END -->
                </div>

                <div class="form-group">
                    <button type="submit" class="btn btn-primary" name="sendMe" value="1">Send message</button>
                </div>


            </form>

        </div>



        <div class="col-sm-12 col-lg-3 py-3">
            <h2>Have a question?</h2>

            <p class="mb-0"><i class="fa fa-phone" aria-hidden="true"></i> <?php if($clientPhone) echo $clientPhone; ?></p>
        </div>


    </div>
</div>

<?php
    $session->remove('flashMessage');
    $session->sent = false;
    echo $captcha->getScript();
?>

So validation works fine, the flash messages work, the only thing that's wrong is in my gmail app (or gmail in the browser - this form is sending to a gmail address).

I receive it twice, but the second one is like it's being forwarded back to me? Is weird, here's what it looks like once I've submitted it:

form-submission.png.7415270a1c1beb157af8f39ee339faec.png

...then if I expand the [...] quoted text bit...

form-submission-2.png.d29cdce4152d48374ee2f5e476eee0a6.png

Can anyone see or suggest why this might be happening? Thanks for any advice :)

Link to comment
Share on other sites

Hi,

I think if you replace this:

$m->to($contactFormRecipient)
            ->from($email)
            ->subject('Contact form submission')
            ->bodyHTML($message)
            ->send();

with the following:

$m->to($contactFormRecipient)
            ->from($email)
            ->subject('Contact form submission')
            ->bodyHTML($message);

that it will work and the email will be send one time, that's how my contact form works :), I hope this helps you

~ Harmen

  • Like 3
Link to comment
Share on other sites

Just now, Harmen said:

Hi,

I think if you replace this:


$m->to($contactFormRecipient)
            ->from($email)
            ->subject('Contact form submission')
            ->bodyHTML($message)
            ->send();

with the following:


$m->to($contactFormRecipient)
            ->from($email)
            ->subject('Contact form submission')
            ->bodyHTML($message);

that it will work and the email will be send one time, that's how my contact form works :), I hope this helps you

~ Harmen

Thanks @Harmen but the next block relies on the return value of send() to show the flash message like so:

if ($m->send()) {
                $session->flashMessage = "<h2>Thank you for your message! I will get back to you shortly.</h2>";
                $session->sent = true;
                $session->redirect($pages->get($contactPageID)->url);
            }
            else {
                $session->flashMessage = "<h2>Sorry, an error occured. Please try again.</h2>";
            }

Would you mind sharing the code for your form so I can have a look at how you approach this?

Link to comment
Share on other sites

15 minutes ago, SamC said:

Would you mind sharing the code for your form so I can have a look at how you approach this?

Sure! See the snippet below

if ($input->post->submit) { // === When submit button is clicked
	if ($v->validate()) { // === Validate the data
		if ($captcha->verifyResponse() === true) { // === Verify Captcha
			$subject = 'Contact Form'; // === Subject
			$messageHTML = include_once('partials/contact/_email.php'); // === Get the message, is in HTML
			$mail = wireMail() // === Set up the mail data
				->to($contactFormRecipient)
			    	->header('Reply-To', $email)
				->subject($subject)
				->bodyHTML($messageHTML);

			if ($mail->send()) { // === If mail is sent, while sending e-mail
				$session->flashMessage = __('Thank you for your message! We will get back to you.');
				$session->sent = true;
				$session->redirect($page->url);
			} else { // === If mail isn't sent
				$session->flashMessage = __('Mail not sent. Error occured.');
			}

		} else { // === Captcha error
			$session->flashMessage = __('Recaptcha Validation Error');
		}
	} else { // === Validation errors
		$session->flashMessage = __('Please correct the errors and try again.');
	}
}

 

  • Like 2
Link to comment
Share on other sites

My original code:

$m->to($contactFormRecipient)
            ->from($email)
            ->subject('Contact form submission')
            ->bodyHTML($message)
            ->send(); // SEND #1


            if ($m->send()) { // SEND #2

I totally didn't notice the parenthesis in the if block. Doh! It sends the mail, then returns true/false presumably. You were right in your first reply. Thanks @Harmen

All working now :)

Full code here (bootstrap 4 alpha 6):

<?php namespace ProcessWire;

wireIncludeFile("./vendor/vlucas/valitron/src/Valitron/Validator.php");
$captcha = $modules->get("MarkupGoogleRecaptcha");

$contactPageID = '1020';
$contactFormRecipient = 'MY_EMAIL_ADDRESS';

$name = $sanitizer->text($input->post->name);
$email = $sanitizer->email($input->post->email);
$message = $sanitizer->text($input->post->message);

$v = new \Valitron\Validator(array(
    'name' => $name,
    'email' => $email,
    'message' => $message
    )
);

$v->rule('required', ['name', 'email', 'message']);
$v->rule('email', 'email');

if ($input->post->sendMe) {
    if ($v->validate()) {
        if ($captcha->verifyResponse() === true) {

            $message = "
                <html>
                    <body>
                        <p><b>From:</b></p>
                        <p>{$name}</p>
                        <p><b>Email:</b></p>
                        <p>{$email}</p>
                        <p><b>Message:</b></p>
                        <p>{$message}</p>
                    </body>
                </html>
                ";

            $mail = wireMail();

            $mail->to($contactFormRecipient)
            ->header('Reply-To', $email)
            ->subject('JS Electrician form submission')
            ->bodyHTML($message);

            if ($mail->send()) {
                $session->flashMessage = "<h2>Thank you for your message! I will get back to you shortly.</h2>";
                $session->sent = true;
                $session->redirect($pages->get($contactPageID)->url);
            }
            else {
                $session->flashMessage = "<h2>Sorry, an error occured. Please try again.</h2>";
            }

        }
        else {
            $session->flashMessage = '<h2>Recaptcha must be complete.</h2>';
        }
    }
    else {
        $session->flashMessage = 'Please fill out the fields correctly.';
    }
}
?>


<div class="container">
    <div class="row justify-content-between">


        <div class="col-sm-12 col-lg-8 py-3">
            
        <?php if($session->flashMessage):?>
            <div class="alert <?php echo $session->sent ? 'alert-success' : 'alert-danger'?>" role="alert">
                <?php echo $session->flashMessage;?>
            </div>
            <?php endif;?>

            <form id="contact-form" method="post">

            
            <div class="row">
                <div class="form-group col-sm-12 col-lg-6 py-2 <?php echo $v->errors('name') ? 'has-danger' : ''?>">
                    <label for="name">Name (required)</label>
                    <input class="form-control" name="name" id="name" type="text" value="<?php echo $sanitizer->text($input->post->name); ?>">
                </div>

                <div class="form-group col-sm-12 col-lg-6 py-2 <?php echo $v->errors('email') ? 'has-danger' : ''?>">
                    <label for="email">Email (required)</label>
                    <input class="form-control" name="email" id="email" type="text" value="<?php echo $sanitizer->text($input->post->email); ?>">
                </div>
            </div>
            

                <div class="form-group py-2 <?php echo $v->errors('message') ? 'has-danger' : ''?>">
                    <label for="message">Message (required)</label>
                    <textarea class="form-control" name="message" id="message" rows="8"><?php echo $sanitizer->text($input->post->message); ?></textarea>
                </div>

                <div>
                    <!-- Google Recaptcha code START -->
                    <?php echo $captcha->render(); ?>
                    <!-- Google Recaptcha code END -->
                </div>

                <div class="form-group">
                    <button type="submit" class="btn btn-primary" name="sendMe" value="1">Send message</button>
                </div>


            </form>

        </div>



        <div class="col-sm-12 col-lg-3 py-3">
            <h2>Have a question?</h2>

            <p class="mb-0"><i class="fa fa-phone" aria-hidden="true"></i> <?php if($clientPhone) echo $clientPhone; ?></p>
        </div>


    </div>
</div>

<?php
    $session->remove('flashMessage');
    $session->sent = false;
    echo $captcha->getScript();
?>

 

  • Like 2
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...