使用之前,必须了解的基本概念与核心类:Session是邮件操作的接口;Transport是收发邮件所
使用的协议,一般Session会有多个Transport;Message是收发操作的单位;Store是消息的集合,类
似邮件客户端。每个Store包含一系列的Folder和Message,每个Folder又包含一系列的Folder和Message。
Session需要使用java,mail.util.Properties来构造,常用的用来构造Session的属性:
属性名
|
含义
|
java,mail.smtp.user
|
SMTP的缺省用户名。
|
java,mail.smtp.host
|
要连接的SMTP服务器。
|
java,mail.smtp.port
|
要连接的SMTP服务器的端口号,如果connect没有指明端口号就使用它,缺省值25。
|
java,mail.smtp.connectiontimeout
|
Socket连接超时值,单位毫秒,缺省值不超时。
|
java,mail.smtp.timeout
|
Socket I/O超时值,单位毫秒,缺省值不超时。
|
java,mail.smtp.from
|
SMTPjava,mail使用的Email地址,用来设置邮件的return地址。缺省是Message.getFrom()或InternetAddress.getLocalAddress()。注意:java,mail.smtp.user优先使用
|
java,mail.smtp.localhost
|
localhost名,缺省是InetAddress.getLocalHost().getHostName()。如果JDK和name
service正确配置,一般不需设置。
|
java,mail.smtp.ehlo
|
如果为false,那么不会尝试使用EHLO命令登录,缺省是true。通常EHLO命令失败,会倒退到HELO命令。这个属性只有在服务器没有fail
EHLO属性或没有实现EHLO属性。
|
java,mail.smtp.auth
|
缺省是false,如果为true,尝试使用AUTH命令认证用户。
|
java,mail.host
|
邮件交互的主机。
|
java,mail.transport.protocol
|
要装入session的协议(smtp、pop3、imap、nntp)。
|
java,mail.user
|
登录邮件服务器的用户名(发送邮件时需要)。
|
java,mail.from
|
发件人地址(发送邮件时需要)。
|
发送邮件
发送邮件主要涉及的类包括: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);
|
分享到:
相关推荐
本教程“张孝祥Java邮件开发详解”深入探讨了如何使用Java来实现邮件的发送功能,涵盖了从基础概念到高级特性的全方位讲解。 首先,Java Mail API是Java中用于处理邮件的核心库,它提供了丰富的类和接口,使得...
Java邮件系统是一个基于Java Web技术构建的B/S(Browser/Server)架构的应用程序,它允许用户通过网页浏览器发送、接收和管理电子邮件。在本项目中,开发者利用了Java的强大力量,特别是对于网络通信和数据处理的...
在IT行业中,Java邮件开发是一项基础且重要的技能,尤其对于构建企业级应用和服务来说更是不可或缺。张孝祥的"Java邮件开发详解"教程无疑是学习这一主题的宝贵资源。本教程可能包含了从邮件协议理解到实际JavaMail ...
Java邮件开发是IT行业中一个常见的任务,特别是在自动化通知、数据报告或者客户服务中。Java提供了强大的API,如JavaMail API,来实现邮件的发送和接收。本文将深入探讨Java邮件开发的相关知识点,包括JavaMail API...
首先,JavaMail API是Java邮件开发的基础,它提供了一系列的接口和类来处理SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)等邮件服务。JavaMail API的主要组件包括`javax.mail.Session`、...
Java邮件发送组件是Java开发中用于发送电子邮件的工具,它使得开发者能够轻松地在应用程序中实现邮件功能。Java Mail API是实现这一功能的核心库,它提供了丰富的接口和类,允许程序进行邮件的创建、发送以及处理。...
Java邮件开发是Java编程中的一个重要领域,特别是在企业级应用中,用于发送通知、报告、确认信息等。张孝祥老师的课程“传智播客张孝祥java邮件开发”旨在教授如何利用Java进行邮件的发送和处理。在这个16节的完整...
这个文件是项目在Eclipse环境中运行和管理的基础,对于Java邮件系统的开发和调试有着重要的作用。 3. **META-INF**:这是一个标准的Java存档(JAR)文件夹,通常包含元数据信息。在邮件系统中,可能会有MANIFEST.MF...
这里提到的两个jar包——`spring-context-support-4.1.7.RELEASE.jar`和`mail-1.4.1.jar`,都是Java邮件发送的重要组成部分。 `spring-context-support-4.1.7.RELEASE.jar`是Spring框架的一个扩展模块,主要提供了...
在Java编程环境中,发送HTML模板邮件是一项常见的任务,特别是在企业级应用中,用于发送美观、格式化的通知或营销信息。本项目提供了一个完整的Eclipse工程...希望这个概述能帮助你理解并实现自己的Java邮件发送功能。
这个“简易java邮件发送工具”显然是基于JavaMail API构建的,旨在简化邮件发送的过程,尤其针对Yahoo、Sina、Sohu和163等常见邮件服务商。用户无需登录到这些网站的网页界面,只需在拥有Tomcat或WebLogic等应用...
在IT行业中,使用编程语言发送电子邮件是一项常见的任务,特别是在自动化脚本或系统集成中。Java作为广泛应用的编程语言,提供了多种方法来发送邮件,包括...理解这些概念和技术是Java开发者在进行邮件通信时的基础。
Java邮件发送客户端是一种利用JavaMail API开发的程序,它允许用户通过图形化的用户界面发送电子邮件。这个客户端可以作为个人或企业内部沟通的工具,也可以用于自动化邮件发送任务,例如发送通知、报告或订阅内容。...
在Java编程语言中,发送邮件是一项常见的任务,尤其在企业级应用中,它用于通知、报表或者客户服务等。本文将详细讲解如何使用Java发送邮件,并着重介绍消息格式化的概念及其重要性。 首先,发送邮件的核心类是...
Java邮件收发系统是一种基于Java技术实现的电子邮件应用程序,它能够帮助用户发送、接收和管理电子邮件。这个系统的核心是利用JavaMail API,一个强大的库,为开发者提供了在Java环境中处理邮件的标准接口。本文将...
Java邮件收发是Java开发中一个实用的功能,它允许程序自动发送和接收电子邮件。在Java中,这主要通过使用JavaMail API来实现。JavaMail API是一个开源库,它提供了丰富的接口和类,使得开发者能够方便地处理邮件服务...
这个"JAVA邮件发送系统项目"提供了一个基础的实现,让你能够快速地进行定制和扩展以满足多样化的需求。 首先,我们来了解一下Java中发送邮件的基础知识。在Java中,我们可以使用JavaMail API来处理邮件发送。...
Java邮件管理模块是一个用于处理电子邮件发送、接收和管理的软件组件,特别适合初学者学习JSP(JavaServer Pages)技术。这个模块可以帮助开发者构建Web应用中的邮件功能,例如注册确认邮件、密码重置请求或者日常...
Java邮件发送是一个常见的任务,尤其在自动化通知、报表发送或者用户服务中扮演着重要角色。在Java中,我们可以使用JavaMail API来实现这个功能。JavaMail API是一个开源库,允许开发者通过SMTP(简单邮件传输协议)...