java
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
/**
*
* <p>Title: Thumbnail</p>
*
* <p>Description: Picture Thumbnail</p>
*
* <p>Copyright: Copyright (c) 54powerman@163.com 2005</p>
*
* <p>Company:
http://blog.sina.com.cn/u1055000490</p>
*
* @author 54powerman
* @version 1.0
*/
public class Thumbnail {
private String srcFile;
private String destFile;
private int width;
private int height;
private Image img;
public static void main(String[] args) throws Exception {
Thumbnail thum = new Thumbnail("Winter.png");
thum.resizeFix(500, 300);
}
/**
* 构造函数
* @param fileName String
* @throws IOException
*/
public Thumbnail(String fileName) throws IOException {
File _file = new File(fileName); //读入文件
this.srcFile = _file.getName();
this.destFile = this.srcFile.substring(0, this.srcFile.lastIndexOf(".")) +
"_s.jpg";
img = javax.imageio.ImageIO.read(_file); //构造Image对象
width = img.getWidth(null); //得到源图宽
height = img.getHeight(null); //得到源图长
}
/**
* 强制压缩/放大图片到固定的大小
* @param w int 新宽度
* @param h int 新高度
* @throws IOException
*/
public void resize(int w, int h) throws IOException {
BufferedImage _image = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
_image.getGraphics().drawImage(img, 0, 0, w, h, null); //绘制缩小后的图
FileOutputStream out = new FileOutputStream(destFile); //输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(_image); //近JPEG编码
out.close();
}
/**
* 按照固定的比例缩放图片
* @param t double 比例
* @throws IOException
*/
public void resize(double t) throws IOException {
int w = (int) (width * t);
int h = (int) (height * t);
resize(w, h);
}
/**
* 以宽度为基准,等比例放缩图片
* @param w int 新宽度
* @throws IOException
*/
public void resizeByWidth(int w) throws IOException {
int h = (int) (height * w / width);
resize(w, h);
}
/**
* 以高度为基准,等比例缩放图片
* @param h int 新高度
* @throws IOException
*/
public void resizeByHeight(int h) throws IOException {
int w = (int) (width * h / height);
resize(w, h);
}
/**
* 按照最大高度限制,生成最大的等比例缩略图
* @param w int 最大宽度
* @param h int 最大高度
* @throws IOException
*/
public void resizeFix(int w, int h) throws IOException {
if (width / height > w / h) {
resizeByWidth(w);
}
else {
resizeByHeight(h);
}
}
/**
* 设置目标文件名
* setDestFile
* @param fileName String 文件名字符串
*/
public void setDestFile(String fileName) throws Exception {
if (!fileName.endsWith(".jpg")) {
throw new Exception("Dest File Must end with \".jpg\".");
}
destFile = fileName;
}
/**
* 获取目标文件名
* getDestFile
*/
public String getDestFile() {
return destFile;
}
/**
* 获取图片原始宽度
* getSrcWidth
*/
public int getSrcWidth() {
return width;
}
/**
* 获取图片原始高度
* getSrcHeight
*/
public int getSrcHeight() {
return height;
}
}
import java.io.*;
import java.net.*;
import java.util.*;
public class Test
{
public static void main(String[] args)
{
//POST发送数据,返回http资源
System.out.println(OpenUrl("http://www.ip138.com:8080/search.asp","action=mobile&mobile=13910000000&B1=查询"));
//GET发送数据,返回http资源
System.out.println(OpenUrl("http://www.ip138.com:8080/search.asp?action=mobile&mobile=13910000000&B1=查询",""));
//返回Ftp资源
System.out.println(OpenUrl(ftp://user:pass@192.168.0.1/book/jdk.txt",""));
}
public static String OpenUrl(String urlString,String postParam) {
StringBuffer document = new StringBuffer();
try {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if(!postParam.trim().equals("")){
conn.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "GBK");
out.write(postParam);
out.flush();
out.close();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
while ( (line = reader.readLine()) != null) {
document.append(line + "\n");
}
reader.close();
}
catch (MalformedURLException e) {
System.out.println("Unable to connect to URL: " + urlString);
}
catch (IOException e) {
System.out.println("IOException when connecting to URL: " + urlString);
}
return document.toString();
}
}
先说说Tomcat5.exe和Tomcat5w是干什么的。
Tomcat5.exe可以把Tomcat加入服务;Tomcat5w.exe可以辅助配置已经添加的服务。
Tomcat5w.exe 监控程序
Tomcat5w是一个监控和配置Tomcat服务的图形界面应用程序。可用的命令行选项如下:
//ES// 编辑服务配置,这是缺省的选项。如果没有提供任何选项,却把tomcat5w.exe重命名为%SERVICE_NAME%.exe运行的话,这个选项就被调用。
//MS// 监控服务,讲图标放置到系统托盘中。
Tomcat5.exe 服务程序
命令行选项
每一个命令行指令都形如//XX//ServiceName
可用的命令行选项如下:
The ServiceName is the name of the executable without exe sufix, meaning Tomcat5
//TS// 控制台应用程序模式运行服务,这是缺省的操作。在没有提供任何选项开关的时候,它被调用。服务名是执行文件没有exe后缀的部分,如Tomat5。
//RS// Run Service的缩写,运行服务,在服务管理器(Sevices.msc)中启动服务的时候被调用。
//SS// Stop Service的缩写,停止服务,在服务管理器中停止服务时被调用。
//US// Update Service的缩写,更新服务参数。
//IS// Install service 的缩写,安装服务 。
//DS// Delete service的缩写,删除服务,如果服务正在运行,首先删除服务。
命令行参数
每一个命令行参数以“--”开头。如果命令行以“++”为前缀,则它的值附加到存在的选项上。如果存在和命令行参数有同样的名字,但是以PR_开头的环境变量,它将被优先使用。例如:
set PR_CLASSPATH=xx.jar
等同于
--Classpath=xx.jar
作为命令行参数。
参数名 缺省值 描述
--Description 服务名描述 (最多1024个字符)
--DisplayName ServiceName 服务显示名称
--Install procrun.exe //RS//ServiceName 安装服务
--Startup manual Service 服务启动模式,可以是自动或者手动,值分别为:auto和manual
--DependsOn 列举此服务依赖的所有服务. 被依赖的服务用#或者;分隔。
--Environment 列决提供给服务使用的环境变量,形如key=value。多个环境变量之间用#或者;分隔。
--User 运行服务使用的用户账号。 只有在运行于没有“作为服务登录”权限下的账户中使用StartMode java 或者作为服务的exe可运行程序选项的情况下才被使用。
--Password --User参数中用户的密码
--JavaHome JAVA_HOME 定义了JAVA_HOME环境变量时,设置一个不同的JAVA_HOME环境变量
--Jvm auto 用auto或指定jvm.dll的全路径。这里可以使用环境变量表达式。
--JvmOptions -Xrs 列举形如-D 或 -X 的开关传递给JVM虚拟机。多个选项开关之间用#或者;分隔。
--Classpath 设置Java的ClassPath环境变量。
--JvmMs 设置初始使用的内存池容量,单位为MB。
--JvmMx 设置最大使用的内存池容量,单位为MB。
--JvmSs 线程堆栈容量,单位为KB
--StartImage 要被运行的可执行文件
--StartPath 开始运行可执行文件的工作路径
--StartClass 启动时使用的类
--StartParams 列决要传递给StartImage 或 StartClass的参数。多个参数之间用#或者;分隔。
--StartMethod Main 启动服务调用的方法,如果不是main,这里写上方法名
--StartMode executable 可以是jvm、java或exe 之一
--StopImage 停止服务调用的可执行文件
--StopPath 停止服务执行的文件的工作路径
--StopClass 停止服务调用的类
--StopParams 列决要传递给 StopImage 或 StopClass 的参数。多个参数之间用#或者;分隔。
--StopMethod Main 停止服务调用的方法,如果不是main,这里写上方法名
--StopMode executable 可以是jvm、java或exe 之一
--StopTimeout No Timeout 定义一个服务顺利退出的延时,单位为秒。
--LogPath 定义日志路径
--LogPrefix jakarta_service 定义日志文件名前缀
--LogLevel INFO 定义日志等级,可选值:error, info, warn或debug
--StdOutput 重定向stdout文件名
--StdError 重定向Stderr文件名
安装服务
手动安装服务最安全的方法就是使用service.bat脚本。
使用service.bat安装名字为'Tomcat5'的服务
C:\> service.bat install Tomcat5
如果使用tomcat5.exe安装名字为'Tomcat5'的服务,你需要使用//IS//参数。
C:\> tomcat5 //IS//Tomcat5 --DisplayName="Apache Tomcat 5" --Install="C:\Program Files\Tomcat\bin\tomcat5.exe" --Jvm=auto --StartMode=jvm --StopMode=jvm --StartClass=org.apache.catalina.startup.Bootstrap --StartParams=start --StopClass=org.apache.catalina.startup.Bootstrap --StopParams=stop
更新服务
要更新服务的参数,你需要使用tomcat5.exe的//US//参数。
更新名字为'Tomcat5的服务
C:\> tomcat5 //US//Tomcat5 --Description="Apache Tomcat Server - http://jakarta.apache.org/tomcat " --Startup=auto --Classpath=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar
移除服务
要移除服务,你需要使用tomcat5.exe的//DS//参数。如果服务正在运行,将首先关闭然后删除。
移除名字为'Tomcat5'的服务
C:\> tomcat5 //DS//Tomcat5
调试服务
如果需要在控制台模式运行服务,应该使用//TS//参数。此时若要关闭服务必须使用CTRL+C 或者 CTRL+BREAK关闭控制台。如果你将tomcat5.exe 更名为 testservice.exe那么你应该运行testservice.exe,命令模式将被缺省运行。
在控制台模式下运行命称为'Tomcat5' 的服务
C:\> tomcat5 //TS//Tomcat5 [additional arguments]
或者简单地运行:
C:\> tomcat5
Asp遍历服务器对象的代码
一 遍历Request
方式1:
<%
For Each r In Request.QueryString
Response.Write "Request("""&r&""") = " & Request(r)
Response.Write "<p>"
Next
%>
方式2:
<%
For i = 1 To Request.QueryString.Count
Response.Write "Request("""&Request.QueryString.Key(i)&""") = " & Request.QueryString(Request.QueryString.Key(i))
Response.Write "<p>"
Next
%>
将QueryString改为Form,即可遍历Post变量。
二 遍历Session
<%
Session("key1")="value1"
Session("key2")="value2"
For Each s In Session.Contents
Response.Write "Session("""&s&""") = " & Session(s)
Response.Write "<p>"
Next
%>
二 遍历Application
<%
Application("key1")="value1"
Application("key2")="value2"
For Each a In Application.Contents
Response.Write "Application("""&a&""") = " & Application(a)
Response.Write "<p>"
Next
%>
批处理创建当天日期的文件夹
1 如果不存在就创建今天日期的文件夹
if not exist %date:~0,10% (md %date:~0,10%)
2 每月1号创建文件夹
if %date:~8,2%==01 (md %date:~0,10%)
闲来无事,整理了一下java代码。算做个复习笔记了。
import java.sql.*;
public class dbaccess{
public static void main(String args[]) throws Exception{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dburl ="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=Mobile.mdb";//此为NO-DSN方式
//String dburl ="jdbc:odbc:odbcName";//此为ODBC连接方式
Connection conn=DriverManager.getConnection(dburl);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select Top 20 * from MobileSection");
System.out.println("号段\t地区\t类型\t省份\t区号");
while(rs.next()){
System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getString(4)+"\t"+rs.getString(5));
}
rs.close();
stmt.close();
conn.close();
}
}
经常用,先放这里,用的时候过来拿!
<%@page import="java.net.*,java.io.*"%>
<%!
public boolean saveUrlAs(String photoUrl, String fileName) {
//此方法只能用户HTTP协议
try {
URL url = new URL(photoUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
DataInputStream in = new DataInputStream(connection.getInputStream());
DataOutputStream out = new DataOutputStream(new FileOutputStream(fileName));
byte[] buffer = new byte[4096];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
in.close();
return true;
}
catch (Exception e) {
return false;
}
}
public String getDocumentAt(String urlString) {
//此方法兼容HTTP和FTP协议
StringBuffer document = new StringBuffer();
try {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.
getInputStream()));
String line = null;
while ( (line = reader.readLine()) != null) {
document.append(line + "\n");
}
reader.close();
}
catch (MalformedURLException e) {
System.out.println("Unable to connect to URL: " + urlString);
}
catch (IOException e) {
System.out.println("IOException when connecting to URL: " + urlString);
}
return document.toString();
}
%>
<%
//测试
String photoUrl = "http://ad4.sina.com.cn/200601/12/43932_750450.jpg";
String fileName = photoUrl.substring(photoUrl.lastIndexOf("/"));
String filePath = "d:/ghost/";
boolean flag = saveUrlAs(photoUrl, filePath + fileName);
out.println("Run ok!\n<BR>Get URL file " + flag);
%>
ASP调用SqlServer存储过程的经典示例
1、无输入参数,无返回值
这种方式比较少见,但也是一种情况。
ConnString="Dsn=DsnName;Uid=user;Pass=pass"
Set Conn = Server.CreateObject("Adodb.Connection")
Conn.Open ConnString
Conn.Execute "ProcName"
2、两个输入参数,无返回值
ConnString="Dsn=DsnName;Uid=user;Pass=pass"
Set Conn = Server.CreateObject("Adodb.Connection")
Conn.Open ConnString
Conn.Execute "ProcName var1,var2"
Sql Mail技术给每一位数据库开发人员和DBA(数据库管理员)带来了极大的方便,利用该技术,Sql Server数据库代理程序可以在系统出现异常的时候自动发送Email通知管理员,开发人可以利用它让数据库自动定期的修改用户密码,然后发送Email通知用户……等等这些应用,都不同程度上把我们从繁杂的工作中解放出来。但是,Sql Mail的配置是比较复杂的,相信90%以上的人在配置Sql Mail的时候都遇到过各种各样的麻烦,至少有70%的人放弃了Sql Mail而选择其他方案来解决这个问题。笔者是一名Web开发人员,亲身经历了这一切,并找到了一个更好的替代方法。不敢独享,写出来以飨读者。
Sql Mail配置有几种方式,按照支持软件可划分为基于Exchange、Outlook2000(以上)和第三方软件的配置方案,三种方式各有利弊,主要表现在以下几个方面:
使用Outlook客户端配合Sql Server实现Sql Mail
此方案软件要求较低,只需要在Sql Server所在服务器上安装Outlook2000以上版本客户端即可。它要求在Sql Mail使用期间,OutLook客户端必须打开,否则,只能到下次打开时,邮件才能发送出去。另外,如果服务器为远程服务器,用微软官方的远程桌面无法完成配置,可替代的方案是DBA亲自去机房直接操作,或者安装PcAnywhere10替代远程桌面进行操作。
使用Exchange要求较高
Microsoft推荐使用Exchange作为Sql Mail的最佳拍档,MSDN的资料提出:“由于 POP3/SMTP 协议存在的局限性和登录问题,Microsoft 建议您使用 Exchange Server 来实现可靠性”。但是Exchange并不是专门做这个来使用的,可以说是屈才了,而且Exchange要求服务器配置域管理器,相信这个东东对大多数数据库服务器来说用处不大,只不过是浪费资源罢了。如果我们要在多台服务器上配置Sql Mail那么就需要在每一台服务器上配置域管理器,或者所有的服务器都配置到一个域内,但是对于服务器比较分散的系统来说这样是不现实的。
使用第三方系统支持
微软MSDN称:“如果您使用的是第三方邮件服务器,则必须将邮件服务器配置为 POP3 服务器。如果这些邮件服务器使用的本地邮件服务可能是由第三方邮件客户端安装的,Microsoft 将不支持连接到这些服务器”。这就意味着你还要使用Windows平台的邮件服务,使用ASP编写网站的朋友一定都知道,Cdonts.dll组件实在是……。
面对这些问题,笔者就变成了我刚才说的那70%了,虽然爬网无数,读文字数万把Sql Mail配置好了,但是我仍然绝对放弃,因为我不想在做第2台、第3台……的时候重蹈覆辙。替代的方案就是Jmail组件+OLE自动化对象,以上的问题迎刃而解。
预备知识
1.OLE自动化函数
OLE自动化使应用程序能够对另一个应用程序中实现的对象进行操作,或者将对象公开以便可以对其进行操作。自动化客户端是可对属于另一个应用程序的公开对象进行操作的应用程序,本文值得是Sql Server。公开对象的应用程序称为自动化服务器,又成为自动化组件,本文中即Jmail组件咯。客户端通过访问应用程序对象的属性和函数对这些对象进行操作。
在Sql Server使用Ole组件的途径是几个系统扩展存储过程sp_OACreate、sp_OADestroy、sp_OAGetErrorInfo、sp_OAMethod、sp_OASetProperty和sp_OAGetProperty,再次简单地介绍一下使用方法,详细资料参考Sql Server联机丛书。
OLE自动化对象的使用方法:
(1)调用 sp_OACreate 创建对象。
格式:sp_OACreate clsid,objecttoken OUTPUT [ , context ]
参数:clsid——是要创建的 OLE 对象的程序标识符 (ProgID)。此字符串描述该 OLE 对象的类,其形式,如 'OLEComponent.Object',OLEComponent 是 OLE 自动化服务器的组件名称,Object 是 OLE 对象名,本文中使用的“JMail.Message”;
Objecttoken——是返回的对象标志,并且必须是数据类型为 int 的局部变量。用于标识所创建的 OLE 对象,并将在调用其它 OLE 自动化存储过程时使用。本文中就是通过它来调用JMail.Message组件的属性和方法的。
Context——指定新创建的 OLE 对象要在其中运行的执行上下文。本文不使用该参数,故不赘述。以下与此一致,所有方法属性的其他用法请参阅Sql Server联机文档。
(2)使用该对象。
(a)调用 sp_OAGetProperty 获取属性值。
格式:_OAGetProperty objecttoken,propertyname [, propertyvalue OUTPUT]
参数:(前面出现过的参数,以下均省略。)
Propertyname——对象的属性名称;
Propertyvalue——返回的对象的属性值,该参数带OUTPUT属性,执行该操作后,你就可以从propertyvalue中得到属性的值了。
(b)调用 sp_OASetProperty 将属性设为新值。
格式:sp_OASetProperty objecttoken, propertyname, propertyvalue
(c)调用 sp_OAMethod 以调用某个方法。
格式:sp_OAMethod objecttoken, methodname [, returnvalue OUTPUT] [ , [ parametername = ] parametervalue [...n]]
参数:Returnvalue——调用方法的返回值,如果没有返回值,此参数设置为NULL;
Parametername——方法定义中的参数名称,也就是形参;
Parametervalue——参数值;
……n——表示,可以带很多参数,个数由方法定义限制;
(d)调用 sp_OAGetErrorInfo 获取最新的错误信息。
格式:sp_OAGetErrorInfo [objecttoken ] [, source OUTPUT] [, description OUTPUT]
参数:Source——错误源;
Description——错误描述;
(3)调用 sp_OADestroy 释放对象。
格式:sp_OADestroy objecttoken
2.xp_cmdshell扩展存储过程
该扩展存储过程在master数据库中,它的全路径是master..xp_cmdshell(注意,中间是2个点),它的功能是:以操作系统命令行解释器的方式执行给定的命令字符串,并以文本行方式返回任何输出。
格式:xp_cmdshell {'command_string'} [, no_output]
参数:'command_string'——是在操作系统命令行解释器上执行的命令字符串。
no_output——是可选参数,表示执行给定的 command_string,但不向客户端返回任何输出。本文应用中不使用该参数。
操作方法
(1)软件准备
请先到http://www.dimac.net/或者国内提供组件下载的网站下载最新版的JMail组件,如果你得到的是安装版,执行weJMailx.exe即可,系统的配置安装程序会自动完成。如果只有一个JMail.dll文件,请按照下面的步骤安装:
(a)新建文本文件,输入如下命令:
regsvr32 JMail.dll
net start w3svc
另存为Install.Bat(注意,千万不要保存成Install.Bat.Txt啊)
(b)此文件连同Jmail.dll一起拷贝到Sql Server数据库服务器的System32目录下,并执行双击Install.Bat即可。
(2)准备好了吗?跟我来吧
(a)运行Sql Server查询分析器,并以sa身份登录到Sql Server数据库;
(b)如果你的存储过程要添加到YourDefaultCatalog数据库,请在空白Sql窗口输入如下指令,否则请相应修改数据库名。
Use YourDefaultCatalog
按F5或者运行按钮运行该指令;
(c)创建基本发送存储过程
复制如下代码到Sql Server命令窗口,并运行。下面的代码中有相应的注释,文中不多做解释,如有疑问请查看前面的“预备知识”或者查询Sql Server帮助文件,当然也可以和作者联系。
Create Procedure dbo.sp_jmail_send
@sender varchar(100),
@sendername varchar(100)='',
@serveraddress varchar(255)='SMTP服务器地址',
@MailServerUserName varchar(255)=null,
@MailServerPassword varchar(255)=null,
@recipient varchar(255),
@recipientBCC varchar(200)=null,
@recipientBCCName varchar(200)=null,
@recipientCC varchar(200)=null,
@recipientCCName varchar(100)=null,
@attachment varchar(100) =null,
@subject varchar(255),
@mailbody text
As
/*
该存储过程使用办公自动化脚本调用Dimac w3 JMail AxtiveX组件来代替Sql Mail发送邮件
该方法支持“服务器端身份验证”
*/
--声明w3 JMail使用的常规变量及错误信息变量
Declare @object int,@hr int,@rc int,@output varchar(400),@description varchar (400),@source varchar(400)
--创建JMail.Message对象
Exec @hr = sp_OACreate 'jmail.message', @object OUTPUT
--设置邮件编码
Exec @hr = sp_OASetProperty @object, 'Charset', 'gb2312'
--身份验证
If Not @MailServerUserName is null
Exec @hr = sp_OASetProperty @object, 'MailServerUserName',@MailServerUserName
If Not @MailServerPassword is null
Exec @hr = sp_OASetProperty @object, 'MailServerPassword',@MailServerPassword
--设置邮件基本参数
Exec @hr = sp_OASetProperty @object, 'From', @sender
Exec @hr = sp_OAMethod @object, 'AddRecipient', NULL , @recipient
Exec @hr = sp_OASetProperty @object, 'Subject', @subject
Exec @hr = sp_OASetProperty @object, 'Body', @mailbody
--设置其它参数
if not @attachment is null
exec @hr = sp_OAMethod @object, 'Addattachment', NULL , @attachment,'false'
print @attachment
If (Not @recipientBCC is null) And (Not @recipientBCCName is null)
Exec @hr = sp_OAMethod @object, 'AddRecipientBCC', NULL , @recipientBCC,@recipientBCCName
Else If Not @recipientBCC is null
Exec @hr = sp_OAMethod @object, 'AddRecipientBCC', NULL , @recipientBCC
If (Not @recipientCC is null) And (Not @recipientCCName is null)
Exec @hr = sp_OAMethod @object, 'AddRecipientCC', NULL , @recipientCC,@recipientCCName
Else If Not @recipientCC is null
Exec @hr = sp_OAMethod @object, 'AddRecipientCC', NULL , @recipientCC
If Not @sendername is null
Exec @hr = sp_OASetProperty @object, 'FromName', @sendername
--调用Send方法发送邮件
Exec @hr = sp_OAMethod @object, 'Send', null,@serveraddress
--捕获JMail.Message异常
Exec @hr = sp_OAGetErrorInfo @object, @source OUTPUT, @description OUTPUT
if (@hr = 0)
Begin
Set @output='错误源: '+@source
Print @output
Select @output = '错误描述: ' + @description
Print @output
End
Else
Begin
Print '获取错误信息失败!'
Return
End
--释放JMail.Message对象
Exec @hr = sp_OADestroy @object
(d)简化存储过程操作,以适合我们平时的使用习惯
上面的存储过程基本可以完成邮件发送操作,但是非常冗长,而且不符合我们的习惯,比如它不支持多个发送给接收者、不支持将Sql指令运行结果以附件形式发送(这是Sql Mail的功能,我们也可以做到)等,所以我们要再写一个存储过程来调用它,以简化操作,并扩展功能。
Create Procedure SendMail
@Sender varChar(50)=null,
@strRecipients varChar(200),
@strSubject varChar(200),
@strMessage varChar(2000),
@sql varChar(50)=null)
As
Declare @SplitStr varchar(1) --定义邮件地址分割符变量
Declare @strTemp varchar(200) --定义多个收件人字符串临时变量
Declare @email varchar(50) --用分割符分割后的单个收件人字符串变量
Declare @SenderAddress varChar(50)
Declare @Attach varChar(200)
Declare @DefaultSender varChar(50)
Declare @MailServer varChar(50)
Declare @User varChar(50)
Declare @Pass varChar(50)
Declare @SenderName varChar(50)
Declare @AttachDir varChar(100)
--初始化缺省变量
Set @DefaultSender='缺省发送地址'
Set @MailServer='邮件服务器地址'
Set @User='SMTP服务器验证用户地址'
Set @Pass='SMTP服务器验证地址'
Set @SenderName='缺省发件人名称'
Set @AttachDir='E:\LOG\WebData\Jmail\'+Replace(Replace(Replace(Convert(varChar(19),GetDate(),120),'-',''),' ',''),':','')+'.txt'
--将Email地址分割符统一为分号
set @SplitStr=';'
Set @strTemp=@strRecipients+@SplitStr+'end'
Set @strTemp=Replace(@strTemp,',',';')
--判断是否有sql语句
If (@Sql is Null) Or (len(@Sql)=0)
Set @AttachDir=Null
Else
Begin
Declare @CmdStr varChar(200)
Set @CmdStr='bcp "'+@Sql+'" queryout '+@AttachDir+' -c'
EXEC master..xp_cmdshell @CmdStr
End
while CharIndex(@SplitStr,@strTemp,1)<>0
Begin
Set @email=left(@strTemp,CharIndex(@SplitStr,@strTemp,1)-1)
Set @strTemp=right(@strTemp,len(@strTemp)-len(@email)-1)
If (@Sender Is Null) Or (Len(@Sender)=0)
Set @SenderAddress=@DefaultSender
Else
Set @SenderAddress=@Sender
Print @email
--调用sp_jmail_send发送邮件
EXEC sp_jmail_send @sender=@SenderAddress,@sendername=@SenderName,
@serveraddress=@MailServer,@MailServerUserName=@User,@MailServerPassword=@Pass,
@recipient=@email,@subject=@strSubject,@mailbody=@strMessage,@attachment=@AttachDir
End
此存储过程只扩展了Sql查询结果附件发送,如果你要发送标准附件,请直接使用sp_jmail_send存储过程或者自行扩展功能。
以下代码仅供javascript初学者学习之用,请勿使用于非法途径,造成任何不好的后果与作者无关。
<script language=javascript>
/**
* @Author 54powerman
* QQ:19486554
* Mail:54powerman@163.com
* @Version 2.0 (1.0好像已经失效,所以去掉iframe,用弹出窗口处理(自动关闭))
* @Description
* 刷天网币的代码,使用方法:首先登录天网论坛,然后打开该网页即可,不影响工作。
* 技巧:运行多个Maxthon进程--打开一个maxthon以进程方式登录bbs,打开本页,同样的办法,再打开一个Maxthon进程;注意是进程,不是标签。
* 此技巧作者也没有试验,谁试验确定是否有效,请通知我一下。谢谢。
* @Params
* STARTTID 整数,帖子开始ID
* ENDTID 整数,帖子结束ID,要求大于STARTID
* INTERVAL 每次刷新间隔时间,推荐120秒
*/
var tid;
var STARTTID=10000;
var ENDTID=16857382; //建议:定期(如一个月)获取最大(相对)的ID写在这里
var INTERVAL=120;
var newWin;
function isInt(str)
{
for (Count=0; Count < str.length; Count++)
{
if(str.charAt(Count)<'0'||str.charAt(Count)>'9') return false;
}
return true;
}
function request(str)
{
var queryStr=window.location.search;
if(queryStr==null||queryStr.length==0)
return "";
var posStart=0;
var posEnd=0;
posStart=queryStr.indexOf(str+"=")+str.length+1;
if(posStart<0)
{
return "";
}
posEnd=queryStr.indexOf("%26",posStart)
if(posEnd<0)
{
Tid=queryStr.substr(posStart);
return Tid;
}
else if(posEnd<=posStart)
{
return "";
}
else
{
Tid=queryStr.substring(posStart,posEnd);
return Tid;
}
}
function getTid()
{
var Tid;
Tid=request("tid");
if(Tid==null||Tid.length==0||!isInt(Tid)||parseInt(Tid)<STARTTID)
Tid=ENDTID.toString();
window.urlString.innerHTML=Tid;
return Tid;
}
function redirect()
{
tid=getTid();
window.urlString.innerHTML="<p><BR><BR><center>正在请求帖子"+tid+"。</center>";
newWin=window.open("http://pfw.sky.net.cn/bbs/viewthread.php?tid="+tid+"&gid=4");
window.setTimeout(reloadPage,INTERVAL*1000);
}
function reloadPage()
{
if(newWin)
{newWin.close();}
tid=getTid();
var newTid=parseInt(tid)-1;
window.location=window.location.pathname+"?tid="+newTid.toString();
}
window.setTimeout(redirect,3000);
</script><div id=urlString name=urlString></div>
当你打开浏览器,自由地游弋于浩如烟海的互联网世界之时,是否也沉迷于下载各种实用软件?其中也许有很大一部分就是网络工具吧!但请你不要忽视你的面前——windows(包括win98和nt)作系统中本来就带有不少的网络实用工具,虽然比较简单,却并不简陋。本着“简单就是美”的原则,下面就为你展现windows网络实用工具的丰采……
ping
ping是个使用频率极高的实用程序,用于确定本地主机是否能与另一台主机交换(发送与接收)数据报。根据返回的信息,你就可以推断tcp/ip参数是否设置得正确以及运行是否正常。需要注意的是:成功地与另一台主机进行一次或两次数据报交换并不表示tcp/ip配置就是正确的,你必须执行大量的本地主机与远程主机的数据报交换,才能确信tcp/ip的正确性。
简单的说,ping就是一个测试程序,如果ping运行正确,你大体上就可以排除网络访问层、网卡、modem的输入输出线路、电缆和路由器等存在的故障,从而减小了问题的范围。但由于可以自定义所发数据报的大小及无休止的高速发送,ping也被某些别有用心的人作为ddos(拒绝服务攻击)的工具,前段时间yahoo就是被黑客利用数百台可以高速接入互联网的电脑连续发送大量ping数据报而瘫痪的。
按照缺省设置,windows上运行的ping命令发送4个icmp(网间控制报文协议)回送请求,每个32字节数据,如果一切正常,你应能得到4个回送应答。
ping能够以毫秒为单位显示发送回送请求到返回回送应答之间的时间量。如果应答时间短,表示数据报不必通过太多的路由器或网络连接速度比较快。ping还能显示ttl(time to live存在时间)值,你可以通过ttl值推算一下数据包已经通过了多少个路由器:源地点ttl起始值(就是比返回ttl略大的一个2的乘方数)-返回时ttl值。例如,返回ttl值为119,那么可以推算数据报离开源地址的ttl起始值为128,而源地点到目标地点要通过9个路由器网段(128-119);如果返回ttl值为246,ttl起始值就是256,源地点到目标地点要通过9个路由器网段。
通过ping检测网络故障的典型次序
正常情况下,当你使用ping命令来查找问题所在或检验网络运行情况时,你需要使用许多ping命令,如果所有都运行正确,你就可以相信基本的连通性和配置参数没有问题;如果某些ping命令出现运行故障,它也可以指明到何处去查找问题。下面就给出一个典型的检测次序及对应的可能故障:
ping 127.0.0.1——这个ping命令被送到本地计算机的ip软件,该命令永不退出该计算机。如果没有做到这一点,就表示tcp/ip的安装或运行存在某些最基本的问题。
ping 本机ip——这个命令被送到你计算机所配置的ip地址,你的计算机始终都应该对该ping命令作出应答,如果没有,则表示本地配置或安装存在问题。出现此问题时,局域网用户请断开网络电缆,然后重新发送该命令。如果网线断开后本命令正确,则表示另一台计算机可能配置了相同的ip地址。
ping 局域网内其他ip——这个命令应该离开你的计算机,经过网卡及网络电缆到达其他计算机,再返回。收到回送应答表明本地网络中的网卡和载体运行正确。但如果收到0个回送应答,那么表示子网掩码(进行子网分割时,将ip地址的网络部分与主机部分分开的代码)不正确或网卡配置错误或电缆系统有问题。
ping 网关ip——这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够作出应答。
ping 远程ip——如果收到4个应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问internet(但不排除isp的dns会有问题)。
ping localhost——localhost是个作系统的网络保留名,它是127.0.0.1的别名,每太计算机都应该能够将该名字转换成该地址。如果没有做到这一带内,则表示主机文件(/windows/host)中存在问题。
ping www.yahoo.com——对这个域名执行ping命令,你的计算机必须先将域名转换成ip地址,通常是通过dns服务器 如果这里出现故障,则表示dns服务器的ip地址配置不正确或dns服务器有故障(对于拨号上网用户,某些isp已经不需要设置dns服务器了)。顺便说一句:你也可以利用该命令实现域名对ip地址的转换功能。
如果上面所列出的所有ping命令都能正常运行,那么你对你的计算机进行本地和远程通信的功能基本上就可以放心了。但是,这些命令的成功并不表示你所有的网络配置都没有问题,例如,某些子网掩码错误就可能无法用这些方法检测到。
ping命令的常用参数选项
ping ip -t——连续对ip地址执行ping命令,直到被用户以ctrl+c中断。
ping ip -l 2000——指定ping命令中的数据长度为2000字节,而不是缺省的32字节。
ping ip -n——执行特定次数的ping命令。
netstat
netstat用于显示与ip、tcp、udp和icmp协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
如果你的计算机有时候接受到的数据报会导致出错数据删除或故障,你不必感到奇怪,tcp/ip可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的ip数据报相当大的百分比,或者它的数目正迅速增加,那么你就应该使用netstat查一查为什么会出现这些情况了。
netstat的一些常用选项:
netstat -s——本选项能够按照各个协议分别显示其统计数据。如果你的应用程序(如web浏览器)运行速度比较慢,或者不能显示web页之类的数据,那么你就可以用本选项来查看一下所显示的信息。你需要仔细查看统计数据的各行,找到出错的关键字,进而确定问题所在。
netstat -e——本选项用于显示关于以太网的统计数据。它列出的项目包括传送的数据报的总字节数、错误数、删除数、数据报的数量和广播的数量。这些统计数据既有发送的数据报数量,也有接收的数据报数量。这个选项可以用来统计一些基本的网络流量)。
netstat -r——本选项可以显示关于路由表的信息,类似于后面所讲使用route print命令时看到的 信息。除了显示有效路由外,还显示当前有效的连接。
netstat -a——本选项显示一个所有的有效连接信息列表,包括已建立的连接(established),也包括监听连接请求(listening)的那些连接。
netstat -n——显示所有已建立的有效连接。
netstat的妙用
经常上网的人一般都使用icq的,不知道你有没有被一些讨厌的人骚扰得不敢上线,想投诉却又不知从和下手?其实,你只要知道对方的ip,就可以向他所属的isp投诉了。但怎样才能通过icq知道对方的ip呢?如果对方在设置icq时选择了不显示ip地址,那你是无法在信息栏中看到的。其实,你只需要通过netstat就可以很方便的做到这一点:当他通过icq或其他的工具与你相连时(例如你给他发一条icq信息或他给你发一条信息),你立刻在dos prompt下输入netstat -n或netstat -a就可以看到对方上网时所用的ip或isp域名了。甚至连所用port都完全暴露了,如果你想给他一些教训,这些信息已经足够……
ipconfig
ipconfig实用程序和它的等价图形用户界面——windows 95/98中的winipcfg可用于显示当前的tcp/ip配置的设置值。这些信息一般用来检验人工配置的tcp/ip设置是否正确。但是,如果你的计算机和所在的局域网使用了动态主机配置协议(dynamic host configuration protocol,dhcp——windows nt下的一种把较少的ip地址分配给较多主机使用的协议,类似于拨号上网的动态ip分配),这个程序所显示的信息也许更加实用。这时,ipconfig可以让你了解你的计算机是否成功的租用到一个ip地址,如果租用到则可以了解它目前分配到的是什么地址。了解计算机当前的ip地址、子网掩码和缺省网关实际上是进行测试和故障分析的必要项目。
最常用的选项:
ipconfig——当使用ipconfig时不带任何参数选项,那么它为每个已经配置了的接口显示ip地址、子网掩码和缺省网关值