首页 JavaMail教程教程

JavaMail教程教程

举报
开通vip

JavaMail教程教程JavaMail教程教程 第 1 页(共JavaMail API 是什么呢, 1 页) JavaMail API 是一个用于阅读、编写和发送电子消息的可选包(标准扩展)。与 Eudora、pine 及 Microsoft Outlook 相似,这个包用来创建邮件用户代理(Mail User Agent,MUA) 类型程序。API 的主要用途并不在于传输、发送和转发消息;这一功能范围属于某些应用程序,如 sendmail 及其它邮件传输代理(Mail Transfer Agent,MTA)类型程序。MUA 类型的...

JavaMail教程教程
JavaMail教程教程 第 1 页(共JavaMail API 是什么呢, 1 页) JavaMail API 是一个用于阅读、编写和发送电子消息的可选包( 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 扩展)。与 Eudora、pine 及 Microsoft Outlook 相似,这个包用来创建邮件用户代理(Mail User Agent,MUA) 类型程序。API 的主要用途并不在于传输、发送和转发消息;这一功能范围属于某些应用程序,如 sendmail 及其它邮件传输代理(Mail Transfer Agent,MTA)类型程序。MUA 类型的程序能让用户阅读和书写邮件,而它却依赖 MTA 处理实际发送。 JavaMail API 打算将 API 分成两部分来支持独立于协议的发送和接受消息: , 此 API 的第一部分是这个课程的焦点 — 基本上来说,是如何发送和接受独立于供应 商,协议消息。 , 第二部分谈到特定协议的语言,如 SMTP、POP、IMAP 和 NNTP。有了 JavaMail API, 要与服务器通信,还需要每个协议的供应商(provider)。此课程不涉及创建特定的协 议供应商,因为 Sun 已经为我们免费提供了很充分的一组。 第 1 页(共介绍 6 页) 在研究 JavaMail API 的细则之前,让我们回顾用于 API 的协议。基本上,您会逐渐熟悉并喜爱的协议有四个: , SMTP , POP , IMAP , MIME 您还将碰到 NNTP 和其它协议。理解所有协议的基本知识将有助于您理解如何使用 JavaMail API。虽然不了解这些协议您照样可以用这个 API,却不能够克服那些基础协议的局限性。如果我们精选的协议不能支持某种性能,JavaMail API 决不能魔术般的将这种性能添加上去。(您很快就会看到,在处理 POP 时这将成为一个难 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 。) 第 2 页(共SMTP 6 页) 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由 RFC 821 定义。它定义了发送电子邮件的机制。在 JavaMail API 环境中,您基于 JavaMail 的程序将和您的公司或因特网服务供应商的(Internet Service Provider's,ISP's)SMTP 服务器通信。SMTP 服务器会中转消息给接收方 SMTP 服务器以便最终让用户经由 POP 或 IMAP 获得。这不是要求 SMTP 服务器成为开放的中继,尽管 SMTP 服务器支持身份验证,不过还是得确保它的配置正确。像配置服务器来中继消息或添加删除邮件账号这类任务的实现,JavaMail API 中并不支持。 第 3 页(共 POP 6 页) POP 代 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 邮局协议(Post Office Protocol)。目前用的是版本 3,也称 POP3,RFC 1939 定义了这个协议。POP 是一种机制,因特网上大多数人用它得到邮件。它规定每个用户一 个邮箱的支持。这就是它所能做的,而这也造成了许多混淆。使用 POP 时,用户熟悉的许 多性能并不是由 POP 协议支持的,如查看有几封新邮件消息这一性能。这些性能内建于如 Eudora 或 Microsoft Outlook 之类的程序中,它们能记住一些事,诸如最近一次收到的 邮件,还能计算出有多少是新的。所以当使用 JavaMail API 时,如果您想要这类信息, 您就必须自己算。 第 4 页(共IMAP 6 页) IMAP 是更高级的用于接收消息的协议。在 RFC 2060 中被定义,IMAP 代表因特网消息访问协议(Internet Message Access Protocol),目前用的是版本 4,也称 IMAP4。在用到 IMAP 时,邮件服务器必需支持这个协议。不能仅仅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假设邮件服务器支持 IMAP,基于 JavaMail 的程序可以利用这种情况 — 用户在服务器上有多个文件夹(folder),并且这些文件夹可以被多个用户共享。 因为有这一更高级的性能,您也许会认为所有用户都会使用 IMAP。事实并不是这样。要求服务器接收新消息,在用户请求时发送到用户手中,还要在每个用户的多个文件夹中维护消息。这 样虽然能将消息集中备份,但随着用户长期的邮件夹越来越大,到磁盘空间耗尽时,每个用户都会受到损失。使用 POP,就能卸载邮件服务器上保存的消息了。 第 5 页(共MIME 6 页) MIME 代表多用途因特网邮件扩展标准(Multipurpose Internet Mail Extensions)。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 。这里有很多不同的有效文档:RFC 822、RFC 2045、RFC 2046 和 RFC 2047。作为一个 JavaMail API 的用户,您通常不必对这些格式操心。无论如何,一定存在这些格式而且程序会用到它。 第 6 页(共NNTP 及其它 6 页) 因为 JavaMail API 将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持。Sun 保留了一张第三方供应商列表,他们利用了 Sun 不提供超出(out-of-the-box)支持范围的协议。您会找到 NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途因特网邮件扩展)及其它支持。 第 1 页介绍 (共 6 页) 现在有两种常 用的 JavaMail API 版本: 1.2 和 1.1.3。这一课程的所有示例都能在这两种版本上正常运行。虽然版本 1.2 是最新 版,但版本 1.1.3 包含了 Java 2 平台企业版(Java 2 Platform, Enterprise Edition, J2EE)的版本 1.2.1,所以仍然有很多人使用它。您要用的 JavaMail API 的版本 取决于您下载和安装的东 西,所有这些 将在JDK 1.1.6+、 J2EE 版本 1.2.x 和 J2SE 版本 1.3.x 下工 作。 注意:安装完 Sun 的 JavaMail 实现后,您可以在 demo 目录中 找到很多示例程序。 第 JavaMail 2 页1.2 的安(共 6 装 页) 要使用 JavaMail 1.2 API,请下载 JavaMail 1.2 实 现,解开 javamail-1_2.zip 文 件,并将 mail.jar 文件 添加到您的 CLASSPATH 中。除了核心类,随版 本 1.2 实现一起 提供的还有 SMTP、IMAP4 和 POP3 供应商。 安装完 JavaMail 1.2 之后,安装 JavaBeans Activation Framework。 第 JavaMail 3 页1.1.3 的(共 6 安装 页) 要使用 JavaMail 1.1.3 API,请下 载 JavaMail 1.1.3 实现,解开 javamail1_1_3.zip文件,并将 mail.jar 文件添加到您的 CLASSPATH 中。除了核心类,随版 本 1.1.3 实现一 起提供的还有 SMTP 和 IMAP4 供应商。 如果您用 JavaMail 1.1.3 访问一个 POP 服 务器,请下载并安 装一个 POP3 供 应商。Sun 就有一 个独立于 JavaMail 实现。 下载并解开 pop31_1_1.zip 文件后,将 pop3.jar 也 添加到您的 CLASSPATH 中。 安装完 JavaMail 1.1.3 之后,请安 装 JavaBeans Activation Framework。 第 4 页 (共6 JavaBeans Activation Framework 的安装 页) JavaMail API 的所有版本都需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理。功能似乎不多,但目前许多浏览器和邮件工具中都能找到这种基本的 MIME 型支持。下载完框架后,解开 jaf1_0_1.zip 文件,并将 activation.jar 文件添加到 CLASSPATH 中。 对于 JavaMail 1.2 用户来说,现在您应该已将 mail.jar 和 activation.jar 文件添加到 CLASSPATH 中了。 而对于 JavaMail 1.1.3 用户,现在您应该已将 mail.jar、pop3.jar和 activation.jar文件添加到 CLASSPATH 中了。如果不打算用 POP3,就不必将 pop3.jar 添加到 CLASSPATH 中去。 如果您不想更改 CLASSPATH 环境变量,将 jar 文件复制到您 Java 运行时 环境(Java Runtime Environment,JRE)目录下的 lib/ext 目录中去。例如,J2SE 1.3 发行版的缺省目录在 Windows 平台的 C:\jdk1.3\jre\lib\ext。 第 5 页(共在 Java 2 企业版中使用 JavaMail 6 页) 如果您使用 J2EE,就没有什么特定的事非要用基本 JavaMail API 来做不可;J2EE 的类就 能处理了。只要确保 j2ee.jar 文件已在您的CLASSPATH 中并已全部设置好。 对于 J2EE 1.2.1 来说,需要个别安装 POP3 供应商,所以请下载并按照前面“JavaMail 1.1.3 的安装”章节所展示的步骤将 POP3 供应商引入。J2EE 1.3 的用户在 J2EE 中得到了 POP3 供应商,所以不必再个别安装了。这两种安装都不必再安装 JavaBeans Activation Framework。 第 1 页介绍 (共8 页) 在采用深入探索 JavaMail 类的入门方法前,这一章向您展示构成 API 的核心类:Session、Message、Address、Authenticator、Transport、Store 和 Folder。尽管您常会发现自己使用的子类在 javax.mail.internet 中,但上述这些类却放在 JavaMail API的顶级包 javax.mail 里。 第 2 页Session (共8 页) Session 类定义了一个基本邮件会话(session)。所有其它类都是经由这个session 才得以生效。Session 对象用 java.util.Properties 对象获取信息,如邮件服务器、用户名、密码及整个应用程序中共享的其它信息。 类的构造器是私有的(private)。您可以得到单个缺省 session,它能用 getDefaultInstance() 方法 被共享: Properties props = new Properties(); // fill props with any information Session session = Session.getDefaultInstance(props, null); 或者,您还可以用 getInstance() 创建一个独立的 session: Properties props = new Properties(); // fill props with any information Session session = Session.getDefaultInstance(props, null); 对于这两种情况,null 参数都是 Authenticator 对象(在这次没有使用)。 对于大多数情况,共享的 session 已经够用了,即使要处理多个用户邮箱的邮件 session 也一样。您可以在通信过程中稍后的步骤加入用户名和密码组合,让一切 保持独立。 第 3 页(共Message 8 页) 一旦获得 Session 对象,就可以继续创建要发送的消息。这由 Message 类来完成。因为 Message 是个抽象类,您必需用一个子类,多数情况下为 javax.mail.internet.MimeMessage。MimeMessage 是个能理解 MIME 类型和头的电子邮件消息,正如不同 RFC 中所定义的。虽然在某些头部域非 ASCII 字符也能被译码,但 Message 头只能被限制为用 US-ASCII 字符。 要创建一个 Message,请将 Session 对象传递给 MimeMessage 构造器: MimeMessage message = new MimeMessage(session); 注意:还存在其它构造器,如用按 RFC822 格式的输入流来创建消息。 一旦获得消息,您就可以设置各个部分,因为 Message 实现 Part 接口(且 MimeMessage 实现 MimePart )。设置内容的基本机制是 setContent() 方法,同时使用参数,分别代表内容和 mime 类型: message.setContent("Hello", "text/plain"); 但如果,您知道您在使用 MimeMessage,而且消息是纯文本格式,您就可以用 setText() 方法,它只需要代表实际 内容的参数,( MIME 类型缺省为 text/plain): message.setText("Hello"); 后一种格式是设置纯文本消息内容的首选机制。至于发送其它类型的消息,如 HTML 文件格式的 消息,我们首选前者。 用 setSubject() 方法设置 subject(主题): 第 4 页(共Address 8 页) 一旦您创建了 Session 和 Message,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是 javax.mail.internet.InternetAddress 类。 若创建的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。 Address address = new InternetAddress("president@whitehouse.gov"); 若希望名字紧挨着电子邮件显示,也可以把它传递给构造器: Address address = new InternetAddress("president@whitehouse.gov", "George Bush"); 需要为消息的 from 域和 to 域创建地址对象。除非邮件服务器阻止,没什么能阻止你发送一段看上去是来自任何人的消息。 一旦创建了 address(地址),将它们与消息连接的方法有两种。如果要识别发件人,您可以用 setFrom() 和 setReplyTo() 方法。 message.setFrom(address) 需要消息显示多个 from 地址,可以使用 addFrom() 方法: Address address[] = ...; message.addFrom(address); 若要识别消息 recipient(收件人),您可以使用 addRecipient() 方法。除 address(地址)外,这一方法还请求一个 Message.RecipientType。 message.addRecipient(type, address) 三种预定义的地址类型是: , Message.RecipientType.TO , Message.RecipientType.CC , Message.RecipientType.BCC 如果消息是发给副总统的,同时发送一个副本(carbon copy)给总统夫人,以下做法比较恰当: Address toAddress = new InternetAddress("vice.president@whitehouse.gov"); Address ccAddress = new InternetAddress("first.lady@whitehouse.gov"); message.addRecipient(Message.RecipientType.TO, toAddress); message.addRecipient(Message.RecipientType.CC, ccAddress); JavaMail API 没有提供电子邮件地址有效性核查机制。虽然通过编程,自己能够扫描有效字符(如 RFC 822 中定义的)或验证邮件交换(mail exchange,MX)记录,但这些功能不属于 JavaMail API。 第 5 页(共Authenticator 8 页) 与 java.net 类一样,JavaMail API 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于JavaMail API 来说,这些资源就是邮件服务器。JavaMail Authenticator 在 javax.mail 包中,而且它和 java.net 中同 名的类 Authenticator 不同。两者并不共享同一个 Authenticator,因为JavaMail API 用于 Java 1.1,它没有 java.net 类别。 要使用 Authenticator,先创建一个抽象类的子类,并从 getPasswordAuthentication() 方法中返回 PasswordAuthentication 实例。创建完成后,您必需向 session 注册 Authenticator。然后,在需要认证的时候,就会通知 Authenticator。您可以弹出窗口,也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为 PasswordAuthentication 对象返回给调用程序。 Properties props = new Properties(); // fill props with any information Authenticator auth = new MyAuthenticator(); Session session = Session.getDefaultInstance(props, auth); 第 6 页(共Transport 8 页) 消息发送的最后一部分是使用 Transport 类。这个类用协议指定的语言发送消息(通常是 SMTP)。它是抽象类,它的工作方式与 Session 有些类似。仅调用静态 send() 方法,就能使用类的 版本:缺省 Transport.send(message); 或者,您也可以从针对您的协议的会话中获得一个特定的实例,传递用户名和密码(如果不必要就不传),发送消息,然后关闭连接。 message.saveChanges(); // implicit with send() Transport transport = session.getTransport("smtp"); transport.connect(host, username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); 后面这种方法在您要发送多条消息时最好,因为它能保持邮件服务器在消息间的活动状态。基本 send() 机制为每个方法的调用设置与服务器独立的连接。 注意:要观察传到邮件服务器上的邮件命令,请用 session.setDebug(true) 设置调试标志。 第 7 页(共Store 和 folder 8 页) 用 Session 获取消息与发送消息开始很相似。但是,在 session 得到后,很可能使用用户名和密码或使用 Authenticator 连接到一个 Store。类似于 Transport ,您告知 Store 使用什么协议: // Store store = session.getStore("imap"); Store store = session.getStore("pop3"); store.connect(host, username, password); 连接到 Store 之后,接下来,您就可以获取一个 Folder,您必需先打开它,然后才能读里面的消息。 Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); POP3 唯一可以用的文件夹是 INBOX。如果使用 IMAP,还可以用其它文件夹。 注意:Sun 的供应商有意变得聪明。虽然 Message message[] = folder.getMessages(); 看上去是个很慢的操作,它从服务器上读取每一条消息,但仅在你实际需要消息的一部分时,消息的内容才会被检索。 一旦有了要读的 Message,您可以用 getContent() 来获取其内容,或者用 writeTo() 将内容写入流。getContent() 方法只能得到消息内容,而 writeTo() 的输出却包含消息头。 System.out.println(((MimeMessage)message).getContent()); 一旦读完邮件,要关闭与 folder 和 store 的连接。 folder.close(aBoolean); store.close(); 传递给 folder 的 close() 方法的 boolean 表示是否清除已删除的消息从而更新 folder。 第 8 页(共继续 8 页) 基本上,对于 JavaMail API 差不多所有内容,了解如何使用这七个类已经足够。JavaMail API 其它功能建立在这七个类的基础上,它们做的事稍有不同,或者方法独特,如内容是附件的情况。 某些如搜索之类的任务,是个别情况,我们稍候讨论。 第 1 页(共介绍 9 页) 您已经了解如何运用 JavaMail API 的核心部分。在接下来的章节,您会看到如何连接从而 实现给定任务块的入门方法。 第 2 页(共发送消息 9 页) 发送电子邮件消息这一过程包括获取一个会话,创建并填充一则消息,然后发送。得到 Session 时,经由设置传递的 Properties 对象中的 mail.smtp.host 属性,可以指定您的 SMTP 服务器: String host = ...; String from = ...; String to = ...; // Get system properties Properties props = System.getProperties(); // Setup mail server props.put("mail.smtp.host", host); // Get session Session session = Session.getDefaultInstance(props, null); // Define message MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello JavaMail"); message.setText("Welcome to JavaMail"); // Send message Transport.send(message); 您应该将代码放在一个 try-catch 程序块中,这样创建和发送消息时就能够抛出异常。 第 3 页(共消息的提取 9 页) 为读邮件,您获取一个会话,获取并连接一个用于邮箱的适宜的存储(store),打开适宜的文件夹,然后获取您的消息。同样,切记完成后关闭连接。 String host = ...; String username = ...; String password = ...; // Create empty properties Properties props = new Properties(); // Get session Session session = Session.getDefaultInstance(props, null); // Get the store Store store = session.getStore("pop3"); store.connect(host, username, password); // Get folder Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); // Get directory Message message[] = folder.getMessages(); for (int i=0, n=message.length; i 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 教程;只要将两部分输入同一个域,用逗号分隔就行。) import javax.mail.*; import javax.swing.*; import java.util.*; public class PopupAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { String username, password; String result = JOptionPane.showInputDialog( "Enter 'username,password'"); StringTokenizer st = new StringTokenizer(result, ","); username = st.nextToken(); password = st.nextToken(); return new PasswordAuthentication(username, password); } } 因为 PopupAuthenticator 涉及到 Swing,它会启动 AWT 的事件处理线程。这一点基本上要求您在代码中添加一个对 System.exit() 的调用来终止程序。 第 6 页(共消息的回复 9 页) Message 类引入一个 reply() 方法来配置一个新 Message,包括正确的 recipient(收件人)和添加“Re”(如果没有就添加)的正确的 subject。这样做并没有为消息添加新内容,仅仅将 from 或 reply-to(被回复人) 头复制给新的收件人。这种方法用一个 boolean 参数指定消息只回复给发件人(false)或回复给全体(true)。 MimeMessage reply = (MimeMessage)message.reply(false); reply.setFrom(new InternetAddress("president@whitehouse.gov")); reply.setText("Thanks"); Transport.send(reply); 在发送消息时要配置 reply to(被回复人) 地址,可以用 setReplyTo() 方法。 第 7 页(共消息的转发 9 页) 转发消息有一点棘手。没有单独的方法可以调用,您通过对组成消息各部分的处理来组织要转发的消息。 一条邮件消息可以由多个部分组成。在处理 MIME 消息时,消息中每部分都是 BodyPart,再特殊些,是 MimeBodyPart。不同的 body part(信体部件或正文部件)结合成一个容器,名为 Multipart,再特殊些,就是 MimeMultipart。要转发一条消息,您为自己的消息正文创建一个部件,要转发的消息作为另一部件。并且将两个部件结合成一个 multipart(多部件)。然后您将这个 multipart 添加到一则已写好恰当地址的消息中,并发送。 本质上就是如此。要将一条消息内容复制到另一条,只要复制 DataHandler (JavaBeans Activation Framework 中的类)就行了。 // Create the message to forward Message forward = new MimeMessage(session); // Fill in header forward.setSubject("Fwd: " + message.getSubject()); forward.setFrom(new InternetAddress(from)); forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Create your new message part BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText( "Here you go with the original message:\n\n"); // Create a multi-part to combine the parts Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); // Create and fill part for the forwarded content messageBodyPart = new MimeBodyPart(); messageBodyPart.setDataHandler(message.getDataHandler()); // Add part to multi part multipart.addBodyPart(messageBodyPart); // Associate multi-part with message forward.setContent(multipart); // Send message Transport.send(forward); 第 8 页(共附件的处理 9 页) 附件是邮件消息的相关资源,如通常不包含在消息正文里文本文件、电子表格或图像等。常见的邮件程序,如 Eudora 和 pine 之类,可以用 JavaMail API 将资源 attach(附加) 到您的消息上,就可以在收到消息时得到。 附件的发送: 发送附件非常像转发消息。您建立各部分以组成完整消息。完成第一部件,即消息正文后,您添加其它部件,其中每个 DataHandler 都代表附件,而不是转发消息情况下的共享处理程序。如果从文件中读附件,附件的数据源是 FileDataSource。而如果从 URL 中读时,附件的数据源是 URLDataSource。一旦存在 DataSource,只要先把它传递给 DataHandler 构造器,最后再用 setDataHandler() 把它附加到 BodyPart。假定您要保留附件的原始文件名,最终要做的是用 BodyPart 的 setFileName() 方法设置与附件相关的文件名。如下所示: // Define message Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello JavaMail Attachment"); // Create the message part BodyPart messageBodyPart = new MimeBodyPart(); // Fill the message messageBodyPart.setText("Pardon Ideas"); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); // Part two is attachment messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); // Put parts in message message.setContent(multipart); // Send the message Transport.send(message); 就消息引入附件时,若程序是个 servlet (小服务程序),除告知消息发送到何处外,还必需上载附件。可以将 multipart/form-data 表单编码类型(form encoding type)用于每个上载文件的处理。
注意:消息大小由 SMTP 服务器而不是 JavaMail API 来限制。如果您碰到问题,可以考虑用设置 ms 和 mx 参数的方法增大 Java 堆大小。 练习: 练习 5. 如何发送附件 附件的获取: 从消息中获取附件比发送它们棘手些,因为 MIME 没有简单的关于附件的概念。当消息包含附件时,消息的内容是个 Multipart 对象。接着,您需要处理每个 Part,获取主要内容和附件。标有从 part.getDisposition() 获得的 Part.ATTACHMENT 配置(disposition)的部件(Part)无疑就是附件。但是,没有配置(以及一个非文本 MIME 类型)和带 Part.INLINE 配置的部件也可能是附件。当配置要么是 Part.ATTACHMENT,要么是 Part.INLINE 时,这个消息部件的内容就能被保存。只要用 getFileName() 和 getInputStream() 就能分别得到原始文件名和输入流。 Multipart mp = (Multipart)message.getContent(); for (int i=0, n=multipart.getCount(); i"; message.setContent(htmlText, "text/html")); 在接收端,如果您用 JavaMail API 提取消息,API 中没有内建的显示 HTML 消息的东西。 JavaMail API 只把它看成一串字节流。要显示 HTML 文件格式的消息,您必需使用 Swing JEditorPane 或其它第三方 HTML 格式查看器组件。 if (message.getContentType().equals("text/html")) { String content = (String)message.getContent(); JFrame frame = new JFrame(); JEditorPane text = new JEditorPane("text/html", content); text.setEditable(false); JScrollPane pane = new JScrollPane(text); frame.getContentPane().add(pane); frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.show(); } 在消息中引入图像: 另一方面,如果您想让 HTML 文件格式内容的消息完整(内嵌的图像作为消息的一部分),您必需把图像作为附件,并且用一个给定的 cid URL 引用图像,其中 cid 是图像附件 Content-ID 头的引用。 嵌入图像的过程与附加文件到消息的过程非常相似,唯一的区别在于您必需通过设置 MimeMultipart 构造器中的子类型(或者说用 setSubType())告知 MimeMultipart 各个相关部件,并且将这个图像的 Content-ID 头设置成随机字符串,作为图像的 src 在 img 标记中使用。完整的演示如下。 String file = ...; // Create the message Message message = new MimeMessage(session); // Fill its headers message.setSubject("Embedded Image"); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // Create your new message part BodyPart messageBodyPart = new MimeBodyPart(); String htmlText = "

Hello

" + ""; messageBodyPart.setContent(htmlText, "text/html"); // Create a related multi-part to combine the parts MimeMultipart multipart = new MimeMultipart("related"); multipart.addBodyPart(messageBodyPart); // Create part for the image messageBodyPart = new MimeBodyPart(); // Fetch the image and associate to part DataSource fds = new FileDataSource(file); messageBodyPart.setDataHandler(new DataHandler(fds)); messageBodyPart.setHeader("Content-ID","memememe"); // Add part to multi-part multipart.addBodyPart(messageBodyPart); // Associate multi-part with message message.setContent(multipart); 第 1 页(共介绍 1 页) JavaMail API 引入一个过滤机制,它在 javax.mail.search 包中,能用于建立 SearchTerm。一旦建立,您可以询问 Folder,有什么消息匹配,得到一个 Message 对象的数组: SearchTerm st = ...; Message[] msgs = folder.search(st); 有 22 个不同的类有助于您建立搜索条件。 , AND 条件(class AndTerm) , OR 条件(class OrTerm) , NOT 条件(class NotTerm) , SENT DATE 条件(class SentDateTerm) , CONTENT 条件(class BodyTerm) , HEADER 条件(FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc..) 基本上,您建立一个匹配消息的逻辑表达式,然后搜索。例如,下面的条件搜索主题(subject)字符串(部分)为 ADV 或 from 域为 friend@public.com 的消息。您可以考虑定期运行这一查询并自动删除任何返回消息。 SearchTerm st = new OrTerm( new SubjectTerm("ADV:"), new FromStringTerm("friend@public.com")); Message[] msgs = folder.search(st); 第 1 页(共总结 3 页) JavaMail API 是一个 Java 包,用于阅读、编写及发送电子邮件消息(包括附件)。您能用它建立基于标准的电子邮件客户机,它配置了各种因特网邮件协议包括 SMTP、POP、IMAP 和 MIME,还包括相关的 NNTP、S/MIME 及其它协议。 此 API 自然的划分为两个部件。第一部件着眼于独立于使用协议的发送、接收及管理消息,而第二部件则着眼于协议的特定用途。本教程的目的在于展示如何利用 API 的第一部分,并不试图涉及协议供应商。 核心 JavaMail API 由七个类组成 — Session、Message、 Address、Authenticator、Transport、Store 及 Folder — 它们都来自 javax.mail、即 JavaMail API 顶级包。我们用这些类完成了大量常见的电子邮件任务,包括发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、处理基于 HTML 文件格式的消息以及搜索或过滤邮件列表。 最后,提供了大量按部就班的练习来协助说明提出的概念。希望会有助于您将电子邮件功能性添加到独立于平台的 Java 应用程序。
本文档为【JavaMail教程教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_841159
暂无简介~
格式:doc
大小:78KB
软件:Word
页数:29
分类:生活休闲
上传时间:2018-04-29
浏览量:45