`

java-邮件开发基础

    博客分类:
  • mail
阅读更多

(转)

  使用 之前,必须了解的基本概念与核心类: 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);
分享到:
评论

相关推荐

    7-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发

    4. **Java EE(Java Platform, Enterprise Edition)**: 也称为Java EE或Jakarta EE,是Java Web开发的基础框架,提供了一系列API和服务器环境,如Servlet、JSP、EJB(Enterprise JavaBeans)、JMS(Java Message ...

    aws-java-sdk-1.2.12下载

    总之,AWS Java SDK 1.2.12是一个强大的工具,它简化了与AWS服务的交互,让开发者能专注于应用程序的核心逻辑,而不是底层的基础设施管理。通过学习和实践其中的示例,开发者可以快速掌握AWS服务的使用,从而提升...

    java邮件开发_Java邮件开发源代码

    Java邮件开发是IT行业中一个常见的任务,特别是在自动化通知、数据报告或者客户服务中。Java提供了强大的API,如JavaMail API,来实现邮件的发送和接收。本文将深入探讨Java邮件开发的相关知识点,包括JavaMail API...

    张孝祥Java邮件开发详解

    本教程“张孝祥Java邮件开发详解”深入探讨了如何使用Java来实现邮件的发送功能,涵盖了从基础概念到高级特性的全方位讲解。 首先,Java Mail API是Java中用于处理邮件的核心库,它提供了丰富的类和接口,使得...

    java-mail开发包

    4. **mailapi.jar**:包含了Java Mail API的主要接口和抽象类,是使用Java Mail的基础。 使用Java Mail API发送邮件的基本步骤如下: 1. **创建Session**:首先,需要创建一个`Session`对象,配置邮件服务器的相关...

    appengine-java-sdk-1.3.1 GoogleApp开发的SDK(Java版)

    标题中的"appengine-java-sdk-1.3.1"指的是Google App Engine的Java版本SDK,这是一个用于在Google云平台上开发和部署Java应用程序的工具包。这个SDK包含了运行和测试Google App Engine应用所需的所有组件,包括开发...

    eclipse-java-2020-03-R-win32-x86_64.zip

    Eclipse是一款广受欢迎的开源集成开发环境(IDE),主要用于Java编程,同时也支持其他多种语言如C++, Python等。"eclipse-java-2020-03-R-win32-x86_64.zip" 是Eclipse针对Windows操作系统,32位和64位架构的特定...

    张孝祥Java邮件开发详解110M

    在IT行业中,Java邮件开发是一项基础且重要的技能,尤其对于构建企业级应用和服务来说更是不可或缺。张孝祥的"Java邮件开发详解"教程无疑是学习这一主题的宝贵资源。本教程可能包含了从邮件协议理解到实际JavaMail ...

    java邮件系统-javaweb项目

    总的来说,"Java邮件系统-javaweb项目"是一个涵盖了Java Web开发全栈的实践案例,涉及了服务器端编程、前端页面开发、数据库操作、邮件处理和安全控制等多个方面。无论是对于初学者还是经验丰富的开发者,都能从中...

    appengine-java-sdk-1.8.7.zip

    3. **API库**: 提供了一系列的Java库,如数据存储服务(Datastore)、任务队列(Task Queues)、邮件服务(Mail Service)等,帮助开发者轻松实现常见的Web功能。 4. **自动缩放与负载均衡**: App Engine可以根据...

    传智播客张孝祥java邮件开发_Java邮件开发源代码.rar

    首先,JavaMail API是Java邮件开发的基础,它提供了一系列的接口和类来处理SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)等邮件服务。JavaMail API的主要组件包括`javax.mail.Session`、...

    appengine-java-sdk-1.5.0.1.zip_JDK1.5.0.1_appengine-java-s_appen

    3. **Java库**:SDK会包含Google App Engine支持的Java库,例如datastore API、memcache API、邮件服务API等,这些都是开发应用程序时需要引用的。 4. **示例代码**:可能包含一些示例应用程序,展示如何使用App ...

    java毕业设计&课设-邮件开发(视频+源码+资料).zip

    Java 毕业设计与课程设计 - 邮件开发是一个综合性的项目,涉及到Java编程、网络通信以及电子邮件协议的应用。这个项目旨在帮助学生深入理解Java技术,并掌握实际的软件开发流程。通过这个项目,你可以学习到以下关键...

    Java学习资料、java-ee课堂作业 自学练习代码

    Java-EE,即Java Platform, Enterprise Edition,是Java平台的一个版本,专门针对企业级应用开发。这个压缩包“java-ee-master”很可能包含了学习Java-EE的各种资源,包括课堂作业和自学练习代码。 Java学习资料: ...

    java手机邮件开发

    Java手机邮件开发是一种在移动设备上实现电子邮件功能的技术,它主要依赖于J2ME(Java Micro Edition)平台和Servlet技术。J2ME是Java的一种轻量级版本,专为资源有限的嵌入式设备,如手机和PDA设计,而Servlet则是...

    ws-security java-mail

    在IT行业中,`ws-security` 和 `java-mail` 是两个重要的技术领域,分别涉及Web服务安全和电子邮件处理。本文将详细探讨这两个领域的相关知识点,并结合提供的文件信息进行讲解。 首先,`ws-security`(Web ...

    Java邮件开发demo

    ### Java邮件开发知识点详解 #### 一、JavaMail概述 JavaMail API 是一个用于收发电子邮件的标准Java API,它提供了一套丰富的API来处理各种邮件相关的任务,包括发送、接收邮件,以及处理邮件中的附件等功能。 ...

    Java邮件开发详解

    ### Java邮件开发详解 在Java开发领域中,JavaMail API是一项非常重要的技术,它使得Java开发者能够方便地处理电子邮件操作,如发送、接收邮件等。本文将深入探讨JavaMail API的相关概念、工作原理以及如何使用...

    传智播客张孝祥java邮件开发_Java邮件开发源代码_16(完)

    Java邮件开发是Java编程中的一个重要领域,特别是在企业级应用中,用于发送通知、报告、确认信息等。张孝祥老师的课程“传智播客张孝祥java邮件开发”旨在教授如何利用Java进行邮件的发送和处理。在这个16节的完整...

Global site tag (gtag.js) - Google Analytics