`

java-邮件开发基础

 
阅读更多

(转)

使用 之前,必须了解的基本概念与核心类: 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 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    Java Web开发实例大全(基础卷) 完整pdf扫描版[179MB]

    Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...

    Java Web开发实例大全

    Java Web开发实例大全(提高卷)筛选、汇集了Java Web开发从基础知识到高级应用各个层面的大量实例及源代码,共有600个左右,每个实例及源代码按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析...

    新版Android开发教程.rar

    程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算...

    Java邮件开发—–javaMail

    现在开始Java邮件开发。  一、JavaMail简介  JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。JavaMail API是Sun公司为...

    java基础类库开发包,工作5年精心整理_Java常用工具类源码

    工作5年精心整理_Java常用工具类源码 收集了java项目开中常用的工具操作类,方法非常全,可应用在大部份java 项目中。...邮件 - 9.二维码、条形码 - 10.web Java常用工具类大全,工作5年精心整理(最新版)

    基于SpringBoot+ORM-Mybatis+SpringMVC和多种组件构建的企业信息化开发基础平台源码+项目说明.zip

    1、基于SpringBoot+ORM-Mybatis+SpringMVC和多种组件构建的企业信息化开发基础平台源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、...

    精通Java:JDK、数据库系统开发Web开发(实例代码)

    《精通Java:JDK、数据库系统开发Web开发》全书共分27章,内容涵盖了Java编程环境概述、基础语法、面向对象软件设计方法、线程、数据集合、网络编程、图形编程、多媒体编程以及Java Web开发。本书每一节的例子都是...

    基于Java 的mail的邮件收发系统源码

    基于Javamail的邮件收发系统的设计与实现项目是一个基于Java语言开发的邮件收发系统,主要使用Javamail和JavaSMTP等技术实现邮件的收发和管理。该系统主要适用于需要频繁发送邮件的机构或个人,提供优质的邮件服务和...

    毕设-MeyboMail Web(Java)开源简化-meybomailweb

    MeyboMail Web(脉博邮件系统客户端)是由成都脉博软件工作室与easyjf.com(简易java框架)联合开发的基于B/S的邮件系统客户端软件,系统全部使用java编写,Web页面使用easyjf.com的EasyJWeb框架开发,主要通过调用java ...

    Java范例大全 源码

    其次,《Java范例大全》还讲解了XML开发、Java图形编程、Java网络编程、多媒体开发、邮件开发、Java Web开发和Java安全等大量极其重要的企业级开发知识,使全书上升到一个新的高度;最后,以一个极具代表性的综合...

    基于Java语言的邮件收发系统实现sql数据库

    基于java语言的毕业设计——基于Javamail的邮件收发系统(附带:系统源码 + 毕业论文 + 开题报告 + 任务书 + 外文翻译 + 文献综述 + 答辩PPT + 作品说明书) 基于Javamail的邮件收发系统是一款简单、方便、快捷的...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    利用Java开发合同管理代码

    维护系统基础数据,添加,修改和删除合同流程等 4. 合同发起 合同流程开始阶段,由工作流定义 5. 合同审核 合同流程审核阶段,由工作流定义 6. 合同授权 合同授权阶段,由工作流定义 7. 合同编号 合同编号阶段,由...

    ssh入门视频之ssh1

    张孝祥java邮件开发视频-&gt; 传智播客Struts视频教程-&gt; 传智播客hibernate视频教程-&gt; 传智播客ibatis视频教程-&gt; 传智播客jpa视频教程-&gt; 传智播客FCKeditor教程-&gt; 传智播客AJAX视频教程-&gt; 传智播客巴巴运动网-&gt; 其它...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

Global site tag (gtag.js) - Google Analytics