练习
发送带有图片的 HTML 消息 用SearchTerm搜索
JavaMail API包含一种可用于创建SearchTerm(搜索条件)的筛选机制,它可以在javax.mail.search包中找到。一旦创建了SearchTerm,您就可以询问某个文件夹匹配的消息,并检索出消息对象数组: SearchTerm st = ...;
Message[] msgs = folder.search(st); 有22种不同的类可用于帮助创建搜索条件。 · AND条件(AndTerm类) · OR条件(OrTerm类) · NOT条件(NotTerm类)
· SENT DATE条件(SentDateTerm类) · CONTENT条件(BodyTerm类)
· HEADER条件(FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc.)
本质上,您可以为匹配的消息创建一个逻辑表达式,然后进行搜索。例如,下面显示了一条消息的条件搜索示例,该消息带有(部分带有)一个ADV主题字符串,其发送者字段为friend@public.com。您可能考虑定期运行该查询,并自动删除任何返回的消息。 SearchTerm st = new OrTerm(
new SubjectTerm(\
new FromStringTerm(\friend@public.com\Message[] msgs = folder.search(st);
CNBIE BLOG
-------------------------------------------------------------------------------- JavaMail API简介 原文:JavaMail API简介 JavaMail API简介
JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展)。您可使用这种包创建邮件用户代理(Mail User Agent ,MUA) 类型的程序,它类似于Eudora、Pine及Microsoft Outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(Mail Transfer Agent,MTA)类型的程序那样用于传输、发送和转发消息。换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。 JavaMail API的设计是,为收发信息提供与协议无关的访问。方式是把该API划分成两个部分: · 该API的第一个部分是本课程的重点。基本上是如何发送和接收独立于提供程序/协议的消息。 · 第二个部分则使用特定的协议语言,如:SMTP、POP、IMAP和NNTP。如果要让JavaMail API与服务器通信,就需要为之提供协议。由于Sun公司对特定协议提供程序有充分的介绍,用户可以免费获取,所以本课程没有介绍创建特定协议提供程序的内容。 复习相关协议
在学习JavaMail API的深层知识之前,让我们回过头来看一看在该API中使用的协议,本质上
有4种人们常用的协议: · SMTP · POP · IMAP · MIME
您还需要了解NNTP及其他一些协议。理解这些协议的基本原理有助于您理解如何使用JavaMail API。而该API的设计要与协议无关,所以不能克服这些基础协议的限制。如果选用的协议不支持某种功能,那么JavaMail API也无法在其上添加这种功能。(正如您一会儿就会看到的,在操作POP协议时,常常会碰到这种问题)。 SMTP
简单邮件传输协议(SMTP)是用于传送电子邮件的机制。在JavaMail API环境中,您的基于JavaMail的程序将与您公司或Internet服务提供商(ISP)的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。 POP
POP的含义是邮局协议,当前的版本为3,也称作POP3,该协议是在RFC 1939中定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或Microsoft Outlook之类的邮件程序中,能为您记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用JavaMail API时,如果想获取这类信息,将需要由自己进行计算。 IMAP
IMAP是用于接收消息的更加高级的协议,它是在RFC 2060中定义的。IMAP的含义是“Internet消息访问协议”,当前版本是第4版,也称作IMAP4。使用IMAP时,您的邮件服务器必须支持该协议。您不能只是简单地把程序转变为支持IMAP,而不是支持POP,就指望能支持IMAP中的一切。假定您的邮件服务器支持IMAP,那么基于JavaMail的程序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的功能。
由于IMAP协议具有更高级的功能,您也许会想IMAP应该被每一个人使用,但事实不是这样。因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光了时,每个人都会遭受损失。而使用POP协议时,已保存消息可以解除服务器的重负。 MIME
MIME的含义是“多用途的网际邮件扩充协议”。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC 822、RFC 2045、RFC 2046和RFC 2047。作为JavaMail API的用户,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。 NNP和其他协议
由于JavaMail API分开了提供程序和其他部分,所以您可以轻松地为附加协议添加支持。Sun公司提供第3方提供程序清单,这些提供程序要利用 Sun公司不支持的少见的协议。在这份清单中,您将会看到对NNTP(asp.cn/ class=wordstyle>网络新闻传输协议)[新闻组]、S/MIME(安全多用途的网际邮件扩充协议)及其他协议的提供支持的第3方提供程序。
安装
目前有两种版本的JavaMail API最常用:1.2和1.1.3。本课程中的所有例子都适用于这两种版本。其中JavaMail API 1.2是最新的,而JavaMail API 1.1.3中包含了Java 2企业版(J2EE)平台1.2.1版,所以它仍然很常用。使用JavaMail API的版本会对您的下载和安装产生一些影响。这两种版本的JavaMail API都能与JDK 1.1.6、Java 2标准版(J2SE)平台1.2.x和1.3.x协同工作。
注意:在安装了Sun公司的JavaMail工具后,会在演示目录下看到许多示例程序。 安装JavaMail 1.2
要使用JavaMail 1.2 API,可以下载JavaMail 1.2工具,然后解压缩javamail-1_2.zip文件,并把mail.jar文件添加到典型安装路径下。JavaMail 1.2工具带有SMTP、IMAP4和POP3提供程序以及核心类。
安装完JavaMail 1.2后,再安装JavaBeans Activation Framework。 安装JavaMail 1.1.3
要使用JavaMail 1.1.3 API,可以下载JavaMail 1.1.3工具,然后解压缩javamail1_1_3.zip文件,并把mail.jar文件添加到典型安装路径下。JavaMail 1.1.3工具带有SMTP和IMAP4提供程序以及核心类。
如果您想用JavaMail 1.1.3访问POP服务器,需要下载并安装POP3提供程序。Sun公司拥有
CNBIE BLOG
-------------------------------------------------------------------------------- JavaMail 之 杜绝邮件乱码 原文:JavaMail 之 杜绝邮件乱码
我一直想不通,RFC822 标准都发布多少年了,为什么还有那么多不符合规范的email 出现呢?一来也许是服务器的问题,二来就是不负责任的程序员的错了。所以我突然意识到,不是只有冷血无情的老板和咄咄逼人的客户让程序员的身心饱受摧残,同行的不经意或经意也在加剧着伤害。
我面对着一份邮件原文发出以上的感慨,客户抱怨该邮件收到的时候在系统中正文显示是乱码。这是一份典型的不合规范的邮件: Content-Type : text/plain ,没有说明 charset,而接下来的正文直接就是未进行任何编码的中文文字。不过 Subject 却是符合规范的(=?gb2312?B?xxxxxxx?=)。
行行色色的不合规范的邮件见过不少,最常见的就是某些header未编码,还有的可能就是,Body编码了而Subject 未编码,最讨厌的就是整份Email都没有编码信息。 恨归恨,问题还是得解决,我修改了代码,处理逻辑如下:
1. 在最开始解析邮件的时候,先解析某些可能带有编码信息的header,并记录为 headerCharset;部分代码如下:
private static Pattern encodeStringPattern =
Pattern.compile(\Pattern.DOTALL);
private final String[] CHARTSET_HEADER = new String[] { \
\ ..........
Enumeration enum = message.getMatchingHeaderLines(CHARTSET_HEADER); while (enum.hasMoreElements()) {
String header = (String) enum.nextElement(); Matcher m = encodeStringPattern.matcher(header); if (m.find()) {
this.headCharset = m.group(1);
log.debug(\ break; } }
2. 接着解析邮件体,找到 Body 的时候,看看是否指明 charset 信息;如果指定了,记录为 bodyCharset;如果没有,使用 headerCharset,如果 headerCharset 也是 null,使用默认charset。通常是 ISO-8859-1。
3. 最后再处理邮件 header,如果没有charset 信息,使用 bodyCharset,否则使用默认charset。
以上的解决方案,只要邮件的Body或者Header中的一个提供了编码信息,那么都可能可以避免乱码的产生,如果哪份遭千杀的邮件,Body 用 gb2312 编码,Subject 却是未编码的日文,那我只能长叹被击败了。如果整份邮件都没有编码信息的话,除非你确定邮件都是指定的编码并进行转码,否则只有听天由命。
最后还是要呼吁一声,请遵循规范!
CNBIE BLOG
-------------------------------------------------------------------------------- JavaMailAPI及其应用——一个邮件列表服务器的实现(三)(转贴) 原文:JavaMailAPI及其应用——一个邮件列表服务器的实现(三)(转贴) 相关资源
1.Java Mail API软件包下载(版本1.1.2)
ftp://usmt.java.sun.com/pub/javamail/tyo39/javamail1_1_2.zip 缺省POP3实现软件包下载:
ftp://usmt.java.sun.com/pub/javamial/tyo39/pop31_1.zip 以上文件也可以从Sun的Java Mail API主页下载 http://java.sun.com/products/javamail/
2.JavaBeans Activation Framework(JAF)主页 http://java.sun.com/beans/glasgow/jaf.html
3.用Java Mail API开发的第三方产品列表,部分可以下载源代码 http://java.sun.com/products/javamail/Third_Party.html 4.Java meets e-mail
http://www.developer.com/journal/techworkshop/112498_jmail.html 5.Cutting Edge Java Technology: The JavaMail API http://www.sigs.com/
6.订阅由Sun维护的关于Java Mail API的邮件列表 发信给listserv@java.sun.com,内容: subscribe javamail-interest
CNBIE BLOG
-------------------------------------------------------------------------------- JavaMail操作的总结(2) 原文:JavaMail操作的总结(2)
//此段代码用来进行服务器对用户的认证
public class Email_Autherticator extends Authenticator {
public Email_Autherticator() { super(); }
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,password); } }
//该程序为接收邮件
void jButton2_actionPerformed(ActionEvent e) { try