Angular http post 和 PHP(和 .net)之间的特殊字符问题
Problems with Special Characters between Angular http post and PHP (and .net)
我网站上的电子邮件表单需要能够通过服务器 运行 .net.
发送电子邮件
代码运行良好,但电子邮件服务器已移动,因此客户端无法直接访问它。我的主服务器可以与之对话,我正在将我所有的客户端 -> 电子邮件服务器代码转换为客户端 -> PHP 服务器 -> 电子邮件服务器。 (我通过它收到的不仅仅是电子邮件 运行,现在所有这些都在工作)。我正在为特殊字符而苦苦挣扎 - 我的示例电子邮件:
示例电子邮件:
More special characters and multi-line
` ~ ! @ # $ % ^ & * ( ) _ - + =
{ [ } ] \ | ; : ' " < , > . ? /
and finally a last line.
这个作品(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);
我从网上尝试了几种不同的选择:
- Remove all special characters from a string
- https://www.php.net/manual/en/function.addslashes.php
- https://www.w3schools.com/php/func_string_htmlspecialchars.asp
无论我如何处理,我都收到来自电子邮件服务器的失败响应。
我需要维护特殊字符(包括换行符)。谁能帮我解决这个问题?
谢谢
这几乎可以肯定是您编译 JSON 字符串的方式。这些东西非常挑剔,如果可能的话,你不应该手动创建它们。而是按预期创建对象(或数组)并使用 built-in 工具进行字符串化。
而不是$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) ;
这不仅更易于阅读和维护,而且会自动解决在尝试转义内容以进行传输时可能遇到的大量问题。
我网站上的电子邮件表单需要能够通过服务器 运行 .net.
发送电子邮件代码运行良好,但电子邮件服务器已移动,因此客户端无法直接访问它。我的主服务器可以与之对话,我正在将我所有的客户端 -> 电子邮件服务器代码转换为客户端 -> PHP 服务器 -> 电子邮件服务器。 (我通过它收到的不仅仅是电子邮件 运行,现在所有这些都在工作)。我正在为特殊字符而苦苦挣扎 - 我的示例电子邮件:
示例电子邮件:
More special characters and multi-line
` ~ ! @ # $ % ^ & * ( ) _ - + =
{ [ } ] \ | ; : ' " < , > . ? /
and finally a last line.
这个作品(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);
我从网上尝试了几种不同的选择:
- Remove all special characters from a string
- https://www.php.net/manual/en/function.addslashes.php
- https://www.w3schools.com/php/func_string_htmlspecialchars.asp
无论我如何处理,我都收到来自电子邮件服务器的失败响应。
我需要维护特殊字符(包括换行符)。谁能帮我解决这个问题? 谢谢
这几乎可以肯定是您编译 JSON 字符串的方式。这些东西非常挑剔,如果可能的话,你不应该手动创建它们。而是按预期创建对象(或数组)并使用 built-in 工具进行字符串化。
而不是$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) ;
这不仅更易于阅读和维护,而且会自动解决在尝试转义内容以进行传输时可能遇到的大量问题。