(转)
使用
之前,必须了解的基本概念与核心类:
Session
是邮件操作的接口;
Transport
是收发邮件所
使用的协议,一般
Session
会有多个
Transport
;
Message
是收发操作的单位;
Store
是消息的集合,类
似邮件客户端。每个
Store
包含一系列的
Folder
和
Message
,每个
Folder
又包含一系列的
Folder
和
Message
。
Session
需要使用
java,mail
.util.Properties
来构造,常用的用来构造
Session
的属性:
属性名
|
含义
|
|
SMTP
的缺省用户名。
|
|
|
|
要连接的
SMTP
服务器的端口号,如果
connect
没有指明端口号就使用它,缺省值
25
。
|
|
Socket
连接超时值,单位毫秒,缺省值不超时。
|
|
Socket I/O
超时值,单位毫秒,缺省值不超时。
|
|
SMTPjava,mail
使用的
Email
地址,用来设置邮件的
return
地址。缺省是
Message.getFrom()
或
InternetAddress.getLocalAddress()
。注意:
java,mail
.smtp.user
优先使用
|
|
localhost
名,缺省是
InetAddress.getLocalHost().getHostName()
。如果
JDK
和
name service
正确配置,一般不需设置。
|
|
如果为
false
,那么不会尝试使用
EHLO
命令登录,缺省是
true
。通常
EHLO
命令失败,会倒退到
HELO
命令。这个属性只有在服务器没有
fail EHLO
属性或没有实现
EHLO
属性。
|
|
缺省是
false
,如果为
true
,尝试使用
AUTH
命令认证用户。
|
|
邮件交互的主机。
|
|
要装入
session
的协议(
smtp
、
pop3
、
imap
、
nntp
)。
|
|
登录邮件服务器的用户名(发送邮件时需要)。
|
|
发件人地址(发送邮件时需要)。
|
发送邮件
发送邮件主要涉及的类包括:Session、Transport和MimeMessage。如果发送带附件的邮件还会
涉及:MimeMultipart、DataSource和DataHandler。注意:以下的示例代码不带异常处理。
- 发送不带附件的邮件:
Properties props= new Properties();
//
如果使用
connect
包含用户名和密码
//
仍然连接不上,那么有可能是这个属性没有设置。
//
导致服务器不验证
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.auth", "true");
Session session= Session.getDefaultInstance( props);
//
也可实现一个自定义的
Authenticator
,并调用
//getDefaultInstance(java.util.Properties props, Authenticator authenticator)
//
来完成验证。个人觉得不如使用
connect
方便。
Transport transport= session.getTransport("smtp");
MimeMessage message= new MimeMessage( session);
InternetAddress from= new InternetAddress( "James.Hu@chinacodeline.com", "James.Hu");
message.setFrom( from);
InternetAddress to= new InternetAddress("foxgem_magic@yahoo.com.cn");
//
指定收件人的类型
message.setRecipient( MimeMessage.RecipientType.TO, to);
message.setSubject( "This is a test.");
//
文本内容,就直接使用这个函数。
//
如果内容不是纯文本,那么使用
setContent
指定
mime type
。
message.setText( "
检查文件
");
//
加上这句话表示邮件完成
message.saveChanges();
//
连接并验证
transport.connect("mail.chinacodeline.com", "james.hu@chinacodeline.com", "
密码
");
transport.sendMessage( message, message.getAllRecipients());
transport.close();
|
- 发送带附件的邮件:
Properties props= new Properties();
props.put("mail.smtp.auth", "true");
Session session= Session.getDefaultInstance( props);
Transport transport= session.getTransport("smtp");
MimeMessage msg= new MimeMessage( session);
msg.setFrom( new InternetAddress( "james.hu@chinacodeline.com", "foxgem"));
msg.setRecipient( MimeMessage.RecipientType.TO
, new InternetAddress("foxgem_magic@yahoo.com.cn"));
msg.setSubject("mail with single file");
//
把邮件内容看作多个组成部分,每部分分别组织自己的内容。最后
//
通过这个类组合起来一起发出。
MimeMultipart content= new MimeMultipart();
MimeBodyPart part1= new MimeBodyPart();
part1.setText("pls check the file");
MimeBodyPart part2= new MimeBodyPart();
//
附件如果是文件,一般都是使用
FileDataSource
//
如果是从其他方面获得,那么使用对应的
DataSource
。
//
如,若是来自
url
,那么就使用
URLDataSource
DataSource fileDs= new FileDataSource( "d:/test.txt");
DataHandler dh= new DataHandler( fileDs);
part2.setDataHandler( dh);
//
标记为附件,否则当邮件客户端(如
OE
)收到后,直接在邮件中显示内容。
part2.setDisposition( MimeBodyPart.ATTACHMENT);
//
设置附件的文件名
part2.setFileName( "test.txt");
content.addBodyPart( part1);
content.addBodyPart( part2);
msg.setContent( content);
msg.saveChanges();
transport.connect("mail.chinacodeline.com", "james.hu@chinacodeline.com", "
密码
");
transport.sendMessage( msg, msg.getAllRecipients());
transport.close();
|
接收邮件
接收邮件涉及的类:Session、Store、Folder和MimeMessage。如果发送带附件的邮件还会
涉及:MimeMultipart、DataSource和DataHandler。注意:以下的示例代码不带异常处理。
- 接收不带附件的邮件:
Properties props= new Properties();
Session session= Session.getDefaultInstance( props);
Store store= session.getStore( "pop3");
store.connect( "pop.mail.yahoo.co.uk", "foxgem_magic", "
密码
");
//
找到缺省的目录
Folder root= store.getDefaultFolder();
//
也可指定打开的目录,如
Folder inbox= root.getFolder( “inbox”);
Folder[] folders= root.list();
for( int j=0; j< folders.length; j++){
//
打开
folder
folders[j].open( Folder.READ_WRITE);
Message[] msgs= folders[j].getMessages();
for(int i=0; i< msgs.length; i++){
System.out.println( "subject:"+ msgs[i].getSubject());
System.out.println( "content:"+ msgs[i].getContent().toString());
}
//
检查是否有新邮件。
System.out.println( folders[j].hasNewMessages());
folders[j].close( false);
}
store.close();
|
- 接收带附件的邮件:
Properties props= new Properties();
Session session= Session.getDefaultInstance( props);
Store store= session.getStore( "pop3");
store.connect( "pop.mail.yahoo.co.uk", "foxgem_magic", "
密码
");
Folder root= store.getDefaultFolder();
Folder[] folders= root.list();
for( int i=0; i< folders.length; i++){
folders[i].open( Folder.READ_ONLY);
Message[] msgs= folders[i].getMessages();
for( int j=0; j< msgs.length; j++){
Object content= msgs[j].getContent();
//
注意
Multipart
并不是判定是否是附件的标准
if( content instanceof Multipart){
int count= ((Multipart)content).getCount();
for( int k=0; k< count; k++){
BodyPart part= ((Multipart)content).getBodyPart(k);
String disposition= part.getDisposition();
//
判断是否是附件
if( null!= disposition &&
disposition.equalsIgnoreCase( Part.ATTACHMENT)){
BufferedReader br= new BufferedReader( new InputStreamReader(
part.getInputStream()));
for( String line= br.readLine(); null!= line; line= br.readLine()){
System.out.println( line);
}
}
}
}
}
}
store.close();
|
其他操作
接收和发送是最通常的邮件操作,除此之外,一般还有:
- 复制、删除和移动邮件:这些操作都必须要Folder以读写方式打开,且是在Folder关闭
之后起作用。
//
删除
folder.open(Folder.READ_WRITE);
message.setFlag(Flags.Flag.DELETED, true);
folder.close(true);
|
//
移动,另一种形式的设置消息标志位。
inbox.copyMessages(xml_msgs, xml_dev);
Flags delete_flag = new Flags(Flags.Flag.DELETED);
inbox.setFlags(xml_msgs, delete_flag, true);
inbox.expunge();
|
考虑实现通过交互性更强的形式来进行这些操作,如显示邮件列表的web页,为了对指定
的邮件进行操作,需要使用Message的Message number。注意,它的值并不是一定,会因为其
他邮件(如另一人从另一个界面删除了一个邮件)的被删除而改变。因此,在实际使用时还
需要辅助其他的手段。
- 回复邮件
//false
,只回复给发件人;
true
,是回复全体。
MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress("president@whitehouse.gov"));
reply.setText("Thanks");
Transport.send(reply);
|
- 消息转发:创建一个新邮件的BodyPart,将要转发的消息复制到新邮件的一个BodyPart中。
2着结合成一个MultiPart,作为新邮件的内容发出。
Message forward = new MimeMessage(session);
forward.setSubject("Fwd: " + message.getSubject());
forward.setFrom(new InternetAddress(from));
forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
//
创建新邮件的内容
Multipart multipart = new MimeMultipart();
//
创建新邮件的
BodyPart
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText( "Here you go with the original message:\n\n");
multipart.addBodyPart(messageBodyPart);
//
复制要转发的邮件,
messageBodyPart = new MimeBodyPart();
//
要将一条消息内容复制到另一条,只要复制
DataHandler
就可以了
messageBodyPart.setDataHandler(message.getDataHandler());
multipart.addBodyPart(messageBodyPart);
forward.setContent(multipart);
Transport.send(forward);
|
- 查找邮件,使用SearchTerm来进行。具体的SearchTerm查看相应的文档。
SearchTerm to = new RecipientStringTerm(Message.RecipientType.TO,
"xml.dev@lists.xml.org");
SearchTerm cc = new RecipientStringTerm(Message.RecipientType.CC,
"xml.dev@lists.xml.org");
SearchTerm xml_search = new OrTerm(to, cc);
Messages[] xml_msgs = inbox.search(xml_search);
|
- 邮件的编码主要用于非英文的支持。(注意,上述的例子中有中文,但是没有这么做就
成功地接收并显示了中文文字的内容。具体的使用还有待尝试)
编码:
String foreign_str = ".....";
String usable_str = MimeUtility.encodeText(foreign_str);
message.setText(usable_str);
解码:
String msg_str = message.getText();
String foreign_str = MimeUtility.decodeText(msg_str);
textfield.setText(foreign_str);
|
分享到:
相关推荐
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...
Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...
程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算...
现在开始Java邮件开发。 一、JavaMail简介 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。JavaMail API是Sun公司为...
工作5年精心整理_Java常用工具类源码 收集了java项目开中常用的工具操作类,方法非常全,可应用在大部份java 项目中。...邮件 - 9.二维码、条形码 - 10.web Java常用工具类大全,工作5年精心整理(最新版)
1、基于SpringBoot+ORM-Mybatis+SpringMVC和多种组件构建的企业信息化开发基础平台源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、...
《精通Java:JDK、数据库系统开发Web开发》全书共分27章,内容涵盖了Java编程环境概述、基础语法、面向对象软件设计方法、线程、数据集合、网络编程、图形编程、多媒体编程以及Java Web开发。本书每一节的例子都是...
基于Javamail的邮件收发系统的设计与实现项目是一个基于Java语言开发的邮件收发系统,主要使用Javamail和JavaSMTP等技术实现邮件的收发和管理。该系统主要适用于需要频繁发送邮件的机构或个人,提供优质的邮件服务和...
MeyboMail Web(脉博邮件系统客户端)是由成都脉博软件工作室与easyjf.com(简易java框架)联合开发的基于B/S的邮件系统客户端软件,系统全部使用java编写,Web页面使用easyjf.com的EasyJWeb框架开发,主要通过调用java ...
其次,《Java范例大全》还讲解了XML开发、Java图形编程、Java网络编程、多媒体开发、邮件开发、Java Web开发和Java安全等大量极其重要的企业级开发知识,使全书上升到一个新的高度;最后,以一个极具代表性的综合...
基于java语言的毕业设计——基于Javamail的邮件收发系统(附带:系统源码 + 毕业论文 + 开题报告 + 任务书 + 外文翻译 + 文献综述 + 答辩PPT + 作品说明书) 基于Javamail的邮件收发系统是一款简单、方便、快捷的...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
维护系统基础数据,添加,修改和删除合同流程等 4. 合同发起 合同流程开始阶段,由工作流定义 5. 合同审核 合同流程审核阶段,由工作流定义 6. 合同授权 合同授权阶段,由工作流定义 7. 合同编号 合同编号阶段,由...
张孝祥java邮件开发视频-> 传智播客Struts视频教程-> 传智播客hibernate视频教程-> 传智播客ibatis视频教程-> 传智播客jpa视频教程-> 传智播客FCKeditor教程-> 传智播客AJAX视频教程-> 传智播客巴巴运动网-> 其它...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...