仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 539|回复: 13
打印 上一主题 下一主题

[学习教程] JAVA教程之利用ESMTP(SMTP)举行邮件发送

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:23:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。smtp利用ESMTP/SMTP举行邮件发送,碰到一个成绩:

假设附件为图片gif文件,发送没有成绩。可是吸收后,没法显现图片。敬请妙手指导!!!!!



/*
*Createdon2004-12-21
*
*TODOTochangethetemplateforthisgeneratedfilegoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/

/**
*@authorAdministrator
*
*TODOTochangethetemplateforthisgeneratedtypecommentgoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
publicclassFoxMailMain{

publicstaticvoidmain(String[]args){

FoxMailfoxMail=newFoxMail("smtp.citiz.net",25);
foxMail.setMailUserName("zhou");
foxMail.setMailUserPass("abcdefgf");
foxMail.setMailTo("aaaaa@citiz.net");
foxMail.setMailFrom("bbbb@citiz.net");
foxMail.setMailShowTo("tom");
foxMail.setMailShowFrom("Nike");
foxMail.setMailSubject("hello用中文主题");
foxMail.setMailBody("welcomeforyou.mmm.中文呀.aaa
载来一行");
foxMail.setMailAttachFile(newString[]{"D:eclipse_projectworkspacePROJECT_emailsrcpic.gif"});

if(foxMail.sendMail()){
System.out.println("OK.");
}else{
System.out.println("False.");
}

}
}


FoxMail.java代码

importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.Socket;
importjava.text.DateFormat;
importjava.text.SimpleDateFormat;
importjava.util.Date;

/*
*Createdon2004-12-21
*
*TODOTochangethetemplateforthisgeneratedfilegoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/

/**
*@authorAdministrator
*
*TODOTochangethetemplateforthisgeneratedtypecommentgoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
publicclassFoxMail{

privatefinalstaticbyteLOCATION_TO_SCREEN=1;//Log信息输入地位1=输入到屏幕
privatefinalstaticDateFormatdateformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");//日记用日期格局
privatefinalstaticStringEND_FLAG="
";//SMTP/ESMTP命令停止标志
privatefinalstaticStringEMAIL_ATTACH_SIGN="=====att";//邮件附件的暗示标记

privateStringsmtpServer=null;//邮件发送服务器域名
privateintsmtpPort=25;//邮件发送端口
privateSocketclientMailSocket;//邮件毗连socket
privateInputStreaminData;//吸收数据
privateOutputStreamoutData;//发送数据
privateStringmailUserName=null;//邮件账户
privateStringmailUserPass=null;//邮件账户的暗码
privateStringmailTo=null;//邮件发送方针
privateStringmailFrom=null;//邮件发送人
privateStringmailSubject=null;//邮件主题
privateStringmailBody=null;//邮件注释
privateStringmailShowTo=null;//邮件内容仰面部分-邮件发送方针
privateStringmailShowFrom=null;//邮件内容仰面部分-邮件发送人
privateString[]mailAttachFile=null;//邮件附件对应的当地文件名(包括相对路径)

/**
*@returnReturnsthemailAttachFile.
*/
publicString[]getMailAttachFile(){
returnmailAttachFile;
}
/**
*@parammailAttachFileThemailAttachFiletoset.
*/
publicvoidsetMailAttachFile(String[]mailAttachFile){
this.mailAttachFile=mailAttachFile;
}
/**
*@returnReturnsthemailShowFrom.
*/
publicStringgetMailShowFrom(){
returnmailShowFrom;
}
/**
*@parammailShowFromThemailShowFromtoset.
*/
publicvoidsetMailShowFrom(StringmailShowFrom){
this.mailShowFrom=mailShowFrom;
}
/**
*@returnReturnsthemailShowTo.
*/
publicStringgetMailShowTo(){
returnmailShowTo;
}
/**
*@parammailShowToThemailShowTotoset.
*/
publicvoidsetMailShowTo(StringmailShowTo){
this.mailShowTo=mailShowTo;
}


/**
*@returnReturnsthemailBody.
*/
publicStringgetMailBody(){
returnmailBody;
}
/**
*@parammailBodyThemailBodytoset.
*/
publicvoidsetMailBody(StringmailBody){
this.mailBody=mailBody;
}
/**
*@returnReturnsthemailFrom.
*/
publicStringgetMailFrom(){
returnmailFrom;
}
/**
*@parammailFromThemailFromtoset.
*/
publicvoidsetMailFrom(StringmailFrom){
this.mailFrom=mailFrom;
}
/**
*@returnReturnsthemailSubject.
*/
publicStringgetMailSubject(){
returnmailSubject;
}
/**
*@parammailSubjectThemailSubjecttoset.
*/
publicvoidsetMailSubject(StringmailSubject){
this.mailSubject=mailSubject;
}
/**
*@returnReturnsthemailTo.
*/
publicStringgetMailTo(){
returnmailTo;
}
/**
*@parammailToThemailTotoset.
*/
publicvoidsetMailTo(StringmailTo){
this.mailTo=mailTo;
}
/**
*@returnReturnsthemailUserName.
*/
publicStringgetMailUserName(){
returnmailUserName;
}
/**
*@parammailUserNameThemailUserNametoset.
*/
publicvoidsetMailUserName(StringmailUserName){
this.mailUserName=mailUserName;
}
/**
*@returnReturnsthemailUserPass.
*/
publicStringgetMailUserPass(){
returnmailUserPass;
}
/**
*@parammailUserPassThemailUserPasstoset.
*/
publicvoidsetMailUserPass(StringmailUserPass){
this.mailUserPass=mailUserPass;
}

/**
*Constrctor
*@param_smtpServer
*@param_smtpPort
*/
publicFoxMail(StringsmtpServer,intsmtpPort){
this.smtpServer=smtpServer;
this.smtpPort=smtpPort;
}


/**
*写日记信息
*@param_log
*@param_locaton
*/
publicstaticvoidprintLogger(String_log,int_locaton){
switch(_locaton){
caseLOCATION_TO_SCREEN:
System.out.println("["+dateformat.format(newDate())+"]"+_log);
break;
default:
System.out.println("["+dateformat.format(newDate())+"]"+_log);
}//switch(_locaton)
}//end

/**
*
*@return
*/
publicbooleancreateConnection(){
try{
freeAll();
clientMailSocket=newSocket(smtpServer,smtpPort);
printLogger("Connecttoemailserver"+smtpServer+"onport"+smtpPort,LOCATION_TO_SCREEN);
inData=clientMailSocket.getInputStream();
outData=clientMailSocket.getOutputStream();
fetchCMDResult();//当初次毗连服务器后有前往值,必需取走该前往值,不然前面命令的前往值没法判别
}catch(IOExceptione){
returnfalse;
}
returntrue;
}

publicstaticStringresponse(InputStreamin){
byte[]buffer=newbyte[1024];
StringBufferinData=newStringBuffer();
intn=0;
try{
n=in.read(buffer);
inData.append(newString(buffer,0,n));

}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
printLogger("CMDResult="+inData.toString(),LOCATION_TO_SCREEN);
returninData.toString();

}

publicstaticvoidsend(Strings,OutputStreamout){
byte[]buffer=s.getBytes();
try{
out.write(buffer);
out.flush();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}


publicStringfetchCMDResult(){
returnresponse(inData);
}

publicbooleansendCmd(String_cmd){
if(_cmd!=null){
send(_cmd,outData);
printLogger("CMD="+_cmd,LOCATION_TO_SCREEN);
}
returntrue;
}

/**
*发送邮件
*服务器为ESMTP时分接纳本办法
*@returntrue=sendok,false=sendfailed
*/
publicbooleansendMail(){

//翻开与邮件服务器的毗连
if(!createConnection()){
returnfalse;
}

StringBuffertheContent=null;

//EHLO
theContent=newStringBuffer();
theContent.append("EHLO");
theContent.append(smtpServer);
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("250")==-1)returnfalse;
//AUTHLOGIN
theContent=newStringBuffer();
theContent.append("AUTHLOGIN");
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("334")==-1)returnfalse;
//用户名
theContent=newStringBuffer();
theContent.append(Base64Encode(this.mailUserName));
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("334")==-1)returnfalse;
//暗码
theContent=newStringBuffer();
theContent.append(Base64Encode(this.mailUserPass));
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("235")==-1)returnfalse;
//邮件发送者
theContent=newStringBuffer();
theContent.append("MAILFROM:");
theContent.append("<");
theContent.append(this.mailFrom);
theContent.append(">");
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("250")==-1)returnfalse;
//邮件发送方针地点
theContent=newStringBuffer();
theContent.append("RCPTTO:");
theContent.append("<");
theContent.append(this.mailTo);
theContent.append(">");
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("250")==-1)returnfalse;

//邮件内容-入手下手
theContent=newStringBuffer();
theContent.append("DATA");
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("354")==-1)returnfalse;
//邮件内容-邮件仰面部分
theContent=newStringBuffer();
theContent.append("From:");
theContent.append(this.mailShowFrom);
theContent.append(END_FLAG);
theContent.append("To:");
theContent.append(this.mailShowTo);
theContent.append(END_FLAG);
theContent.append("Subject:");
theContent.append(this.mailSubject);
theContent.append(END_FLAG);
theContent.append("Mime-Version:1.0");
theContent.append(END_FLAG);


theContent.append("Content-Type:multipart/mixed;Boundary="");//设置附件暗示符
theContent.append(EMAIL_ATTACH_SIGN);
theContent.append(""");
theContent.append(END_FLAG);//在注释内容前必需有2个END_FLAG标志
theContent.append(END_FLAG);
sendCmd(theContent.toString());

//邮件内容-注释部分
theContent=newStringBuffer();
theContent.append("--");
theContent.append(EMAIL_ATTACH_SIGN);
theContent.append(END_FLAG);
theContent.append("Content-type:text/plain;");
theContent.append(END_FLAG);
theContent.append("Content-Transfer-Encoding:base64");
theContent.append(END_FLAG);
theContent.append(END_FLAG);
theContent.append(Base64Encode(this.mailBody));
theContent.append(END_FLAG);
theContent.append(END_FLAG);
sendCmd(theContent.toString());

//邮件内容-附件部分
//mailAttachFile=null;
if(mailAttachFile!=null&&mailAttachFile.length>0){
for(inti=0;i<this.mailAttachFile.length;i++){
//发送附件仰面
theContent=newStringBuffer();
theContent.append("--");
theContent.append(EMAIL_ATTACH_SIGN);
theContent.append(i);
theContent.append(END_FLAG);
theContent.append("Content-Type:image/gif;name="aaa.gif"");
theContent.append(END_FLAG);
theContent.append("Content-Transfer-Encoding:base64");
theContent.append(END_FLAG);
theContent.append("Content-Disposition:attachment;name="aaa.gif"");
theContent.append(END_FLAG);
theContent.append(END_FLAG);
sendCmd(theContent.toString());

//发送附件内容
sendBase64Data(newStringBuffer(Base64Encode(readFile(mailAttachFile[i]))));

//发送附件停止
/*
theContent=newStringBuffer();
theContent.append(END_FLAG);
theContent.append("--");
theContent.append(EMAIL_ATTACH_SIGN);
theContent.append(i);
theContent.append("--");
theContent.append(END_FLAG);
sendCmd(theContent.toString());
*/
}

}


//发送附件停止
theContent=newStringBuffer();
theContent.append(END_FLAG);
theContent.append(END_FLAG);
theContent.append("--");
theContent.append(EMAIL_ATTACH_SIGN);
theContent.append("--");
theContent.append(END_FLAG);
sendCmd(theContent.toString());

//邮件内容-停止标志
theContent=newStringBuffer();
theContent.append(END_FLAG);
theContent.append(".");
theContent.append(END_FLAG);
sendCmd(theContent.toString());
if(fetchCMDResult().indexOf("250")==-1)returnfalse;

//加入断开服务器毗连
theContent=newStringBuffer();
theContent.append("QUIT");
theContent.append(END_FLAG);
sendCmd(theContent.toString());
fetchCMDResult();

//邮件发送乐成后开释资本
freeAll();
theContent=null;

returntrue;//邮件发送乐成
}

/**
*发送经由Base64编码后的数据
*@paramsrc
*/
publicvoidsendBase64Data(StringBuffersrcData){
intLEN_CMD_DATA=76;
intstartIndex=0;
inttotalLength=0;
if(srcData!=null&&srcData.length()>0){
totalLength=srcData.length();
while(true){
if(startIndex+LEN_CMD_DATA<totalLength){
sendCmd(srcData.substring(startIndex,startIndex+LEN_CMD_DATA));
sendCmd(END_FLAG);
}else{
sendCmd(srcData.substring(startIndex,totalLength));
sendCmd(END_FLAG);
break;
}
startIndex=startIndex+LEN_CMD_DATA;
}
}
}

/**
*开释一切资本
*
*/
publicvoidfreeAll(){
if(inData!=null){
try{
inData.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
inData=null;
}

if(outData!=null){
try{
outData.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
outData=null;
}

if(clientMailSocket!=null){
try{
clientMailSocket.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
clientMailSocket=null;
}

}


/**
*读取文件内容
*@paramfileName
*@return
*/
publicStringreadFile(StringfileName){
byte[]fileBuffer=newbyte[1024];
intrealSize=0;
StringBufferreadContent=newStringBuffer();
try{
InputStreaminFile=newFileInputStream(newFile(fileName));
while(true){
realSize=inFile.read(fileBuffer);
if(-1==realSize)break;
readContent.append(newString(fileBuffer,0,realSize));
}
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnreadContent.toString();
}

/**
*Base64编码函数
*将指定的字符串编码为Base64格局的字符串
*@paramsrc
*@return
*/
publicstaticStringBase64Encode(Stringsrc){
if(src==null||src.length()==0)
return"";
StringEncodingTable="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
byte[]Buffer=src.getBytes();
intReadNow,i,res;
char[]WriteBuf=newchar[4];
char[]Buf=newchar[3];
StringEncodedStr="";
intReadIndex=0;
intLen=Buffer.length;
booleanisEnd;
intBytesWritten=0;
ReadNow=0;
do{
isEnd=false;
for(i=0;i<3;i++){
if(ReadIndex>=Len){
isEnd=true;
ReadNow=i;
break;
}
Buf[i]=(char)(((byte)Buffer[ReadIndex])&0x00FF);
ReadIndex=ReadIndex+1;
}
if(isEnd)
break;
WriteBuf[0]=EncodingTable.charAt((Buf[0]>>2)&0x003F);
WriteBuf[1]=EncodingTable
.charAt(((Buf[0]&3)<<4|(Buf[1]>>4))&0x003F);
WriteBuf[2]=EncodingTable
.charAt(((Buf[1]&15)<<2|(Buf[2]>>6))&0x003F);
WriteBuf[3]=EncodingTable.charAt((Buf[2]&63)&0x003F);
for(i=0;i<4;i++)
EncodedStr=EncodedStr+WriteBuf[i];
BytesWritten=BytesWritten+4;
if((BytesWritten%76)==0){
EncodedStr=EncodedStr+"";
}
}while(ReadNow!=3);
if(ReadNow<3){
switch(ReadNow){
case1:
WriteBuf[0]=EncodingTable.charAt((Buf[0]>>2)&0x003F);
WriteBuf[1]=EncodingTable
.charAt(((Buf[0]&3)<<4)&0x003F);
WriteBuf[2]==;
WriteBuf[3]==;
for(i=0;i<4;i++)
EncodedStr=EncodedStr+WriteBuf[i];
break;
case2:
WriteBuf[0]=EncodingTable.charAt((Buf[0]>>2)&0x003F);
WriteBuf[1]=EncodingTable
.charAt(((Buf[0]&3)<<4|(Buf[1]>>4))&0x003F);
WriteBuf[2]=EncodingTable
.charAt(((Buf[1]&15)<<2)&0x003F);
WriteBuf[3]==;
for(i=0;i<4;i++)
EncodedStr=EncodedStr+WriteBuf[i];
break;
default:
break;
}
}
return(EncodedStr);
}
}




如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉,
老尸 该用户已被删除
沙发
发表于 2015-1-20 23:51:23 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
因胸联盟 该用户已被删除
板凳
发表于 2015-1-30 07:52:19 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-2 06:44:00 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
分手快乐 该用户已被删除
5#
发表于 2015-2-7 16:53:13 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
小魔女 该用户已被删除
6#
发表于 2015-2-8 07:31:18 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
再现理想 该用户已被删除
7#
发表于 2015-2-10 08:13:25 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
海妖 该用户已被删除
8#
发表于 2015-3-1 04:04:00 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
乐观 该用户已被删除
9#
发表于 2015-3-1 04:48:47 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-10 12:48:02 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
若天明 该用户已被删除
11#
发表于 2015-3-11 12:39:17 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
精灵巫婆 该用户已被删除
12#
发表于 2015-3-11 19:31:20 | 只看该作者
是一种使用者不需花费很多时间学习的语言
金色的骷髅 该用户已被删除
13#
发表于 2015-3-19 09:53:55 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
深爱那片海 该用户已被删除
14#
发表于 2015-3-27 17:10:51 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 14:01

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表