2012-01-25 18 views
4

PHPからの添付ファイルを使用して暗号化された電子メールを送信しようとしていますが、電子メールは電子メールクライアント(この場合はMS Outlook)。 これは私が電子メールを送信するために使用するコードです:スクリプトの動作S/MIME(PHP)を使用して添付ファイル付きの電子メールを送信

$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-- 

添付ファイル付きの暗号化メールを送信する別の方法はありますか?または、この問題の解決策がありますか?

+0

[私はPHPのメール機能やphpmailerを使うべきですか?](http://stackoverflow.com/questions/1231886/should-i-use-php-mail-function-or-phpmailer) – mario

+0

ありがとうMario、しかし、その質問は、PHPからのメーリングに関することを除いて、私の質問とはまったく関係ありません。 –

+0

phpmailerまたはswitftmailerでセミコロンが見つからないことはありませんでした。あなたのコードにパッチを当ててはいけません。それを捨てる。 – mario

答えて

4

この問題の解決策は、元のメッセージのヘッダーをメッセージを含むファイルに含めることです。

私は、ファイルをディスクに書き込む前に、このようなものを追加しました:

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

その後、openssl_pkcs7_encrypt()関数に渡す前に、アレイからMIME-バージョンとのContent-Typeヘッダを削除します。

関連する問題