我正在尝试开发一个电子邮件解析器 - 收集文件中的电子邮件,并能够以编程方式处理各种组件 - 知道发件人和收件人是谁,主题行,主体和任何附件。我打算将附件作为单独的文件提取出来,但我刚开始就难倒了。
我在一个功能齐全的开发环境中开始使用已经运行的java程序,并开始添加它。首先添加的是这一行(后来是一组行):
import javax.mail.*;
import javax.mail.internet;
import javax.mail.internet.MimeUtility;
后来,在适当的地方,我们有了这个不起眼的开始:
MimeMessage m = null;
我很震惊地发现只有这两个更改的编译失败,并且I learned here(在另一个StackOverflow页面上)包javax.mail包未包含在标准JDK中。困惑,我看了一下,发现了这个:
# rpm -qa | grep -i java
android-json-org-java-4.3-0.2.r3.1.fc21.noarch
snappy-java-1.0.5-2.fc21.noarch
tzdata-java-2015b-1.fc21.noarch
python-javapackages-4.1.0-7.fc21.noarch
postgresql94-jdbc-javadoc-9.3.1101-1.f21.noarch
protobuf-java-2.5.0-11.fc21.x86_64
java-1.8.0-openjdk-1.8.0.40-25.b25.fc21.x86_64
java-1.8.0-openjdk-headless-1.8.0.40-25.b25.fc21.x86_64
javassist-3.18.1-2.fc21.noarch
apache-commons-javaflow-1.0-0.8.20120509SNAPSHOT.fc21.noarch
javapackages-tools-4.1.0-7.fc21.noarch
java-1.8.0-openjdk-devel-1.8.0.40-25.b25.fc21.x86_64
antlr3-java-3.5.2-2.fc21.noarch
javamail-1.5.1-3.fc21.noarch
xz-java-1.5-3.fc21.noarch
abrt-java-connector-1.1.0-2.fc21.x86_64
请注意,是的,实际上,JavaMail已安装 - 版本1.5.1-3。然而,为了成为一个腰带和吊带的人,我找到了the JavaMail project并下载了最新的生产版本,并把它放在了CLASSPATH中。
令我惊讶的是,这并没有解决问题!作为谨慎的类型,并保持简单的方式来证明我的方式,我只是从库目录中删除了javax.mail.jar文件,然后从我的程序中删除了两行,重新编译并且它工作。然后,我在导入行中添加了,但它失败了。然后我将jar文件移回库目录并编译成功,确认正在加载javax.mail包。
但是,当我在第一次引用库中添加了MimeMessage(参见上面的行)时,编译失败了。
所以,当然,我去了check the documentation!的确,MimeMessage是一个可用的课程。
我做错了什么?!我的意思是,geez,我从版本1.0开始就一直在使用Java - 我不是因为犯了太多愚蠢的错误而闻名,但我认为我一定是这样!
我想到了两个悬而未决的问题:
1)为什么不使用已安装的JavaMail包版本?很清楚,我不得不添加它。请注意,我不需要对CLASSPATH(或其他任何地方)执行任何特殊操作来获取Java的其余部分!和;
2)现在我已经有了一个JavaMail包,为什么它没有发现MimeMessage类呢?
任何/所有帮助表示赞赏 - 如果你发现我非常愚蠢,请轻轻指出我的错误!
其他信息: 我添加了两个以上的导入行,所以现在有上面列出的三个。奇怪的是,当我将.jar文件放在CLASSPATH指定的路径中但未明确引用时,每次导入都会出现一个错误,但是当我明确地将.jar文件引用为显式项时,我只会收到一个错误!出现了一个错误:
import javax.mail.internet;
当然,知道这个罐子实际上只是一个拉链,我解压缩并看了一下。果然,有一个名为“internet”的目录,填充了38个类文件。
在某个地方,我有一个疯狂的想法,不知何故在系统或CLASSPATH中有另一个javax.mail条目,所以我看了。这是Fedora Core,所以它在/ usr / lib下,我没有在其名称中找到包含字符串“mail”的其他文件,所以我认为不是它。
我注意到在NOTES.txt文件中有一些关于没有为某些应用程序解压jar的注意事项,因为这被视为一种安全风险,但我认为对于我想要做的事情,没有这样的风险,也许它会工作,但我也无法工作......
我也一直在尝试使用-cp而不是实际更改CLASSPATH变量,但它似乎并不重要。我显然得到了相同的结果,所以我一直在使用-cp进行测试,因为尝试各种替代方案会更快。
答案 0 :(得分:2)
MimeMessage位于javax.mail.internet包中,您尚未导入。
由问题ASKER编辑:
实际上,我试图导入,除其他外:
import javax.mail.internet;
那并没有奏效。我缺少的是只有javax.mail.internet才能导入。将其更改为:
import javax.mail.internet.*;
工作得很好!
所以,虽然比尔不是很正确,但这个答案加上他的评论让我看到了我的盲目......我觉得很傻!