SwiftMailer RfcComplianceException给出的ID无效

时间:2017-02-03 21:05:40

标签: php email-attachments swiftmailer mime-message

我正在研究一个系统,它在发送电子邮件之前接收电子邮件,查找所有base64编码的图像,并将它们作为内联附件嵌入内容ID(cid)。

Well SwiftMailer不喜欢我做Id的方式。我试过这个:

$attachment = new \Swift_Attachment( $image['bytes'], $image['name'], $image['type'] );
$attachment->setDisposition('inline');
$attachment->setId($image['content_id']); // content id is dhGCSXS6bXRbBQIKl2xoXNh4

它给了我这个:

// Swift_RfcComplianceException: Invalid ID given <dhGCSXS6bXRbBQIKl2xoXNh4>

显然有一种内容ID的格式?我查了RFC 2111并且找不到拼写格式的内容。从环顾四周来看,我认为这只是你可以提出的随机唯一字符串。或者也许只是4点钟,我的大脑已经检查过了。

另外,我不能只使用Swift生成的cid,因为cid已经被链中早​​期的另一个服务生成和使用。

那么cid的格式是否有效?

1 个答案:

答案 0 :(得分:1)

我认为CID中应该有@符号。

更具体地说,CID应该与源中的匹配:

private function _assertValidId($id)
    {
        if (!preg_match(
            '/^'.$this->getGrammar()->getDefinition('id-left').'@'.
            $this->getGrammar()->getDefinition('id-right').'$/D',
            $id
            )) {
            throw new Swift_RfcComplianceException(
                'Invalid ID given <'.$id.'>'
                );
        }
    }

更具体地说,CID应该匹配以下正则表达式:

/^(?:(?:[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\}\|~]+(\.[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\}\|~]+)*)|(?:"(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21\x23-\x5B\x5D-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F]))*"))@(?:(?:[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\}\|~]+(\.[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_`\{\}\|~]+)*)|(?:\[(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x5A\x5E-\x7E])|(?:\\[\x00-\x08\x0B\x0C\x0E-\x7F]))*\]))$/D

有关详细信息,请查看:https://github.com/swiftmailer/swiftmailer/blob/de19df332219d73a2704525ba75aabd7dfaa303b/lib/classes/Swift/Mime/Grammar.php