Qdmailでは、S/MIME署名することができるのは、SMTP送信の場合のみです。
$param には、smtpの設定データが入っているものとします。
なお、サンプルのためパスワードをスクリプトに直接入れる形になっていますが、このパスワードは秘密鍵を守る重要なものです。ユーザーの責任において、厳重に管理する必要があります。
$option = array(
'type'=>'text',
'option'=>array(
'sign'=>'s/mime',
'certificateFilePath'=>'/usr/local/username/cert',
'certificateTempPath'=>'/usr/local/username/cert/temp',
'certificateFile'=>'cert_spok.pfx',
'certificatePass'=>'your_password',
),
'smtp'=>$param,
);
$to = array('address@example.com','宛先日本語');
$body = <<<EOF
S/MIMEのテストです。
S/MIMEはメール全体を包んで、ハッシュ値(SHA1)を取り、それを秘密鍵で暗号化し、
さらに公開鍵といっしょにして送信するものです。
受け取ったメーラーは、独自に内容のハッシュ値を取り、公開鍵で解読したハッシュ値と比較します。
これが一致していれば、メールの内容は改ざんされていないことになります。
EOF;
$from = array('from@example','スポック');
qd_send_mail($option , $to , 'S/MIMEテスト' , $body , $from , 'test.jpg' );
certificateFilePathは、署名ファイルが置いてあるディレクトリです。
デフォルト(指定しない場合)では、windows環境の時(PHP_OSがWINの時)は、c:¥cert 、ウィンドウズ以外の時は、/user/local/cert となります。最後に、スラッシュ、バックスラッシュは付けないでください。
certificateTempPathは、署名ルーチンが使用するtempディレクトリです。
デフォルト(指定しない場合)では、windows環境の時(PHP_OSがWINの時)は、c:¥temp 、ウィンドウズ以外の時は、/tmp となります。最後に、スラッシュ、バックスラッシュは付けないでください。
相対パス指定にすると、apacheからみたルートディレクトリがカレントディレクトリとされて、意図と違うディレクトリを参照することになりますので、絶対パスで指定するのが無難です。
例えば開発環境winと運用環境unixで、署名ディレクトリが異なる場合があるかと思います。その場合は、ソースコードの、$certificate_file_path_win と $certificate_file_path_unix の定義部分をそれぞれの環境に合わせて書き換えておけば、アプリケーションでパスを切り替える必要がありません。
署名ファイルディレクトリが初期設定のままでいい場合は下記のように省略できます。
$option = array(
'type'=>'text',
'option'=>array(
'sign'=>'s/mime',
'certificateFile'=>'cert_spok.pfx',
'certificatePass'=>'your_password',
),
'smtp'=>$param,
);
署名が.pfx形式ではなく、.pem方式の場合は以下のように指定します。
.pem方式は、秘密鍵が平分で保存されています。.pemファイル自体の管理を十分に気をつけて下さい。
$option = array(
'type'=>'text',
'option'=>array(
'sign'=>'s/mime',
'certificateFilePath'=>'/usr/local/username/cert',
'certificateTempPath'=>'/usr/local/username/cert/temp',
'certificateFile'=>'cert_spok.pem',
'privateKeyFile'=>'private_spok.pem',
),
'smtp'=>$param,
);
なお、デフォルトは、pem形式であり、何も指定しない場合は、 cert.pem , private.pem がデフォルトファイル名になります。
証明書ファイルから抽出される秘密鍵は、外部に漏らしてはいけないものです。抽出時のパスワードは必ず設定してください。また、pem形式の場合は、パスワード保護がきかない場合もあるので、certificateFilePathは、外部からアクセスできないディレクトリを指定することを強く推奨します。
また、tempディレクトリも外部からアクセスできないディレクトリを指定してください。