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);

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

  1. Remove all special characters from a string
  2. https://www.php.net/manual/en/function.addslashes.php
  3. 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) ;

这不仅更易于阅读和维护,而且会自动解决在尝试转义内容以进行传输时可能遇到的大量问题。