使用S / MIME(PHP)发送带附件的电子邮件

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了使用S / MIME(PHP)发送带附件的电子邮件脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用 PHP附件发送加密邮件,但是,我的电子邮件只是在电子邮件客户端(在本例中为MS Outlook)中显示纯文本.
这是我用来发送电子邮件代码

$SEMi_rand = md5(time());   
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";   
$fileatt = "\path\to\attachment";
$headers = array();
$headers['From'] = $email_from;
$headers['Subject'] = $email_subject; 
$headers['MIME-Version'] = "1.0";
$headers['Content-tyPE'] = "multipart/mixed; boundary=\"{$mime_boundary}\"";    

$file = fopen($fileatt,'rb');   
$data = fread($file,filesize($fileatt));
$data = chunk_splIT(base64_encode($data));     
fclose($file);   

//message part
$email_message = "This is a multi-part message in MIME format.\n\n" .   
                "--{$mime_boundary}\n" .   
                "Content-Type:text/htML; charset=\"UTF-8\"\n" .   
                "Content-transfer-encoding: 7bit\n\n
                                     Please find the file attached\n\n";   


//file part
$email_message .= "--{$mime_boundary}\n" .   
                  "Content-Type: {$fileatt_type};\n" .   
                  " name=\"{$fileatt_name}\"\n" .   
                  "Content-transfer-encoding: base64\n\n" .   
                 $data . "\n\n" .   
                  "--{$mime_boundary}--\n";   

$mfile = fopen("msg.txt","w");
fwrite($mfile,$email_message);
fclose($mfile);


$key = file_get_contents("mailcert.cer");

$encrypt = openssl_pkcs7_encrypt("msg.txt","enc.txt",$key,$headers);
if($encrypt){
    $data = file_get_contents("enc.txt");
    $parts = explode("\n\n",$data,2);

    // Send mail
    $ok = mail($email_to,$email_subject,$parts[1],$parts[0]);
}

该脚本有效,电子邮件已发送,可以在Outlook中解密,但结果如下:

--==Multipart_Boundary_x6434b5a09F1f49c571a633802cd36772x

Content-Type:text/html; charset="UTF-8"
Content-transfer-encoding: 7bit

Please find the file attached

--==Multipart_Boundary_x6434b5a09f1f49c571a633802cd36772x
Content-Type: application/octet-stream;
 name="1327490599scrippie.txt"
Content-transfer-encoding: base64

JG9sZElwID0gIjE5NS40Ni4zOS43MyINCiRuZXdJcCA9ICIqIg0KDQojIEdldCBhbGwgb2jqZWN0
cyBhdCBJSVM6Ly9Mb2NhbGhvc3QvVzNTVkMNCiRpaXNPYmplY3RzID0gbmV3LW9iamVjdCBgDQog
ICAgU3lzdGVtLkRpcmVjdG9yeVNlcnZpY2VzLkRpcmVjdG9yeUVudHJ5KCJJSVM6Ly9Mb2NhbGhv
[etc....]

--==Multipart_Boundary_x6434b5a09f1f49c571a633802cd36772x--

是否有其他方式发送带附件的加密电子邮件或者这个问题有解决方案吗?

解决方法

此问题的解决方案是在包含消息的文件中包含原始消息的标头.

在将文件写入磁盘之前,我添加了类似的内容

foreach($headers as $headerkey => $headerval){
    $email_message = $headerkey . ": " . $headerval . "\r\n" . $email_message;
}

然后,在将数组传递给openssl_pkcs7_encrypt()函数之前,从数组中删除MIME-version和Content-Type标头.

脚本宝典总结

以上是脚本宝典为你收集整理的使用S / MIME(PHP)发送带附件的电子邮件全部内容,希望文章能够帮你解决使用S / MIME(PHP)发送带附件的电子邮件所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。