2016-09-15 42 views
2

我正在嘗試開發一個電子郵件分析器 - 用於獲取文件中的電子郵件,並且能夠以編程方式處理各種組件 - 知道發件人和收件人主題,主體和任何附件。我打算將附件提取爲單個文件,但我一開始就陷入困境。即使軟件包位於CLASSPATH中,javax.mail.MimeMessage也不可用

我在一個功能齊全的開發環境中開始了一個已經可以工作的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類?

任何/所有的幫助表示讚賞 - 如果你發現我是非常愚蠢的,請指出我的錯誤輕輕!

附加信息: 我增加了兩條進口線,所以現在有三個上面列出。奇怪的是,當我在CLASSPATH指定的路徑中有.jar文件但沒有明確引用時,每次導入都會出現一個錯誤,但是當我明確引用.jar文件作爲顯式項時,我只會收到一個錯誤!那一個錯誤是:

import javax.mail.internet; 

當然,知道這個罐子實際上只是一個拉鍊,我解壓縮,看了看。果然,名爲「互聯網」的目錄在那裏,填充了38個類文件。

某處,我有一個瘋狂的想法,不知何故在系統或CLASSPATH中有另一個javax.mail條目,所以我看了看。這是Fedora Core,所以它位於/ usr/lib下,並且我沒有在其名稱中找到包含字符串「mail」的另一個文件,所以我認爲這不是它。

我在NOTES.txt文件中注意到有一些關於未將某些應用程序的jar解壓縮的註釋,因爲這被視爲安全風險,但我認爲對於我想要做的事情沒有這樣的風險,並且也許它會工作,但我不能得到這個工作要麼......

我也一直在嘗試使用-cp與實際上改變CLASSPATH變量,但它似乎並不重要。我顯然得到了相同的結果,所以我剛剛使用-cp進行測試,因爲嘗試各種替代方法會更快。

+0

你是如何將JAR添加到你的類路徑中的? –

+0

@TimBiegeleisen我只是把它放到CLASSPATH中已經有其他原因需要的庫目錄中。 –

+0

執行Java應用程序的大多數方法實際上並不使用'CLASSPATH'環境變量來確定類路徑。 –

回答

2

MimeMessage位於您尚未導入的javax.mail.internet包中。

編輯者問題提問者:

其實,我是想進口,其中包括:

import javax.mail.internet; 

並沒有奏效。我錯過的是,沒有什麼可以在javax.mail.internet上導入。更改爲:

import javax.mail.internet.*; 

工作得很好!

因此,雖然比爾不是很正確,但是這個答案加上他的評論讓我看到了我的盲目......我感到很傻!

+0

我已經把這個問題放在一邊 - 使用ripmime來完成大部分工作,現在我確實需要解決這個問題。事實證明,你錯了,我實際上已經試圖導入javax.mail.internet,更具體地說,是javax.mail.internet.MimeUtility。我將更新Q. –

+0

上面只有「import javax.mail。*;」,是否添加了「import javax.mail.internet。*」?僅導入MimeUtility不會讓您訪問整個軟件包。 –

+0

我明白了,比爾,但任何使用這個班的人都將是一個重大的進步。目前它不會超過進口聲明!除非你說我會通過導入所有東西來獲得成功?!奇。但在這一點上,我會嘗試任何事情。 –

相關問題