最近就職活動中なので、カバーレターと履歴書を送るときに、相手がカバーレターを読んだかどうか知りたいです。その後、www.spypig.com を発見しました。これは、受信者がメールをチェックするたびにメールを送信して、メールが閲覧されたことを通知し、閲覧回数を記録することができます。使ってみたところ、実装原理がまだ非常にシンプルであることがわかったので、PHPを使って自分で書きました。
概要
自分が送信したメールが受信者に閲覧されたかどうかを知りたい場合は、Email Tracking System(Email Tracking System)を利用すると役に立ちます。
使い方
メール追跡システムのリンクを開き、メールアドレスとタイトルを入力し、受信する通知の数を選択してから、アクティブ化して追跡画像を取得し、1分以内にメールの本文にコピーして送信します通常のメールです。
実施原則
タグのsrc属性は外部ファイルを積極的に導入するため、srcの値として「トラッカープログラム」(このプログラムは通常画像を出力するもの)のURLを使用し、このをbodyに入れますメールを添付して送信します。このように、受信者がメールを開いて を表示すると、「トラッカー プログラム」が呼び出され、この時点で「トラッカー プログラム」から通知メールが送信されます。電子メールも HTML 形式である必要があります。
お手続きのご案内
プログラムには 4 つの部分があります:
index.html -- 電子メール アドレス、タイトル、受信した通知の数という 3 つのパラメーターを渡す必要がある電子メール トラッカー プログラム インターフェイスを作成します。 -
tracker.php -- 電子メール トラッカーを生成するパラメーターを受け取ります。 -
blank.php -- 電子メールを送信して、電子メールが読まれたことをユーザーに通知し、画像を生成します。 -
msg_template.html -- 通知テキストのテンプレート。 -
コード
テーブルを作成するSQL:
email_tracker SQL
CREATE TABLE `email_トラッカー` (
`unique_id` varchar(50) NOT NULL,
`email` varchar( 100) デフォルト NULL,
`タイトル` varchar(100) default NULL,
`番号` tinyint(4 ) デフォルト '3',
`times` tinyint(4) デフォルト 「-1」 ,
`ip` varchar(16) default NULL,
`sent_time` int (11) デフォルト '0',
プライマリ KEY (`unique_id`),
ユニーク KEY `unique_id` (`unique_id`)
) エンジン=MyISAM;
tracker.php は、新しい電子メール トラッカーを生成するためのパラメーターを受け取ります:
tracker.php
$db =get_db();
$ip =$_SERVER['リモート_ADDR'] ?$_SERVER['REMOTE_ADDR']:'127.0.0.1'; //ユーザーIPを取得
$unique_id=get_unique_id($ip); = intval
( $_POST[ '番号' ]);$email ($_POST['
email']);$title = トリム ($_POST['
タイトル']);$sent_time=時間() ; クエリ(" `email_tracker` (unique
_id、email、title、number、ip、sent_time) VALUES ('$unique_id'、'$email'、'$title') に挿入します。 、$number、'$ip
'、'$sent_time')");
一意の ID を生成するために使用される Get_unique_id 関数:
get_unique_id
関数 current_microsecond() {
list($usec, $sec) = explode (" ", microtime());
,2); }//乱数を取得します 関数ランダム() { $tmp
= rand
(0
, 1)? '-':'' ; ランド(1000、9999)ランド
(1000) 、 9999). ランド(100,999).ランド (100,) 999 );}
// 擬似 GUID を生成します
//3 つのセグメント: 1 つはアドレス、1 つはマイクロ秒、1 つは乱数です
functionget_unique_id($ip) {
$ raw = strtoupper(md5($ip.'-) ' .current_microsecond()。 ' -'.random()));
return substr($raw,) 0、8 ) .'-'.substr($raw,8,4) '- - ' .substr ( $raw,16,4).'-'.substr ( $生, 20 );}
blank.phpはメール本文のTracking Imageによって呼び出され、メールが読まれたことをユーザーに通知するメールを送信し、画像を生成します。
blank.php
if(!($unique_id = trim($_SERVER[ 「QUERY_STRING」] ))) exit_with_image_blank();
$db=get_db();
$tracker =$db ->fetch_one( "SELECT * FROM `email_tracker` WHERE unique_id='$unique_id'");
// レコードが存在しないか、追跡が終了しました
if (空($tracker) && $tracker['回' ] >= $ tracker ['number']) {
// 空白の画像を出力して終了
exit_with_image_blank();
}
// メールが送信されてからの経過時間
$time_elapsed =time() - $トラッカー[ 'sent_time'];
// 1分未満
if($time_elapsed 60) {
if($tracker['回'] 0) { // メールトラッカーがインストールされていませんまだ有効化されています
"); } exit_with_image_blank ();} //1分経過後、times if
(
$tracker
['回 '
] 0) { $one_分前 = 時間() -
60; // 1分後にアクティブ化されていないすべてのメールトラッカーを削除します $db ->
クエリ("DELETE FROM `email_tracker` WHERE 回 $one_ minutes_ago
");//unique_id='$unique_id' exit_with_image_blank(); }
//受信者IPを取得します
$rcpt_ip = $_SERVER['REMOTE _アドレス']? $ _SERVER['REMOTE_ADDR']:'127.0.0.1';
if ($rcpt_ip = = $tracker['ip']) {
// ユーザーがメールを開いた可能性があります
$ tracker['times']++;
} else {
//が受信者ですメールを開いた後の番号は、再生回数が 1 つ増加しました
$tracker['回']++;
}
$db -> query(" UPDATE `email_tracker` SET 回=$tracker[回] WHERE unique_id='$unique_id'");
if (( $tracker[ '回'] >= $tracker['番号] '
]) { // 追跡は終了しました。レコードを削除します
$db->query("DELETE FROM `email_tracker` WHERE unique_id='$unique_id ' "
);🎜}
// 送信Email
send_mail('mailtracker0@gmail.com', $tracker [「メール」」 ], array(
'件名' =>'あなたのeメール「'.$tracker」 ['タイトル'].'」を読みました!',
' 本体' => notify_content($tracker, $rcpt_ip, $time_elapsed),
'ヘッダー' => "MIME-Version: 1.0;rnContent-type:text/html; charset="utf-8";rn" 、
'ホスト' =>'smtp.gmail.com',
'ssl' = >true、
'ポート' =>465,
'認証' => true、
'user' =>'mailtracker0' 、
空の画像を出力して終了します exit_with_image_blank();
send_mail 関数は通知メールの送信に使用されます:
send_mail
/*
* パラメーター:
* 必須の送信者のメールアドレス
* 受信者は必須 受信者のメールアドレス、複数のメールがある場合は、「,」で区切るか、配列を渡します
* params オプション その他のオプションのパラメーター 配列
* ----subject メールの件名
* ----body メール本文
* ----ヘッダー
* ----host メールの送信に使用される SMTP ホスト
* ----port ポート
* ----timeout タイムアウト時間
* ----ssl は SSL 暗号化、デフォルトは false
* ----auth 認証が必要かどうか、デフォルトは false
* ----user 認証に使用されるユーザー名
* ----pass 認証用パスワード
**/
function send_mail($from,$recipients , $params = array()) {
if(空($from) || 空 ($受信者) ) || !is_array($params)) return 'paramsエラー ';
定義 ('crlf' ''、 "rn"); =
10; $auth =
false; $s sl $件名 =
' 無題 '; foreach ($params AS $key => $value) {
$$key = $value;
}
if(!is_array($受信者)) $re受信者 = 爆発 (',', トリム($受信者));
if()
!is_array($headers )) $headers = explode(CRLF, トリム($headえー));
if( !is_string($body)) $body = '';
$body = str_replace (CRLF . '.', CRLF . '...' , $body{ 0}=='.'?':。 $body ); // SMTPサーバーに接続します
($ssl?
'
ssl: //
'
.
$host
:
$ホスト
、
$port
,
$errno
,
$errstr
,
$timeout
);
if(!は_リソース ($connection)) return
'サーバーへの接続に失敗しました )gets($connection, 1024))
if
(
$line
{
3
}
== '= ') Bread; //
コマンドを保存 $ datas
= 配列( ); if
(
$auth === true) { // 本人確認が必要です $ データ
[] = array('EHLO '.$host. CRLF、' 250 ','EHLO コマンドが失敗しました。出力: '); array
(' 認証ログイン'。 CRLF ,'334','AUTH コマンドが失敗しました。出力: '); $データ[] = array(
base64_encode
(
$user
)
.
CRLF
,
'
334
「
、
」
AUTH コマンドが失敗しました。出力:
'
);
$datas[] = array(base64_encode($pass).CRLF 、 '235 ', 'AUTH コマンドが失敗しました、 出力: ');
} else {
$datas[] = 配列('HELO '.$host.CRLF, '250 '、 'こんにちはコマンドが失敗しました。出力: ');
}
// 送信者を設定します
$datas[] = array( ')
メール送信者: '. $from.'>'.CRLF, '250', 'MAIL FROM エラー、出力: ');
// 受信者を設定
AS $value) { $datas[] =
配列('RCPT TO: '
.
$value
.
'>' .CRLF 、' 250', 'RCPT TO エラー、出力: ' ); }
$datas[] = array('DATA'.CRLF 、 '354' , 'DATA コマンドが失敗しました。出力: ');
// 邮件ヘッダー
$datas[] = 'From: '.$from.CRLF ;
$datas[] = '件名: '.$subject.CRLF;
foreach($headers AS $value) {
$datas[] = $value