【问题标题】:error in sending email from my webpage从我的网页发送电子邮件时出错
【发布时间】:2016-02-29 21:54:07
【问题描述】:

我创建了一个网页,该网页在将有效的电子邮件地址插入表单后使用 Javascript 和 PHP 发送电子邮件。

Form 对插入的邮件执行验证,并在出现错误或发送失败时显示一个弹出窗口。它工作正常。

如果一切顺利,应该会显示一个绿色的弹出窗口,但它不会发生。邮件已发送,我看到以下错误(如果我使用 #button-send 表单):

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

代码如下:

PHP

<?php 
require 'mandrill.php';
$send_email_to = "contacts@email.it";
$email_subject = "Feedback landing page";

function send_email($email)
{
  global $send_email_to;
  global $email_subject;
  $headers = "MIME-Version: 1.0" . "rn";
  $headers .= "Content-type:text/html;charset=iso-8859-1" . "rn";
  $headers .= "From: ".$email. "rn";
  $message = "<strong>Email = </strong>".$email."<br>";


try{
$mandrill = new Mandrill("mandrillcode"); 

 //this is not useful
 /*$message = array(
        'html' => '<p><strong>Email = </strong>'.$email.'</p>',
        'text' => 'Example text content',
        'subject' => 'Feedback landing page ',
        'from_email' => $email,
        'from_name' => $email,
        'to' => array(
            array(
                'email' => 'contacts@email.it',
                'name' => 'Recipient Name',
                'type' => 'to'
            )
        )
);

$result = $mandrill->messages->send($message, $async, $ip_pool, $send_at);
    print_r($result); */                   


$template_name = 'autoresponder';

 $template_content = array(
        array(
            'name' => 'example name',
            'content' => 'example content'
        )
    );

$message = array(
           'html' => '<p>this is a test message with Mandrills PHP wrapper!</p>',    
           'subject' => 'Feedback email',
    'from_email' => 'contacts@email.it',

    'to' => array(
                  array(
                        'email' => $email, 
                        'name' => 'Recipient 1'
                       )
                 ),
     'merge_vars' => array(
            array(
                'rcpt' => $email,
                'vars' => array(
                    array(
                        'name' => 'merge2',
                        'content' => 'merge2 content'
                    )
                )
            )
        )

    );        

print_r($mandrill->messages->sendTemplate($template_name, $template_content, $message));        
  return true;
}

catch(Mandrill_Error $e) {
    // Mandrill errors are thrown as exceptions
    echo 'A mandrill error occurred: ' . get_class($e) . ' - ' . $e->getMessage();
    // A mandrill error occurred: Mandrill_Unknown_Subaccount - No subaccount exists with the id 'customer-123'
    throw $e;
}


}

function validate($email)
{
  $return_array = array();
  $return_array['success'] = '1';

  $return_array['email_msg'] = '';

  if($email == '')
  {
    $return_array['success'] = '0';
    $return_array['email_msg'] = 'inserire email';
  }
  else
  {
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$/';
    if(!preg_match($email_exp,$email)) {
      $return_array['success'] = '0';
      $return_array['email_msg'] = 'inserire email valida';  
    }
  }




  return $return_array;
}

$email = $_POST['email'];

$return_array = validate($email);

if($return_array['success'] == '1')
{       
        send_email($email);      
}
header('Content-type: text/json');
echo json_encode($return_array);
die();
?>

JS

$(document).ready(function(){   
$('#button-send').click(function(event){        

    event.preventDefault();                         
    $.ajax({

        type: 'POST',

        url: 'send_form_email.php',

        data: $('#email-form').serialize(),

        dataType: "json",

        success: function(html) {

            if(html.success == '1')
            {

                console.log("#button-send-1 html.success 1");                   
                $('.formdone').show("slow").delay(5000).hide("slow");                                       
            }

            else
            {
                console.log("#button-send-1 html.success not 1");
                $('.formfail').show("slow").delay(5000).hide("slow");                                                                               
            }                   

            console.log("success");

        },

        error: function(XMLHttpRequest, textStatus, errorThrown){

            console.log("#button-send-1 not html.success");

  console.log("textStatus = "+textStatus);
  console.log("XMLHttpRequest= "+XMLHttpRequest);
  console.log("errorThrown= "+errorThrown);

        }
    });     
});


$('#button-send-2').click(function(event){

    event.preventDefault();

    $.ajax({
        type: 'POST',
        url: 'send_form_email.php',
        data: $('#email-form-2').serialize(),

        success: function(html) {                           
            if(html.success == '1')
            {
                console.log("#button-send-2 html.success 1");                   
                $('.formdone2').show("slow").delay(5000).hide("slow");

            }

            else
            {

                console.log("#button-send-2 html.success not 1");
                $('.formfail2').show("slow").delay(5000).hide("slow");

            }                   
            console.log("#button-send-2 success");

        },

        error: function(){
            console.log("#button-send-2 not html.success");
        }

    });
}); 
});

编辑: 我在 php 文件中添加了error_reporting(E_ALL);,我看到有一些变量没有初始化。特别是$async$ip_pool$send_at。我添加了以下内容:

$async = false;
$ip_pool = null;
$send_at = null;

之前

$result = $mandrill-&gt;messages-&gt;send($message, $async, $ip_pool, $send_at);

但没有任何改变。查看我的提供商的 php 错误日志,没有出现新的 php 错误。

我还注意到第一次发送没有用$mandrill-&gt;messages-&gt;send($message, $async, $ip_pool, $send_at);。只需要第二个。我删除了第一个,但没有任何变化。

正确代码:

<?php 
error_reporting(E_ALL);
require 'mandrill.php';
$send_email_to = "contacts@docgem.it";
$email_subject = "Feedback landing page DocGem";
function send_email($email)
{
  global $send_email_to;
  global $email_subject;
  $headers = "MIME-Version: 1.0" . "rn";
  $headers .= "Content-type:text/html;charset=iso-8859-1" . "rn";


$headers .= "From: ".$email. "rn";
  $message = "<strong>Email = </strong>".$email."<br>";


try{
$mandrill = new Mandrill("mfSC_K7XBO8Kj5nW0VobjQ");        

$template_name = 'docgem autoresponder';

 $template_content = array(
        array(
            'name' => 'example name',
            'content' => 'example content'
        )
    );

$message = array(
           'html' => '<p>this is a test message with Mandrills PHP wrapper!</p>',    
           'subject' => 'Feedback landing page DocGem',
    'from_email' => 'contacts@docgem.it',

    'to' => array(
                  array(
                        'email' => $email, 
                        'name' => 'Recipient 1'
                       )
                 ),
     'merge_vars' => array(
            array(
                'rcpt' => $email,
                'vars' => array(
                    array(
                        'name' => 'merge2',
                        'content' => 'merge2 content'
                    )
                )
            )
        )

    );



json_encode($mandrill->messages->sendTemplate($template_name, $template_content, $message));


  return true;
}

catch(Mandrill_Error $e) {
    // Mandrill errors are thrown as exceptions
    echo 'A mandrill error occurred: ' . get_class($e) . ' - ' . $e->getMessage();
    // A mandrill error occurred: Mandrill_Unknown_Subaccount - No subaccount exists with the id 'customer-123'
    throw $e;
}


}

function validate($email)
{
  $return_array = array();
  $return_array['success'] = '1';
  $return_array['email_msg'] = '';
  if($email == '')
  {
    $return_array['success'] = '0';
    $return_array['email_msg'] = 'inserire email';
  }
  else
  {
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$/';
    if(!preg_match($email_exp,$email)) {
      $return_array['success'] = '0';
      $return_array['email_msg'] = 'inserire email valida';  
    }
  }

  return $return_array;
}


$email = $_POST['email'];

$return_array = validate($email);

if($return_array['success'] == '1')
{

    send_email($email);

}
header('Content-type: text/json');
echo json_encode($return_array);

?>

【问题讨论】:

  • print_r($result); 不应该是json_encode($result)吗?
  • json_encode() 在文件的底部。我还需要用json_encode() 切换print_r() 吗?
  • 我已经按照您的建议尝试了,但它不起作用。
  • 您是否有理由使用自己的 PHP 邮件功能,而不是像 PHPMailer 这样经过良好测试的包装器?
  • 解决了!我在sendTemplate() 中使用了json_encode 而不是print_r,谢谢大家。我用正确的 php 代码编辑帖子。 @HNA 我需要使用自己的 PHP 来使用 Mandrill 模板。

标签: javascript php forms email popup


【解决方案1】:

在 JSON 相关的输出中,特别是当它要被 javascript 读取时,您需要使用禁用错误报告,并删除 die(); echo json_encode 之后...

<?php
error_reporting(0);
...
...
...
header('Content-Type:application/json;');
echo json_encode($return_array);

【讨论】:

  • 我试过先删除die(),然后修改header()(因为我有Content-Type: text/json,你的是application/json),最后加上@987654324 @,但他们并没有为我解决问题。我在浏览器控制台上有同样的错误。
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多