【问题标题】:PHPMailer Contact Form with Jquery带有 Jquery 的 PHPMailer 联系表
【发布时间】:2020-07-10 05:57:08
【问题描述】:

我创建了contact form using phpmailer。并且,它正在工作并可以正常发送电子邮件。但是,它确实在 php 文件中重定向,然后显示成功消息。

我想在同一个联系表单 html 页面上显示消息。而且,我为此使用了ajax jquery。但是,邮件不发送。并在同一表单 html 页面上收到以下消息。

文档有问题!

我该如何解决这个问题?

JS 代码

(function ($) {
    "use strict";

    var form = $('#contact-form'); // contact form
    var submit = $('#submit-btn'); // submit button
    
            // form submit event
            form.on('submit', function(e) {
                e.preventDefault(); // prevent default form submit
                $.ajax({
                    url: 'php/mail.php', // form action url
                    type: 'POST', // form submit method get/post
                    dataType: 'html', // request type html/json/xml
                    data: form.serialize(), // serialize form data
                    beforeSend: function() {
                        
                        submit.attr("disabled", "disabled");                    
                        var loadingText = '<span role="status" aria-hidden="true" class="spinner-border spinner-border-sm align-self-center mr-2"></span>Sending.....'; // change submit button text
                        if (submit.html() !== loadingText) {
                            submit.data('original-text', submit.html());
                            submit.html(loadingText);
                        }
                    },
                    success: function(data) {
                        //$('.alert-dismissible').remove();
                        submit.before(data).fadeIn(); // fade in response data 
                        form.trigger('reset'); // reset form
                        submit.html(submit.data('original-text'));// reset submit button text
                        submit.removeAttr("disabled", "disabled");
                    },
                    error: function(e) {
                        alert('error');
                    }
                });
            });
})(jQuery);

ma​​il.php 代码

<?php

    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;

    $myCompanyName = "CompanyName";
    $myCompanyEmail = "noreply@CompanyName.com";
    $myCompanyEmailPassword = "CompanyEmailPassword";
    
    $myPersonalEmail = "personalEmail@gmail.com";

    require './phpmailer/src/Exception.php';
    require './phpmailer/src/PHPMailer.php';
    require './phpmailer/src/SMTP.php';

    if(isset($_POST['submit'])) {

        $mail = new PHPMailer(true);

        //$mail->SMTPDebug = 0;

        $mail->Host = 'smtp.mboxhosting.com';
        $mail->SMTPAuth = true;
        $mail->Username = $myCompanyEmail;
        $mail->Password = $myCompanyEmailPassword;
        $mail->SMTPSecure = 'tls';
        $mail->Port = 587;

        $mail->setFrom($myCompanyEmail, $myCompanyName);
        $mail->addAddress($myPersonalEmail);
        $mail->addReplyTo($_POST['email'], $_POST['name']);

        $mail->isHTML(true);
        $mail->Subject = 'My Subject';
        $mail->Body = $_POST['message'];

        try {
            $mail->send();
            echo 'Your message was sent successfully!';
        } catch (Exception $e) {
            echo "Your message could not be sent! PHPMailer Error: {$mail->ErrorInfo}";
        }
        
    } else {
        echo "There is a problem with the document!";
    }
    
?>

表单 HTML 代码

<form id="contact-form" action="php/mail.php" method="post">
              <div class="row">
                <div class="col-lg-6">
                  <div class="form-group">
                    <input name="name" type="text" class="form-control rounded-lg" required placeholder="Name">
                  </div>
                </div>
                <div class="col-lg-6">
                  <div class="form-group">
                    <input name="email" type="email" class="form-control rounded-lg" required placeholder="Email">
                  </div>
                </div>
              </div>
              <div class="form-group">
                <textarea name="message" class="form-control rounded-lg" rows="3" required placeholder="Tell us more about your needs........"></textarea>
              </div>
              <p class="text-center mt-5 mb-0">
                <button id="submit-btn" class="btn btn-outline-dark rounded-lg shadow-none d-inline-flex" name="submit" type="submit">Send Message</button>
              </p>
            </form>

【问题讨论】:

  • 您尝试检查什么为什么邮件没有发送?这与 AJAX 本身有什么关系?
  • 通常情况下,它确实会发送电子邮件并重定向 mail.php 页面并成功显示消息。而且,确实会在我的收件箱中收到邮件。但是,如果,我尝试上面提到我的 JS 代码。所以,它不发送电子邮件。并显示消息。 There is a problem with the document! 所以,我不能低估。问题出在 php 或 js 中。
  • 如果你得到There is a problem with the document! 那么$_POST['submit'] 不会发送到php文件。
  • insted of data: form.serialize() 您可以通过选择 forn 的值自己将数据作为 json-array 发送,然后您可以在您的 php 中检查它们,并且不会有这个我猜这个问题已经存在了。
  • 像这样:data: { 'submittedName': nameToSubmitValue, 'submittedEmail': emailToSubmitValue }

标签: javascript php jquery ajax phpmailer


【解决方案1】:

我遇到了同样的问题,我用随机名称的表单中的隐藏输入解决了:

<input type="hidden" name="test">

然后在php文件中:

if(isset($_POST['test'])) {

工作,问题来了,因为 form.serialize()new FormData() 不使用提交按钮。
另一种方法是包含按钮提交,如here

【讨论】:

  • 这里,我使用 jquery。如果,我想使用动作/方法。那么,该怎么做呢?如果,我不想使用隐藏输入。任何可能性。
  • 隐藏输入仅供php文件中使用isset,你用ajax发送的。否则请参阅我的答案链接。
  • 谢谢。这很适合您的建议。我们使用if(isset($_POST['name'])) { 所以。不需要添加隐藏输入。
【解决方案2】:

您必须删除 action="php/mail.php" method="post",因为这是由 jQuery 处理的,您必须在表单中添加一个隐藏输入,如 &lt;input type="hidden" name="iamhidden" /&gt;,然后将 if(isset($_POST['submit'])) 替换为 if(isset($_POST['iamhidden']))

【讨论】:

  • 这里,我使用 jquery。如果我想使用动作/方法。那么,怎么做呢?
  • 您阻止了默认的提交事件,因此它甚至不会被调用。 Ajax 方法正在将数据发送到 php 应用程序。
  • 这不是一种安全的方法,因为如果禁用了 Javascript,它会破坏表单。处理这个问题的正确方法是像往常一样保留操作,但使用 jQuery 附加一个事件侦听器,该事件侦听器在 jQuery 的表单操作处理程序中使用 preventDefault 禁用默认操作。这样,如果禁用 JS,表单将保持工作,但如果启用,则使用 jQuery;这种方法称为“渐进增强”。
猜你喜欢
  • 2020-05-01
  • 2019-01-12
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
相关资源
最近更新 更多