熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JavaMail常見問題之編程問題

2013-11-15 11:39:22  來源: JSP教程 

  問 從哪裡可以學習有關 Internet 郵件的基礎知識它是我高效編寫 JavaMail 程序需要知道的?
  答參見我們的 Web 頁中提及的 參考圖書 中的一本獲得有關 Internet 電子郵件MIMESMTPIMAP 和 POP 等的背景信息
  問 如何調試使用 JavaMail API 的應用程序?
  答可通過在代碼中調用 Session 對象上的 setDebug(true) 方法來打開調試模式這將造成在控制台中打印調試消息包括協議跟蹤信息如果您認為在 JavaMail 中發現了 bug就將這個跟蹤及以下信息發送給我們重生成問題的測試用例使用的平台使用的 JDK 的版本和使用的郵件服務器 (IMAP SMTP) 的名稱和版本
  問 如何發送帶有附件的消息?
  答帶有附件的消息采用 MIME 多部分消息來表示其中第一部分是消息的主體其他的部分是附件有大量的例子它們展示了如何在演示程序中構建這種消息JavaMail 下載包包含了這些演示程序
  問 如何閱讀帶有附件的消息並保存附件?
  答如前面描述在 MIME 中帶有附件的消息是作為多部分消息表示的在簡單的例子中Message 對象的 getContent 方法的結果將是一個 MimeMultipart 對象多部分對象的第一個主體部分將是消息的主文本其他的主體部分將是附件msgshowjava 演示程序展示了如何在消息中遍歷所有的多部分對象並提取各個主體部分數據getDisposition 方法將給你一個提示指出主體部分是否應該內嵌顯示或者應該將其考慮成附件(但請注意不是所有的發件人都提供這一信息)
  為了將主體部分中的數據保存到文件(比如)請使用 getInputStream 方法來訪問附件內容並將數據復制到 FileOutputStream
  注意也有一些更復雜的情形也要處理例如一些發件人把主體作為純文本和 html 發送通常這將作為 multipart/alternative 內容(和 MimeMultipart 對象)出現在簡單的文本主體部分的位置中經過數字簽名或加密的消息甚至會更復雜處理所有的這些情形可能具有挑戰性請參考各種 MIME 規范和我們主頁上列出的其他 參考資料
  問 什麼是中斷支持(disconnected support)?
  答支持中斷操作的郵件客戶端將允許用戶訪問遠程消息存儲(比如 IMAP)中消息緩存這些消息中的一些消息的(部分)到本地然後斷開到服務器的連接當處在斷開連接狀態中郵件客戶端可以訪問已經緩存的消息可能也可以刪除它們或將它們保存到其他文件夾當郵件客戶端下一次連接到遠程消息存儲時本地所做變更會與遠程存儲同步同樣中斷支持可以允許客戶端在斷開與服務器連接時發送消息在到服務器的連接可用前消息會進行排隊也請參閱 RFC
  問 如何使用 JavaMail API 來支持中斷操作?
  答JavaMail API 規范定義了一些接口郵件客戶端可以使用這些接口來支持中斷操作我們的 IMAP 提供程序實現了這些接口(UIDFolder 接口)
  問 我如何使用 JavaMail API 來發送安全的電子郵件?
  答JavaMail API 目前不支持發送或接收安全電子郵件JavaMail API 的體系結構使得可以在以後很容易地添加這一支持我們可以添加支持第三方也可以添加支持有關當前電子郵件安全標准(S/MIME 和 PGP)的信息可以從如下站點找到 請浏覽我們的 第三方產品 頁獲取來自其他供應商的解決方案
  問 writeTo() 方法生成了消息文件但消息中的一些行既不是數據的規范 MIME 表示(即使用 CRLF 來結束行)又沒有使用我的平台的規范行分隔符(例如 UNIX 上的\n如果我需要這些表示時如何獲得它們當中的任何一種表示?
  答不管是哪種情形你都將需要創建合適的 FilterOutputStream 對象來傳遞給 writeTo()FilterOutputStream 將需要接受特定的一些行它們具有任何常見終止符然後寫出另外的一些特定行它們只具有期望的行終止符下面是這種過濾器的一些例子NewlineOutputStream 轉換到本地平台的行終止符當將消息寫到文件時它是有用的CRLFOutputStream 轉換到 MIME 規范 CRLF 終止符當需要規范 MIME 格式時(比如計算數字簽名)它是有用的
  問 我可以使用 JavaMail API 來實現郵件服務器嗎?
  答JavaMail API 設計目的不是幫你實現郵件服務器但是對你來說一些實用工具類比如 MIME 消息解析類可能是有用的通常您會發現JavaMail API 是在簡單而不是在強有力方面出錯對於郵件客戶端那是合適的但對於郵件服務器結果可能是不同的
  問 我可以使用 JavaMail API 在我的郵件服務器上添加新的用戶賬戶刪除用戶賬戶或改變用戶賬戶的密碼嗎?
  答JavaMail API 不包括任何工具用於添加刪除或修改用戶賬戶在這一方面是沒有標准的每個郵件服務器對它的處理是不同的
  問 為什麼 MimeMessage 類沒有實現 Serializable這樣我就可以將消息序列化到磁盤並在以後讀回它?
  答JavaMail API 是在現有電子郵件系統上面設計的並使用了現有的消息格式對於這樣的一些實現使用 Java 序列化能力既不是必要的也不是有用的因此不能將它作為 JavaMail API 的目標來考慮
  有關序列化 Message 的困難部分是保留某些指針它們指向 Folder(文件夾)Store(存儲)和 Session(會話)如果只想保存消息的內容而不是對象本身消息的 writeTo 方法將為你完成這一切如果想根據序列化消息創建整個電子郵件系統您應該能夠編寫 Message 等的子類並在子類中實現 Serializable
  如果想序列化自己的引用了 MimeMessages的其他對象那麼你的對象的 writeObject 方法可以使用 MimeMessage 的 writeTo 方法對象的 readObject 方法可以使用 MimeMessage 構造函數該構造函數會得到 InputStream在構造 MimeMessage 時你的類將需要提供一個 Session
  問 我如何編寫服務提供程序?
  答請閱讀服務提供程序文檔獲取一些細節信息通常如果想編寫 Store 提供程序那就編寫 javaxmailStore 和 javaxmailFolder的子類也可能要編寫 javaxmailMessage 及其他一些類的子類對於 Transport 提供程序編寫 javaxmailTransport 的子類也可能需要編寫 javaxmailMessage 及其他的一些類的子類然後在 javamailproviders 注冊表中添加描述提供程序的條目如果對編寫特別的服務提供程序感興趣並且它所針對的協議或郵件系統目前沒有得到 JavaMail API 實現的支持請通過 javamail@SunCOM 聯系我們
  問 我在登錄 Microsoft Exchange 服務器時碰到了麻煩我確信正在使用的用戶名和密碼是正確的我做錯了什麼?
  答當登錄 Exchange 時需要使用比簡單登錄名更多的用戶名例如如果你的電子郵件地址是Windows NT 登錄名是juserNT 域名是dom而且 Exahange 郵箱名是Joe User那麼在使用 JavaMail 登錄時你將需要使用用戶名 dom\juser\JUser
  問 在發送二進制文件前我如何編碼它?當收到它時我又如何解碼它?
  答你不必這樣的做!JavaMail 將自動決定合適的編碼用於消息部分然後才發送消息而且當讀取它們時將自動解碼消息部分getInputStream 方法將返回解碼數據
  問 如果我不需要自己編碼和解碼附件我應該何時使用 MimeUtility 方法?
  答在 JavaMail 沒有自動處理的情況下MimeUtility 方法是有用的經常發生的這樣的一種情形是文件名的編碼基本的 MIME spec(規范)不允許按某種方式編碼標題參數值(比如文件名參數)該方式與(比如)編碼 Subject(主題)標題相同這限制了參數值從而限制了文件名到 ASCII但一些發件人卻實際使用 MIME 文本編碼來做非 ASCII 文件名的編碼工作想與這種非標准發件人互操作的應用程序可以使用 encodeText 方法來編碼文件名然後調用 MimeBodyPartsetFileName 方法而且可以使用 decodeText 方法來解碼返回的文件名
  問 盡管 JavaMail 完成了所有的編碼和解碼工作但我仍需要手動控制一些主體部分的編碼
  答在少數的場合需要控制編碼這裡有幾個方法來重寫 JavaMail 的默認行為下面是一個簡單的方法在創建整個消息後調用 msgsaveChanges()然後使用像 mbpsetHeader(ContentTransferEncoding base) 的語句來強制對指定主體部分做 base 編碼
  另一種辦法是編寫 MimeBodyPart 的子類並重寫 updateHeaders 方法讓它首先調用 superupdateHeaders()然後像上面那樣設置 ContentTransferEncoding 標題
  問 為什麼 JavaMail 沒有在非 ASCII 字符集中正確編碼和解碼文件名?
  答文件名是作為參數存儲在 MIME 標題中的形如 =?ISO?B?OTkLUluZmucGRm?= 的編碼文件名不是 MIME spec(規范)的一部分形如 =?A?B?C?= 的文件名是一個完全有效的文件名而不是一個不正確編碼的文件名JavaMail 沒有編碼和解碼文件名因為這樣做會違反 MIME 規范
  基本的 MIME 規范不允許編碼參數RFC 定義了一種新的方式使得可以在 MIME 標題中包括編碼參數包括文件名它與下面的事實方式不兼容許多應用程序非法編碼文件名支持 RFC 將不允許 JavaMail 與這些現有的程序互操作據我所知很少現有的程序支持 RFC
  如果你選擇違反 MIME 規范是為了與其他也違反了 MIME的程序互操作那麼 JavaMail 會給您所有需要的工具來完成這件事
  編碼文件名的解決方法是簡單的
  mbpsetFileName(MimeUtilityencodeText(filename));
  解碼文件名的解決方法同樣簡單
  String filename = MimeUtilitydecodeText(partgetFi
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19383.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.