分享
 
 
 

用java开发Email工具之接收邮件

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

目前的电子邮件基本上都是通过POP3网络协议接收的。根据POP3的规定,当一个电子邮件程序需要接收电子邮件时,该程序同POP3服务程序需要建立起双向的传输通道。和SMTP类似,当传输通道成功建立后,电子邮件程序会向POP3服务程序发送一系列基于ASCII字符的命令,而POP3服务程序会对这些命令产生相应的回应来表明相应的操作是成功还是失败了。下图显示了POP3是如何工作的。

POP3协议中定义了很多命令,其中最常用的是USER,PASS,STAT,RETR,DELE和QUIT。和前面一样。当一个邮件程序成功地通过套接字连接到POP3服务器后,POP3服务器程序将向邮件程序发送初始化消息。该消息由一个"+OK"回应码和POP3服务程序的名称和版本信息构成。POP3中只有两种回应码"+OK"和"-ERR",邮件程序只需要根据回应码做出相应的反应,而回应码后的文字信息主要是供人查看的。在收到初始化消息后,邮件程序通过发送USER命令开始邮件传输过程。USER命令指定了用户名(邮箱的名称),作为回应,POP3服务程序需要确认用户名对应的邮箱。假如成功,邮件程序需要发送PASS命令来向POP3服务程序提供邮箱的密码。接着需要发送STAT命令来获得目前在邮箱中电子邮件的数量和每个邮件的大小;或者发送RETR命令提取邮件;也可以发送DELE删除邮件。最后使用QUIT命令退出邮件传输过程。

下面提供了一个基于命令行的例子POP3Demo,这个例子可以帮助你理解基于POP3的邮件传输机制。这个程序将利用标准端口110连接到一个POP3服务程序上。为了使程序能够运行,你需要将home更改为你使用的邮箱的地址。

//POP3Demo.java

importjava.io.*;

importjava.net.*;

classPOP3Demo

{

publicstaticvoidmain(String[]args)

{

StringPOP3Server="mail.gatewest.net";

intPOP3Port=110;

Socketclient=null;

try

{

//创建一个连接到POP3服务程序的套接字。

client=newSocket(POP3Server,POP3Port);

//创建一个BufferedReader对象来读取用户输入。

BufferedReaderstdin;

stdin=newBufferedReader(newInputStreamReader(System.in));

//创建一个BufferedReader对象,以便从套接字读取输出。

InputStreamis=client.getInputStream();

BufferedReadersockin;

sockin=newBufferedReader(newInputStreamReader(is));

//创建一个PRintWriter对象,以便向套接字写入内容。

OutputStreamos=client.getOutputStream();

PrintWritersockout;

sockout=newPrintWriter(os,true);//trueforauto-flush

//显示POP3握手信息。

System.out.println("S:"+sockin.readLine());

while(true)

{

System.out.print("C:");

//读取用户输入。

Stringcmd=stdin.readLine();

//将命令发送到POP3服务程序。

sockout.println(cmd);

//读取POP3服务程序的回应消息。

Stringreply=sockin.readLine();

System.out.println("S:"+reply);

//假如输入了RETR命令并且返回了成功的回应码,持续从套接字读取输出,

//直到碰到<CRLF>.<CRLF>。这时从套接字读出的输出就是邮件的内容。

if(cmd.toLowerCase().startsWith("retr")&&

reply.charAt(0)== + )

do

{

reply=sockin.readLine();

System.out.println("S:"+reply);

if(reply!=null&&reply.length()>0)

if(reply.charAt(0)== . )

break;

}

while(true);

//假如用户输入了QUIT命令,退出邮件传输过程。

if(cmd.toLowerCase().startsWith("quit"))

break;

}

}

catch(IOExceptione)

{

System.out.println(e.toString());

}

finally

{

try

{if(client!=null)

client.close();

}

catch(IOExceptione)

{

}

}

}

}

下面是运行POP3Demo的结果:

S:+OKMicrosoftExchange2000POP3serverversion6.04417.0(home.digital.com)

ready

C:userfr

S:+OK

C;passfr

S:+OKUsersUCcessfullyloggedon.

运行POP3Demo后,邮件服务程序首先返回初始化信息。我们可以看到邮件服务器上安装的是微软的Exchange2000作为邮件服务程序。然后输入USER和PASS命令指定用户名和密码。有些邮件服务程序在登录后会提示用户当前邮箱中是否有新的邮件,例如在linux下的QPOP会返回类似于这样的信息:

S:+OKfrhas1message(554octets).。

C:stat

S:+OK11

通过STAT命令可以查看当前邮箱中邮件的数目,POP3服务程序返回了11,表示有一份邮件,一封邮件未读。

C:retr1

S:+OK

S:Recevied:fromgis02([23.3.54.53])byhome.digital.comwithMicrosoftSMTSVC

(5.0.2195.2966)

S:Fri,13Dec200215:12:37+0800

S:Message-ID001401c2a77$04353900$35fw0217@digital.com

S:From:"=?gb2312?B?t+vuow==?="fr@digital.com

S:To:fr@digital.com

Subject:TestEmail

ThisisthetestEmail.

然后就可以发送RETR命令来接收邮件了。RETR的参数代表了邮件的编号,1代表最新的邮件。这封邮件就是刚才通过SMTPDemo发送的邮件。有一点需要注重,在发送的时候我并没有指定From:头,那么From:头是从哪里来的呢?当发送邮件的时候,假如SMTP服务程序假如没有检测到From:头,会将MAIL命令后的参数作为From:头的内容。

C:dele1

S:+OK

C:stat

S:+OK00

使用DELE命令可以删除指定的邮件,这里我删除了序号为1的邮件。删除后,在利用STAT命令查看邮件时,就会返回00,表示现在邮箱里没有邮件。

C:quit

S:+OKMicrosoftExchange2000POP3serverversion6.04417.0signingoff.

最后使用QUIT命令中断与POP3服务程序的通讯。

小结

Java的网络API可以用来编写很多有用的程序,例如收发电子邮件的程序。在这篇文章中,我们了解了电子邮件的结构以及如何使用SMTP和POP3协议来发送和接收邮件,同时也了解了MIME是如何支持附件的。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有