2008/09/06(土)2008-09-06

Qdmaiのダウンロードページはこちら
  • 2008-09-05
    • 1.1.0b
      attachモードの追加修正。array('test.jpg','test2.jpg'...)でも追加できるようにした。
      attachSimple( $bool = null ) or インラインモード時のみ


      decoFixメソッドの改良
      decoSelectメソッドの改良追加
      デバッグモードの文字コード整理
		if( ($this->inline_mode || $this->attach_simple) && !is_array($param[0])){
			foreach($param as $one){
				$param_temp[] = array( $one );
			}
			$param = $param_temp;
		}

開封確認(受信確認)&配送確認

2008/09/03 未分類 spok

開封確認(受信確認)&配送確認

Qdmailでは、追加ヘッダーに設定することにより、開封確認(受信確認)&配送確認をすることができます。
しかし、作者としては配送確認はともかく、開封確認(受信確認)機能を利用していただくことには消極的です。

開封確認機能に消極的な理由

「相手がメールを読んだかどうか。」
送信した人にとっては、結構気になるものですが、受け取った側の人間にとっては煩わしいだけのもので、通常、よくないメールマナーとして紹介されていることが多いです。私自身も受け取りたくないです。
また、スパムメールが好んで使う場合もあり、これも非推奨の理由です。
しかしクローズドな関係での情報のやり取りなどで必要な場面というのも考えられなくはないので、ここに紹介する次第です。
Qdmailには開封確認についての便利な機能はあえて搭載していません。必要な方は、このページを参考に、ご自分でヘッダーを設定してください。

開封確認(受信確認)と配送確認の違い

開封確認(受信確認)は、受信者がメールを開いたかどうか(読んだかどうかではない)を確認するためのものです。
配送確認は、最後のサーバーまで届いたかどうかという点です。受信者が開封したかどうは関係ありません。配送確認は、開封確認の一歩手前の段階です。

開封確認(受信確認)

ヘッダー Disposition-Notification-To が開封確認のヘッダーです。X-Confirm-Reading-Toというヘッダーも同様の働きをしますが、過去のものであり、Disposition-Notification-Toだけで十分でしょう。

開封確認(受信確認)の設定の仕方

qd_send_mail方式の場合(テキストメール)
$add_header = array(
    'From'=>'return@example.com',
    'Disposition-Notification-To'=>'return@example.com',
);

qd_send_mail( 'text' , 'to@example.com' , '件名' , $add_header );
※FromとDisposition-Notification-Toに設定するアドレスは、別々に設定することができますが、一致していないと配送確認を返送しないメーラーもあるようです。
OOP or easyメソッドの場合
$mail にはQdmailのインスタンス(オブジェクト)が入っているものとします。
$mail -> addHeader('Disposition-Notification-To','return@example.com');

配送確認

配送確認の方法は2つあります。
名称配置備考
Return-Receipt-Toヘッダー古い仕様&RFC非準拠
NOTIFY=SUCCESS,FAILUREエンベロープSMTP通信でないとダメ(正しくはESMTP通信)
Return-Receipt-Toは、RFCで明確にされているものではなく、sendmailというインターネットでは代表的なメールサーバの独自拡張です。しかし、sendmailは途中からこのヘッダーをサポートしなくなり、現在のバージョンでは無視されます。もうReturn-Receipt-Toは過去のものと思って良いでしょう。
NOTIFY=SUCCESS,FAILUREは、逆に古いSMTPサーバーではサポートしていないため、送信、受信の両方が対応している必要があります。
現在では、NOTIFY=SUCCESS,FAILUREを設定するのが現実的です。
Qdsmtpでは、簡便的な方法で対応しています。0.1.7.a以降。

SMTP通信の場合
QdmailからQdsmtpを使用する場合は、Qdsmtpで配送確認のページの、SMTP初期設定時のパラメータで指定する方法がよりでしょう。
ただし、この方法は、どの宛先にも配送確認を付けてしまうので、留意が必要です。
また、返送先のアドレスは、ヘッダーのFromではなく、エンベロープのFrom(Return-Path)なので注意が必要です。

mail関数の場合
Qdmailでは、mail関数を利用している場合には、mtaOption()メソッドを利用します。
 -Nオプションで、Notifyの設定を行い、-f でreturn-pathの設定を行います。

配送確認の設定の仕方

Return-Receipt-Toは過去のものなので、ヘッダーだけご紹介しておきます。
Return-Receipt-To
設定は、受信確認を参考にしてください。

Qdsmtpを利用してSMTP送信している場合

NOTIFY=SUCCESS,FAILUREについては、いつかqdsmtpの配送確認のページをご参照下さい。

mail関数を利用している場合

mail関数の第5引数は、MTAに渡すオプションです。お使いのサーバーがsendmailまたはsendmailラッパーであれば、以下の設定をしてみてください。

qd_send_mail($option .....)の場合
$option = array(
    'type' => 'text',
    'option'=>array(
	'mtaOption'=>'-N success,failure -f return_address@example.com'
    ),
);
return_address@example.comには、貴方が返事をもらうためのアドレスを指定してください。
 -f はreturn-pathを設定するためのオプションです。

OOPまたはeasy...メソッドの場合
$mail -> mtaOption( '-N success,failure -f retun_address@example.com' );

その他

この確認の確実性

多くの人は、開封確認(受信確認)について無効に設定しているかと思います。開封確認を付けたからといって、必ず相手が開封したかどうかがわかるわけではありません。
また、配送確認も上記のとおり、確実なものではありません。
配送確認を確実にしたい場合は、SMTPにて相手のサーバーに直接送り届けることでしょう。

参考にさせていただいたサイト

開封確認-中の技術日誌ブログ
開封確認付きメールをどう思いますか。-人力検索はてな
メーラ機能比較報告書-西村宏之のホームページです
becky-ml:01166 開封確認
sendmail システム管理 (151K) -日本ネットワークインフォメーションセンター
SMTP拡張サービス
RFC1891日本語参考訳

電子署名の使用法

2008/09/02 未分類 spok

サンプルコード qd_send_mail型

Qdmailでは、S/MIME署名することができるのは、SMTP送信の場合のみです。
$param には、smtpの設定データが入っているものとします。
なお、サンプルのためパスワードをスクリプトに直接入れる形になっていますが、このパスワードは秘密鍵を守る重要なものです。ユーザーの責任において、厳重に管理する必要があります。

pfx形式

$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
certificateFilePathは、署名ファイルが置いてあるディレクトリです。
デフォルト(指定しない場合)では、windows環境の時(PHP_OSがWINの時)は、c:¥cert 、ウィンドウズ以外の時は、/user/local/cert となります。最後に、スラッシュ、バックスラッシュは付けないでください。
certificateTempPath
certificateTempPathは、署名ルーチンが使用するtempディレクトリです。
デフォルト(指定しない場合)では、windows環境の時(PHP_OSがWINの時)は、c:¥temp 、ウィンドウズ以外の時は、/tmp となります。最後に、スラッシュ、バックスラッシュは付けないでください。
注意点
相対パス指定にすると、apacheからみたルートディレクトリがカレントディレクトリとされて、意図と違うディレクトリを参照することになりますので、絶対パスで指定するのが無難です。

Tips!
例えば開発環境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,
);

ファイル.pem形式

署名が.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ディレクトリも外部からアクセスできないディレクトリを指定してください。

電子署名(S/MIME)

2008/09/02 未分類 spok
Qdmail 1.0.9bからは、電子署名ができます。これにより、よりセキュアなメールをQdmailから送信することができます。(なお、これは暗号化ではなく、署名です。)
1.0.9b現在は、S/MIME方式のみをサポートしています。

なお、この機能を使用するには、OpenSSLモジュールがPHPに組み込まれている必要があります。
また、現状では、SMTP送信でないと正しく送信できません。

電子署名でできること

  • メール本文が経路途中で改ざんされていないことを保証する(本文のみです。ヘッダーは対象外。)
  • 「あなたが」署名したメールであると証明できる(ただし、オレオレ証明書でないことが条件です。)
  • テキストメールだけでなく、HTMLメール、添付ファイルがあっても、その改ざんがないことを保証でききる
例)
三井住友銀行、東京三菱銀行などは、顧客に送るメールすべてにS/MIME方式による電子署名をしています。これにより、フィッシング詐欺などのリスクを減らしています。

条件

貴方(貴社)が、権威ある認証機関から正当な公開鍵証明書をもらっている必要があります。
といっても、制限付きながら私が無料でもらえるぐらいですから、理解さえすればそんなにハードルは高くありません。
商用で使う場合は、ベリサインなどの会社から有償で証明書を購入するのがよいでしょう。