Angular http post和PHP(以及.net)之间的特殊字符问题



我的网站上的电子邮件表单需要能够通过运行.net.的服务器发送电子邮件

代码运行得很好,但电子邮件服务器已被移动,因此客户端无法直接访问它。我的主服务器可以与它对话,我正在转换我的所有客户端->向客户端发送电子邮件服务器代码->PHP服务器->电子邮件服务器。(我有不止一封电子邮件,所有这些现在都在起作用(。我正在与特殊字符作斗争-我的示例电子邮件:

示例电子邮件:

更多特殊字符和多行

`~!@#$%^&*((_-+=

{[}]\|;:'"lt>.?/

最后是最后一行。

This Works(AngularJS(:

$http({
method:'POST',
//url:  "assets/api/SendMessage.php",
url:'https://myemailserver.com/mygroup/SendMessage',
headers: {
'Content-Type': "application/json"
},
data:{
"From": dataObj['firstname-email'] + ' ' + dataObj['lastname-email'],
"SenderEmail": dataObj['senderemail-email'],
"Message": dataObj['body-email'],
"Subject": dataObj['subject-email']
}
}).then(function successCallback(response){
console.log('Email Response, success!',response);

$scope.emailSuccess = true;
}, function errorCallBack(response){
console.log('Email Error:',response);
$scope.emailFail = true;
})

但是,当我把它发送到我的PHP服务器(相同的代码,不同的URL(,然后它使用curl发送消息时,当编辑器中有任何特殊字符(包括空行(时,我会收到一条失败的消息。(除了、和。(

如果消息的正文是一行,那么它可以正常工作

我的PHP:

$url = 'https://myemailserver.com/mygroup/SendMessage';   
$params = json_decode(file_get_contents('php://input'),true);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$headers = array(
"Content-Type: application/json",
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$data = '{"From":"' . $params["From"] . '","SenderEmail":"' . $params["SenderEmail"] . '","Message":"' .$params["Message"] . '","Subject":"' . $params["Subject"] .'"}';
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$resp = curl_exec($curl);
curl_close($curl);
echo($resp);

我在网上尝试了几种不同的选择:

  1. 从字符串中删除所有特殊字符
  2. https://www.php.net/manual/en/function.addslashes.php
  3. https://www.w3schools.com/php/func_string_htmlspecialchars.asp

无论用哪种方式,我都会收到来自电子邮件服务器的失败响应。

我需要保留特殊字符(包括换行符(。有人能帮我怎么做吗?感谢

这几乎可以肯定是编译JSON字符串的方式。这些东西非常挑剔,如果可能的话,你不应该手动创建它们。相反,按照预期创建对象(或数组(,并使用内置工具进行字符串化。

代替$data = '{"From":"' . $params["From"] . '","SenderEmail":"' . $params["SenderEmail"] . '","Message":"' .$params["Message"] . '","Subject":"' . $params["Subject"] .'"}';

试试这个:

$data = array(
"From" => $params["From"],
"SenderEmail" => $params["SenderEmail"],
"Message" => $params["Message"], 
"Subject" => $params["Subject"]);
$data = json_encode($data) ;

这不仅更容易阅读和维护,而且可以自动处理在试图转移内容时可能遇到的一系列问题。

最新更新