`
fonter
  • 浏览: 858162 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[精] JavaMail基础[转]

    博客分类:
  • J2SE
阅读更多

  使用之前,必须了解的基本概念与核心类:Session是邮件操作的接口;Transport是收发邮件所
使用的协议,一般Session会有多个TransportMessage是收发操作的单位;Store是消息的集合,类
似邮件客户端。每个Store包含一系列的FolderMessage,每个Folder又包含一系列的FolderMessage

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()。如果JDKname 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的协议(smtppop3imapnntp)。 
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);
分享到:
评论

相关推荐

    JAVAWeb全课程笔记( html版)

    [转自IBM]中文编码问题 JDBC入门 Jdbc事务控制管理 常用数据库连接池 编写JDBC框架 客户信息管理系统 Servlet Filter 过滤器 HTTP 协议 文件上传和下载 Servlet事件监听器 JavaMail开发 (案例)Estore电子商城 软件...

    CSDN.rar_简繁体_股票 java

    带你步入J2EE殿堂:最易懂的J2EE实例 简析J2EE应用程序数据库类设计模式 编写高级应用程序3 关 于JAVA 的 可 移 植 性 Java 程序编码规范 ...用JAVA转换简繁体的基础知识 邮件例程 - JavaMail - 发送HTML邮件

    Java 2技术内幕(Part1)

    本书适合有一定Java语言基础的编程人员使用。 主要内容: 使用Enterprise JavaBean(EJB)开发可伸缩的应用程序 使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和...

    Java 2技术内幕(Part2)

    本书适合有一定Java语言基础的编程人员使用。 主要内容: 使用Enterprise JavaBean(EJB)开发可伸缩的应用程序 使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和...

    Java 2技术内幕(Part5)

    本书适合有一定Java语言基础的编程人员使用。 主要内容: 使用Enterprise JavaBean(EJB)开发可伸缩的应用程序 使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和...

    Java 2技术内幕(Part3)

    本书适合有一定Java语言基础的编程人员使用。 主要内容: 使用Enterprise JavaBean(EJB)开发可伸缩的应用程序 使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和...

    Java 2技术内幕(Part4)

    本书适合有一定Java语言基础的编程人员使用。 主要内容: 使用Enterprise JavaBean(EJB)开发可伸缩的应用程序 使用Java和JAXP分析XML文档 掌握如何使用消息驱动的bean和JMS进行消息传递 使用JMF、Java Sound、JAI和...

    从Java走向Java+EE+.rar

    15.3 实例——利用JavaMail收发邮件 221 15.3.1 准备阶段 221 15.3.2 编写发送邮件的实例 223 15.3.3 编写接收邮件的实例 235 15.4 小结 241 第16章 基于良好设计模式的Spring 243 16.1 Spring简介 243...

    (超赞)JAVA精华之--深入JAVA API

    1 JAVA SE ...3.5 JavaMail(JAVA邮件服务)API详解 3.6 jxl.jar 包简介 3.7 Java与XML联合编程之SAX篇 3.8 Java与XML联合编程之DOM篇 4 其他 4.1 代码复用的规则 4.2 Java IO 包中的Decorator模式

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第二部分详细讲解了jsf ri、jta、jndi、rmi、jms、javamail、ejb 3的session bean、message driven bean、jpa、jax-ws 2、jaas等java ee知识,这部分知识以jsf+ejb 3+jpa整合开发为重点,通过使用netbeans ide工具...

    Java数据库编程宝典2

    第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    Java数据库编程宝典4

    第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    Java数据库编程宝典1

    第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    Java数据库编程宝典3

    第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 创建、取消、更改数据库和表 3.3.2 创建、更改和取消视图 3.4 数据处理语言 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    基于jbpm与activiti的工作流平台技术架构介绍

    29.流程委办、转办 2.BPMX3多层架构 系统采用多层的系统架构进行功能开发,有利于代码功能责任分开,同时有利于不同开发人员的分工及合作,也有利于代码的单元测试。系统总体结构如下图所示: 【图二】BPMX3多层...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java...附录A JavaMail发送邮件 附录B 在Spring中开发Web Service

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java...附录A JavaMail发送邮件 附录B 在Spring中开发Web Service

    Java编程艺术 PDF

    6.1 Web搜索程序基础 159 6.2 遵守Robot协议 160 6.3 Search Crawler概述 161 6.4 SearchCrawler类 162 6.4.1 SearchCrawler类的变量 179 6.4.2 SearchCrawler类的构造函数 179 6.4.3 actionSearch()方法 180 6.4.4 ...

    java 编程艺术

    6.1 Web搜索程序基础 159 6.2 遵守Robot协议 160 6.3 Search Crawler概述 161 6.4 SearchCrawler类 162 6.4.1 SearchCrawler类的变量 179 6.4.2 SearchCrawler类的构造函数 179 6.4.3 actionSearch()方法 180 ...

Global site tag (gtag.js) - Google Analytics