2017-06-18 109 views
0

我想用Ajax表单和swiftmailer发送电子邮件。它在当地工作,但不在生产中。405 Ajax POST/Nginx配置错误

当contact_me.php不是从表单中获取参数,而是明确写入的时候,甚至会从服务器发送邮件,所以我认为Swiftmailer正在工作。

contact_me.js

// Contact Form Scripts 

$(function() { 

    $("#contactForm input,#contactForm textarea").jqBootstrapValidation({ 
     preventSubmit: true, 
     submitError: function($form, event, errors) { 
      // additional error messages or events 
     }, 
     submitSuccess: function($form, event) { 
      event.preventDefault(); // prevent default submit behaviour 
      // get values from FORM 
      var name = $("input#name").val(); 
      var email = $("input#email").val(); 
      var phone = $("input#phone").val(); 
      var message = $("textarea#message").val(); 
      var firstName = name; // For Success/Failure Message 
      // Check for white space in name for Success/Fail message 
      if (firstName.indexOf(' ') >= 0) { 
       firstName = name.split(' ').slice(0, -1).join(' '); 
      } 
      $.ajax({ 
       url: "././mail/contact_me.php", 
       type: "POST", 
       data: { 
        name: name, 
        phone: phone, 
        email: email, 
        message: message 
       }, 
       dataType: "text", 
       cache: false, 
       success: function() { 
        // Success message  
       }, 
       error: function() { 
        // Fail message      
       }, 
      }); 
     }, 
     filter: function() { 
      return $(this).is(":visible"); 
     }, 
    }); 

    $("a[data-toggle=\"tab\"]").click(function(e) { 
     e.preventDefault(); 
     $(this).tab("show"); 
    }); 
}); 


/*When clicking on Full hide fail/success boxes */ 
$('#name').focus(function() { 
    $('#success').html(''); 
}); 

contact_me.php

<?php 
// Autoload for swiftmailer 
require_once '../vendor/autoload.php'; 

// Check for empty fields 
if(empty($_POST['name'])  || 
    empty($_POST['email'])  || 
    empty($_POST['phone'])  || 
    empty($_POST['message']) || 
    !filter_var($_POST['email'],FILTER_VALIDATE_EMAIL)) 
    { 
    echo "No arguments Provided!"; 
    return false; 
    } 


$name = strip_tags(htmlspecialchars($_POST['name'])); 
$email_address = strip_tags(htmlspecialchars($_POST['email'])); 
$phone = strip_tags(htmlspecialchars($_POST['phone'])); 
$message = strip_tags(htmlspecialchars($_POST['message'])); 

// Create the email and send the message 
$email_subject = "TrustPair nouveau contact : $name"; 
$email_body = "New form.\n\n"."Here are the details:\n\nName: $name\n\nEmail: $email_address\n\nPhone: $phone\n\nMessage:\n$message"; 

// Add here swiftmailer code, need to return true 
// Create the Transport 
$transport = (new Swift_SmtpTransport('mail.gandi.net', 465, "ssl")) 
    ->setUsername('[email protected]') 
    ->setPassword('password') 
; 

// Create the Mailer using your created Transport 
$mailer = new Swift_Mailer($transport); 

// Create the message 
$message = (new Swift_Message()) 
    // Give the message a subject 
    ->setSubject($email_subject) 
    // Set the From address with an associative array 
    ->setFrom(['[email protected]' => 'Domain no reply']) 
    // Set the To addresses 
    ->setTo(['[email protected]', '[email protected]']) 
    // Give it a body 
    ->setBody($email_body) 
    ; 

// Send the message 
$result = $mailer->send($message); 
echo $result; 
// result is equal to the nbr of message recipients 

if ($result == 0) { 
    return false; 
} else { 
    return true; 
} 


?> 
+0

是否有任何错误? – hassan

+0

jquery.min.js:4 POST http://example.com/mail/contact_me_test.php 405(不允许) \t发送@ jquery.min.js:4个 \t AJAX @ jquery.min.js:4 \t submitSuccess @ contact_me.js:22 \t(匿名)@ jqBootstrapValidation.js:76个 \t调度@ jquery.min.js:3个 \t r.handle @ jquery.min.js:3 – user3707264

+0

你的代码是'网址: “././ mail/contact_me.php”,错误信息为:/ mail/contact_me_test.php。它甚至没有试图发布到同一个文件? (你也应该删除URL前面的././ mail/...,并使用根目录:/ mail/...) –

回答

1

的Nginx服务器不允许与静态页面POST请求(即*。html的)。

hacks来解决这个问题。在我的情况下,它修复了405错误,但电子邮件没有发送。

解决的办法是将改为index.html到index.php,务必用adapt your Nginx configuration来反映这个改变。