命令用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. . . .  。

易探云:香港物理机服务器仅550元/月起;E3-1230/16G DDR3/SATA 1TB/香港BGP/20Mbps

易探云怎么样?易探云(yitanyun.com)是一家知名云计算品牌,2017年成立,从业4年之久,目前主要从事出售香港VPS、香港独立服务器、香港站群服务器等,在售VPS线路有三网CN2、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。目前,易探云推出免备案香港物理机服务器性价比很高,E3-1230 8 核*1/16G DDR3/SATA 1TB/香港BGP线路/20Mbps/不限流量,仅...

妮妮云(30元),美国300G防御 2核4G 107.6元,美国高速建站 2核2G

妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款,超过2天不退款 物...

NameCheap黑色星期五和网络礼拜一

如果我们较早关注NameCheap商家的朋友应该记得前几年商家黑色星期五和网络星期一的时候大促采用的闪购活动,每一个小时轮番变化一次促销活动而且限量的。那时候会导致拥挤官网打不开迟缓的问题。从去年开始,包括今年,NameCheap商家比较直接的告诉你黑色星期五和网络星期一为期6天的活动。没有给你限量的活动,只有限时六天,这个是到11月29日。如果我们有需要新注册、转入域名的可以参加,优惠力度还是比...

smtp服务器为你推荐
免费国内空间现在国内比较好的免费网站空间有那个啊?域名服务商如何更换域名服务商网站域名空间哪个网站的域名空间的便宜?php虚拟空间普通网站需要多大空间?本人新手php学习者,想买个虚拟空间用来放自己做的一些企业站,只是练习用途asp网站空间什么是ASP空间?免费网站空间申请如何申请到免费的网站空间国内最好的虚拟主机国内安全性最好的虚拟主机空间商有哪些?100m虚拟主机100M虚拟主机有多大,能放多少东西虚拟主机测评虚拟主机哪个最好台湾虚拟主机问 美国、香港、台湾虚拟主机哪个好
猫咪av永久最新域名 php主机租用 免费linux主机 sugarhosts sharktech 阿里云邮箱登陆首页 赵容 blackfriday 英语简历模板word 双12活动 免费ddos防火墙 html空间 赞助 速度云 域名和空间 qq云端 腾讯总部在哪 万网空间管理 空间登入 路由跟踪 更多