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

DediPath($1.40),OpenVZ架构 1GB内存

DediPath 商家成立时间也不过三五年,商家提供的云服务器产品有包括KVM和OPENVZ架构的VPS主机。翻看前面的文章有几次提到这个商家其中机房还是比较多的。其实对于OPENVZ架构的VPS主机以前我们是遇到比较多,只不过这几年很多商家都陆续的全部用KVM和XEN架构替代。这次DediPath商家有基于OPENVZ架构提供低价的VPS主机。这次四折的促销活动不包括512MB内存方案。第一、D...

CloudCone:KVM月付1.99美元起,洛杉矶机房,支持PayPal/支付宝

CloudCone的[2021 Flash Sale]活动仍在继续,针对独立服务器、VPS或者Hosted email,其中VPS主机基于KVM架构,最低每月1.99美元,支持7天退款到账户,可使用PayPal或者支付宝付款,先充值后下单的方式。这是一家成立于2017年的国外VPS主机商,提供独立服务器租用和VPS主机,其中VPS基于KVM架构,多个不同系列,也经常提供一些促销套餐,数据中心在洛杉...

2021年7月最新洛杉矶CN2/香港CN2 vps套餐及搬瓦工优惠码 循环终身优惠6.58%

搬瓦工怎么样?2021年7月最新vps套餐推荐及搬瓦工优惠码整理,搬瓦工优惠码可以在购买的时候获取一些优惠,一般来说力度都在 6% 左右。本文整理一下 2021 年 7 月最新的搬瓦工优惠码,目前折扣力度最大是 6.58%,并且是循环折扣,续费有效,可以一直享受优惠价格续费的。搬瓦工优惠码基本上可能每年才会更新一次,大家可以收藏本文,会保持搬瓦工最新优惠码更新的。点击进入:搬瓦工最新官方网站搬瓦工...

smtp服务器为你推荐
免费虚拟主机空间谁知道有没有免费的虚拟主机空间虚拟主机推荐有哪些好的虚拟主机推荐查询ip如何查找IP地址?网站域名空间网站域名和空间香港虚拟空间最稳定香港虚拟主机空间在哪里?香港虚拟空间香港虚拟空间 好不、现在还有人买嘛深圳网站空间菜鸟问:网站空间如何选择,与空间的基本知识?手机网站空间QQ空间技巧的手机网站啊?虚拟主机管理系统急!高分!比较好用的虚拟主机管理系统有哪些?虚拟主机服务商请问哪个服务商的虚拟主机比较好呀
美国域名 suspended seovip win8升级win10正式版 青果网 论坛空间 godaddy域名证书 怎么测试下载速度 太原网通测速平台 空间技术网 hkt 酷番云 免费dns解析 33456 电信主机 支持外链的相册 东莞idc 中国电信测速网站 畅行云 lamp是什么意思 更多