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

LetBox:美国洛杉矶/新泽西AMD大硬盘VPS,10TB流量,充值返余额,最低3.3美元两个月

LetBox此次促销依然是AMD Ryzen处理器+NVME硬盘+HDD大硬盘,以前是5TB月流量,现在免费升级到10TB月流量。另外还有返余额的活动,如果月付,月付多少返多少;如果季付或者半年付,返25%;如果年付,返10%。依然全部KVM虚拟化,可自定义ISO系统。需要大硬盘vps、大流量vps、便宜AMD VPS的朋友不要错过了。不过LetBox对帐号审核严格,最好注册邮箱和paypal帐号...

Puaex:香港vds,wtt套餐,G口带宽不限流量;可解流媒体,限量补货

puaex怎么样?puaex是一家去年成立的国人商家,本站也分享过几次,他家主要销售香港商宽的套餐,给的全部为G口带宽,而且是不限流量的,目前有WTT和HKBN两种线路的方面,虽然商家的价格比较贵,但是每次补一些货,就会被抢空,之前一直都是断货的状态,目前商家进行了补货,有需要这种类型机器的朋友可以入手。点击进入:puaex商家官方网站Puaex香港vds套餐:全部为KVM虚拟架构,G口的带宽,可...

VPSMS:53元/月KVM-512MB/15G SSD/1TB/洛杉矶CN2 GIA

VPSMS最近在做两周年活动,加上双十一也不久了,商家针对美国洛杉矶CN2 GIA线路VPS主机提供月付6.8折,季付6.2折优惠码,同时活动期间充值800元送150元。这是一家由港人和国人合资开办的VPS主机商,提供基于KVM架构的VPS主机,美国洛杉矶安畅的机器,线路方面电信联通CN2 GIA,移动直连,国内访问速度不错。下面分享几款VPS主机配置信息。CPU:1core内存:512MB硬盘:...

smtp服务器为你推荐
网站空间租赁如何租用网站空间?怎么查看空间支持那些功能呢? 一般多少钱?中国互联网域名注册中国互联网域名注册怎么操作免费虚拟主机空间谁知道有没有免费的虚拟主机空间海外主机为什么国外的主机和国内的有这么大的差别?免费虚拟主机申请谁有1年免费的虚拟主机申请地址吖?网站服务器租用网站的服务器买哪里的最好,还有租用一年大概多少钱???急!!!美国vps主机美国VPS好?还是香港VPS好?台湾vps香港vps和台湾vps哪个好用免费网站空间免费网站空间哪个好美国网站空间购买美国网站空间使用会不会麻烦呢,
美国虚拟主机推荐 国外免费vps GGC bluevm 60g硬盘 godaddy域名转出 免费ftp站点 数字域名 新家坡 昆明蜗牛家 万网空间管理 路由跟踪 云服务器比较 云服务是什么意思 带宽测试 asp.net虚拟主机 卡巴斯基官方下载 neobux 小米电视主机 kosskeb4 更多