文章 | 文章列表>> |
2009-05-03 10:46:41
【小蜗牛嗷嗷之作
】
需要事先在MySQL建立好数据库,存储有相关的用户信息,这个工作很简单,所以我的代码也没必要面面具到,只是大概说一下自己的登陆方法就可以。如果觉得我PHP菜鸟,请不要笑,我至今都还没有看过一点关于PHP的书籍呢!用都是最简单的语法,跟C一样,如果哪方面不懂就baidu一下就OK了。login.php里有完整的html代码,我当时设置了两种颜色的登陆界面,通过点击页面的某个地方就提交切换颜色,我这里的颜色切换还是用到php来判断输出颜色的(当然也可以用javascript来实现)。
////////////// login.php
<?
include("./config.php");
if ($_POST['login']) {
/* 默认登陆失败 */
$login_status = "Failure";
$login_name = $_POST['login_name'];
$login_pass = $_POST['login_pass'];
$md5_pass = md5($login_pass);
/* 从数据库中获取用户信息做对比 */
$query = "select utype, realname from users where username='$login_name' and password='$md5_pass'";
if ($result = mysqli_query($link, $query)) {
if ($row = mysqli_fetch_row($result)) {
$login_status = "Success";
$utype = $row[0];
$realname = $row[1];
if ($realname == "") {
$realname = $login_name;
}
} else {
if ($thisStyle) {
$error_message = "密码错误,请重新输入!";
} else {
$error_message = "用户名或密码错误,请重新输入!";
}
}
mysqli_free_result($result);
} else {
$error_message = "未知错误!请通知系统管理员!";
}
/* 记录登陆日志 */
$client_ip = get_client_ip();
$query="insert into login_logs (login_name, login_time, login_status, client_ip) values('$login_name', now(), '$login_status', '$client_ip')";
$result = mysqli_query($link, $query);
if (!$result) {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
mysqli_close($link);
/* Let me go or not? */
if ($login_status == "Success") {
/* 验证成功,开启Session */
session_start();
$_SESSION['utype'] = $utype;
$_SESSION['username'] = $login_name;
$_SESSION['realname'] = $realname;
/* 跳转到 main.php */
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=main.php\">";
exit();
}
}
?>
<html>
<head>
<title>登陆首页</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="css/common.css" rel="stylesheet" type="text/css" />
</head>
<?php
if ($_POST['adminLogin'] || ($_POST['login'] && $_POST['loginType'] == "admin")) {
$thisStyle = 1;
} else {
$thisStyle = 0;
}
if ($thisStyle) {
$color = "#cc0000";
$font_color = "white";
$loginType = "admin";
$chgLogin = "userLogin";
$chgLoginVal = "用户登陆";
} else {
$color = "#ffcc33";
$font_color = "red";
$loginType = "user";
$chgLogin = "adminLogin";
$chgLoginVal = "管理员登陆";
}
?>
<body>
<form name="loginForm" method="post" action="<?php echo $PHP_SELF; ?>" >
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td bgcolor="#5b33d7"> </td>
<td height="160" bgcolor="#4f33d7"> </td>
<td bgcolor="#5b33d7"> </td>
</tr>
<tr>
<td width="40%" bgcolor="#4f33d7"> </td>
<td bgcolor="<?php echo $color ?>" height="210"><table bgcolor="#0000cc" align="center" width="280" cellspacing="0" style="table-layout:fixed">
<tr bgcolor="<?php echo $color ?>">
<td width="65" height="20"> </td>
<td width="215"> </td>
</tr>
<tr>
<td colspan="2" height="10"> </td>
</tr>
<tr>
<td colspan="2" align="center" valign="middle" height="30" class="wbText18">SnailWarrior信息管理系统</td>
</tr>
<tr>
<td colspan="2" align="center" valign="bottom" height="20" style="color:#FFFF00;font:14px;font-weight:bold;"><?php if ($thisStyle) echo "管理员登陆"; else echo "用户登陆"; ?></td>
</tr>
<tr>
<td align="right" class="wbText12">用户名:</td>
<td><input name="login_name" maxlength="16" <?php if ($thisStyle) echo "value=\"admin\""; else echo "value=\"hoho\""; ?> class="loginInput"></td>
</tr>
<tr>
<td align="right" class="wbText12">密 码:</td>
<td><input type="password" name="login_pass" maxlength="16" value="123456abcdef" class="loginInput">
</td>
</tr>
<tr>
<td> </td>
<td><table cellspacing="0">
<tr style="color:#FFFF00;font:11px;font-weight:bold;vertical-align:bottom">
<?php if (!$thisStyle) { ?>
<td><input type="checkbox" name="remember_name"></td>
<td>记住用户名</td>
<?php } ?>
<td><input type="checkbox" name="remember_pass"></td>
<td>记住密码</td>
</tr>
</table></td>
</tr>
<tr>
<td> </td>
<td><table>
<tr>
<td width="70"><input name="login" type="submit" style="height:22px; font:11px; width:60px;" value="登录">
</td>
<td><input name="<?php echo $chgLogin ?>" type="submit" style="height:22px; font:11px; width:80px;" value="<?php echo $chgLoginVal ?>" >
</td>
</tr>
<tr><input name="loginType" type="hidden" value="<?php echo $loginType ?>"></tr>
</table>
</tr>
<tr>
<td height="6"> </td>
</tr>
<tr bgcolor="<?php echo $color ?>">
<td colspan="2" height="20" align="center" style="color:<?php echo $font_color ?>; font:12px;font-weight:bold;"><?php if($error_message) echo $error_message; ?></td>
</tr>
</table></td>
<td width="40%" bgcolor="#4f33d7"> </td>
</tr>
<tr>
<td bgcolor="#5f33d7"> </td>
<td height="290" bgcolor="#4F33D7"> </td>
<td bgcolor="#5f33d7"> </td>
</tr>
</table>
</form>
</body>
</html>
////////////// config.php
<?php
//error_reporting(0);
header("content-type: text/html; charset=UTF-8");
/* 数据库配置 */
$dbhost = "localhost";
$dbuser = "SnailWarrior";
$dbpass = "SnailPassword";
$dbname = "users";
/* 连接MySQL数据库 */
$link = mysqli_connect(
$dbhost, /* The host to connect to */
$dbuser, /* The user to connect as */
$dbpass, /* The md5_pass to use */
$dbname); /* The default database to query */
/* 检查连接 */
if (mysqli_connect_errno()) {
printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error());
exit();
}
/* 设置utf8字符集 */
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s", mysqli_error($link));
}
/* 获取客户端IP */
function get_client_ip() {
$client_ip = "unknown";
if($_SERVER['HTTP_CLIENT_IP']){
$client_ip=$_SERVER['HTTP_CLIENT_IP'];
}elseif($_SERVER['HTTP_X_FORWARDED_FOR']){
$client_ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$client_ip=$_SERVER['REMOTE_ADDR'];
}
return $client_ip;
}
?>
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
需要事先在MySQL建立好数据库,存储有相关的用户信息,这个工作很简单,所以我的代码也没必要面面具到,只是大概说一下自己的登陆方法就可以。如果觉得我PHP菜鸟,请不要笑,我至今都还没有看过一点关于PHP的书籍呢!用都是最简单的语法,跟C一样,如果哪方面不懂就baidu一下就OK了。login.php里有完整的html代码,我当时设置了两种颜色的登陆界面,通过点击页面的某个地方就提交切换颜色,我这里的颜色切换还是用到php来判断输出颜色的(当然也可以用javascript来实现)。
////////////// login.php
<?
include("./config.php");
if ($_POST['login']) {
/* 默认登陆失败 */
$login_status = "Failure";
$login_name = $_POST['login_name'];
$login_pass = $_POST['login_pass'];
$md5_pass = md5($login_pass);
/* 从数据库中获取用户信息做对比 */
$query = "select utype, realname from users where username='$login_name' and password='$md5_pass'";
if ($result = mysqli_query($link, $query)) {
if ($row = mysqli_fetch_row($result)) {
$login_status = "Success";
$utype = $row[0];
$realname = $row[1];
if ($realname == "") {
$realname = $login_name;
}
} else {
if ($thisStyle) {
$error_message = "密码错误,请重新输入!";
} else {
$error_message = "用户名或密码错误,请重新输入!";
}
}
mysqli_free_result($result);
} else {
$error_message = "未知错误!请通知系统管理员!";
}
/* 记录登陆日志 */
$client_ip = get_client_ip();
$query="insert into login_logs (login_name, login_time, login_status, client_ip) values('$login_name', now(), '$login_status', '$client_ip')";
$result = mysqli_query($link, $query);
if (!$result) {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
mysqli_close($link);
/* Let me go or not? */
if ($login_status == "Success") {
/* 验证成功,开启Session */
session_start();
$_SESSION['utype'] = $utype;
$_SESSION['username'] = $login_name;
$_SESSION['realname'] = $realname;
/* 跳转到 main.php */
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=main.php\">";
exit();
}
}
?>
<html>
<head>
<title>登陆首页</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="css/common.css" rel="stylesheet" type="text/css" />
</head>
<?php
if ($_POST['adminLogin'] || ($_POST['login'] && $_POST['loginType'] == "admin")) {
$thisStyle = 1;
} else {
$thisStyle = 0;
}
if ($thisStyle) {
$color = "#cc0000";
$font_color = "white";
$loginType = "admin";
$chgLogin = "userLogin";
$chgLoginVal = "用户登陆";
} else {
$color = "#ffcc33";
$font_color = "red";
$loginType = "user";
$chgLogin = "adminLogin";
$chgLoginVal = "管理员登陆";
}
?>
<body>
<form name="loginForm" method="post" action="<?php echo $PHP_SELF; ?>" >
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td bgcolor="#5b33d7"> </td>
<td height="160" bgcolor="#4f33d7"> </td>
<td bgcolor="#5b33d7"> </td>
</tr>
<tr>
<td width="40%" bgcolor="#4f33d7"> </td>
<td bgcolor="<?php echo $color ?>" height="210"><table bgcolor="#0000cc" align="center" width="280" cellspacing="0" style="table-layout:fixed">
<tr bgcolor="<?php echo $color ?>">
<td width="65" height="20"> </td>
<td width="215"> </td>
</tr>
<tr>
<td colspan="2" height="10"> </td>
</tr>
<tr>
<td colspan="2" align="center" valign="middle" height="30" class="wbText18">SnailWarrior信息管理系统</td>
</tr>
<tr>
<td colspan="2" align="center" valign="bottom" height="20" style="color:#FFFF00;font:14px;font-weight:bold;"><?php if ($thisStyle) echo "管理员登陆"; else echo "用户登陆"; ?></td>
</tr>
<tr>
<td align="right" class="wbText12">用户名:</td>
<td><input name="login_name" maxlength="16" <?php if ($thisStyle) echo "value=\"admin\""; else echo "value=\"hoho\""; ?> class="loginInput"></td>
</tr>
<tr>
<td align="right" class="wbText12">密 码:</td>
<td><input type="password" name="login_pass" maxlength="16" value="123456abcdef" class="loginInput">
</td>
</tr>
<tr>
<td> </td>
<td><table cellspacing="0">
<tr style="color:#FFFF00;font:11px;font-weight:bold;vertical-align:bottom">
<?php if (!$thisStyle) { ?>
<td><input type="checkbox" name="remember_name"></td>
<td>记住用户名</td>
<?php } ?>
<td><input type="checkbox" name="remember_pass"></td>
<td>记住密码</td>
</tr>
</table></td>
</tr>
<tr>
<td> </td>
<td><table>
<tr>
<td width="70"><input name="login" type="submit" style="height:22px; font:11px; width:60px;" value="登录">
</td>
<td><input name="<?php echo $chgLogin ?>" type="submit" style="height:22px; font:11px; width:80px;" value="<?php echo $chgLoginVal ?>" >
</td>
</tr>
<tr><input name="loginType" type="hidden" value="<?php echo $loginType ?>"></tr>
</table>
</tr>
<tr>
<td height="6"> </td>
</tr>
<tr bgcolor="<?php echo $color ?>">
<td colspan="2" height="20" align="center" style="color:<?php echo $font_color ?>; font:12px;font-weight:bold;"><?php if($error_message) echo $error_message; ?></td>
</tr>
</table></td>
<td width="40%" bgcolor="#4f33d7"> </td>
</tr>
<tr>
<td bgcolor="#5f33d7"> </td>
<td height="290" bgcolor="#4F33D7"> </td>
<td bgcolor="#5f33d7"> </td>
</tr>
</table>
</form>
</body>
</html>
////////////// config.php
<?php
//error_reporting(0);
header("content-type: text/html; charset=UTF-8");
/* 数据库配置 */
$dbhost = "localhost";
$dbuser = "SnailWarrior";
$dbpass = "SnailPassword";
$dbname = "users";
/* 连接MySQL数据库 */
$link = mysqli_connect(
$dbhost, /* The host to connect to */
$dbuser, /* The user to connect as */
$dbpass, /* The md5_pass to use */
$dbname); /* The default database to query */
/* 检查连接 */
if (mysqli_connect_errno()) {
printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error());
exit();
}
/* 设置utf8字符集 */
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s", mysqli_error($link));
}
/* 获取客户端IP */
function get_client_ip() {
$client_ip = "unknown";
if($_SERVER['HTTP_CLIENT_IP']){
$client_ip=$_SERVER['HTTP_CLIENT_IP'];
}elseif($_SERVER['HTTP_X_FORWARDED_FOR']){
$client_ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$client_ip=$_SERVER['REMOTE_ADDR'];
}
return $client_ip;
}
?>
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-05-03 08:48:21
【小蜗牛嗷嗷之作
】
这里面主要是一个 recvmail() 函数,从POP3服务器检测并收取新的邮件,最后用 update_mail_table() 函数将新邮件信息(发信者, 主题, 发送时间, 邮件文件名, 邮件大小, 附件标志)插入到数据库。
我在 update_mail_table() 函数里写的解释一封电子邮件内容的方法不规范,可能无法正确解释一些不严格遵守MIME规范的邮件。还有一些其它的实用函数,参考了互联网上的别人的一些方法,Thanks the Original Author. ;)
<?php
/* 系统默认参数,注意:这里是全局变量 */
$connection=0; // 保存与主机的连接
$timeout = 5; // 连接主机的最大超时时间
$err_str=''; // 如果出错,这里保存错误信息
$err_no; // 如果出错,这里保存错误号码
$resp; // 临时保存服务器的响应信息
$new_mail_count = 0; //新邮件数目
/*
* 函数功能:接收POP3服务器上的(新)邮件
* 输入参数:$host,$user,$pass
* 返 回:如果顺利执行,返回true,否则返回false,
* 错误信息保存在$err_str
*
*/
function recvmail($host, $user, $pass) {
/* 使用全局的数据库连接 */
global $link;
/* 使用全局的pop3连接参数 */
global $connection;
global $timeout;
global $err_str;
global $err_no;
global $resp;
/* 这次所取回的新邮件数目 */
global $new_mail_count;
global $new_mail_dir;
$mail_uidl_stored = array(); // 数据库里的邮件UIDL列表
$mail_uidl_fresh = array(); // 邮件服务器上的UIDL列表
/*===================== 从数据库读取UIDL列表 ========================*/
$query = "select * from mail_uid_list";
if ($result = mysqli_query($link, $query)) {
$i = 0;
while ($row = mysqli_fetch_row($result)) {
$mail_uidl_stored[$i++] = $row[0];
}
mysqli_free_result($result);
} else {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
/*========================= 连接POP3服务器 =========================*/
if (!$connection=fsockopen($host, 110 , &$err_no, &$err_str, $timeout)) {
$err_str="连接到POP服务器失败,错误信息:".$err_str."错误号:".$err_no;
return false;
} else {
getresp();
if (substr($resp,0,3)!="+OK") {
$err_str="服务器返回无效的信息:".$resp."请检查POP服务器是否正确!";
return false;
}
}
/*========================= 登陆POP3服务器 =========================*/
if (!login($user, $pass)) {
$err_str = "帐号或者密码错误!";
return false;
}
/*====================== 获取邮件列表,用UIDL命令 ====================*/
command("UIDL", 3, "+OK");
getresp();
$i = 0;
while ($resp != ".") {
$mail_uidl_key[$i] = strtok($resp," ");
$mail_uidl_fresh[$i] = strtok(" "); // 这是邮件的UID
getresp();
$i++;
}
/*====== 对邮件列表进行分析处理,对比数据库中的信息,收取新邮件 =======*/
$new_mail_uidl = array_diff($mail_uidl_fresh, $mail_uidl_stored);
if (empty($new_mail_uidl)) {
$new_mail_count = 0;
/* 注意:如果没有新邮件,这里就返回了 */
return true;
} else {
$new_mail_count = count($new_mail_uidl);
}
/* 这里巧妙的运用了array_keys函数 */
$new_mail_num = array_keys($new_mail_uidl);
$i = 0;
while (($num = $new_mail_num[$i]) || ($new_mail_num[$i] === 0)) { // 循环收取新邮件
$num += 1;
if (!command("RETR $num", 3, "+OK")) {
return false;
}
$mail_file_str = "";
$mail_str = fgets($connection, 100);
while ($mail_str != ".\r\n") { // .\r\n 是邮件结束的标志
$mail_file_str .= $mail_str;
$mail_str = fgets($connection, 100);
}
/* 输出邮件文件 */
$mail_file_name_array[$i] = date("YmdHis")."_hoho_".get_radom_str(10);
file_put_contents($new_mail_dir.$mail_file_name_array[$i], $mail_file_str);
$i ++;
}
/*====================== 关闭与服务器连接 =========================*/
if (!command("QUIT",3,"+OK")) {
return false;
}
fclose($connection);
/*====================== 更新数据库UID列表 ========================*/
$i = 0;
while (($num = $new_mail_num[$i]) || ($new_mail_num[$i] === 0)) { // 即使有一封新邮件,也要更新数据库
//如果是大批量数据,最好采用数组合并,但目前没有掌握将数据存放msyql的方法
//$mail_uidl_stored = array_unique(array_merge($mail_uidl_stored, $mail_uidl_fresh));
//只好笨笨的这样做了
$query = "insert into mail_uid_list values('".$new_mail_uidl[$new_mail_num[$i]]."', '".$mail_file_name_array[$i]."')";
$result = mysqli_query($link, $query);
if (!$result) {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
$i ++;
}
/*================ 更新mail列表 =======================*/
$i = 0;
while ($mail_file_name_array[$i]) {
update_mail_table($mail_file_name_array[$i]);
$i ++;
}
/*=============== 注意:这里不能关闭与数据库的连接 ==================*/
//mysqli_close($link);
return true;
}
function getresp() {
/* 采用全局变量,再三思考,还是认为这样效率高 */
global $connection;
global $resp;
for($resp = "";;) {
if(feof($connection))
return false;
$resp .= fgets($connection,100);
$length = strlen($resp);
if($length >= 2 && substr($resp, $length - 2, 2) == "\r\n") {
$resp = strtok($resp,"\r\n");
return true;
}
}
}
function command($command, $return_lenth=1, $return_code='+') {
/* 采用全局变量,再三思考,还是认为这样效率高 */
global $connection;
global $resp;
global $err_str;
if (!fputs($connection, "$command\r\n")) {
$err_str = "无法发送命令".$command;
return false;
} else {
getresp();
if (substr($resp, 0, $return_lenth) != $return_code) {
$err_str = $command." 命令服务器返回无效:".$resp;
return false;
} else {
return true;
}
}
}
function login($user, $password) {
if (!command("USER $user",3,"+OK")) return false;
if (!command("PASS $password",3,"+OK")) return false;
return true;
}
function get_radom_str($len){
$str = 'abcdefghijklmnopqrstuvwxyz0123456789';
//从以上字串中产生随机串,你如果想要其它字符,可以自行加入,如大写字母
return substr(str_shuffle($str),0,$len);
}
function update_mail_table($mail_file_name) {
global $new_mail_dir;
$mail_file_content = file_get_contents($new_mail_dir.$mail_file_name);
$mail_file_size = filesize($new_mail_dir.$mail_file_name);
/* 记录附件个数和对应名字、大小 */
if ($mail_file_size > 1048576) {
$mail_file_size = round($mail_file_size/1048576, "2")." MB ";
} else if ($mail_file_size > 1024) {
$mail_file_size = round($mail_file_size/1024, "2")." KB ";
} else {
$mail_file_size = $mail_file_size." Bytes ";
}
/*
* 注意!这里好像没有先后,所以不能拿一个作为另一个的参考位置出发点
*/
/*======== 发件人 ========*/
$from_start = strpos($mail_file_content, "\r\nFrom:");
$from_end = strpos($mail_file_content, "\r", $from_start + 7);
$from_str = substr($mail_file_content, $from_start, $from_end - $from_start);
if ($sender_start = strpos($from_str, "?B?")) {
$sender_start += 3;
$sender_end = strpos($from_str, "?=", $sender_start);
$sender_str = substr($from_str, $sender_start, $sender_end - $sender_start);
$sender = base64_decode($sender_str);
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($from_str, "=?") + 2;
$charset_end = strpos($from_str, "?", $charset_start);
$charset = substr($from_str, $charset_start, $charset_end - $charset_start);
} else if ($sender_start = stripos($from_str, "?Q?")) {
$sender_start += 3;
$sender_end = strpos($from_str, "?=", $sender_start);
$sender_str = substr($from_str, $sender_start, $sender_end - $sender_start);
/* 有些变态的名字,还分开几段来写,真郁闷! */
while ($sender_start = stripos($from_str, "?Q?", $sender_end)) {
$sender_start += 3;
$sender_end = strpos($from_str, "?=", $subject_start);
$sender_str .= substr($from_str, $sender_start, $sender_end - $sender_start);
}
$sender = quoted_printable_decode($sender_str);
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($from_str, "=?") + 2;
$charset_end = strpos($from_str, "?", $charset_start);
$charset = substr($from_str, $charset_start, $charset_end - $charset_start);
} else if ($sender_start = strpos($from_str, "\"")) {
/* “预防”有的邮件没有 "发件人",虽然自己还没见到例外 2008-10-21 */
$sender_start += 1;
$sender_end = strpos($from_str, "\"", $sender_start);
/* 这里是ascii组成 */
$sender = substr($from_str, $sender_start, $sender_end - $sender_start);
} else {
$sender_start = 8;
/* 先看看是否有空格,有空格就以空格为边界 */
if (!$sender_end = strpos($from_str, " ", $sender_start)) {
$sender_end = $from_end;
}
$sender = substr($from_str, $sender_start, $sender_end - $sender_start);
if (substr($sender, 0, 1) == "<") {
$sender = "";
}
}
/* 发件人email地址 */
if ($sender_email_start = strpos($from_str, "<")) {
$sender_email_end = strpos($from_str, ">");
$sender_email = substr($from_str, $sender_email_start + 1, $sender_email_end - $sender_email_start - 1);
if (strlen($sender) > 30 || strlen($sender) == 0){
$sender = $sender_email;
}
}
/*======== 收件人 ========*/
/*
* 暂略
*/
/*========= 主题 =========*/
$subject_start = strpos($mail_file_content, "\r\nSubject:");
$subject_end = strpos($mail_file_content, "\r", $subject_start+10);
$subject_line = substr($mail_file_content, $subject_start, $subject_end - $subject_start);
if ($subject_start = strpos($subject_line, "?B?")) {
$subject_start += 3;
$subject_end = strpos($subject_line, "?=", $subject_start);
$subject_str = substr($subject_line, $subject_start, $subject_end - $subject_start);
$subject = base64_decode($subject_str);
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($subject_line, "=?") + 2;
$charset_end = strpos($subject_line, "?", $charset_start);
$charset = substr($subject_line, $charset_start, $charset_end - $charset_start);
} else if ($subject_start = stripos($subject_line, "?Q?")) {
$subject_start += 3;
$subject_end = strpos($subject_line, "?=", $subject_start);
$subject_str = substr($subject_line, $subject_start, $subject_end - $subject_start);
/* 有些变态的名字,还分开几段来写,真郁闷! */
while ($subject_start = stripos($subject_line, "?Q?", $subject_end)) {
$subject_start += 3;
$subject_end = strpos($subject_line, "?=", $subject_start);
$subject_str .= substr($subject_line, $subject_start, $subject_end - $subject_start);
}
$subject = htmlspecialchars(quoted_printable_decode($subject_str));
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($subject_line, "=?") + 2;
$charset_end = strpos($subject_line, "?", $charset_start);
$charset = substr($subject_line, $charset_start, $charset_end - $charset_start);
} else {
$subject = substr($subject_line, 11, $subject_end - $subject_start - 11);
}
/*======== 发送日期 =======*/
if ($date_start = strpos($mail_file_content, "\r\nDate:")) {
$date_start += 8;
$date_end = strpos($mail_file_content, "\r", $date_start);
$date_str = substr($mail_file_content, $date_start, $date_end - $date_start);
$date = date('Y年m月d日 H:i:s', strtotime($date_str));
} else {
$date = date('Y年m月d日 H:i:s');
}
/* 检查是否有附件 */
if (strpos($mail_file_content, "\r\nContent-Disposition: attachment")) {
$has_attachment = 1;
} else {
$has_attachment = 0;
}
global $link;
if ($charset == "UTF-8" || $charset == "utf-8") {
$sender = iconv("UTF-8", "GB2312", $sender);
$subject = iconv("UTF-8", "GB2312", $subject);
}
/* 插入数据库 */
$query = "insert into mail(Sender, Subject, Sendtime, Filename, Filesize, Attachment) \n
values('$sender', '$subject', '$date', '$mail_file_name', '$mail_file_size', '$has_attachment')";
$result = mysqli_query($link, $query);
if (!$result) {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
}
?>
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
这里面主要是一个 recvmail() 函数,从POP3服务器检测并收取新的邮件,最后用 update_mail_table() 函数将新邮件信息(发信者, 主题, 发送时间, 邮件文件名, 邮件大小, 附件标志)插入到数据库。
我在 update_mail_table() 函数里写的解释一封电子邮件内容的方法不规范,可能无法正确解释一些不严格遵守MIME规范的邮件。还有一些其它的实用函数,参考了互联网上的别人的一些方法,Thanks the Original Author. ;)
<?php
/* 系统默认参数,注意:这里是全局变量 */
$connection=0; // 保存与主机的连接
$timeout = 5; // 连接主机的最大超时时间
$err_str=''; // 如果出错,这里保存错误信息
$err_no; // 如果出错,这里保存错误号码
$resp; // 临时保存服务器的响应信息
$new_mail_count = 0; //新邮件数目
/*
* 函数功能:接收POP3服务器上的(新)邮件
* 输入参数:$host,$user,$pass
* 返 回:如果顺利执行,返回true,否则返回false,
* 错误信息保存在$err_str
*
*/
function recvmail($host, $user, $pass) {
/* 使用全局的数据库连接 */
global $link;
/* 使用全局的pop3连接参数 */
global $connection;
global $timeout;
global $err_str;
global $err_no;
global $resp;
/* 这次所取回的新邮件数目 */
global $new_mail_count;
global $new_mail_dir;
$mail_uidl_stored = array(); // 数据库里的邮件UIDL列表
$mail_uidl_fresh = array(); // 邮件服务器上的UIDL列表
/*===================== 从数据库读取UIDL列表 ========================*/
$query = "select * from mail_uid_list";
if ($result = mysqli_query($link, $query)) {
$i = 0;
while ($row = mysqli_fetch_row($result)) {
$mail_uidl_stored[$i++] = $row[0];
}
mysqli_free_result($result);
} else {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
/*========================= 连接POP3服务器 =========================*/
if (!$connection=fsockopen($host, 110 , &$err_no, &$err_str, $timeout)) {
$err_str="连接到POP服务器失败,错误信息:".$err_str."错误号:".$err_no;
return false;
} else {
getresp();
if (substr($resp,0,3)!="+OK") {
$err_str="服务器返回无效的信息:".$resp."请检查POP服务器是否正确!";
return false;
}
}
/*========================= 登陆POP3服务器 =========================*/
if (!login($user, $pass)) {
$err_str = "帐号或者密码错误!";
return false;
}
/*====================== 获取邮件列表,用UIDL命令 ====================*/
command("UIDL", 3, "+OK");
getresp();
$i = 0;
while ($resp != ".") {
$mail_uidl_key[$i] = strtok($resp," ");
$mail_uidl_fresh[$i] = strtok(" "); // 这是邮件的UID
getresp();
$i++;
}
/*====== 对邮件列表进行分析处理,对比数据库中的信息,收取新邮件 =======*/
$new_mail_uidl = array_diff($mail_uidl_fresh, $mail_uidl_stored);
if (empty($new_mail_uidl)) {
$new_mail_count = 0;
/* 注意:如果没有新邮件,这里就返回了 */
return true;
} else {
$new_mail_count = count($new_mail_uidl);
}
/* 这里巧妙的运用了array_keys函数 */
$new_mail_num = array_keys($new_mail_uidl);
$i = 0;
while (($num = $new_mail_num[$i]) || ($new_mail_num[$i] === 0)) { // 循环收取新邮件
$num += 1;
if (!command("RETR $num", 3, "+OK")) {
return false;
}
$mail_file_str = "";
$mail_str = fgets($connection, 100);
while ($mail_str != ".\r\n") { // .\r\n 是邮件结束的标志
$mail_file_str .= $mail_str;
$mail_str = fgets($connection, 100);
}
/* 输出邮件文件 */
$mail_file_name_array[$i] = date("YmdHis")."_hoho_".get_radom_str(10);
file_put_contents($new_mail_dir.$mail_file_name_array[$i], $mail_file_str);
$i ++;
}
/*====================== 关闭与服务器连接 =========================*/
if (!command("QUIT",3,"+OK")) {
return false;
}
fclose($connection);
/*====================== 更新数据库UID列表 ========================*/
$i = 0;
while (($num = $new_mail_num[$i]) || ($new_mail_num[$i] === 0)) { // 即使有一封新邮件,也要更新数据库
//如果是大批量数据,最好采用数组合并,但目前没有掌握将数据存放msyql的方法
//$mail_uidl_stored = array_unique(array_merge($mail_uidl_stored, $mail_uidl_fresh));
//只好笨笨的这样做了
$query = "insert into mail_uid_list values('".$new_mail_uidl[$new_mail_num[$i]]."', '".$mail_file_name_array[$i]."')";
$result = mysqli_query($link, $query);
if (!$result) {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
$i ++;
}
/*================ 更新mail列表 =======================*/
$i = 0;
while ($mail_file_name_array[$i]) {
update_mail_table($mail_file_name_array[$i]);
$i ++;
}
/*=============== 注意:这里不能关闭与数据库的连接 ==================*/
//mysqli_close($link);
return true;
}
function getresp() {
/* 采用全局变量,再三思考,还是认为这样效率高 */
global $connection;
global $resp;
for($resp = "";;) {
if(feof($connection))
return false;
$resp .= fgets($connection,100);
$length = strlen($resp);
if($length >= 2 && substr($resp, $length - 2, 2) == "\r\n") {
$resp = strtok($resp,"\r\n");
return true;
}
}
}
function command($command, $return_lenth=1, $return_code='+') {
/* 采用全局变量,再三思考,还是认为这样效率高 */
global $connection;
global $resp;
global $err_str;
if (!fputs($connection, "$command\r\n")) {
$err_str = "无法发送命令".$command;
return false;
} else {
getresp();
if (substr($resp, 0, $return_lenth) != $return_code) {
$err_str = $command." 命令服务器返回无效:".$resp;
return false;
} else {
return true;
}
}
}
function login($user, $password) {
if (!command("USER $user",3,"+OK")) return false;
if (!command("PASS $password",3,"+OK")) return false;
return true;
}
function get_radom_str($len){
$str = 'abcdefghijklmnopqrstuvwxyz0123456789';
//从以上字串中产生随机串,你如果想要其它字符,可以自行加入,如大写字母
return substr(str_shuffle($str),0,$len);
}
function update_mail_table($mail_file_name) {
global $new_mail_dir;
$mail_file_content = file_get_contents($new_mail_dir.$mail_file_name);
$mail_file_size = filesize($new_mail_dir.$mail_file_name);
/* 记录附件个数和对应名字、大小 */
if ($mail_file_size > 1048576) {
$mail_file_size = round($mail_file_size/1048576, "2")." MB ";
} else if ($mail_file_size > 1024) {
$mail_file_size = round($mail_file_size/1024, "2")." KB ";
} else {
$mail_file_size = $mail_file_size." Bytes ";
}
/*
* 注意!这里好像没有先后,所以不能拿一个作为另一个的参考位置出发点
*/
/*======== 发件人 ========*/
$from_start = strpos($mail_file_content, "\r\nFrom:");
$from_end = strpos($mail_file_content, "\r", $from_start + 7);
$from_str = substr($mail_file_content, $from_start, $from_end - $from_start);
if ($sender_start = strpos($from_str, "?B?")) {
$sender_start += 3;
$sender_end = strpos($from_str, "?=", $sender_start);
$sender_str = substr($from_str, $sender_start, $sender_end - $sender_start);
$sender = base64_decode($sender_str);
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($from_str, "=?") + 2;
$charset_end = strpos($from_str, "?", $charset_start);
$charset = substr($from_str, $charset_start, $charset_end - $charset_start);
} else if ($sender_start = stripos($from_str, "?Q?")) {
$sender_start += 3;
$sender_end = strpos($from_str, "?=", $sender_start);
$sender_str = substr($from_str, $sender_start, $sender_end - $sender_start);
/* 有些变态的名字,还分开几段来写,真郁闷! */
while ($sender_start = stripos($from_str, "?Q?", $sender_end)) {
$sender_start += 3;
$sender_end = strpos($from_str, "?=", $subject_start);
$sender_str .= substr($from_str, $sender_start, $sender_end - $sender_start);
}
$sender = quoted_printable_decode($sender_str);
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($from_str, "=?") + 2;
$charset_end = strpos($from_str, "?", $charset_start);
$charset = substr($from_str, $charset_start, $charset_end - $charset_start);
} else if ($sender_start = strpos($from_str, "\"")) {
/* “预防”有的邮件没有 "发件人",虽然自己还没见到例外 2008-10-21 */
$sender_start += 1;
$sender_end = strpos($from_str, "\"", $sender_start);
/* 这里是ascii组成 */
$sender = substr($from_str, $sender_start, $sender_end - $sender_start);
} else {
$sender_start = 8;
/* 先看看是否有空格,有空格就以空格为边界 */
if (!$sender_end = strpos($from_str, " ", $sender_start)) {
$sender_end = $from_end;
}
$sender = substr($from_str, $sender_start, $sender_end - $sender_start);
if (substr($sender, 0, 1) == "<") {
$sender = "";
}
}
/* 发件人email地址 */
if ($sender_email_start = strpos($from_str, "<")) {
$sender_email_end = strpos($from_str, ">");
$sender_email = substr($from_str, $sender_email_start + 1, $sender_email_end - $sender_email_start - 1);
if (strlen($sender) > 30 || strlen($sender) == 0){
$sender = $sender_email;
}
}
/*======== 收件人 ========*/
/*
* 暂略
*/
/*========= 主题 =========*/
$subject_start = strpos($mail_file_content, "\r\nSubject:");
$subject_end = strpos($mail_file_content, "\r", $subject_start+10);
$subject_line = substr($mail_file_content, $subject_start, $subject_end - $subject_start);
if ($subject_start = strpos($subject_line, "?B?")) {
$subject_start += 3;
$subject_end = strpos($subject_line, "?=", $subject_start);
$subject_str = substr($subject_line, $subject_start, $subject_end - $subject_start);
$subject = base64_decode($subject_str);
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($subject_line, "=?") + 2;
$charset_end = strpos($subject_line, "?", $charset_start);
$charset = substr($subject_line, $charset_start, $charset_end - $charset_start);
} else if ($subject_start = stripos($subject_line, "?Q?")) {
$subject_start += 3;
$subject_end = strpos($subject_line, "?=", $subject_start);
$subject_str = substr($subject_line, $subject_start, $subject_end - $subject_start);
/* 有些变态的名字,还分开几段来写,真郁闷! */
while ($subject_start = stripos($subject_line, "?Q?", $subject_end)) {
$subject_start += 3;
$subject_end = strpos($subject_line, "?=", $subject_start);
$subject_str .= substr($subject_line, $subject_start, $subject_end - $subject_start);
}
$subject = htmlspecialchars(quoted_printable_decode($subject_str));
/* 检测字符集类型,在recvmail_func.php中没有这一项 */
$charset_start = strpos($subject_line, "=?") + 2;
$charset_end = strpos($subject_line, "?", $charset_start);
$charset = substr($subject_line, $charset_start, $charset_end - $charset_start);
} else {
$subject = substr($subject_line, 11, $subject_end - $subject_start - 11);
}
/*======== 发送日期 =======*/
if ($date_start = strpos($mail_file_content, "\r\nDate:")) {
$date_start += 8;
$date_end = strpos($mail_file_content, "\r", $date_start);
$date_str = substr($mail_file_content, $date_start, $date_end - $date_start);
$date = date('Y年m月d日 H:i:s', strtotime($date_str));
} else {
$date = date('Y年m月d日 H:i:s');
}
/* 检查是否有附件 */
if (strpos($mail_file_content, "\r\nContent-Disposition: attachment")) {
$has_attachment = 1;
} else {
$has_attachment = 0;
}
global $link;
if ($charset == "UTF-8" || $charset == "utf-8") {
$sender = iconv("UTF-8", "GB2312", $sender);
$subject = iconv("UTF-8", "GB2312", $subject);
}
/* 插入数据库 */
$query = "insert into mail(Sender, Subject, Sendtime, Filename, Filesize, Attachment) \n
values('$sender', '$subject', '$date', '$mail_file_name', '$mail_file_size', '$has_attachment')";
$result = mysqli_query($link, $query);
if (!$result) {
printf("Can't query to MySQL Server. Errorcode: %s ", mysqli_error($link));
exit();
}
}
?>
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-05-02 22:43:45
【小蜗牛五二无聊之作
】
网络上能找到的相关资料太多了,也太繁杂,但有些人还整理得不错,下面根据自己的偏好再梳理一下,有些是自己对照着man手册翻译的,下面的例子都是自己编造自己测试OK,都是比较实用的东西,方便自己日后参考。
1、算术运算比较运算符(bash自身不能比较浮点数)
-eq 等于 [ $num1 -eq $num2 ]
-ne 不等于 [ 100 -ne $num1 ]
-lt 小于 [ 100 -lt `expr $num1 + $num2` ]
-le 小于或等于 [ 100 -le `expr $num1 \* $num2` ]
-gt 大于 [ 100 -gt `expr $num1 / $num2` ]
-ge 大于或等于 [ 100 -ge `expr $num1 % $num2` ]
2、字符串比较运算符
-z string 如果 string 长度为零,则为真 [ -z "`ps aux | grep mysql`" ]
-n string 如果 string 长度非零,则为真 [ -n "$string" ]
【注意】 $string 一定要放在双引号里面 "$string",否则使用 -n -z 的结果都为真!
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$str1" != "Snail" ]
string1 == string2 如果 string1 与 string2 相同,则为真 [ "$str1" == "$str2" ]
(上面用一个 = 也可以,在严格的 POSIX 兼容下使用)
string1 < string2 如果 string1 按字典顺序比较小于 string2,则为真
string1 > string2 如果 string1 按字典顺序比较大于 string2,则为真
3、文件比较运算符
-a filename 如果 filename 存在,则为真 [ -e $HOME/.bashrc ]
-e filename (同上)
-b filename 如果 filename 存在,并且是块文件,则为真 [ -e /dev/loop0 ]
-c filename 如果 filename 存在,并且是字符文件,则为真 [ -e /dev/ttyS0 ]
-d filename 如果 filename 存在,并且为目录,则为真 [ -d /home/snail ]
-f filename 如果 filename 存在,并且为常规文件,则为真 [ -f /dev/ttyS0 ]
-g filename 如果 filename 存在,并且为set-group-id,为真 [ -f $HOME/ak47 ]
-h filename 如果 filename 存在,并且为符号连接,则为真 [ -h /bin/vi ]
-L filename (同上)
-k filename 如果 filename 存在,并且设置了sticky位,为真 [ -k /bin/ping ]
-p filename 如果 filename 存在,并且为有名管道(FIFO),真 [ -p /tmp/pipe ]
-r filename 如果 filename 存在,并且可读,则为真 [ -r /etc/passwd ]
-s filename 如果 filename 存在,并且大小不为零,为真 [ -s ./none-zero ]
-u filename 如果 filename 存在,并且为set-user-id,为真 [ -f $HOME/ak47 ]
-w filename 如果 filename 存在,并且可写,则为真 [ -w /var/log/mail ]
-x filename 如果 filename 存在,并且可执行,则为真 [ -x ./start.sh ]
下面这些不常用的:
-t fd 如果文件描述符被打开并指向一个终端,则为真 [ -t /proc/1/fd/10 ]
【提示】在 /proc/进程号/fd 下可以找到文件描述符:)
-O filename 如果 filename 存在,并且被有效用户ID所拥有,则为真
-G filename 如果 filename 存在,并且被有效组ID所拥有,则为真
-S filename 如果 filename 存在,并且为一个socket,则为真 [ -S /tmp/mysql.sock ]
-N filename 如果 filename 存在,并且在上次读取后被修改过,则为真
-o optname 如果 shell 选项 optname 被开启,则为真
【提示】使用 set -o 来查看
file1 -nt file2 如果 file1 比 file2 新,或者 file1 存在 file2 不存在,则为真
file1 -ot file2 如果 file1 比 file2 旧,或者 file2 存在 file1 不存在,则为真
file1 -ef file2 如果 file1 和 file2 都指向同样的设备(device)和索引节点号(inode numbers),则为真
【提示】查看文件的索引节点可以用 ls -i 选项
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
网络上能找到的相关资料太多了,也太繁杂,但有些人还整理得不错,下面根据自己的偏好再梳理一下,有些是自己对照着man手册翻译的,下面的例子都是自己编造自己测试OK,都是比较实用的东西,方便自己日后参考。
1、算术运算比较运算符(bash自身不能比较浮点数)
-eq 等于 [ $num1 -eq $num2 ]
-ne 不等于 [ 100 -ne $num1 ]
-lt 小于 [ 100 -lt `expr $num1 + $num2` ]
-le 小于或等于 [ 100 -le `expr $num1 \* $num2` ]
-gt 大于 [ 100 -gt `expr $num1 / $num2` ]
-ge 大于或等于 [ 100 -ge `expr $num1 % $num2` ]
2、字符串比较运算符
-z string 如果 string 长度为零,则为真 [ -z "`ps aux | grep mysql`" ]
-n string 如果 string 长度非零,则为真 [ -n "$string" ]
【注意】 $string 一定要放在双引号里面 "$string",否则使用 -n -z 的结果都为真!
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$str1" != "Snail" ]
string1 == string2 如果 string1 与 string2 相同,则为真 [ "$str1" == "$str2" ]
(上面用一个 = 也可以,在严格的 POSIX 兼容下使用)
string1 < string2 如果 string1 按字典顺序比较小于 string2,则为真
string1 > string2 如果 string1 按字典顺序比较大于 string2,则为真
3、文件比较运算符
-a filename 如果 filename 存在,则为真 [ -e $HOME/.bashrc ]
-e filename (同上)
-b filename 如果 filename 存在,并且是块文件,则为真 [ -e /dev/loop0 ]
-c filename 如果 filename 存在,并且是字符文件,则为真 [ -e /dev/ttyS0 ]
-d filename 如果 filename 存在,并且为目录,则为真 [ -d /home/snail ]
-f filename 如果 filename 存在,并且为常规文件,则为真 [ -f /dev/ttyS0 ]
-g filename 如果 filename 存在,并且为set-group-id,为真 [ -f $HOME/ak47 ]
-h filename 如果 filename 存在,并且为符号连接,则为真 [ -h /bin/vi ]
-L filename (同上)
-k filename 如果 filename 存在,并且设置了sticky位,为真 [ -k /bin/ping ]
-p filename 如果 filename 存在,并且为有名管道(FIFO),真 [ -p /tmp/pipe ]
-r filename 如果 filename 存在,并且可读,则为真 [ -r /etc/passwd ]
-s filename 如果 filename 存在,并且大小不为零,为真 [ -s ./none-zero ]
-u filename 如果 filename 存在,并且为set-user-id,为真 [ -f $HOME/ak47 ]
-w filename 如果 filename 存在,并且可写,则为真 [ -w /var/log/mail ]
-x filename 如果 filename 存在,并且可执行,则为真 [ -x ./start.sh ]
下面这些不常用的:
-t fd 如果文件描述符被打开并指向一个终端,则为真 [ -t /proc/1/fd/10 ]
【提示】在 /proc/进程号/fd 下可以找到文件描述符:)
-O filename 如果 filename 存在,并且被有效用户ID所拥有,则为真
-G filename 如果 filename 存在,并且被有效组ID所拥有,则为真
-S filename 如果 filename 存在,并且为一个socket,则为真 [ -S /tmp/mysql.sock ]
-N filename 如果 filename 存在,并且在上次读取后被修改过,则为真
-o optname 如果 shell 选项 optname 被开启,则为真
【提示】使用 set -o 来查看
file1 -nt file2 如果 file1 比 file2 新,或者 file1 存在 file2 不存在,则为真
file1 -ot file2 如果 file1 比 file2 旧,或者 file2 存在 file1 不存在,则为真
file1 -ef file2 如果 file1 和 file2 都指向同样的设备(device)和索引节点号(inode numbers),则为真
【提示】查看文件的索引节点可以用 ls -i 选项
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-05-02 11:32:48
【小蜗牛五二无聊之作
】
BASH只支持一维数组,但参数个数没有限制。
声明一个数组:
declare -a array
(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组)
数组赋值:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
arrya[1]=var2
...
array[n]=varN
计算数组元素个数:
${#array[@]} 或者 ${#array[*]}
BASH的特殊参数 @ 和 * 都表示“扩展位置参数,从1开始”,但形式稍有差异,但在数组里使用好像是可以通用的。
引用数组:
echo ${array[n]}
遍历数组:
filename=(`ls`)
for var in ${filename[@]};do
echo $var
done
数组实用示例:(个人收集整理)
1、从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里
i=0
n=5
while [ "$i" -lt $n ] ; do
echo "Please input strings ... `expr $i + 1`"
read array[$i]
b=${array[$i]}
echo "$b"
i=`expr $i + 1`
done
2、将字符串里的字母逐个放入数组,并输出到“标准输出”
chars='abcdefghijklmnopqrstuvwxyz'
for (( i=0; i<26; i++ )) ; do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
这里有趣的地方是 ${chars:$i:1},表示从chars字符串的 $i 位置开始,获取 1 个字符。如果将 1 改为 3 ,就获取 3 个字符啦~ 结果是:
abc
bcd
...
vxy
xyz
yz //没有足够字符串获取了
z //没有足够字符串获取了
3、将数组应用到shell环境变量
3、将数组应用到shell环境变量(1)
数组赋值:
[root@pps ~]# SEASON=("Srping" "Summer" "Autumn" "Winter")
当你发现赋值错了,也可以立刻从新赋值纠正,如上面的 Spring 被写成 Srping。
重新赋值:(原来的值被重写)
[root@pps ~]# SEASON=("Spring" "Summer" "Autumn" "Winter")
查看一下环境变量:
[root@pps ~]# set | grep SEASON
SEASON=([0]="Spring" [1]="Summer" [2]="Autumn" [3]="Winter")
显示整个数组:
[root@pps ~]# echo ${SEASON[*]} 或者 echo ${SEASON[@]}
Spring Summer Autumn Winter
显示某一数组元素:
[root@pps ~]# echo ${SEASON[3]}
Winter
给单个数组元素赋值:
[root@pps ~]# SEASON[0]="New_Spring"
再查看一下看数组:
[root@pps ~]# echo ${SEASON[*]}
New_Spring Summer Autumn Winter
清除指定的单个数组元素:
[root@pps ~]# unset SEASON[2]
清除整个数组:
[root@pps ~]# unset SEASON
4、将数组应用到shell环境变量(2) 【这个用法不错!给原作者赞一个!】
使用tr命令将文件中的回车转换成空格:
[root@pps ~]# cat /etc/shells | tr "\n" " " > /tmp/tmp.file
将文件中内容给数组赋值:(碰到第一个回车符之前的内容)
[root@pps ~]# read -a SHELLS < /tmp/tmp.file
查看数组赋值情况:
[root@pps ~]# set | grep "SHELLS"
SHELLS=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/ksh")
后面可以将这个数组环境变量应用到其它的SHELL脚本或者应用程序里了~
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
BASH只支持一维数组,但参数个数没有限制。
声明一个数组:
declare -a array
(其实不用声明,按数组方式直接赋值给变量即可,BASH就知道那是数组)
数组赋值:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
arrya[1]=var2
...
array[n]=varN
计算数组元素个数:
${#array[@]} 或者 ${#array[*]}
BASH的特殊参数 @ 和 * 都表示“扩展位置参数,从1开始”,但形式稍有差异,但在数组里使用好像是可以通用的。
引用数组:
echo ${array[n]}
遍历数组:
filename=(`ls`)
for var in ${filename[@]};do
echo $var
done
数组实用示例:(个人收集整理)
1、从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里
i=0
n=5
while [ "$i" -lt $n ] ; do
echo "Please input strings ... `expr $i + 1`"
read array[$i]
b=${array[$i]}
echo "$b"
i=`expr $i + 1`
done
2、将字符串里的字母逐个放入数组,并输出到“标准输出”
chars='abcdefghijklmnopqrstuvwxyz'
for (( i=0; i<26; i++ )) ; do
array[$i]=${chars:$i:1}
echo ${array[$i]}
done
这里有趣的地方是 ${chars:$i:1},表示从chars字符串的 $i 位置开始,获取 1 个字符。如果将 1 改为 3 ,就获取 3 个字符啦~ 结果是:
abc
bcd
...
vxy
xyz
yz //没有足够字符串获取了
z //没有足够字符串获取了
3、将数组应用到shell环境变量
3、将数组应用到shell环境变量(1)
数组赋值:
[root@pps ~]# SEASON=("Srping" "Summer" "Autumn" "Winter")
当你发现赋值错了,也可以立刻从新赋值纠正,如上面的 Spring 被写成 Srping。
重新赋值:(原来的值被重写)
[root@pps ~]# SEASON=("Spring" "Summer" "Autumn" "Winter")
查看一下环境变量:
[root@pps ~]# set | grep SEASON
SEASON=([0]="Spring" [1]="Summer" [2]="Autumn" [3]="Winter")
显示整个数组:
[root@pps ~]# echo ${SEASON[*]} 或者 echo ${SEASON[@]}
Spring Summer Autumn Winter
显示某一数组元素:
[root@pps ~]# echo ${SEASON[3]}
Winter
给单个数组元素赋值:
[root@pps ~]# SEASON[0]="New_Spring"
再查看一下看数组:
[root@pps ~]# echo ${SEASON[*]}
New_Spring Summer Autumn Winter
清除指定的单个数组元素:
[root@pps ~]# unset SEASON[2]
清除整个数组:
[root@pps ~]# unset SEASON
4、将数组应用到shell环境变量(2) 【这个用法不错!给原作者赞一个!】
使用tr命令将文件中的回车转换成空格:
[root@pps ~]# cat /etc/shells | tr "\n" " " > /tmp/tmp.file
将文件中内容给数组赋值:(碰到第一个回车符之前的内容)
[root@pps ~]# read -a SHELLS < /tmp/tmp.file
查看数组赋值情况:
[root@pps ~]# set | grep "SHELLS"
SHELLS=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/ksh")
后面可以将这个数组环境变量应用到其它的SHELL脚本或者应用程序里了~
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-05-01 11:07:27
【小蜗牛五一无聊之作
】
如果你每天收到很多垃圾邮件,很憎恨…你不是一个人在愤怒,你不是一个人…
垃圾邮件的本质:牺牲公共利益,满足个人私利,损耗世界资源,污染世界环境。
小蜗牛不是邮件专家,只从事过相关的技术支持,下面,我根据自己的小小经验,“按角色”给大家说一下我所认识的垃圾邮件以及相关斗争……
主角:垃圾邮件发送者
工具:邮件群发软件
邮件地址来源:
1、邮件群发软件穷举邮件地址,盲目投递,只管成功,不管失败。
2、购买某些网站、个人或企业提供的邮件地址数据、行业信息、企业名录等
3、某些软件或者邮件群发软件自身能自动采集互联网上的邮件地址
...
小提示:你可以搜索一下“邮件群发软件”~嘿嘿!
有专门的垃圾邮件发送商,它们可能有更先进的垃圾邮件发送技术和相关网络服务支持,提投递成功率和客户命中率。
受害者:世界网民(狭义)
广义来说,垃圾邮件的危害还包括资源消耗、环境污染等,大家可以搜索相关信息
除了垃圾邮件群发软件主动试探我们的邮箱地址外,我们自己也可能有意无意的在互联网上暴露、泄漏了自己的邮箱地址。比如:
1、注册网站,留下email信息(有可能被邮件地址搜索软件搜索到或被网站出卖)
2、网上开店,个人博客等(比如,每一个sohu博客对应一个sohu邮箱)
邮件服务器反垃圾邮件手段
【注意】下面的技术只是根据自己接触过的邮箱服务器粗略的讲述,有太多新技术我没有接触过。
1、在网络层对外来的连接进行判断。比如判断对方的IP是否为动态IP(一般正规的邮件服务器都是静态IP,而很多垃圾邮件发送者用的都是动态IP),是否被列入国际或者国内反垃圾组织的RBL(动态黑名单),或者是RWL(动态白名单),或者被列入本系统的黑名单、白名单等等。在网络层还可以进行速率控制、并发控制等防止邮件系统过载。
2、SMTP会话层进行判断。比如检验HELO域名是否和IP匹配,是否存在反向解释等。灰名单技术(GrayList 一种基于重试原则的技术)是SMTP会话层和网络层的相互配合实现的。
3、邮件系统全局过滤规则。系统过滤规则可以有很多很多,每一条都用来过滤特定的垃圾邮件,比如过滤邮件主题包含“发票”字样,或内容包含“培训”字样等邮件。基于规则,我们可以对邮件进行多样性的分类处理,比如删除、转发、放到垃圾箱、回复发信人、将发信人列入黑名单等等。
4、反垃圾系统过滤。这个就比较难说了,各种反垃圾系统有各自的特性和优点,不过原理上离不开通过对邮件主题、内容(甚至内容里的图片、HTTP链接等)、附件等邮件各个部分进行检测分析、判断或评分(垃圾邮件评分原则,也即将邮件进行一层一层的过滤、评分,到最后出来一个总分数,如果分数超过一定阀值,就被认为是垃圾邮件或者直接被系统删除)。比较著名的开源反垃圾引擎有 SpamAssassin,官方网站是 [url]http://spamassassin.apache.org[/url] 。在网络层、SMTP会话层、或在过滤规则里,都可以对邮件来源(IP),发件人、收件人等进行垃圾邮件过滤。因此,“反垃圾邮件系统”是一个分层次、相互协调、相互补充的反垃圾体系。
相关反垃圾技术术语:白名单、黑名单、灰名单、实时黑(白)名单、反向MX解释、关键字过滤、指纹技术、意图分析技术、贝叶斯过滤技术...
5、用户级别的黑名单、白名单、过滤规则等。一般的邮件系统都有用户自己的黑白名单,过滤规则设置,还有垃圾邮件举报等功能。
6、客户端的垃圾邮件过滤功能。比如Foxmail就带有垃圾邮件过滤系统,并且还具有垃圾邮件学习功能。
个人邮箱地址保护手段
1、用图片形式的邮件地址。目前有很多可以自动生成免费邮箱图片的网站,比如
[url]http://pic.sdodo.com/tool/mailpic/[/url], [url]http://services.nexodyne.com/[/url]
2、用链接形式的邮件地址,真实的邮件地址为链接所指向的网站所保护,需要输入验证码才能获取真实的用户邮箱地址。目前有很多网站为大家提供免费的邮件地址保护服务,比如 [url]http://scr.im[/url] , [url]http://tinymail.me[/url] 。有些网站提供免费的“中转”服务,比如 [url]http://whspr.me[/url],你在它那里申请邮件地址保护,它提供你一个链接,点击这个链接打开一个页面,别人在这个页面里给你留言,这个网站就将这些信息转发到你真正的邮箱里了。
【实质上,这些网站为大家提供免费的邮箱地址保护服务,大家为该网站做宣传】
3、使用 # % & 等其它符号代替 @ 符号,这样能很大程度上减少被搜索软件识别的几率。,但某些比较“聪明”的搜索软件也能识别这种小技巧,当然你可以更聪明,多加一些其它“漂亮”的干扰,只要能让大家正确识别你的邮件地址就可以了。
目前市场上免费的、收费的、或者是企业的电子邮件系统各有优劣,反垃圾反病毒方面肯定存在差距,我在这里也无法加于评判,大家读完这篇小短文,会有什么动作吗?
反垃圾斗争的手段,除了采用先进的反垃圾技术外,有讨论说通过收费邮件、或者法律手段对垃圾邮件进行控制、惩罚,但我认为,从根本上消灭垃圾邮件,就像从根本上消灭恐怖分子一样困难……
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
如果你每天收到很多垃圾邮件,很憎恨…你不是一个人在愤怒,你不是一个人…
垃圾邮件的本质:牺牲公共利益,满足个人私利,损耗世界资源,污染世界环境。
小蜗牛不是邮件专家,只从事过相关的技术支持,下面,我根据自己的小小经验,“按角色”给大家说一下我所认识的垃圾邮件以及相关斗争……
主角:垃圾邮件发送者
工具:邮件群发软件
邮件地址来源:
1、邮件群发软件穷举邮件地址,盲目投递,只管成功,不管失败。
2、购买某些网站、个人或企业提供的邮件地址数据、行业信息、企业名录等
3、某些软件或者邮件群发软件自身能自动采集互联网上的邮件地址
...
小提示:你可以搜索一下“邮件群发软件”~嘿嘿!
有专门的垃圾邮件发送商,它们可能有更先进的垃圾邮件发送技术和相关网络服务支持,提投递成功率和客户命中率。
受害者:世界网民(狭义)
广义来说,垃圾邮件的危害还包括资源消耗、环境污染等,大家可以搜索相关信息
除了垃圾邮件群发软件主动试探我们的邮箱地址外,我们自己也可能有意无意的在互联网上暴露、泄漏了自己的邮箱地址。比如:
1、注册网站,留下email信息(有可能被邮件地址搜索软件搜索到或被网站出卖)
2、网上开店,个人博客等(比如,每一个sohu博客对应一个sohu邮箱)
邮件服务器反垃圾邮件手段
【注意】下面的技术只是根据自己接触过的邮箱服务器粗略的讲述,有太多新技术我没有接触过。
1、在网络层对外来的连接进行判断。比如判断对方的IP是否为动态IP(一般正规的邮件服务器都是静态IP,而很多垃圾邮件发送者用的都是动态IP),是否被列入国际或者国内反垃圾组织的RBL(动态黑名单),或者是RWL(动态白名单),或者被列入本系统的黑名单、白名单等等。在网络层还可以进行速率控制、并发控制等防止邮件系统过载。
2、SMTP会话层进行判断。比如检验HELO域名是否和IP匹配,是否存在反向解释等。灰名单技术(GrayList 一种基于重试原则的技术)是SMTP会话层和网络层的相互配合实现的。
3、邮件系统全局过滤规则。系统过滤规则可以有很多很多,每一条都用来过滤特定的垃圾邮件,比如过滤邮件主题包含“发票”字样,或内容包含“培训”字样等邮件。基于规则,我们可以对邮件进行多样性的分类处理,比如删除、转发、放到垃圾箱、回复发信人、将发信人列入黑名单等等。
4、反垃圾系统过滤。这个就比较难说了,各种反垃圾系统有各自的特性和优点,不过原理上离不开通过对邮件主题、内容(甚至内容里的图片、HTTP链接等)、附件等邮件各个部分进行检测分析、判断或评分(垃圾邮件评分原则,也即将邮件进行一层一层的过滤、评分,到最后出来一个总分数,如果分数超过一定阀值,就被认为是垃圾邮件或者直接被系统删除)。比较著名的开源反垃圾引擎有 SpamAssassin,官方网站是 [url]http://spamassassin.apache.org[/url] 。在网络层、SMTP会话层、或在过滤规则里,都可以对邮件来源(IP),发件人、收件人等进行垃圾邮件过滤。因此,“反垃圾邮件系统”是一个分层次、相互协调、相互补充的反垃圾体系。
相关反垃圾技术术语:白名单、黑名单、灰名单、实时黑(白)名单、反向MX解释、关键字过滤、指纹技术、意图分析技术、贝叶斯过滤技术...
5、用户级别的黑名单、白名单、过滤规则等。一般的邮件系统都有用户自己的黑白名单,过滤规则设置,还有垃圾邮件举报等功能。
6、客户端的垃圾邮件过滤功能。比如Foxmail就带有垃圾邮件过滤系统,并且还具有垃圾邮件学习功能。
个人邮箱地址保护手段
1、用图片形式的邮件地址。目前有很多可以自动生成免费邮箱图片的网站,比如
[url]http://pic.sdodo.com/tool/mailpic/[/url], [url]http://services.nexodyne.com/[/url]
2、用链接形式的邮件地址,真实的邮件地址为链接所指向的网站所保护,需要输入验证码才能获取真实的用户邮箱地址。目前有很多网站为大家提供免费的邮件地址保护服务,比如 [url]http://scr.im[/url] , [url]http://tinymail.me[/url] 。有些网站提供免费的“中转”服务,比如 [url]http://whspr.me[/url],你在它那里申请邮件地址保护,它提供你一个链接,点击这个链接打开一个页面,别人在这个页面里给你留言,这个网站就将这些信息转发到你真正的邮箱里了。
【实质上,这些网站为大家提供免费的邮箱地址保护服务,大家为该网站做宣传】
3、使用 # % & 等其它符号代替 @ 符号,这样能很大程度上减少被搜索软件识别的几率。,但某些比较“聪明”的搜索软件也能识别这种小技巧,当然你可以更聪明,多加一些其它“漂亮”的干扰,只要能让大家正确识别你的邮件地址就可以了。
目前市场上免费的、收费的、或者是企业的电子邮件系统各有优劣,反垃圾反病毒方面肯定存在差距,我在这里也无法加于评判,大家读完这篇小短文,会有什么动作吗?
反垃圾斗争的手段,除了采用先进的反垃圾技术外,有讨论说通过收费邮件、或者法律手段对垃圾邮件进行控制、惩罚,但我认为,从根本上消灭垃圾邮件,就像从根本上消灭恐怖分子一样困难……
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-04-29 16:18:48
【小蜗牛悠悠之作
】
当你给某人发送了一封电子邮件,想知道对方是否阅读了吗?这里不是说我们平常使用的“回执”方式,靠收件人发送回执是不可行的,因为像我这样的人就不喜欢给对方回执,呵呵。
我们可以通过这里所说的“电子邮件追踪技术”来实现,其实道理挺简单的,但仅适用于html邮件,普通的plain-text或者rich-text邮件不行(因为不支持内嵌图片),下面就简单的说一下“电子邮件追踪”原理:
在所写的html邮件里,包含一个链接图片,其实在html中的表示就是一个URL链接,例如我的小蜗牛头像 <img src=[url]http://img1.51cto.com/image/upload/680306_1235977773.jpg[/url] /> 。当这封邮件被阅读的时候,无论是在网页里或者在客户端(Foxmail,Outlook)阅读,由于都要显示该图片,因此该URL图片的链接或者访问次数就会增加。因此,只要在URL图片的服务器端记录该图片的访问次数(或者作其它的标记、记录等),就可以知道你所发送的电子邮件是否被对方阅读过了。如果URL图片所在的服务器是你自己的,那就最好不过了,自己编写简单的小程序管理控制,比如,一旦发现图片的访问次数增多了(比如由0增加为1),服务器就给发信人(当然服务器要知道发信人是谁)发送一封通知信,通知发信人某某主题(或其它的信息)的邮件已经被对方阅读了。
如果你没有自己的服务器或者网站,那也没关系,因为早就有非常好的“免费”的网站为你提供邮件追踪服务:[url]http://www.spypig.com[/url] (侦察猪)。
打开“侦察猪”网站的首页,你只需要输入你的邮件地址,邮件主题(可以和你发给对方的主题一样或者随便写都可以,你自己清楚就行),然后选择一个猪猪图片或者透明图片,最后选择最多通知的次数(一般都不止一次阅读或者打开查看该邮件),点击step5的大图片即可生成一个随机命名的图片(和你上面选择的那个图片一样,但这个图片的命名关联了你输入的邮件地址、邮件主题等信息),然后在60秒内复制该图片到你想要发送的html电子邮件中即可(透明图片让收件人几乎无法察觉图片的存在)。
说一下为什么要在60秒内复制并粘贴到邮件中。在60秒内,这个图片还没有被spypig网站激活,也就是,你在60秒内随意复制粘贴多次都没所谓,如果60秒后,你再尝试复制粘贴,那么在你还没有发送邮件之前,你的收件箱就会收到来自spypig的一封(或多封)邮件通知说你的邮件已经被阅读了,呵呵,明白怎么回事了吧?
国内某高人利用该方法来发送应聘简历(赞一个!),还自己用php来尝试实现一下spypig的功能(再赞两个!!),值得我们模仿(发简历)和学习(php)!
这就是我说的那高人的文章:
[url]http://www.cnblogs.com/czy1121/archive/2009/02/24/1397154.html[/url]
文章后面的评论比较精彩,值得看看学习学习:)
如果图片被过滤了,那么阅读追踪功能也就实效了:(
评论中还提到,垃圾邮件商为了确认邮箱地址是否活跃,就会用到这狠招!
NND,估计自己一直以来也中招不少~
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
当你给某人发送了一封电子邮件,想知道对方是否阅读了吗?这里不是说我们平常使用的“回执”方式,靠收件人发送回执是不可行的,因为像我这样的人就不喜欢给对方回执,呵呵。
我们可以通过这里所说的“电子邮件追踪技术”来实现,其实道理挺简单的,但仅适用于html邮件,普通的plain-text或者rich-text邮件不行(因为不支持内嵌图片),下面就简单的说一下“电子邮件追踪”原理:
在所写的html邮件里,包含一个链接图片,其实在html中的表示就是一个URL链接,例如我的小蜗牛头像 <img src=[url]http://img1.51cto.com/image/upload/680306_1235977773.jpg[/url] /> 。当这封邮件被阅读的时候,无论是在网页里或者在客户端(Foxmail,Outlook)阅读,由于都要显示该图片,因此该URL图片的链接或者访问次数就会增加。因此,只要在URL图片的服务器端记录该图片的访问次数(或者作其它的标记、记录等),就可以知道你所发送的电子邮件是否被对方阅读过了。如果URL图片所在的服务器是你自己的,那就最好不过了,自己编写简单的小程序管理控制,比如,一旦发现图片的访问次数增多了(比如由0增加为1),服务器就给发信人(当然服务器要知道发信人是谁)发送一封通知信,通知发信人某某主题(或其它的信息)的邮件已经被对方阅读了。
如果你没有自己的服务器或者网站,那也没关系,因为早就有非常好的“免费”的网站为你提供邮件追踪服务:[url]http://www.spypig.com[/url] (侦察猪)。
打开“侦察猪”网站的首页,你只需要输入你的邮件地址,邮件主题(可以和你发给对方的主题一样或者随便写都可以,你自己清楚就行),然后选择一个猪猪图片或者透明图片,最后选择最多通知的次数(一般都不止一次阅读或者打开查看该邮件),点击step5的大图片即可生成一个随机命名的图片(和你上面选择的那个图片一样,但这个图片的命名关联了你输入的邮件地址、邮件主题等信息),然后在60秒内复制该图片到你想要发送的html电子邮件中即可(透明图片让收件人几乎无法察觉图片的存在)。
说一下为什么要在60秒内复制并粘贴到邮件中。在60秒内,这个图片还没有被spypig网站激活,也就是,你在60秒内随意复制粘贴多次都没所谓,如果60秒后,你再尝试复制粘贴,那么在你还没有发送邮件之前,你的收件箱就会收到来自spypig的一封(或多封)邮件通知说你的邮件已经被阅读了,呵呵,明白怎么回事了吧?
国内某高人利用该方法来发送应聘简历(赞一个!),还自己用php来尝试实现一下spypig的功能(再赞两个!!),值得我们模仿(发简历)和学习(php)!
这就是我说的那高人的文章:
[url]http://www.cnblogs.com/czy1121/archive/2009/02/24/1397154.html[/url]
文章后面的评论比较精彩,值得看看学习学习:)
如果图片被过滤了,那么阅读追踪功能也就实效了:(
评论中还提到,垃圾邮件商为了确认邮箱地址是否活跃,就会用到这狠招!
NND,估计自己一直以来也中招不少~
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-04-28 13:56:19
【小蜗牛嗷嗷之作
】
在短信发送编码的时候,有必要判断要发送的内容是否带有中文或者其它的多字节字符,从而采取最优的编码方式。(如果没有中文,则使用7BIT压缩编码,以在一条短信中容纳最多160个ASCII字符)
我查看过某些编码资料,了解到中文UTF8编码的范围为2-3个字节(我还没碰到过2个字节UTF8编码的中文,日常碰到的几乎都是3个字节的)。
我发现中文UTF8编码的一个共同特点,无论是2个字节还是3个字节的UTF8中文编码,其实每一个字节的最高位都是 1 。因此,我利用这个特点,就能简单快速的判断UTF8字符串里是否有中文。这里顺便说一下,ASCII的UTF8编码也是和ASCII一样,只占用一个字节,最高位是0(这里不包括扩展ASCII)。
下面是我的C函数:
//如果检测到多字节字符,返回1,否则返回0
int scanMultiBytes(const char *pSrc)
{
int i;
for (i = 0; i < strlen(pSrc); i ++)
if (*(pSrc+i) & 0x80)
return 1;
return 0;
}
经我观察(不一定正确,请大家指正),几乎所有的多字节字符最高位都是 1,因此上面我的函数名为“扫描多字节字符”- scanMultiBytes()。
【注意】上面我用 strlen() 函数来获取源字符串的长度,这里仅限于UTF8编码的源字符串,如果是其它编码的字符串就不一定适用了(比如我上一篇文章提到的UCS2编码就不适用)
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
在短信发送编码的时候,有必要判断要发送的内容是否带有中文或者其它的多字节字符,从而采取最优的编码方式。(如果没有中文,则使用7BIT压缩编码,以在一条短信中容纳最多160个ASCII字符)
我查看过某些编码资料,了解到中文UTF8编码的范围为2-3个字节(我还没碰到过2个字节UTF8编码的中文,日常碰到的几乎都是3个字节的)。
我发现中文UTF8编码的一个共同特点,无论是2个字节还是3个字节的UTF8中文编码,其实每一个字节的最高位都是 1 。因此,我利用这个特点,就能简单快速的判断UTF8字符串里是否有中文。这里顺便说一下,ASCII的UTF8编码也是和ASCII一样,只占用一个字节,最高位是0(这里不包括扩展ASCII)。
下面是我的C函数:
//如果检测到多字节字符,返回1,否则返回0
int scanMultiBytes(const char *pSrc)
{
int i;
for (i = 0; i < strlen(pSrc); i ++)
if (*(pSrc+i) & 0x80)
return 1;
return 0;
}
经我观察(不一定正确,请大家指正),几乎所有的多字节字符最高位都是 1,因此上面我的函数名为“扫描多字节字符”- scanMultiBytes()。
【注意】上面我用 strlen() 函数来获取源字符串的长度,这里仅限于UTF8编码的源字符串,如果是其它编码的字符串就不一定适用了(比如我上一篇文章提到的UCS2编码就不适用)
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-04-28 10:01:50
【小蜗牛清心之作
】
UCS2编码在发送短信时候经常用到,如果发送的是纯ASCII字符的短信,采用7BIT压缩编码最大一次可以发送160个ASCII,但是如果想发送中文的话,只能采用UCS2编码了,一条短信最大可以发送70个中文(或70个中英文、数字混合短信,比如,如果有1个中文,后面可以再有69个中文,或者69个英文、数字)。
中文、普通ASCII的UCS2编码都是要占用两个字节,但是,ASCII的UCS2编码有一个字节为0x0,导致无法用 strlen() 函数来计算UCS2编码的长度,我是这么计算UCS2编码长度的:
// 计算出UCS2编码的长度并返回长度
int ucs2Count(const unsigned char *pSrc)
{
int i;
for (i = 0; pSrc[i]+pSrc[i+1] != 0; i += 2);
//注意上面有个";"
return i;
}
pSrc这里存放着已经UCS2编码好的字节串,这里需要注意的是,我们必须有 n*2+2 字节的空间来存储UCS2字节串,这里的 n 是需要进行UCS2编码的字符个数,中文当作一个字符,英文字母、数字也是一个字符。并且,我们在编码转换的时候,需要先把 n*2+2 字节的空间清零,可以使用函数 bzero(pSrc, n*2+2) 或者 memset(pSrc, 0, n*2+2)。
温馨提示一下,在Linux下各种编码转换,可以使用 iconv() 函数哦~
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
UCS2编码在发送短信时候经常用到,如果发送的是纯ASCII字符的短信,采用7BIT压缩编码最大一次可以发送160个ASCII,但是如果想发送中文的话,只能采用UCS2编码了,一条短信最大可以发送70个中文(或70个中英文、数字混合短信,比如,如果有1个中文,后面可以再有69个中文,或者69个英文、数字)。
中文、普通ASCII的UCS2编码都是要占用两个字节,但是,ASCII的UCS2编码有一个字节为0x0,导致无法用 strlen() 函数来计算UCS2编码的长度,我是这么计算UCS2编码长度的:
// 计算出UCS2编码的长度并返回长度
int ucs2Count(const unsigned char *pSrc)
{
int i;
for (i = 0; pSrc[i]+pSrc[i+1] != 0; i += 2);
//注意上面有个";"
return i;
}
pSrc这里存放着已经UCS2编码好的字节串,这里需要注意的是,我们必须有 n*2+2 字节的空间来存储UCS2字节串,这里的 n 是需要进行UCS2编码的字符个数,中文当作一个字符,英文字母、数字也是一个字符。并且,我们在编码转换的时候,需要先把 n*2+2 字节的空间清零,可以使用函数 bzero(pSrc, n*2+2) 或者 memset(pSrc, 0, n*2+2)。
温馨提示一下,在Linux下各种编码转换,可以使用 iconv() 函数哦~
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己![/img]..
2009-04-27 11:28:48
【小蜗牛无聊之作
】
这些都是非常基本的命令,希望这篇小短文对Linux新手有帮助:
查看某目录占用空间命令:
# du -sh DirPath
比如: du -sh /home/snail
查看某目录下有多少个文件命令:
# find DirPath -type f | wc -l
比如: find /home/snail -type f | wc -l
如果想查看 src 目录下有多少 C 文件,如下:
# find ./src -type f -name "*.c" | wc -l
find 命令的 -type 后的参数有以下选择,每种都代表不一样的“类型(type)”
-type 文件类型
b 块文件(比如内存)
c 字符文件(比如串口)
d 目录文件(目录也是一种文件)
p 有名管道(FIFO)
f 普通文件
l 符号链接(如果使用 -L 或 -follow 选项则不起作用,除非链接损坏)
s socket文件(比如 /tmp/mysql.sock)
D door (Solaris)
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己!
[/img]..
这些都是非常基本的命令,希望这篇小短文对Linux新手有帮助:
查看某目录占用空间命令:
# du -sh DirPath
比如: du -sh /home/snail
查看某目录下有多少个文件命令:
# find DirPath -type f | wc -l
比如: find /home/snail -type f | wc -l
如果想查看 src 目录下有多少 C 文件,如下:
# find ./src -type f -name "*.c" | wc -l
find 命令的 -type 后的参数有以下选择,每种都代表不一样的“类型(type)”
-type 文件类型
b 块文件(比如内存)
c 字符文件(比如串口)
d 目录文件(目录也是一种文件)
p 有名管道(FIFO)
f 普通文件
l 符号链接(如果使用 -L 或 -follow 选项则不起作用,除非链接损坏)
s socket文件(比如 /tmp/mysql.sock)
D door (Solaris)
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己!
[/img]..
2009-04-26 21:47:52
【小蜗牛无聊之作
】
我经常需要用到for循环,自己小结一下它的用法:
方法1:
for 变量 in 常量列表; do 一些命令; done;
(注意:我这里用“常量列表”来表述不一定准确,希望大家理解即可,
我实在想不出更好的表述了,请大家指教!)
如:for file in `ls`; do echo $file; done;
for i in 1 2 3 4 5; do echo $i; done;
方法2:
for (( 变量初始化; 条件判断; 变量自变 )); do 一些命令; done;
如:for (( i = 0; i < 10; i++)); do echo $i; done;
这里就像使用C语言那样哦~不过是用两个括号而已。
这里举一个有趣的例子:
#!/bin/bash
# test.sh
MAX=10
for (( i = 0; i < MAX ; i ++ ))
do
echo $i
done
有趣的是,这里的 MAX 前面没有 '$',当然,你使用 $MAX 也是可以的。
难道 bash 就那么宽容吗?听说,类似C的这种语法,只有bash独有哦~
顺便提一下,在bash中使用expr进行简单的数学计算,如下:
MAX=10
for (( i = 0; i < MAX ; i ++ ))
do
echo `expr $i \* $i`
# 或者这样
# echo $[$i * $i]
done
注意,这里需要用 ` ` 括号(一时想不起它叫啥名字)起来表示 expr 是一个命令,前面的 `ls` 也就是取 ls 命令的输出结果。还有,这里的'*'要用'\'来转义,使用 '+' '-' 等算术符则不需要转移。使用上面注释掉的第二种方法就不需要转义。
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己!
[/img]..
我经常需要用到for循环,自己小结一下它的用法:
方法1:
for 变量 in 常量列表; do 一些命令; done;
(注意:我这里用“常量列表”来表述不一定准确,希望大家理解即可,
我实在想不出更好的表述了,请大家指教!)
如:for file in `ls`; do echo $file; done;
for i in 1 2 3 4 5; do echo $i; done;
方法2:
for (( 变量初始化; 条件判断; 变量自变 )); do 一些命令; done;
如:for (( i = 0; i < 10; i++)); do echo $i; done;
这里就像使用C语言那样哦~不过是用两个括号而已。
这里举一个有趣的例子:
#!/bin/bash
# test.sh
MAX=10
for (( i = 0; i < MAX ; i ++ ))
do
echo $i
done
有趣的是,这里的 MAX 前面没有 '$',当然,你使用 $MAX 也是可以的。
难道 bash 就那么宽容吗?听说,类似C的这种语法,只有bash独有哦~
顺便提一下,在bash中使用expr进行简单的数学计算,如下:
MAX=10
for (( i = 0; i < MAX ; i ++ ))
do
echo `expr $i \* $i`
# 或者这样
# echo $[$i * $i]
done
注意,这里需要用 ` ` 括号(一时想不起它叫啥名字)起来表示 expr 是一个命令,前面的 `ls` 也就是取 ls 命令的输出结果。还有,这里的'*'要用'\'来转义,使用 '+' '-' 等算术符则不需要转移。使用上面注释掉的第二种方法就不需要转义。
------------------------------------------------------------------------------------------
赵小蜗牛
QQ: 755721501
E-mail: snailwarrior@qq.com
在不断奉献中谋求生存发展、打造自己的优秀品质,用人性最本质最动人的一面“营销”自己!
[/img]..



snailwarrior 的BLOG 
自我介绍
博客统计信息
文章
热门文章
最新评论