命令用Java实现SMTP服务器.doc

smtp服务器  时间:2021-01-14  阅读:()

用Java实现SMTP服务器

子邮件传递可以由多种协议来实现。 目前在Inter网上最流行的三种电子邮件协议是S MTP、 P OP 3和IMAP下面分别简单介绍。

◆S MTP协议

简单邮件传输协议(S imp leMailTrans ferProto co l,S MTP)是一个运行在T CP/IP之上的协议用它发送和接收电子邮件。 S MTP服务器在默认端口25上监听。 S MTP客户使用一组简单的、基于文本的命令与S MTP服务器进行通信。在建立了一个连接后 为了接收响应 S MT P客户首先发出一个命令来标识它们的电子邮件地址。如果S MT P服务器接受了发送者发出的文本命令它就利用一个O K 响应和整数代码确认每一个命令。客户发送的另一个命令意味着电子邮件消息体的开始消息体以一个圆点.加上回车符终止。

◆P OP 3协议

邮局协议(PostOfficeProtocolVersion3,POP3)提供了一种对邮件消息进行排队的标准机制这样接收者以后才能检索邮件。 P OP 3服务器也运行在T CP/IP之上并且在默认端口110上监听。在客户和服务器之间进行了初始的会话之后基于文本的命令序列可以被交换。 POP3客户利用用户名和口令向POP3服务器认证。 POP3中的认证是在一种未加密的会话基础之上进行的。 POP3客户发出一系列命令发送给P OP 3服务器如请求客户邮箱队列的状态、请求列出的邮箱队列的内容和请求检索实际的消息。 POP3代表一种存储转发类型的消息传递服务。现在大部分邮件服务器都采用S MTP发送邮件 同时使用P OP 3接收电子邮件消息。

◆IMAP协议

Inter消息访问协议(Int erMes s ageAc c essPro to co l,IMAP)是一种电子邮件消息排队服务它对POP3的存储转发限制提供了重要的改进。 IMAP也使用基于文本命令的语法在TCP/IP上运行 IMAP服务器一般在默认端口 143监听。 IMAP服务器允许IMAP客户下载一个电子邮件的头信息并且不要求将整个消息从服务器下载至客户这一点与POP 3是相同的。 IMAP服务器提供了一种排队机制以接收消息 同时必须与S MTP相结合在一起才能发送消息。

下面以S MTP发送电子邮件为例讲解怎样用Java实现S MTP服务器应用功能从而完成邮件的发送的。

S MTP命令

S MTP协议是目前网上流行的发送E-Ma i l的协议 S MTP协议共有14条命令。不过发一封E-Mai l只需用如下5条命令就足够

了分别为

◆HELO<S P><d o main><C RLF> 与S MTP服务器握手传送本机域名

◆MA IL<S P>F RO M:<r eve rs e-p ath><C RLF> 传送发信者的信箱名称

◆RCPT<S P>TO:<forail的发送和设置我们设计一个S mtp Mail类它封装了与邮件服务器之间的So c ket通信操作 以及S MTP命令的发送和响应信息的接收。

编程技巧说明

1.设置窗体和组件

我们设计了一个Mai lS e nd F rame()类继承F rame对象作为容纳组件的主窗体。Main()函数实现将窗体启动时置于屏幕的正中央窗口定义代码如下pub lic s tatic vo idmain(S tring[]args){mailS endF rame mailS endF rame=neailS endF rame();

DimensionscreenSize=Toolkit.getDefaultToolkit().getS creenS ize();D imens ionframeS iz e=mailS endFrame.g etS ize();if(frameS ize.he ight>s creenS iz e.he ight){frameSize.height=screenSize.height;

}if(frameS ize.eS ize.ailS endFrame.s etLo c ation((s creenS ize.eS ize.eS ize.he i ght)/2);ma ilS endF rame.s etVis ib le(tru e);mailS endF rame.s ho e的S etLo c atio n()方法设置窗体的左上角坐标使窗体的中心和屏幕的中心正好重合从而将窗体居中。

//组件实例变量的定义

P anelp ane lMain=ne=nedBrows e=newButton();

1234下一页. .. .  。 P anelp ane lDo d S end=nedExit=ne,null);p anelUp.add(p ane l8,null);p anel8.add(nedBro dS end,null);p anel 10.add(cmdExit,null);p anelDo ailS endFrame(){try{

In it();

}c atc h(Exc ep tio ne){e.p rint S tac kTrac e();

}

} 单击发送按钮的事件处理实现用户填写邮件信息的收集和邮

件的发送操作。发送按钮的代码如下c md S end.addAc tio nL is tener(need(Ac t io nEv ent e){c md S end_ac tio nP erfo rmed(e);

}

}

实现c md S end_ac tio nP erfo rmed()方法如下vo id c md S end_ac tio nP erfo rmed(Ac tio nEv ente){mailS ender.s etF rom(txtF ro m.getText().trim());mailS ender.s etTo(txtTo.getText().trim());mailS ender.addHeader(Subject,txtSubj ect.getText().trim());mailS ender.addData(txtMail.getText());if(!lb lF ile.getText().trim().equals())mailS ender.addAttachment(lb lF ile.getText().trim());mailS ender.op en(txtS erver.getText().trim(),25);mailS ender.transmit();mailS ender.c lo s e();

} 单击退出按钮的事件处理实现程序的退出和窗体的关闭。退出按钮和侦听器的程序代码如下c mdExit.ad dAc tio nL is ten er(need(Ac t io nEv ente){c mdExit_ac t io nP erfo rmed(e);

}

}th is.ad d ed()和this_d Exit_ac tio nP erfo rm

上一页1234下一页.. . .  。 ed(Ac tio nEvent e){

S ys tem.exit(0);

}vo idthis_.exit(0);

} 3.S mtp Mail类的实现

采用Op en()方法建立与邮件服务器之间的TCP/IP连接创建套接字并且得到发送命令所用的输出流S end和接收服务器相应所用的输入流Rev。Op en()方法的代码如下pub lic intop en(S trings erverName,intp ort){try{mailS o cket=nee,p ort);s end=neailS o c ket.getOutputS tream(),true);rec v=neRead er(ma ilS o c ket.getInp utS tream()));

S trings 1=recv.readLine();c harc=s 1.c harAt(0);if((c=='4')|(c=='5'))return0;

}

c atc h(Exc ep tio ne){return0;

}return 1;

} 在S mtp Mail类中通过Trans mit()方法完成发送任务。Trans mit()方法的代码如下public inttransmit(){booleanflag=true;

//发送HELO命令if(d o main.leng th()!=0){int i=s end S tring(HE LO+do main);if(i!=1)return0;

}

//发送MAILFROM命令(发件人)if(fro m.len gth()!=0){intj=s end S tring(MAILF RO M:+fro m);if(j!=1)return0;

}

//发送RCPTTO命令(收件人)if(to.le ngt h()!=0){intk=s end S tring(RC P TT O:+to);if(k!=1)return0;

}

//发送邮件正文(DATA命令)if(s end S tring(DATA)!=1)return0;

//发送邮件头信息for(intl=0;l<x_s et.s ize();l+=2){

S trings=(S trin g)x_s et.elem entAt(l);s end.p rint ln(s+:+x_s et.ele mentAt(l+1));

}

//发送时间及相关内容格式说明if(x_s et.indexO f(Date)<0)s end.p rint ln(D ate:+(n e.o ut.p rint(s 1);return0;

}if(s 1.le ngth()==0)return0;c harc=s 1.c harAt(0);

return!((c=='4')|(c=='5'))?1:0;

} 使用Close()方法来关闭与服务器之间的套接字连接。该方法发送QUIT命令收到响应消息后才真正关闭连接。 Close()方法的代码如下publicintclose(){int i=0;try{i+=s end S tring(Q UIT);mailS ocket.clo s e();

}c atc h(Exc ep tio ne){return0;

}return i==0?1:0;

} mailS e ndF rame.j ava源程序代码如下imp ortjava.ap ortjava.aailS endFrameextend s F rame{s mtp MailmailS e nder=netp Mail();

P anelp ane lMain=ne=nedBro ail=newTextAre a();

P anelpanel1

上一页1234下一页.. . .  。 0=nedS end=nedExit=nea ilS e ndF rame(){try{

In it();

}c atc h(Exc ep tio ne){e.p rint S tac kTrac e();

}

}pub lic s tatic vo idmain(S tring[]args){mailS endF rame mailS endF rame=neailS endF rame();

DimensionscreenSize=Toolkit.getDefaultToolkit().getS creenS ize();D imens ionframeS iz e=mailS endFrame.g etS ize();if(frameS ize.he ight>s creenS iz e.he ight){frameSize.height=screenSize.height;

}if(frameS ize.eS ize.ailS endFrame.s etLo c ation((s creenS ize.eS ize.eS ize.hei ght)/2);ma ilS endF rame.s etVis ib le(tru e);ma ilS endF rame.s ho tp Mail.j ava的源代码imp ortjava.io.*;imp ortjava. .S ocket;importjava.util.*;publicclas s smtpMail{

p rivateb o o leans endC o nf=fals e;pub lic s tatic finalintOK=1;pub lic s tatic finalintERROR=0;p rivates tatic finalS tringT EXT=1;privates tatic finalS tringTF ILE=2;privates tatic finalS tringBF ILE=3;privates tatic finalS tringC P R=Java 1.0;privates tatic finalS tringMAI LER=X-Mailer;privates tatic finalintBUF F ER_S IZE=48;p rivate S tring DEL IM ET ER;p rivate S tring S EPARAT O R;privates tatic finalintHO TP_ERRO R_C O DE 1=52;privates tatic finalcharS MTP_ERROR_CODE2=53;privatestatic finalintfillc har=61;privates tatic finalS tringcvt=

ABCDEF GHIJKLMNOP QRS TUVail(){

DEL IMET ER=;

S EPARATO R=;mailS o cket=null;recv=null;s end=nul l;fro m=;to=;d o main=;x_s et=ne.getP rop erty(file.s ep arato r);

}

上一页1234. . . .  。

百纵科技云主机首月9元,站群1-8C同价,美国E52670*1,32G内存 50M 899元一月

百纵科技:美国高防服务器,洛杉矶C3机房 独家接入zenlayer清洗 带金盾硬防,CPU全系列E52670、E52680v3 DDR4内存 三星固态盘阵列!带宽接入了cn2/bgp线路,速度快,无需备案,非常适合国内外用户群体的外贸、搭建网站等用途。官方网站:https://www.baizon.cnC3机房,双程CN2线路,默认200G高防,3+1(高防IP),不限流量,季付送带宽美国洛杉矶C...

ParkinHost:俄罗斯离岸主机,抗投诉VPS,200Mbps带宽/莫斯科CN2线路/不限流量/无视DMCA/55折促销26.4欧元 /年起

外贸主机哪家好?抗投诉VPS哪家好?无视DMCA。ParkinHost今年还没有搞过促销,这次parkinhost俄罗斯机房上新服务器,母机采用2个E5-2680v3处理器、128G内存、RAID10硬盘、2Gbps上行线路。具体到VPS全部200Mbps带宽,除了最便宜的套餐限制流量之外,其他的全部是无限流量VPS。ParkinHost,成立于 2013 年,印度主机商,隶属于 DiggDigi...

阿里云秋季促销活动 轻量云服务器2G5M配置新购年60元

已经有一段时间没有分享阿里云服务商的促销活动,主要原因在于他们以前的促销都仅限新用户,而且我们大部分人都已经有过账户基本上促销活动和我们无缘。即便老用户可选新产品购买,也是比较配置较高的,所以就懒得分享。这不看到有阿里云金秋活动,有不错的促销活动可以允许产品新购。即便我们是老用户,但是比如你没有购买过他们轻量服务器,也是可以享受优惠活动的。这次轻量服务器在金秋活动中力度折扣比较大,2G5M配置年付...

smtp服务器为你推荐
美国vps服务器美国Vps 哪里的稳定,服务好,不是代购,主要是我新手,不太懂美国vps服务器请问国外VPS服务器去哪里买呀,急求?拜托了各位 谢谢独立ip主机独立ip主机的好处?域名备案查询如何查看网站备案已经成功vps主机vps主机好吗?是不是垃圾?免费国外空间那个国外空间好啊啊 价格便宜 急需查询ip如何查IP网址美国服务器托管美国网站服务器去哪里租?国外主机空间2个国外主机空间,都放了BLOG,看看哪个更快?虚拟空间哪个好虚拟空间哪个好
个人域名备案 174.127.195.202 xfce 中国特价网 申请个人网页 网站挂马检测工具 linux空间 数字域名 炎黄盛世 南通服务器 paypal注册教程 石家庄服务器托管 个人免费邮箱 服务器防御 双十二促销 第八届中美互联网论坛 comodo cdn免备案空间 免费服务器 网络安装 更多