问. 我如何安装 javamail api 实现?
答:解压缩分发的 zip 文件,并编辑 classpath 环境变量以包含 mail.jar 文件,该文件包括在 javamail api 分发中。你也需要 javabeans activation framework(参见下面)的实现。参阅 readme 文件(在分发中),获得其他细节和例子。
问. javamail 是否包括所有必要的邮件服务器?
答:不是,javamail api 包不包括任何邮件服务器。为了使用 javamail api 包,你将需要访问 imap 或 pop3 邮件服务器(用于阅读邮件)和/或 smtp 邮件服务器(用于发送邮件)。这些邮件服务器通常由 internet 服务提供商提供,或者作为组织网络基础结构的一部分。如果你不必访问这样的邮件服务器,请往下看。
问. 从哪里可以获得必要的邮件服务器?
答:sun java system messaging server 可用于 solaris 和 windows 平台。华盛顿大学的 imap 服务器支持多种平台 (unix、32 位 windows 等)。可从如下地址获取源代码:ftp://ftp.cac.washington.edu/imap/imap.tar.z。其他的许多供应商提供了支持 internet 标准的邮件服务器。可以从 imap connection 和 internet mail consortium 获得更多信息。
问. 我应该使用什么主机名、用户名或密码?
答:我们不提供邮件服务器让你使用。你必须使用自己的邮件服务器,或者使用 internet 服务提供商或你所工作的公司提供的邮件服务器。网络管理员可能给你一些必要的信息用于配置 javamail,以便同邮件服务器一起工作。
问. 我如何配置 javamail 通过代理服务器工作?
答:大多数代理服务器只支持 http 协议。javamail 没有使用 http 协议来阅读或发送邮件。使用代理服务器的一个主要原因是为了允许企业网络中的 http 请求通过企业防火墙。防火墙通常会阻止对 internet 的大多数访问,但允许来自代理服务器的请求通过。此外,企业网络内部的邮件服务器将为邮件执行类似的功能,通过 smtp 接收消息,然后将它们转发到 internet 上的最终目的地,以及接收传入的消息,然后将它们发送到合适的内部邮件服务器。
如果你的代理服务器支持 socks v4 或 v5 协议 (http://www.socks.nec.com/aboutsocks.html, rfc1928),并允许匿名连接,可以告诉 java 运行时把所有的 tcp socket 直接连接到 socks 服务器。参阅 http://java.sun.com/j2se/1.4/docs/guide/net/properties.html,获取 socksproxyhost 和 socksproxyport 属性的最新文档。这些是系统级属性,而不是 javamail 会话属性。当调用应用程序时,它们可以从命令行中设置,例如:java -dsocksproxyhost=myproxy ...。这个工具可用于指出从 javamail 到 socks 代理服务器进行 smtp、imap 和 pop3 通信。注意,设置这些属性将告诉 所有 tcp socket 连接到 socks 代理,在应用程序的其他方面上,这可能会带来负面影响。
假如没有这样的 socks 服务器,如果想使用 javamail 来直接访问防火墙外部的邮件服务器,那将需要配置防火墙来允许这一访问。一个简单的 http 代理 web 服务器是足够的。
问. 如何在 windows nt 中设置 classpath?
答:详细说明可从 这里 获得。
问. 当试图在 linux 中运行程序时,得到了非常奇怪的错误消息,而且程序运行失败了。错误在哪里?
答:通常,错误消息看起来像下面这样:
exception in thread "main"
java.lang.verifyerror:(class:com/sun/mail/pop3/pop3store,
method: finalize signature :()v)
illegal use of nonvirtual function call
问题是由于在 linux 上,使用的 unzip 命令是有 bug 的版本,这样解压缩 javamail 下载包时,unzip 命令破坏了 mail.jar 文件。获取更新版本的 unzip 命令或使用 jdk 的 jar 命令来解压缩下载包。
问. 在运行于 securitymanager 下面的应用程序中,我如何使用 javamail;我必须授予应用程序和 javamail 什么权限?
答:在具有 securitymanager 的 jdk 1.2(或更新版本)中,当使用 javamail 时,javamail 读取 mail.jar 文件中的配置文件有时会失败。在从 activation.jar 文件中读取配置文件时,javabeans activation framework 可能也有相同的问题。这些默认配置文件是作为“资源”文件存储的,并且存储在 jar 文件的 meta-inf 目录中。
有许多调试技术可用于决定这是否是个问题。设置 session 属性“mail.debug”为 true(或调用 session.setdebug(true)),将导致 javamail 在试图加载各个配置文件时打印调试消息。形如“debug: can't load default providers file”(debug: 不能加载默认提供程序文件) 的消息指出这个问题可能存在。同样,设置 system 属性“javax.activation.debug”为“true”(例如,通过使用 "java -djavax.activation.debug=true ..." 来运行程序),将导致 jaf 在试图加载各个资源文件时打印调试消息。最后,通过设置 system 属性“java.security.debug” 为“access:failure”(例如,通过使用“java -djava.security.debug=access:failure ...”来运行程序),jdk 可以产生有用的调试输出。
除了读取配置文件的必要权限外,应用程序(和 javamail)也将需要一定的权限才可以连接到它使用的邮件服务器。如果应用程序使用 system 属性来配置 javamail(例如,像许多 javamail 演示程序所做的那样,通过传递从 system.getproperties() 中返回的 properties 对象到 session 构造函数),它也将需要一定的权限才可以使用 system properties 对象。另外,应用程序可以使用自己的 properties 对象,以及确信设置 "mail.from" 属性 或 "mail.user" 和 "mail.host" 属性(参见 internetaddress.getlocaladdress() 方法)。
在 jdk 1.2 securitymanager 中,为了使应用程序能够使用 javamail,应用程序、javamail 和 jaf 将需要某些权限,比如下面的一些权限(一定要使用适当的值替换主机名和路径名);把这些权限添加到应用程序使用的安全策略文件中。
grant {
// following two permissions allow
// access to default config files
permission java.io.filepermission
"/path/to/mail.jar", "read";
permission java.io.filepermission
"/path/to/activation.jar", "read";
// following to use smtp
permission java.net.socketpermission
"smtphost:25", "connect,resolve";
// following to use imap
permission java.net.socketpermission
"imaphost:143", "connect,resolve";
// following to use pop3
permission java.net.socketpermission
"pop3host:110", "connect,resolve";
// following needed if system.getproperties() is used
permission java.util.propertypermission
"*", "read,write";
};
问. 如何配置 web 服务器来运行 javamail 演示 servlet?
答:针对以下 web 服务器的指导说明可从这里获得:
tomcat
apache with jserv
iplanet web server
java web server
问. 当在 servlet 中使用 javamail 时,未找到任何的 javamail 类。我已经在服务器的 classpath 中添加了 mail.jar?
答:当改变 classpath 时,通常有必要完全重启 web 服务器。
问. 我的 servlet 可以找到 javamail 类,但 javamail 抱怨它不能找到针对“smtp”或“imap”的服务提供程序或地址类型“rfc822”。
答:通常这是因为 javamail 无法访问 mail.jar 中的配置文件,而这可能是由于安全权限问题造成的;参见 本条目,获取更多的细节。也保证你没有提取 mail.jar 内容;在服务器的 classpath 中,应该包括未更改的 mail.jar 文件。
问. 在哪里可以找到 jws.jar?我已经安装了 java web server 2.0,并试图运行 javamailservlet。readme 文件指示我在 classpath 中添加 jws.jar。
答:jws.jar 不再与 java web server 一起发行(在以前版本中,它们是一起发行的),因此不需要在 classpath 中添加它。只要在 classpath 中添加 mail.jar 和 activation.jar,然后重启 java web server。