如何在PHP中创建有效的行包装JSON


How to create valid line-wrapped JSON in PHP?

我目前正试图通过Sendgrid SMTP API发送电子邮件。我有一个"名字"替换,用收件人的名字替换电子邮件中的标签。然而,我遇到了一个问题,我的SMTP JSON被Sendgrid拒绝为无效。

这个问题是因为名字有空格,Swift邮件器在这里换行。换行符最终位于名称的中间,使这些字符串无效的JSON导致Sendgrid拒绝该电子邮件。我正在使用Sendgrid自己的SMTP API PHP库生成标头,但这不会为您做换行。

我试图找到一种方法来包装我的JSON在一种方式,不使它无效。我还没有找到任何PHP解决方案。Sendgrid本身给出了一个PERL正则表达式示例,我试图在PHP中这样做,但没有成功。

我还发现了一个很有前途的Ruby解决方案,但我的应用服务器只支持PHP。这是我找到的Ruby解决方案。

这是我用来发送邮件的代码。

<?php
//...
$header = new Header(); // This is the sendgrid API header class
$header->setTos(array_column($subscribers, 'email'));
$header->addSubstitution('-SubscriberName-', array_column($subscribers, 'name'));
$header->addSubstitution('-SubscriberId-', array_column($subscribers, 'id'));
// $message is a SwiftMessage
$message->getHeaders()->addTextHeader(strtoupper(Header::NAME), $header->jsonString());

这是根据日志设置头值的方式。我已经删除了个人数据,但您可以看到"The('n)Shop"将如何导致上述无效的JSON错误。在整个名称替换过程中,这种情况会发生很多次。

X-SMTPAPI: {"to":[/* emails removed, but there were no spaces so all emails were on one very long line */],"sub":{"-SubscriberName-":["Joseph","Alexandra","Michelle","Nicky","Des","Clive","Peter","Robert","Tedy","Terry","Terry","Terry","Tessa","The 
Shop","Thomas","Tim","Tim","Tina","Tina","Tobias","Tom","Tommy", //...

可能你需要的是json_encode与JSON_PRETTY_PRINT在这里讨论:使用PHP打印JSON

SendGrid有一个实现SMTPAPI报头的php库:https://github.com/sendgrid/sendgrid-php

即使你不使用它,你也总能看到他们是如何解决这个问题的,开源之美。

祝你好运!