欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

PHP電子郵件追蹤是如何開發制作的

admin
2012年1月14日 11:16 本文熱度 2910

應用場景


  找工作、發送推廣郵件等,發信時想知道對方是否已經看過自己的求職或推廣信。網站www.spypig.com可以實現在收信人每次查看你的郵件時發送Email通知你郵件已經被查看過了,并記錄查看的次數。使用過程中發現,它的實現原理還很簡單,所以就用PHP照著葫蘆畫瓢自己寫了個。


概述


  當你想知道自己發送的郵件是否被收信人查看過時,使用電子郵件追蹤系統(Email Tracking System)就可以幫助你。


使用方法


  打開鏈接電子郵件追蹤系統,輸入Email地址和標題,選擇接收通知的次數,然后激活獲取Tracking Image,在一分鐘內將其復制到你的Email郵件正文中,再正常發送郵件就行了。



實現原理


  由于<img />標簽的src屬性會主動引入外部文件,所以將調用“tracker程序”(此程序會正常輸出一張圖片)的URL作為src的值,并將此<img />放入郵件正文中與之一起發送出去。這樣,每當收信人打開該郵件顯示該<img />時,都會調用“tracker程序”,這時“tracker程序”會發送email通知你。而郵件也必須是HTML格式的才行。


程序說明


  程序共有四部分:



  • index.html -- 創建一個Email Tracker的程序界面,需要傳遞三個參數 - 郵件地址,標題和接收通知的次數。
  • tracker.php -- 接收參數產生一個Email Tracker。
  • blank.php -- 發送Email通知用戶郵件已閱,并生成一個圖片。
  • msg_template.html -- 通知正文的模板。

代碼


  創建表的SQL:



CREATE TABLE `email_tracker` (
`unique_id`
varchar(50) NOT NULL,
`email`
varchar(100) default NULL,
`title`
varchar(100) default NULL,
`
number` tinyint(4) default '3',
`times`
tinyint(4) default '-1',
`ip`
varchar(16) default NULL,
`sent_time`
int(11) default '0',
PRIMARY KEY (`unique_id`),
UNIQUE KEY `unique_id` (`unique_id`)
) ENGINE
=MyISAM;


  tracker.php接收參數產生一個新的Email Tracker:


tracker.php
$db = get_db();
$ip = $_SERVER['REMOTE_ADDR']?$_SERVER['REMOTE_ADDR']:'127.0.0.1'; //獲取用戶IP
$unique_id = get_unique_id($ip); // 產生一個唯一ID
$number = intval($_POST['number']);
$email = trim($_POST['email']);
$title = trim($_POST['title']);
$sent_time = time(); // 作為發送郵件的時間
$db->query("INSERT INTO `email_tracker` (unique_id, email, title, number, ip, sent_time) VALUES ('$unique_id', '$email', '$title', $number, '$ip', '$sent_time')");


  用于產生唯一ID的get_unique_id函數:



function current_microsecond() {
list($usec, $sec) = explode(" ",microtime());
return $sec.substr($usec, 2);
}
// 獲取隨機數
function random() {
$tmp = rand(0,1)?'-':'';
return $tmp.rand(1000, 9999).rand(1000, 9999).rand(1000, 9999).rand(100, 999).rand(100, 999);
}
// 產生一個偽GUID
// 三段 : 一段是地址 一段是微秒 一段是隨機數

function get_unique_id($ip) {
$raw = strtoupper(md5($ip.'-'.current_microsecond().'-'.random()));
return substr($raw,0,8).'-'.substr($raw,8,4).'-'.substr($raw,12,4).'-'.substr($raw,16,4).'-'.substr($raw,20);
}


  blank.php由郵件正文中Tracking Image調用,發送Email通知用戶郵件已閱,并生成一個圖片。


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'");

// 記錄不存在,或Tracking已經結束
if(empty($tracker) && $tracker['times'] >= $tracker['number']) {
// 輸出一個空白圖片并退出
exit_with_image_blank();
}
// 郵件發送時到現在經過的時間
$time_elapsed = time() - $tracker['sent_time'];
// 不到一分鐘
if($time_elapsed < 60) {
if($tracker['times'] < 0) { // 還未激活Email Tracker
$db->query("UPDATE `email_tracker` SET times=0 WHERE unique_id='$unique_id'");
}
exit_with_image_blank();
}
// 一分鐘之后,times<0表示Email Tracker未激活
if($tracker['times'] < 0) {
$one_minute_ago = time() - 60;
// 刪除所有經過一分鐘還未激活的Email Tracker
$db->query("DELETE FROM `email_tracker` WHERE times < 0 && sent_time < $one_minute_ago");//unique_id='$unique_id'
exit_with_image_blank();
}
// 獲取收信人IP
$rcpt_ip = $_SERVER['REMOTE_ADDR']?$_SERVER['REMOTE_ADDR']:'127.0.0.1';
if($rcpt_ip == $tracker['ip']) {
//與用戶IP相同,也許是用戶自己打開了Email
$tracker['times']++;
}
else {
// 是收信人打開了Email, 查閱次數增加一次
$tracker['times']++;
}

$db->query("UPDATE `email_tracker` SET times=$tracker[times] WHERE unique_id='$unique_id'");
if($tracker['times'] >= $tracker['number']) {
// Tracking已經結束, 刪除記錄
$db->query("DELETE FROM `email_tracker` WHERE unique_id='$unique_id'");
}
// 發送Email
send_mail('mailtracker0@gmail.com', $tracker['email'], array(
'subject' =>'Your email "'.$tracker['title'].'" has been read!',
'body' =>notify_content($tracker, $rcpt_ip, $time_elapsed),
'headers' =>"MIME-Version: 1.0;\r\nContent-type:text/html; charset=\"utf-8\";\r\n",

'host' =>'smtp.gmail.com',
'ssl' =>true,
'port' =>465,

'auth' =>true,
'user' =>'mailtracker0',
'pass' =>'**********'
));
// 輸出一個空白圖片并退出
exit_with_image_blank();


  send_mail函數用于發送通知郵件:



/*
* 參數:
* from required 發信人email
* recipients required 收信人email地址,如果有多個email則以','分隔或傳遞數組
* params optional 其它可選參數組成的數組
* ----subject 郵件主題
* ----body 郵件正文
* ----headers
* ----host 用于發郵件的SMTP主機
* ----port 端口
* ----timeout 超時時間
* ----ssl 是SSL加密,默認為false
* ----auth 是否要身份驗證,默認為false
* ----user 用于身份驗證的用戶名
* ----pass 用于身份驗證的密碼
*
*/
function send_mail($from, $recipients, $params = array()) {
if(empty($from) || empty($recipients) || !is_array($params)) return 'params error.';
define('CRLF', "\r\n");
$port = 25;
$host = 'localhost';
$timeout = 10;
$auth = false;
$ssl = false;
$subject = 'untitled';
foreach ($params AS $key => $value) {
$
$key = $value;
}

if(!is_array($recipients)) $recipients = explode(',', trim($recipients));
if(!is_array($headers)) $headers = explode(CRLF, trim($headers));
if(!is_string($body)) $body = '';
$body = str_replace(CRLF . '.', CRLF . '..', $body{0} == '.' ? '.'.$body : $body);

// 連接SMTP服務器
$connection = fsockopen($ssl?'ssl://'.$host:$host, $port, $errno, $errstr, $timeout);
if(!is_resource($connection)) {
return 'Failed to connect to server: '.$errstr;
}
while($line = @fgets($connection, 1024)) if($line{3} == ' ') break;
// 保存命令
$datas = array();
if($auth === true) { // 需要驗證身份
$datas[] = array('EHLO '.$host.CRLF, '250', 'EHLO command failed, output: ');
$datas[] = array('AUTH LOGIN'.CRLF , '334', 'AUTH command failed, output: ');
$datas[] = array(base64_encode($user).CRLF, '334', 'AUTH command failed, output: ');
$datas[] = array(base64_encode($pass).CRLF, '235', 'AUTH command failed, output: ');
}
else {
$datas[] = array('HELO '.$host.CRLF, '250', 'HELO command failed, output: ');
}
// 設置發信人
$datas[] = array('MAIL FROM: <'.$from.'>'.CRLF, '250', 'MAIL FROM error, output: ');
// 設置收信人
foreach($recipients AS $value) {
$datas[] = array('RCPT TO: <'.$value.'>'.CRLF, '250', 'RCPT TO error, output: ');
}
$datas[] = array('DATA'.CRLF, '354', 'DATA command failed, output: ');
// 郵件headers
$datas[] = 'From: '.$from.CRLF;
$datas[] = 'Subject: '.$subject.CRLF;
foreach($headers AS $value) {
$datas[] = $value.CRLF;
}
$datas[] = CRLF;
$datas[] = $body.CRLF;
$datas[] = array('.'.CRLF , '250', 'DATA(end) command failed, output: ');
$datas[] = array('QUIT'.CRLF, '221', 'QUIT command failed, output: ');

$return_value = '';
// 執行命令
foreach($datas AS $data){
if(is_string($data)) {
@
fwrite($connection, $data, strlen($data));
}
else {
@
fwrite($connection, $data[0], strlen($data[0]));
while($line = @fgets($connection, 1024)) if($line{3} == ' ') break;
if(!($data[1] === substr($line, 0, 3))) {
// 出錯, 保存錯誤信息
$return_value .= $data[2].$line.'<br />';
}
}
}
@
fclose($connection);// 關閉連接
return empty($return_value)?true:$return_value;
}


  notify_content跟據郵件模板生成通知郵件的正文:



function notify_content($tracker, $rcpt_ip, $time_elapsed) {
foreach ($tracker AS $key => $value) {
$
$key = $value;
}
$hours = intval($time_elapsed / 3600);
$minutes = intval(($time_elapsed % 3600) /60);
$seconds = $time_elapsed % 60;
$time_elapsed = '';
if($hours > 0) $time_elapsed .= $hours.' hours ';
if($minutes > 0) $time_elapsed .= $minutes.' minutes ';
if($hours == 0 && $seconds > 0) $time_elapsed .= $seconds.' seconds ';
$sent_time = date('Y-m-d H:i:s', $sent_time - date("Z") + 8 * 3600);

ob_start();
include_once('msg_template.html');
$mail_body=ob_get_contents();
ob_end_clean();
return $mail_body;
}


  exit_with_image_blank函數輸出一個空白圖片并退出:



function exit_with_image_blank() {
$img = imagecreate(15, 15);
$white = imagecolorallocate($img, 0xff, 0xff, 0xff);
imagefill(
$img, 0, 0, $white);

header('Cache-Control: no-cache, must-revalidate');
header('Content-Type:image/png');
imagepng(
$img);
imagedestroy(
$img);
exit;
}

該文章在 2012/1/14 11:16:52 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved