PHPMailer转移到另一台服务器后失败

时间:2018-07-06 12:47:49

标签: php phpmailer

这伤了我的大脑。我在两个单独的服务器上有完全相同的代码。它在一个中发送SMTP邮件而没有问题,而在另一个中失败。控制台很干净。而且我无法调试任何东西,因为我不知道到底是什么失败了。我可以借一双眼睛吗?

这是带有验证码的简单表格。通过或失败后,将以成功/失败模式进行回答。如果失败,它将停留在联系页面上以更正错误并重新发送。如果通过,它将在关闭成功模式后刷新屏幕。

我的联系人页面public int orderDigits(int a) { String str = a + ""; char[] charArray = str.toCharArray(); Arrays.sort(charArray); if (a>0) { String Sorted = new String(charArray); return Integer.parseInt(Sorted); } else if (a<0) { int size = 1; while(a!=0){ size++; a /= 10; } String tempStr = new String(charArray); String withoutMinus = tempStr.substring(1); String withoutZero = withoutMinus.substring(0, withoutMinus.length()); StringBuffer sb = new StringBuffer(withoutZero); sb.reverse(); String revStr = sb + ""; return -(Integer.parseInt(revStr)); } else{ return 0; } }

<head>

联系表格:

    <script>
        $(document).ready(function() {

            var request;

            $("#contactForm").submit(function(event){
                event.preventDefault();

                // Abort any pending request
                if (request) {
                    request.abort();
                }

                // setup some local variables
                var $form = $(this);

                // Let's select and cache all the fields
                var $inputs = $form.find("input, select, button, textarea");

                // Serialize the data in the form
                var serializedData = $form.serialize();

                // Let's disable the inputs for the duration of the Ajax request.
                // Note: we disable elements AFTER the form data has been serialized.
                // Disabled form elements will not be serialized.
                $inputs.prop("disabled", true);

                request = $.ajax({
                    url: "sendContactMail.php",
                    type: "post",
                    data: serializedData
                });

                // Callback handler that will be called on success
                request.done(function (response, textStatus, jqXHR){

                    if (response.status == 0) {
                        // Success! Do something successful, like show success modal
                        jQuery.noConflict();
                        $('#successEmail').modal('show');
                    } else {
                        // Oh no, failure - notify the user
                        jQuery.noConflict();
                        $('#failEmail').modal('show');
                    }

                    $( "#failBtn" ).click(function() {
                        jQuery.noConflict();
                        $('#failEmail').modal('hide');
                    });

                    $( "#passBtn" ).click(function() {
                        window.location.reload();
                    });

                });

                // Callback handler that will be called on failure
                request.fail(function (jqXHR, textStatus, errorThrown){
                    // Say you have a <div class="message"></div> somewhere, maybe under your form
                    //$('.message').html('Error: ' + textStatus + ', ' + errorThrown)
                });

                // Callback handler that will be called regardless
                // if the request failed or succeeded
                request.always(function () {
                    // Reenable the inputs
                    $inputs.prop("disabled", false);
                });
            });
        });
    </script>

我的sendContactMail.php脚本

<form id="contactForm" class="form margin-alpha-top" method="POST"> 
    <div class="form__group">
        <label class="form__label" for="inputSubject">Subject</label>
        <input id="inputSubject" name="subject" type="text" class="form__field">
    </div>
    <div class="form__group">
        <label class="form__label" for="inputName">Name *</label>
        <input id="inputName" name="name" type="text" class="form__field" required="">
    </div>
    <div class="form__group">
        <label class="form__label" for="inputEmail">E-mail *</label>
        <input id="inputEmail" name="email" type="email" class="form__field" required="">
    </div>
    <div class="form__group">
        <label class="form__label" for="inputPhone">Phone</label>
        <input id="inputPhone" name="phone" type="text" class="form__field">
    </div>
    <div class="form__group form-group--extended">
        <label class="form__label form__label--extended" for="inputMessage">Message *</label>
        <textarea id="inputMessage" name="message" class="form__field form__field--extended" rows="6" required=""></textarea>
    </div>
    <div class="row captcha">
        <div class="column-xs-12 column-sm-4 column-md-4 xs-center">
        </div>
        <div class="column-xs-6 column-sm-4 column-md-4 xs-center">
            <img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA Image" />
            <br/>
            <input type="text" name="captcha_code" size="10" maxlength="6" />
            <br/>
            <a href="#" id="secureText" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">
                <small>Refresh Image</small>
            </a>
        </div>
        <div class="column-xs-6 column-sm-4 column-md-4 xs-center">
            <div class="form__group submit-button">    
                <button 
                    type="submit" 
                    class="form__button button button--gamma margin-beta-bottom" 
                    id="btnSubmit">
                    <span class="button__text">Send</span>
                </button>
            </div>
        </div>
    </div>                                        
</form>

我在其他站点中运行的设置完全相同,也可以正常运行。我没看到什么?它如何在一台服务器上工作而不在另一台服务器上工作?

我知道在此处发布真实站点不是一个好习惯,但是如果您希望看到它们通过并失败,也许可以帮助您进行某种调试,则可以。这是警察局的网站。完全安全。

Failing site(来自我无法控制的专用服务器)

Passing Site(来自HostGator)

非常感谢您。这是我捐赠的公益网站,因此我只能招募到多少帮助

1 个答案:

答案 0 :(得分:1)

最近,我在PHP Mailer中遇到了非常相似的问题。首先,我们知道它必须与服务器做一些事情,因为站点可以在开发服务器上工作,而不能在实时服务器上工作。该错误最有可能是由于 SMTP服务器连接不起作用或实时系统中的SMTP服务器拒绝了您的邮件请求 (但是,可能已经出问题了)由于不同的PHP版本,不同的变量,不同的php.ini,...),您的代码会更早。

因此,我们必须进行调试才能发现问题。调试PHPMailer的资料非常丰富:https://github.com/PHPMailer/PHPMailer/wiki/SMTP-Debugging

这是您应该尝试调试问题(缩短代码)的方式:

    //Create a new PHPMailer instance
    $mail = new PHPMailer;

    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = 'smtp.live.com';                        // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = 'lotusms@outlook.com';              // SMTP username
    $mail->Password = '********';                         // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                                    // TCP port to connect to

    $mail->setFrom('lotusms@outlook.com', 'Mailer');
    $mail->addAddress('lotusms@outlook.com', 'Luis Silva');


    $mail->Subject = $_POST['subject'];
    $mail->isHTML(true);
    $mail->Body = "...";


    $mail->SMTPDebug = 4; // Lowest level, you may also use 1, 2 or 3
    $mail->Debugoutput = 'text'; // if this does not work, use 'error_log' or even a custom closure

    var_dump($mail);

    $send = $mail->send());

    var_dump($send);

如果出现问题,您应该立即在var_dumpSMTPDebugDebugoutput属性创建的输出中看到问题。

造成问题的各种可能原因,关键是在实际环境中(但不一定在实际站点上)正确地调试代码。

如果$mail->Debugoutput='text';不起作用,请尝试'error_log'并查看日志文件,甚至为此编写一个自定义闭包(请参阅文档)。