2016-02-22 4 views
1

Я создаю мобильное приложение, используя onsen-ui framework и phonegap. Я хочу добавить форму «связаться с нами» In-App, где пользователь может отправить форму и при успешном представлении форма будет отправлена ​​на адрес [email protected]Onsen UI: Свяжитесь с нами Форма представления

В index.html я добавил

<script type="text/ons-template" id="contact.html"> 
<ons-navigator title="Navigator" var="sNavigator"> 
<ons-page id="page-contact"> 
    <ons-toolbar>  

    <div class="left"> 
    <ons-toolbar-button onclick="setHome();"> 
     <ons-icon icon="fa-chevron-left"></ons-icon> 
    </ons-toolbar-button>   
    </div> 

    <div class="center white"> 
    <span id="search-text" class="trn" data-trn-key="contact">Contact Us</span> 
    </div>     
    </ons-toolbar> 

    <div class="home-header"> 
     <img src="css/images/banner.png" alt="" title=""> 
     <p class="center trn" data-trn-key="contact">We respond to messages in the order received</p> 
    </div> 

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

    <div class="wrapper"> 
     <div class="field-wrapper"> 
     <input type="text" name="first_name" class="first_name text-input text-input--underbar has_validation" 
     placeholder="First Name" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="text" name="last_name" class="last_name text-input text-input--underbar has_validation" 
     placeholder="Last Name" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="number" name="contact_phone" class="contact_phone text-input text-input--underbar has_validation" 
     placeholder="Mobile Phone" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="email" name="email_address" class="email_address text-input text-input--underbar has_validation" 
     placeholder="Email address" value="" data-validation="email" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="text" name="subject" class="subject text-input text-input--underbar has_validation" 
     placeholder="Subject" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <textarea style="width:100%;height:80px" name="message" class="message text-input text-input--underbar has_validation" 
     placeholder="Your Message" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" ></textarea> 
     </div> 

     <p class="small-font-dim trn" data-trn-key="create_account_terms"> 
     Please note all fields are mandatory, you should fill in all before submission.</p>  
    </div> 

    <button class="button green-btn button--large trn" onclick="contact();" data-trn-key="contact" > 
    Submit Now! 
    <div class="search-btn"><ons-icon icon="fa-chevron-right"></ons-icon></div> 
    </button> 
    </form> 

</ons-page> 
</ons-navigator> 
</script> 

Тогда я проверки формы в .js файле и вызова функции API

case "page-contact":   
    translatePage(); 
    translateValidationForm(); 
    $(".full_name").attr("placeholder", getTrans("Full Name",'full_name')); 
    $(".last_name").attr("placeholder", getTrans('Last Name','last_name')); 
    $(".contact_phone").attr("placeholder", getTrans('Mobile Phone','contact_phone')); 
    $(".email_address").attr("placeholder", getTrans('Email address','email_address')); 
    $(".subject").attr("placeholder", getTrans('Subject','subject')); 
    $(".message").attr("placeholder", getTrans('Your Message','message'));   

    break; 

Здесь я делаю проверки и вызова АНИ от веб-сервера:

function contact() 
{ 
    $.validate({  
     form : '#frm-contact',  
     borderColorOnError:"#FF0000", 
     onError : function() {  
     },  
     onSuccess : function() {    
      var params = $("#frm-contact").serialize();   
      params+="&device_id="+ getStorage("device_id"); 
      callAjax("contact",params);  
      return false; 
     } 
    }); 
} 

на веб-сервере конец PHP код включает в себя

public function actionContact($to='',$from='',$subject='',$body='') 
    {     
     $from1=Yii::app()->functions->getOptionAdmin('global_admin_sender_email'); 
     if (!empty($from1)){ 
      $from=$from1; 
     }  

     $email_provider=Yii::app()->functions->getOptionAdmin('email_provider'); 

     if ($email_provider=="smtp"){ 
      $smtp_host=Yii::app()->functions->getOptionAdmin('smtp_host'); 
      $smtp_port=Yii::app()->functions->getOptionAdmin('smtp_port'); 
      $smtp_username=Yii::app()->functions->getOptionAdmin('smtp_username'); 
      $smtp_password=Yii::app()->functions->getOptionAdmin('smtp_password'); 

      $mail=Yii::app()->Smtpmail; 

      Yii::app()->Smtpmail->Host=$smtp_host; 
      Yii::app()->Smtpmail->Username=$smtp_username; 
      Yii::app()->Smtpmail->Password=$smtp_password; 
      Yii::app()->Smtpmail->Port=$smtp_port; 

      $mail->SetFrom($from, ''); 
      $mail->Subject = $subject; 
      $mail->MsgHTML($body); 
      $mail->AddAddress($to, ""); 
      if(!$mail->Send()) { 
       //echo "Mailer Error: " . $mail->ErrorInfo; 
       return false; 
      }else { 
       //echo "Message sent!"; 
       return true; 
      }      
     } elseif ($email_provider=="mandrill"){ 
      $api_key=Yii::app()->functions->getOptionAdmin('mandrill_api_key');   
      try { 
       require_once 'mandrillapp/Mandrill.php'; 
       $mandrill = new Mandrill($api_key); 
       $message = array(
        'html' => $body, 
        'text' => '', 
        'subject' => $subject, 
        'from_email' => $from, 
        //'from_name' => 'Example Name', 
        'to' => array(
         array(
          'email' => $to, 
          //'name' => 'Recipient Name', 
          'type' => 'to' 
         ) 
        ) 
       );     
       $async = false; 
       $ip_pool = ''; 
       $send_at = ''; 
       $result = $mandrill->messages->send($message, $async, $ip_pool, $send_at); 
       //dump($result); 
       if (is_array($result) && count($result)>=1){ 
        if ($result[0]['status']=="sent"){ 
         return true; 
        }      
       } 
      } catch(Mandrill_Error $e) { 
       //echo 'A mandrill error occurred: ' . get_class($e) . ' - ' . $e->getMessage(); 

      } 
      return false; 
     } 

     $body = $_POST['first_name']. ' ' .$_POST['last_name']. ' ' .$_POST['contact_phone']. ' ' .$_POST['message']; 

     $to  = '[email protected]'; 
     $from  = $_POST['email_address']; 

     $headers = "From: $from\r\n";  
     $headers .= "Content-type: text/html; charset=UTF-8\r\n"; 
     $subject = $_POST['subject']; 
$message =<<<EOF 
$body 
EOF; 

     if (!empty($to)) { 
      if (@mail($to, $subject, $message, $headers)){ 
       return true; 
      } 
     } 
     return false; 
    } 

Форма отправляет электронное письмо, однако если нет/нулевых данных, я не могу получить предоставленную информацию.

Пожалуйста, сообщите, спасибо.

+0

Поместите это: 'console.log (params);' перед этим: 'callAjax (" contact ", params);' и опубликовать результаты. Мне любопытно узнать, получает ли сериализация все и что это такое. – Munsterlander

+0

@Munsterlander спасибо за комментарий и извините за поздний ответ. Я ничего не работал. Я получил электронное письмо без темы и без отправителя и вообще без тел –

ответ

2

На основании того, что вы опубликовали, произошла ошибка в отношении идентификатора устройства. В частности, функция getStorage не определена. Приведенный ниже код отлично работает и смог отправить все поля через почту на мою тестовую страницу PHP и отправить электронное письмо. Конечно, я не использовал сложный PHP-процессор, как есть, но он работает!

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="apple-mobile-web-app-capable" content="yes" /> 
    <meta name="mobile-web-app-capable" content="yes" /> 
    <meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'"> 
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /> 
    <link href='https://fonts.googleapis.com/css?family=Roboto:400,300italic,300,400italic,500,700,700italic,500italic' rel='stylesheet' type='text/css'> 
    <title>Onsen UI 2.0 Quickstart</title> 

    <script src="components/loader.js"></script> 
    <script src="lib/onsenui/js/onsenui.js"></script> 

    <link rel="stylesheet" href="lib/onsenui/css/onsenui.css" type="text/css" media="all" /> 
    <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css" type="text/css" media="all" /> 
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script> 
    <script> 
     function contact() 
     { 
      var params = $("#frm-contact").serialize();  
      console.log(params); 
     } 
    </script> 

</head> 

<body> 
<ons-page id="page-contact"> 
    <ons-toolbar>  

    <div class="left"> 
    <ons-toolbar-button onclick="setHome();"> 
     <ons-icon icon="fa-chevron-left"></ons-icon> 
    </ons-toolbar-button>   
    </div> 

    <div class="center white"> 
    <span id="search-text" class="trn" data-trn-key="contact">Contact Us</span> 
    </div>     
    </ons-toolbar> 

    <div class="home-header"> 
     <img src="css/images/banner.png" alt="" title=""> 
     <p class="center trn" data-trn-key="contact">We respond to messages in the order received</p> 
    </div> 

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

    <div class="wrapper"> 
     <div class="field-wrapper"> 
     <input type="text" name="first_name" class="first_name text-input text-input--underbar has_validation" 
     placeholder="First Name" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="text" name="last_name" class="last_name text-input text-input--underbar has_validation" 
     placeholder="Last Name" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="number" name="contact_phone" class="contact_phone text-input text-input--underbar has_validation" 
     placeholder="Mobile Phone" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="email" name="email_address" class="email_address text-input text-input--underbar has_validation" 
     placeholder="Email address" value="" data-validation="email" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <input type="text" name="subject" class="subject text-input text-input--underbar has_validation" 
     placeholder="Subject" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" > 
     </div> 

     <div class="field-wrapper"> 
     <textarea style="width:100%;height:80px" name="message" class="message text-input text-input--underbar has_validation" 
     placeholder="Your Message" value="" data-validation="required" data-validation-error-msg="this field is mandatory!" ></textarea> 
     </div> 

     <p class="small-font-dim trn" data-trn-key="create_account_terms"> 
     Please note all fields are mandatory, you should fill in all before submission.</p>  
    </div> 

    <button class="button green-btn button--large trn" onclick="contact();" data-trn-key="contact" > 
    Submit Now! 
    <div class="search-btn"><ons-icon icon="fa-chevron-right"></ons-icon></div> 
    </button> 
    </form> 

</ons-page> 

</body> 
</html> 

PHP:

<?php 
    $to = '[email protected]'; 
    $from = $_REQUEST['email_address']; 
    $message = $_REQUEST['message']; 
    $subject = $_REQUEST['subject']; 
    $header = "From: <".$email_address.">" ."\r\n"; 
    $send = @mail($to, $subject, $message, $header); 
    if(!$send){ 
     die(); 
    } 
?> 

Также, обратите внимание, что я не посылала свои другие поля [first_name, last_name, contact_phone], но они могут быть добавлены в любом месте. Наконец, это отнюдь не безопасный способ отправки почты, а что-то вместе, чтобы доказать, что Onsen не мешает отправке почты через HTML-форму с помощью jQuery.

Edit: Несмотря на то, что это ветвление от фактического вопроса, на основе ваших комментариев, я бы настоятельно рекомендую прочитать некоторые из них:

https://codereview.stackexchange.com/questions/19365/is-this-a-secure-and-best-practice-php-mail-function

Secure php email script

What is the best way to send a secure email in PHP

+0

Спасибо. Я решил проблему, но, пожалуйста, вы можете уточнить, что вы сказали, что это не безопасный способ отправки почты? Смогут ли спамеры использовать форму для отправки массовых писем со спамом? –

+0

Ну, файл php, который я опубликовал - в качестве примера - крайне небезопасен, потому что он примет любой $ _REQUEST к нему и отправит электронное письмо.Таким образом, это «может» стать спамом-порталом, который приведет к тому, что ваш IP-адрес/почтовый сервер будет занесен в черный список. Там есть множество отличных защищенных почтовых сценариев, но, как минимум, вам необходимо подтвердить, что запрос поступает с вашего сервера, а не удаленный адрес, а также проверяет входные данные/дезинфицирует входные данные, чтобы предотвратить инъекции. – Munsterlander

+0

Итак, на основе вашего примера я изменил $ _POST на $ _REQUEST, поскольку вы упоминаете, что это считается небезопасным. Я использую onsen ui и js проверку в самом мобильном приложении, которое будет подключено к файлу API на сервере, чтобы отправить электронное письмо корреспонденту-корреспонденту, таким образом, насколько я понял, это может быть рискованным. Что касается скриптов, все они используют $ _POST и пробовали их как автономные, они работают нормально, но с помощью in-app ничего не публикуется. –

0

Для Googlers : Благодаря @munsterlander мне удалось решить проблему, заменив $_POST на $_GET, который hel пед делает весь процесс так, как нужно.

$body = $_GET['first_name']. ' ' .$_GET['last_name']. ' ' .$_GET['contact_phone']. ' ' .$_GET['message']; 

     $to  = '[email protected]'; 
     $from  = $_GET['email_address']; 

     $headers = "From: $from\r\n";  
     $headers .= "Content-type: text/html; charset=UTF-8\r\n"; 
     $subject = $_GET['subject']; 
$message =<<<EOF 
$body 
EOF; 
Смежные вопросы