我正在尝试通过PHPBB发送经过数字签名的电子邮件。我的所有交换电子邮件和所有各种客户端都运行良好,但它不适用于gmail用户。似乎谷歌似乎没有处理/阅读多部分哑剧类型。也许我错过了一些愚蠢或容易的事情?谢谢你的期待!
以下是测试电子邮件的示例,证书被#:
阻止这是一条S / MIME签名邮件
------ ############################ Content-Type:text / html;字符集=" ISO-8859-1"
Content-Transfer-Encoding:8位
Hello admin,
祝贺。如果您收到此电子邮件,phpBB是正确的 配置为发送电子邮件。
如果您需要帮助,请访问phpBB支持论坛 - https://www.phpbb.com/community/
-
------ ############################ Content-Type: 应用程序/ x-PKCS7签名;命名=" smime.p7s" Content-Transfer-Encoding:base64 Content-Disposition:attachment; 文件名=" smime.p7s"
# # # # # # # # # # # # # # # # # # # # #------ ############################ -
以下是我正在使用的代码片段:
// Send message ...
$mail_to = ($to == '') ? 'undisclosed-recipients:;' : $to;
$fp = fopen("/var/www/ssl/ext/phpbbservices/digests/includes/msg.txt", "w");
$this->msg = "".'Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit'. "\n\n" . $this->msg . "\n";
fwrite($fp, $this->msg);
fclose($fp);
openssl_pkcs7_sign("/var/www/ssl/ext/phpbbservices/digests/includes/msg.txt", "/var/www/ssl/ext/phpbbservices/digests/includes/signed.txt", file_get_contents("/var/www/ssl/ext/phpbbservices/digests/includes/publicCert.pem"), array(file_get_contents("/var/www/ssl/ext/phpbbservices/digests/includes/privateKey.pem"), 'PASSWORD_FOR_PRIVATE_KEY'), $headers);
$data = file_get_contents("/var/www/ssl/ext/phpbbservices/digests/includes/signed.txt");
$parts = explode("\n\n", $data, 2);
$newHeader = explode("\n", $parts[0]);
$newMessage = $parts[1];
$result = phpbb_mail($mail_to, $this->subject, $newMessage, $newHeader, PHP_EOL, $err_msg);
答案 0 :(得分:1)
这很简单! 交换标头与我在signed.txt处理文件中的标头不匹配。所以我挖了它,发现phpBB系统正在创建一个标题,包括Content-Type:text / html;字符集的字符集= =" ISO-8859-1” 。所以标题有两个,那个和正确的"内容类型:multipart / signed;协议="应用程序/ x-PKCS7签名&#34 ;; micalg =" sha-256“;”Exchange修改了标题,只是忽略/清除了第一个条目,而谷歌忽略了第二个内容类型,只使用了第一个。
所以最终我只需要在设置Content-Type的那部分代码中注释phpBB标头条目。