`

JavaMail常见问题

阅读更多

阅读邮件——IMAP

问. 我尝试在 IMAP 服务器上运行演示程序,但我得到了错误。
答:首 先检查在 IMAP 服务器上确实有一个电子邮件账户。与系统管理员协商有关它的事情。通过在代码中调用 session 对象上的 setDebug(true) 方法来打开调试模式。这将造成在屏幕上转储 IMAP 协议跟踪。把这个跟踪发送给我们。对于说明问题,这个跟踪是非常有用的。如果可以的话,请将有关你的 IMAP 服务器的供应商信息发送给我们。

问. 当我提取带有较大附件的消息时,IMAP 提供程序似乎丢失了数据。
答:这是由于在 IMAP 服务器的部分提取实现中有 bug。为了解决这个服务器 bug,请将“mail.imap.partialfetch”属性设置为 false。参考 JavaMail 包的 NOTES.txt,获取进一步信息。

问. IMAP 提供程序是否缓存检索的数据?
答:只有在必要的时候,IMAP 提供程序才从服务器上提取消息的数据(javax.mail.FetchProfile 可用于优化这一点)。一旦提取了标题和 bodystructure(主体结构)信息,它就总是缓存在 Message 对象中。不过,没有缓存bodypart(主体部分)的内容。因此每次客户端请求内容时(使用 getContent() 或使用 getInputStream()),就会向服务器发出一个新的 FETCH 请求。这是由于消息的内容可能比较大,因此如果缓存了大量消息的这些内容,就可能导致系统很快用完内存,因为垃圾收集器不能释放被引用的对象。客户端应该注意到这一点,而且如果需要的话,自己维持检索的内容。

问. 我想在文件夹间移动消息。我应该使用 appendMessages() 或 copyMessages() 吗?
答:在下面的这种情况下,使用 copyMessages()——要复制或移动的消息属于某个文件夹,而该方法就是在这个文件夹中被调用的。这是因为一些实现可以优化这个操作,前提是源和目标文件夹属于相同的后端 Store(存储)。否则使用 appendMessages()

问. 有时检索大消息主体似乎是低效的。
答:如果你正在使用 Sun IMAP 提供程序,就可以试着增加 mail.imap.fetchsize 属性(当前默认值是 16K)。这将导致从服务器提取的数据是一些较大的块区。注意,当你这样做时,要冒这样的危险——JVM 可能用完内存。

问. 当加载这种大二进制附件时,我得到了 OutOfMemory 错误。
答:在启动时增大最大 JVM 堆大小。如果使用来自 Sun 的标准 JVM,那就使用“-mx”选项。不要保持不使用消息“内容”的引用。在某些情形下,可以尽量将消息内容作为原始字节进行流转化(使用 getInputStream()),使用它们,然后丢弃已使用的数据块区。

问. 当在主体部分 (bodypart) 上调用 getContent() 时,我为什么会得到 UnsupportedDataTypeException?
答:getContent() 方法返回一个 Java 对象,它代表 bodypart(主体部分)内容。为了让它工作,必须注册对应内容的 MIME 类型的 JAF DataContentHandler。否则将引发 UnsupportedDataTypeException。在这种情形下,可以使用 getInputStream() 方法来将内容作为字节流检索。参阅 JAF 文档,获取有关如何创建和注册自己的 DataContentHandlers 的细节。

问. 当在包含文本数据的主体部分 (bodypart) 上调用 getContent() 时,为什么会得到 UnsupportedEncodingException?
答:当使用 getContent() 时, 文本主体部分(例如主类型是“text”的主体部分)返回 Unicode 字符串对象。通常,这些主体部分内部用某些非 Unicode 字符集保持文本数据。JavaMail(通过 "text/plain" DataContentHandler)试着将那些数据转换成 Unicode 字符串。基础 JDK 的字符集可用于做这种工作。如果 JDK 不支持特别的字符集,那么就引发 UnsupportedEncodingException。在这种情况下,可以使用 getInputStream() 方法来将内容作为字节流检索。下面是一个例子:

String s;
if (part.isMimeType("text/plain")) {
try {
s = part.getContent();
} catch (UnsupportedEncodingException uex) {
InputStream is = part.getInputStream();
/*
   * Read the input stream into a byte array.
   * Choose a charset in some heuristic manner, use
   * that charset in the java.lang.String constructor
   * to convert the byte array into a String.
   */
s = convert_to_string(is);
} catch (Exception ex) {
// Handle other exceptions appropriately
}
}


发送邮件——SMTP

问. 我如何回复消息?
答:为了回复消息,请使用 Message 对象上的 reply 方法。这个方法将返回一个新的对象,对象中的标题已经针对回复做了恰当设置。你将需要自己提供消息的内容。

问. 我如何转发消息?
答:用于转发消息的方法取决于你要怎样表示要转发的消息。简单的办法是创建一个新的 MimeMessage,并适当地为它提供地址,然后将现有的消息作为附件放在新消息中。为了将原始消息放在新消息中,比如可以使用下面的代码:
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent(forwardedMsg, "message/rfc822");
mp.addPart(mbp);
但是如果你想创建新的消息,并在新消息中包括原始消息的文本,可能也要用 "> " 来缩进,那将需要提取原始消息主体中的数据,并进行相应的处理。你可能也想取得原始消息的其他附件,并将它们添加到新消息中。

问. 我如何发送 HTML 邮件?
答:在分发中包括了大量演示程序,它们展示了如何发送 HTML 邮件。如果想发送简单消息,它具有 HTML 而不是纯文本,那请参见 demo(演示)目录中的 sendhtml.java 程序。如果想将 HTML 文件作为附件发送,请参见 sendfile.java 示例,它展示了如何将任何文件作为附件发送。

问. 我如何发送具有不同字体和颜色的格式化文本的邮件?
答:最简单的办法是使用 HTML 文本发送消息。参见 上面

问. 我如何发送具有纯文本和 HTML 文本的邮件,让每个邮件的阅读者可以选择适合它的格式?
答:你想要发送 MIME multipart/alternative 消息。你构造了这样的一条消息,构造方式基本上与构造 multipart/mixed 消息相同,它使用了 MimeMultipart 对象,而该对象又是使用 new MimeMultipart("alternative") 来构造的。然后在 multipart(多部分)中,把 text/plain 主体部分作为第一部分插入,并且把 text/html 作为第二部分插入。参阅 RFC2046,获取这一消息的结构的细节。

问. 我如何发送包含图像的 HTML 邮件?
答:最简单的办法是发送带有图像标签的 HTML 文本,标签引用了公共 Web 站点。在这种方法中,在消息中并没有真正包括图像,因此当用户阅读消息时,如果没有连接到 Internet,那将不能看到图像。
另外,你也可以构造 MIME multipart/related 消息。参阅 RFC2387,获取这种消息结构的细节。

问. Transport 方法 send 和 sendMessage 之间有什么区别?
答:send() 方法是一个静态方法,可以直接使用,而不需要 Transport 对象的实例。它用于常见、简单的场合,比如使用默认传输发送单条消息。从内部讲,send() 方法首先调用消息上的 saveChanges() 方法。然后创建合适的新 Transport 对象,调用 Transport 的 connect() 方法,调用 Transport 的 sendMessage() 方法来实际发送消息,接着调用 Transport 的 close() 方法,最后丢弃 Transport 对象的新实例,并由垃圾收集器收集(实际上,还有比那更加复杂的,但那是一般的想法)。
如你可以看到,静态 send() 便利 (convenience) 方法是建立在更加通用的每实例 sendMessage() 方法的基础上的。有许多原因可以让应用程序直接使用 sendMessage() 方法。最常见的原因是为了通过在单个连接期间发送多条消息 来提高性能,或者为了手动管理连接以提供验证信息。当使用 sendMessage() 方法时,产生的最常见错误是,忘记在要发送的消息上调用 saveChanges() 方法。

问. 我需要验证到 SMTP 服务器,因此我调用了 trans.connect(host, user, password),然后调用 trans.send(msg) 发送消息,但它却不能工作。
答:你应该调用 msg.saveChanges(),然后调用 trans.sendMessage(msg, addrs) 来发送消息。如 上面 所描述,send 方法是一个静态便利方法,它会获得自己的 Transport 对象,并创建自己的连接用于发送消息;它没有使用与某些 Transport 对象有关的连接,并且它是通过该 Transport 对象得到调用的。当然不要忘记将 mail.smtp.auth 属性设置为 true 来启用 SMTP 验证!

问. 我修改了一条消息,但标题却没有反映修改。
答:在创建新消息或修改现有消息后,应该调用 saveChanges()。这将导致重新设置标题以反映变更。注意,Transport.send(Message) 方法隐式调用了这个方法。因此如果你正在做的是发送已修改的消息,就可以跳过调用 saveChanges()。saveChanges() 可能是一个昂贵的操作(特别是对于较大或深度嵌套的消息),因此只在需要时才调用它。

问. 我正在使用 sendMessage() 方法发送消息,但在消息中的文本前后却出现奇怪的一些行,并且我的附件也在消息体中出现。
答:通常这些行像下面这样:
--928176543.952742998030.JavaMail.name@host像 上面 那样,在创建新消息后,在使用 Transport.sendMessage() 方法发送消息之前,必须调用 saveChanges() 方法。静态 Transport.send() 方法将自动调用 Message.saveChanges() 方法。

问. 我为新消息的 Message-ID 标题设置了特定值。但当我发送这条消息时,却重写了那个标题。
答:saveChanges() 将为 Message-ID 字段设置新值,重写所设置的任何值。如果需要设置自己的 Message-ID 并保留它,就必须创建自己的 MimeMessage 子类,重写 updateHeaders() 方法,并使用这个子类的一个实例。

class MyMessage extends MimeMessage {
...

protected void updateHeaders() throws MessagingException {
super.updateHeaders();
setHeader("Message-ID", "my-message-id");
}
...
}



问. 当发送创建的新消息时,为什么会得到 UnsupportedDataTypeException?
答:你可能使用 setContent(Object o, String type) 方法设置了消息的一些内容。为了让它能工作,必须为指定“类型”注册 JAF DataContentHandler。如果不这样做,将获得 UnsupportedDataTypeException。参阅 JAF 文档,获取进一步信息。

问. 当发送消息时,如何能够显式地设置 SMTP FROM: 属性?
答:mail.smtp.from 属性可用于设置 SMTP FROM: 属性。如果没有设置这个属性,就使用消息的 From 属性。如果多个线程需要同时发送邮件,并且每个线程需要设置 From 属性,那么每个线程就必须使用自己的 Session 对象,它具有自己的 Properties 对象。然后可以在每个 Session 对象的 各个 Properties 对象上独立设置 mail.smtp.from 属性(同样对每个线程做这样的设置)。

问. 我想重复发送消息,并且每次发送给一组不同的收件人。但调用 Transport.send(Message) 却导致每次都创建一个新的 Transport 会话。在本例中,这是一个次优办法,我如何来解决它?
答:创建合适的 Transport 对象的实例,然后连上它并重复调用 sendMessage() 方法,例如:

MimeMessage msg = ...;
// construct message
msg.saveChanges();
Transport t = session.getTransport("smtp");
t.connect();

for (int i = 0; .....) {
t.sendMessage(msg, new Address[] { recipients });
}

t.close();



问. 当试图发送消息时,我得到了 “MessagingException: 501 HELO requires domain address”(MessagingException: 501 HELO 要求域地址)。
答:在 SMTP HELO 命令中,SMTP 提供程序使用 InetAddress.getLocalHost().getHostName() 的结果。如果那个调用不能返回任何数据,就不会在 HELO 命令中发送任何名称。检查你的 JDK 和名称服务器配置,确保那个调用返回正确数据。从 JavaMail 1.1.3 开始,你也可以设置 mail.smtp.localhost 属性,并可以把设置为想用于 HELO 命令的名称。

问. 如果将消息发送到错误的地址,为什么我会获得 SendFailedException 或 TransportEvent,指出地址是错误的?
答:在 Internet 上没有端到端验证。通常要将消息转发到几个邮件服务器,然后才到达特定的邮件服务器,该服务器决定了它是否可以传送消息。如果在这些后面的步骤中的某个步 骤发生了错误,那么通常会将消息作为不可传送返回给发件人。一个成功的“发送”只表明邮件服务器已经接受了消息,并将试着传送它。

问. 当消息不能被传送时,就会返回一个失败消息。我如何检测这些“回弹”消息?
答:虽然有一个 Internet 标准用于报告这样的错误(multipart/report MIME 类型,参阅 RFC1892),但还没有广泛实现它。RFC1211 深入讨论了这个问题,包括了大量的例子。
在 Internet 电子邮件中,特定的邮箱或用户名是否存在,只能由传送消息的最终服务器决定。消息可能通过几个中继服务器(它们不能检测错误),然后再到达最终服务器。通 常,当最终服务器检测到这一错误,它会返回一个消息给原始消息的发送人,指出失败的原因。有许多 Internet 标准讨论了这种传送状态通知 (Delivery Status Notifications),但大量服务器不支持这些新标准,相反使用特别技术来返回这种错误消息。这使得将“回弹”消息与产生问题的原始消息相互关联 起来非常困难(注意,这个问题与 JavaMail 完全无关)。
有许多技术和试探法用于处理这一问题,但它们都不是完美的。一种技术是 Variable Envelope Return Paths,http://cr.yp.to/proto/verp.txt 描述了这一技术。

问. 当创建 InternetAddress 对象时,如果地址是非法的,为什么不会获得异常?
答:InternetAddress 类只检查地址的语法。如 上面 所讨论,InternetAddress 类不能决定地址是否做为合法地址实际存在。如果应用程序运行在防火墙背后或目前没有连接到 Internet,那么甚至不能验证主机名。

问. 当试图发送消息时,我为什么会获得 javax.mail.SendFailedException: 550 Unable to relay for 我的地址
答:这 不是 JavaMail 的问题。这是来自你的 SMTP 邮件服务器的错误回复。它指出没有配置你的邮件服务器,使得你可以通过它发送邮件。通常会配置组织的邮件服务器,使得组织中的邮件可以发送到组织中的其他 地址,或者发送到组织外部的地址。通常它也使得来自组织外部地址的邮件可以发送(或中继)到 也是组织外部的另一地址。邮件服务器的配置决定了是否允许这种中继,以及哪些地址应该当成内部地址与外部地址。

问. 当试图发送消息到(例如)Yahoo时,为什么我会获得一个错误,指出“连接被拒绝”?
答:你 试图连接的计算机很可能没有运行邮件服务器。如果你试图连接到 Web 邮件服务,比如 Yahoo,通常你就不能使用 Web 主机名(例如 "yahoo.com"),因为这台主机没有运行所要求的邮件服务器。相反,你需要知道运行所要求邮件服务器的主机的名称;联系你的 Web 邮件提供商获取这一信息。你可以从如下地址找到 Yahoo 的这一信息: http://help.yahoo.com/help/us/mail/pop/pop-02.html。 注意,有些 Web 邮件提供商没有提供这一服务,相反,只允许通过浏览器访问邮件。
如果你没有试图连接到 Web 邮件账户,而是试图连接到本地网络中的一台主机,那很有可能是试图连接的主机没有运行邮件服务器。 有时如果忘记设置(比如)"mail.smtp.host" 属性,这种情况就发生了,它将导致你试图连接到“localhost”。大多数 Windows 计算机没有运行邮件服务器,不过,许多 UNIX(Solaris 和 Linux 等)计算机是运行它的。因此在 Windows 计算机上,试图连接到“localhost”通常会失败,并获得“连接被拒绝”。

问. 当发送邮件时,为什么会失败,并得到一个异常,异常 中包括像“553 To send mail, first check your mail with a valid POP account”(553 为发送邮件,首先检查邮件具有合法的 POP 账户)这样的消息?
答:为了防止它们用于发送垃圾邮件,一些邮件服务器会要 求使用有效的 POP3 账户,并要求要先登录那个账户,然后才可以让你通过邮件服务器发送邮件。在 JavaMail 中,这种处理是简单的。当你知道正在处理这样的邮件服务器时,确保连接到那台邮件服务器上的 POP3 Store,然后再发送邮件。

POP3

问. 我可以从哪里找到 POP3 的支持?
答:在 JavaMail 1.2 及以上版本中包括了 POP3 提供程序。POP3 提供程序也可从多个第三方提供商获得。请浏览我们的 第三方产品清单,获取进一步信息。

问. 我想在 POP3 服务器上删除消息。我在这些消息上设置了 DELETED 标志。然后调用 expunge() 方法,但我得到了MethodNotSupportedException。当使用 Sun 的 POP3 提供程序时,我如何删除消息?
答:POP3 提供程序不支持 expunge() 方法。不过,可以关闭 expunge 标志设为 true 的文件夹。也就是调用 folder.close(true)

问. 在从 Sun POP3 提供程序获得的消息中,我如何可以检索 POP3 UIDL?
答:对于 POP3 提供程序,这是可能的。参见 com.sun.mail.pop3 包文档,获取进一步信息。

问. 对于 POP3,我如何知道哪里消息是新的?
答:POP3 协议不提供任何永久标志的支持,因此 RECENT 标志是没有用的。com.sun.mail.pop3 包文档讨论了几个策略,它们可用于处理这一问题。

问. 当使用 POP3 时,为什么 hasNewMessages() 总是返回 false?
答:POP3 协议没有提供办法来决定文件夹是否有新消息。

问. 我创建了 MessageCountListener(如 monitor 程序中所展示的),但在我的 POP3 INBOX(收件箱)中,我从未得到通知。
答:当 INBOX 打开时,POP3 协议不允许客户端查看传送到 INBOX 的新消息。应用程序必须关闭 INBOX,然后重新打开它, 才可以查看新消息。对于 POP3,使用 MessageCountListener 接口,你从不会得到新邮件的通知。参见 com.sun.mail.pop3 包文档(在 JavaMail 下载包的 docs/sundocs 目录),获取进一步信息。

问. 当使用 POP3 时,为什么 getReceivedDate() 返回 null?
答:POP3 协议不提供有关何时接收消息的信息。通过查看一些消息标题,比如 Received 标题,可能可以猜到接收日期,但这非常不可靠。

问. 当使用 POP3 时,我得到了有关 SocketFetcher 类的抱怨。
答:很 有可能在 CLASSPATH 中有多个版本的 pop3.jar 或 mail.jar。检查 CLASSPATH 的设置,如果你正在使用 JDK 1.2 或更新版本,检查 JDK 中的 "jre/lib/ext" 目录。确保你只有 JavaMail 1.2 mail.jar 可用并且没有 pop3.jar。只有对于较老版本的 JavaMail,pop3.jar 才是必要的。

问. 当使用 POP3 时,我得到了有关 contentStream 字段的抱怨。
答:错误通常像下面这样:
java.lang.NoSuchFieldError: contentStream at
com.sun.mail.pop3.POP3Message.getContentStream(POP3Message.java:115)
上面 一样,使用混合版本的 POP3 提供程序和 mail.jar。在包括 POP3 提供程序的较新版本 mail.jar 之前,你可能在 CLASSPATH 中有了较老版本。

问. 除了 POP3 服务器上的 INBOX(收件箱)外,您如何访问或创建文件夹?
答:不能。POP3 服务器只支持每个用户一个邮箱。大多数使用 POP3 的邮件阅读者也维护着本地消息存储,他们可以将传入的消息(来自 POP3 INBOX)复制到存储中,并允许你将消息写到其他文件夹。参见 本项目,获取有关本地存储提供程序的进一步消息。


servlet 中的 JavaMail

问. 我可以在 servlet 中使用 JavaMail 吗?
答:可以。参阅上面的“安装和配置”一节获取进一步信息。JavaMail API 也是 Java 2 Platform, Enterprise Edition (J2EE) 所要求的一部分。当在 J2EE 产品中使用 JavaMail,不需要任何的安装和配置,就这么简单


applet 中的 JavaMail

问. 我可以在 applet 中使用 JavaMail 吗?
答:可以。JavaMail 1.3 可以在 applet 中工作,这些 applet 可运行于 Netscape 和 Internet Explorer。

问. 在 applet 中,使用 JavaMail 的安全问题是什么?
答:在 applet 中使用 JavaMail,它的一个最大问题是默认的 applet 安全限制。这些限制只允许 applet 连接到特定的主机,而该主机是从中下载它们的主机。因此,为了让这样的 applet 使用 JavaMail,邮件服务器将需要位于特定的计算机,该计算机与从中下载 applet 的 Web 服务器相同。

问. OK,可能我确实不想使用 applet,那我应该怎么做?
答:通常,我们推荐使用 servlet (或 JSP)来收集邮件消息,并使用 JavaMail 来发送它。JavaMail 下载包中包括了演示 servlet,它例举了这种方法。Java Developer Connection 上的 电子邮件 Web 应用程序演示程序 例举了使用 JavaServer Pages 的另一种方法。

分享到:
评论

相关推荐

    JavaMail常见问题.doc

    JavaMail常见问题

    Javamail使用过程中常见问题解决方案

    主要介绍了Javamail使用过程中常见问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JavaMail组件在网站用户注册系统中的应用.pdf

    本文首先阐述了用户注册系统将用户登录密码发送至用户电子邮箱这一应用的优越性和必要性,并对实现该功能的JavaMail API ...最后详细讲述了电子邮件自动发送功能的实现、功能的扩展以及实现过程中常见的中文乱码问题。

    基于javamail开发的Android邮件客户端.zip

    此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的...

    javamail收取Hotmail的退信

    我以前写的邮件客户端只支持收取 multipart/related、multipart/alternative和multipart/mixed 等多媒体类型的邮件,其他的因为不常见,我都忽略了。 客户不答应了,那还有什么好说的,还有什么比让客户满意更重要的...

    JavaMail-java实现发送邮件功能

    JAVA mail源码,内容从网上获得经消化整理而来。包内有mail.jar、activation.jar、Java Mail常见错误.docx

    常见的java web driver

    常见的java web driver commons-fileupload-1.2.2 commons-io-2.2 javamail-1.4.5 slf4j-1.5.6

    J2EE 6.0 中文版API(exe文件) --声明不怎么好用

    不要忘记查看 JavaMail API FAQ,那里提供了对大多数常见问题的解答。JavaMail 网站包含许多其他参考资料。 JavaMail API 支持以下标准属性,这些属性可在 Session 对象中设置,也可以在用于创建 Session 对象的 ...

    java编程常见50例

    java编程的经典例子,如生成EXECL,读写文件,JAVAMAIL等!

    Java学习笔记

    3、连接数据库常见问题 4、B/S结构和C/S结构的区别 5、如何处理中文乱码问题 6、使用JavaMail发送注册验证邮件 7、不安全的用户名密码验证 8、用Session保存登录信息 9、面向对象分析通常分为三个步骤 10、使用...

    JSP2.0技术手册pdf(带示例源码).zip

    9-2 窗体中常见的输入类型 9-3 JSP 处理窗体 9-4 文件上传—— Oreilly 上传组件 9-5 jspSmartUpload ——上传和下载 9-6 本文区输入类型(Textarea) 第十章 Session Tracking 10-1 Stateful & Stateless 10-2 ...

    Android代码-protools

    protools 历经开发周期两年,并且应用过千万级别项目的工具箱 ...大家如果想使用可以先执行mvn clean install即可在本地的其他maven项目中使用 ...封装了 jdk 和 bouncycastle 中几十种常见加密方式all

    JSP网站开发典型模块与实例精讲

     1.4.5 指点迷津——连接数据库常见问题  1.5 调试和错误处理  1.5.1 使用MyEclipse实现快速调试  1.5.2 使用System.out监控变量  1.5.3 为JSP指定一个错误处理页面  1.6 独家见解——B/S结构与C/S结构...

    J2EE企业开发.part3.rar

    第1章J2EE企业开发 第2章企业数据 第3章XML 第4章JAXP 第5章核心JDBC 第6章高级JDBC 第7章企业通信 第8章CORBA通信 第9章RMI通信 ...第11章 常见的企业服务 JNDI JAXP JTA JTS JMS JAXM JavaMail .......

    J2EE企业开发.part2.rar

    第1章J2EE企业开发 第2章企业数据 第3章XML 第4章JAXP 第5章核心JDBC 第6章高级JDBC 第7章企业通信 第8章CORBA通信 第9章RMI通信 ...第11章 常见的企业服务 JNDI JAXP JTA JTS JMS JAXM JavaMail .......

    J2EE企业开发.part1.rar

    第1章J2EE企业开发 第2章企业数据 第3章XML 第4章JAXP 第5章核心JDBC 第6章高级JDBC 第7章企业通信 第8章CORBA通信 第9章RMI通信 ...第11章 常见的企业服务 JNDI JAXP JTA JTS JMS JAXM JavaMail .......

    J2EE企业开发.part5.rar

    第1章J2EE企业开发 第2章企业数据 第3章XML 第4章JAXP 第5章核心JDBC 第6章高级JDBC 第7章企业通信 第8章CORBA通信 第9章RMI通信 ...第11章 常见的企业服务 JNDI JAXP JTA JTS JMS JAXM JavaMail .......

    J2EE企业开发.part6.rar

    第1章J2EE企业开发 第2章企业数据 第3章XML 第4章JAXP 第5章核心JDBC 第6章高级JDBC 第7章企业通信 第8章CORBA通信 第9章RMI通信 ...第11章 常见的企业服务 JNDI JAXP JTA JTS JMS JAXM JavaMail .......

    J2EE企业开发.part4.rar

    第1章J2EE企业开发 第2章企业数据 第3章XML 第4章JAXP 第5章核心JDBC 第6章高级JDBC 第7章企业通信 第8章CORBA通信 第9章RMI通信 ...第11章 常见的企业服务 JNDI JAXP JTA JTS JMS JAXM JavaMail .......

Global site tag (gtag.js) - Google Analytics