好好工作,好好生活
這里,我用pop3連126.com的郵箱取到郵件,解析郵件附件。我的工作是取到jpg或gif圖片并保存。
說明:這是我的在工作中寫的代碼,是可用的。但是有部分代碼被截取出來,比如有些參數我覺得沒有必要,就刪除了,沒有測試。可能會有bug,但是肯定是小bug。
注1:使用的協議是pop3,因為這里不需要發送郵件,只度讀取郵件,pop3協議比較簡單方便
注2:這個函數沒有一次處理所有的郵件,因為沒有這個必要。如果需要一次處理所有郵件的話,將for循環的那部分刪除就可以了
注3:message的類型可以是text/plain,text/html或者是multipart/*等類型的。但是只有multipart/*才是有附件的郵件。當然,有的郵件系統是將郵件內容作為附件來傳遞的。
注4:解析郵件的過程中可能會出現異常,比如我碰到的一個很奇怪的異常就是,當part不為null的時候,part.getFileName()拋出為空的異常。如果不捕獲這個異常,會出問題,究竟是什么問題,我在注6里講解?,F在,捕獲這個異常。這個郵件是有問題的,如果不刪除,下次出來還是會拋異常,于是我們給他置一個刪除標志。
注5:將已處理的郵件置刪除標志。很奇怪,置刪除標志的郵件不是被放在了垃圾箱里,而是被徹底刪除了,所以用的時候要小心。但是如果繼續留在收件箱,下次又會被處理一次
注6:當前面的郵件解析操作正常結束的時候,folder.close(true)會執行。這個時候,才會將剛剛置了刪除標志的郵件刪除。前面說過異常如果沒有被捕獲會出問題。這個問題就是,前面的郵件已經處理了,并且置上了刪除標志,但是碰到問題郵件的時候拋出異常,沒有被及時捕獲,于是folder.close(true)不會被執行,那些該刪除的郵件就沒有刪除。那么當你再調用這個connectMail的時候就會重復的處理郵件。我是在servlet里寫的定時器來調用這個函數的,當時出問題,于是有的郵件被重復解析了200多次,這是很可怕的數字。
注1:part.getContentType()說明取不到這個message的類型,直接返回,不需處理
注2:根據我的需求,我只需處理圖片類型,也就是說,只要這3種類型的message,其他的都可以忽略
注3:email是遵循一些編碼方式的,大部分用的是base64,但是java mail提供解碼的工具,這就是MimeUtility.decodeText(s)
注4:再對文件類型做一次判斷(其實我覺得是不需要的,但是嚴整完整一點還是好些)
注5:有的操作系統對InputStram這樣的對象有限制,限制同時打開的InputStream個數,例如linux中就有這樣的限制。所以在打開了一個InputStream最好關閉。當然,如果不關閉,java的自動回收功能也回回收這個InputStream
Powered by: BlogJava Copyright © hopeshared