ReCaptcha не принимает строки - PullRequest
2 голосов
/ 13 мая 2011

Я пытаюсь добавить recaptcha в контактную форму в первый раз, и я добился определенного прогресса, но теперь я немного застрял.

Это не позволяет мне отправлять электронные письма, и я не могу понять, почему. Раньше у меня была проблема, что recaptcha не останавливал ложные ответы, но после того, как я поместил код recaptcha поверх формы, теперь он показывает себя и защищает форму.

Вот код, который делает:

<?php

        require_once('recaptchalib.php');
        $privatekey = "xxxxxxxxxxxxxxxxxxxxxx";
        $resp = recaptcha_check_answer ($privatekey,
                                    $_SERVER["REMOTE_ADDR"],
                                    $_POST["recaptcha_challenge_field"],
                                    $_POST["recaptcha_response_field"]);

        if (!$resp->is_valid) {
            // What happens when the CAPTCHA was entered incorrectly
            die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
             "(reCAPTCHA said: " . $resp->error . ")");
        } else {
        // Your code here to handle a successful verification
        if(@mail($your_email,$email_subject,$email_content)) {
            echo 'Message sent!'; }
          }

     if(!$_POST) exit;

     $email = $_POST['email'];


        //$error[] = preg_match('/\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i',     $_POST['email']) ? '' : 'INVALID EMAIL ADDRESS';
        if(!eregi("@",$email )){
           $error.="Invalid email address entered";
           $errors=1;
        }
        if($errors==1) echo $error;
      else{
             $values = array ('name','email','telephone','message');
             $required = array('name','email','telephone','message'); 
             $your_email = "email@mydomain.com";
             $email_subject = "New Message from XXX: ".$_POST['subject'];
             $email_content = "New message:\n";

           foreach($values as $key => $value){
             if(in_array($value,$required)){
               if ($key != 'subject' && $key != 'telephone') {
                 if( empty($_POST[$value]) ) { 
                   echo 'PLEASE FILL IN REQUIRED FIELDS'; exit;
                 }
               }
                 $email_content .= $value.': '.$_POST[$value]."\n";
             }
           }

        if(@mail($your_email,$email_subject,$email_content)) {
            echo 'Message sent!'; 
        }
        else {
            echo 'ERROR!';
        }
     }
?>

А вот код из формы:

 <form action="./contact.php" method="post" id="contactform">
        <?php
          require_once('./recaptchalib.php');
          $publickey = "xxxxxxxxxxxxxxxxxx"; // you got this from the signup page
          echo recaptcha_get_html($publickey);
        ?>
          <ol>
            <li>
              <label for="name">Name</label>
              <input id="name" name="name" class="text" />
            </li>
            <li>
              <label for="email">Email</label>
              <input id="email" name="email" class="text" />
            </li>
            <li>
              <label for="telephone">Telephone</label>
              <input id="telephone" name="telephone" class="text" />
            </li>
            <li>
              <label for="message">Message</label>
              <textarea id="message" name="message" rows="6" cols="50"></textarea>
            </li>

            <li class="buttons">
              <input type="image" name="imageField" id="imageField" src="images/send.gif" class="send" />
              <div class="clr"></div>
            </li>
          </ol>

 </form>

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 13 мая 2011

Что значит "не позволяет мне отправлять почту"?Ошибка проверки и вы получаете «Рецепт введен неправильно»?

Или он пытается отправить письмо, но ничего не появляется?

  1. Неиспользуйте eregi.Весь набор функций ereg устарел.Я вижу, у вас есть эквивалент preg_match выше, так что используйте его вместо этого.И если вы используете PHP 5.2+, вы должны использовать filter_var($email, FILTER_VALIDATE_EMAIL) вместо этого, что будет работать лучше, чем ваше регулярное выражение.
  2. Не подавляйте вызов mail() с помощью @.Почта сама по себе не выводит никаких сообщений об ошибках, она просто возвращает true / false.Проверьте это возвращаемое значение и выведите сообщение об ошибке, если оно ложно.В настоящее время вы выводите данные только в том случае, если это правда.
  3. Проверьте журналы SMTP-сервера, если у вас есть к нему доступ, исходя из предположения, что PHP и почта действительно работают и пытаются передать почту.Может быть, сбой в работе SMTP-сервера, и письма застряли в исходящей очереди

И после всего этого может показаться, что вы пытаетесь отправить письмо с $your_email, $email_subjectи т. д. ... ДО того, как вы установили эти переменные и получили значения из $ _POST.Поэтому, скорее всего, вы вызываете mail() с пустыми переменными, которые ничего не делают.

...