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

Megalayer美国独立服务器新用户首月优惠350元(30M优化不限流量)

Megalayer 商家在开始看到有提供香港服务器、香港站群服务器的时候有介绍过,后来就一直没有怎么关注。但是前几天有看到网友使用到他们家的美国独立服务器问其如何的,但是我没有使用过就不好评论,这不前几天也有介绍到Megalayer美国独立服务器。以及我们也有看到商家有提供美国站群服务器和美国大带宽服务器产品,可选30M不限制流量CN2优化线路,以及100M不限制流量国际带宽线路。新年元旦后,Me...

90IDC-香港云主机,美国服务器,日本KVM高性能云主机,创建高性能CLOUD只需60秒即可开通使用!

官方网站:点击访问90IDC官方网站优惠码:云八五折优惠劵:90IDCHK85,仅适用于香港CLOUD主机含特惠型。活动方案:年付特惠服务器:CPU均为Intel Xeon两颗,纯CN2永不混线,让您的网站更快一步。香港大浦CN2測速網址: http://194.105.63.191美国三网CN2測速網址: http://154.7.13.95香港购买地址:https://www.90idc.ne...

鲸云10美元,香港BGPRM 1核 1G 10Mbps峰值带宽 1TB流量,江西CN2-NAT 1核 512MB内存 100M带宽 ,

WHloud Official Notice(鲸云官方通知)(鲸落 梦之终章)]WHloud RouMu Cloud Hosting若木产品线云主机-香港节点上新预售本次线路均为电信CN2 GIA+移动联通BGP,此机型为正常常规机,建站推荐。本次预售定为国庆后开通,据销售状况决定,照以往经验或有咕咕的可能性,但是大多等待时间不长。均赠送2个快照 2个备份,1个默认ipv4官方网站:https:/...

smtp服务器为你推荐
免费vps服务器如何免费搭建自己的vps服务器台湾主机台湾版本的主机好不好?香港虚拟主机推荐一下香港的虚拟主机公司!免备案虚拟主机免备案的虚拟主机在哪买好云南虚拟主机用哪家虚拟主机?(美橙互联还是西部数码)淘宝虚拟主机淘宝买万网虚拟主机怎么变别真假西安虚拟主机如何评价虚拟主机的优劣m3型虚拟主机谁在用中国万网M3虚拟主机?怎么样?域名网站哪里可以给你免费的域名做个网站买域名买域名怎么买?
手机域名注册 重庆vps租用 最新代理服务器地址 香港vps99idc 香港托管 免备案cdn sub-process 一点优惠网 网通服务器ip php免费空间 cpanel空间 bgp双线 河南m值兑换 可外链网盘 空间技术网 能外链的相册 web服务器搭建 万网空间管理 免费外链相册 smtp服务器地址 更多