国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JavaMail常見(jiàn)問(wèn)題之編程問(wèn)題

2019-11-18 13:15:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  問(wèn). 從哪里可以學(xué)習(xí)有關(guān) Internet 郵件的基礎(chǔ)知識(shí),它是我高效編寫(xiě) javaMail 程序需要知道的?
  答:參見(jiàn)我們的 Web 頁(yè)中提及的 參考圖書(shū) 中的一本,獲得有關(guān) Internet 電子郵件、MIME、SMTP、IMAP 和 POP3 等的背景信息。
  問(wèn). 如何調(diào)試使用 JavaMail API 的應(yīng)用程序?
  答:可通過(guò)在代碼中調(diào)用 session 對(duì)象上的 setDebug(true) 方法來(lái)打開(kāi)調(diào)試模式。這將造成在控制臺(tái)中打印調(diào)試消息,包括協(xié)議跟蹤信息。假如您認(rèn)為在 JavaMail 中發(fā)現(xiàn)了 bug,就將這個(gè)跟蹤及以下信息發(fā)送給我們:重生成問(wèn)題的測(cè)試用例、使用的平臺(tái)、使用的 JDK 的版本和使用的郵件服務(wù)器 (IMAP, SMTP) 的名稱(chēng)和版本。
  問(wèn). 如何發(fā)送帶有附件的消息?
  答:帶有附件的消息采用 MIME 多部分消息來(lái)表示,其中第一部分是消息的主體,其他的部分是附件。有大量的例子,它們展示了如何在演示程序中構(gòu)建這種消息,JavaMail 下載包包含了這些演示程序。
  問(wèn). 如何閱讀帶有附件的消息并保存附件?
  答:如前面描述,在 MIME 中,帶有附件的消息是作為多部分消息表示的。在簡(jiǎn)單的例子中,Message 對(duì)象的 getContent 方法的結(jié)果將是一個(gè) MimeMultipart 對(duì)象。多部分對(duì)象的第一個(gè)主體部分將是消息的主文本。其他的主體部分將是附件。msgshow.java 演示程序展示了如何在消息中遍歷所有的多部分對(duì)象,并提取各個(gè)主體部分?jǐn)?shù)據(jù)。getDisposition 方法將給你一個(gè)提示,指出主體部分是否應(yīng)該內(nèi)嵌顯示,或者應(yīng)該將其考慮成附件(但請(qǐng)注重,不是所有的發(fā)件人都提供這一信息)。
  為了將主體部分中的數(shù)據(jù)保存到文件(比如),請(qǐng)使用 getInputStream 方法來(lái)訪問(wèn)附件內(nèi)容,并將數(shù)據(jù)復(fù)制到 FileOutputStream。
  注重,也有一些更復(fù)雜的情形也要處理。例如,一些發(fā)件人把主體作為純文本和 Html 發(fā)送。通常,這將作為 multipart/alternative 內(nèi)容(和 MimeMultipart 對(duì)象)出現(xiàn)在簡(jiǎn)單的文本主體部分的位置中。經(jīng)過(guò)數(shù)字簽名或加密的消息甚至?xí)鼜?fù)雜。處理所有的這些情形可能具有挑戰(zhàn)性。請(qǐng)參考各種 MIME 規(guī)范和我們主頁(yè)上列出的其他 參考資料。
  問(wèn). 什么是“中斷支持”(disconnected support)?
  答:支持中斷操作的郵件客戶(hù)端將答應(yīng)用戶(hù)訪問(wèn)遠(yuǎn)程消息存儲(chǔ)(比如 IMAP)中消息,緩存這些消息中的一些消息的(部分)到本地,然后斷開(kāi)到服務(wù)器的連接。當(dāng)處在斷開(kāi)連接狀態(tài)中,郵件客戶(hù)端可以訪問(wèn)已經(jīng)緩存的消息,可能也可以刪除它們或?qū)⑺鼈儽4娴狡渌募A。當(dāng)郵件客戶(hù)端下一次連接到遠(yuǎn)程消息存儲(chǔ)時(shí),本地所做變更會(huì)與遠(yuǎn)程存儲(chǔ)同步。同樣,中斷支持可以答應(yīng)客戶(hù)端在斷開(kāi)與服務(wù)器連接時(shí)“發(fā)送”消息,在到服務(wù)器的連接可用前,消息會(huì)進(jìn)行排隊(duì)。也請(qǐng)參閱 RFC1733。
  問(wèn). 如何使用 JavaMail API 來(lái)支持中斷操作?
  答:JavaMail API 規(guī)范定義了一些接口,郵件客戶(hù)端可以使用這些接口來(lái)支持中斷操作。我們的 IMAP 提供程序?qū)崿F(xiàn)了這些接口(UIDFolder 接口)。
  問(wèn). 我如何使用 JavaMail API 來(lái)發(fā)送安全的電子郵件?
  答:JavaMail API 目前不支持發(fā)送或接收安全電子郵件。JavaMail API 的體系結(jié)構(gòu)使得可以在以后很輕易地添加這一支持,我們可以添加支持,第三方也可以添加支持。有關(guān)當(dāng)前電子郵件安全標(biāo)準(zhǔn)(S/MIME 和 PGP)的信息,可以從如下站點(diǎn)找到: http://www.imc.org/smime-pgpmime.html。 請(qǐng)瀏覽我們的 第三方產(chǎn)品 頁(yè),獲取來(lái)自其他供給商的解決方案。
  問(wèn). writeTo() 方法生成了消息文件,但消息中的一些行既不是數(shù)據(jù)的規(guī)范 MIME 表示(即使用 CRLF 來(lái)結(jié)束行),又沒(méi)有使用我的平臺(tái)的規(guī)范行分隔符(例如 UNIX 上的“/n”)。假如我需要這些表示時(shí),如何獲得它們當(dāng)中的任何一種表示?
  答:不管是哪種情形,你都將需要?jiǎng)?chuàng)建合適的 FilterOutputStream 對(duì)象來(lái)傳遞給 writeTo()。FilterOutputStream 將需要接受特定的一些行,它們具有任何常見(jiàn)終止符,然后寫(xiě)出另外的一些特定行,它們只具有期望的行終止符。下面是這種過(guò)濾器的一些例子。NewlineOutputStream 轉(zhuǎn)換到本地平臺(tái)的行終止符,當(dāng)將消息寫(xiě)到文件時(shí),它是有用的。CRLFOutputStream 轉(zhuǎn)換到 MIME 規(guī)范 CRLF 終止符,當(dāng)需要規(guī)范 MIME 格式時(shí)(比如計(jì)算數(shù)字簽名),它是有用的。
  問(wèn). 我可以使用 JavaMail API 來(lái)實(shí)現(xiàn)郵件服務(wù)器嗎?
  答:JavaMail API 設(shè)計(jì)目的不是幫你實(shí)現(xiàn)郵件服務(wù)器。但是,對(duì)你來(lái)說(shuō),一些實(shí)用工具類(lèi),比如 MIME 消息解析類(lèi),可能是有用的。通常您會(huì)發(fā)現(xiàn),JavaMail API 是在“簡(jiǎn)單”而不是在“強(qiáng)有力”方面出錯(cuò)。對(duì)于郵件客戶(hù)端,那是合適的,但對(duì)于郵件服務(wù)器,結(jié)果可能是不同的。
  問(wèn). 我可以使用 JavaMail API 在我的郵件服務(wù)器上添加新的用戶(hù)賬戶(hù)、刪除用戶(hù)賬戶(hù)或改變用戶(hù)賬戶(hù)的密碼嗎?
  答:JavaMail API 不包括任何工具,用于添加、刪除或修改用戶(hù)賬戶(hù)。在這一方面是沒(méi)有標(biāo)準(zhǔn)的,每個(gè)郵件服務(wù)器對(duì)它的處理是不同的。
  問(wèn). 為什么 MimeMessage 類(lèi)沒(méi)有實(shí)現(xiàn) Serializable,這樣我就可以將消息序列化到磁盤(pán),并在以后讀回它?
  答:JavaMail API 是在現(xiàn)有電子郵件系統(tǒng)上面設(shè)計(jì)的,并使用了現(xiàn)有的消息格式。對(duì)于這樣的一些實(shí)現(xiàn),使用 Java 序列化能力既不是必要的,也不是有用的,因此,不能將它作為 JavaMail API 的目標(biāo)來(lái)考慮。
  有關(guān)序列化 Message 的困難部分是保留某些指針,它們指向 Folder(文件夾)、Store(存儲(chǔ))和 Session(會(huì)話(huà))。假如只想保存消息的內(nèi)容,而不是對(duì)象本身,消息的 writeTo 方法將為你完成這一切。假如想根據(jù)序列化消息創(chuàng)建整個(gè)電子郵件系統(tǒng),您應(yīng)該能夠編寫(xiě) Message 等的子類(lèi),并在子類(lèi)中實(shí)現(xiàn) Serializable。
  假如想序列化自己的引用了 MimeMessages的其他對(duì)象,那么你的對(duì)象的 writeObject 方法可以使用 MimeMessage 的 writeTo 方法,對(duì)象的 readObject 方法可以使用 MimeMessage 構(gòu)造函數(shù),該構(gòu)造函數(shù)會(huì)得到 InputStream。在構(gòu)造 MimeMessage 時(shí),你的類(lèi)將需要提供一個(gè) Session。
  問(wèn). 我如何編寫(xiě)服務(wù)提供程序?
  答:請(qǐng)閱讀服務(wù)提供程序文檔,獲取一些細(xì)節(jié)信息。通常,假如想編寫(xiě) Store 提供程序,那就編寫(xiě) javax.mail.Store 和 javax.mail.Folder的子類(lèi),也可能要編寫(xiě) javax.mail.Message 及其他一些類(lèi)的子類(lèi)。對(duì)于 Transport 提供程序,編寫(xiě) javax.mail.Transport 的子類(lèi),也可能需要編寫(xiě) javax.mail.Message 及其他的一些類(lèi)的子類(lèi)。然后在 javamail.PRoviders 注冊(cè)表中,添加描述提供程序的條目。假如對(duì)編寫(xiě)非凡的服務(wù)提供程序感愛(ài)好,并且它所針對(duì)的協(xié)議或郵件系統(tǒng)目前沒(méi)有得到 JavaMail API 實(shí)現(xiàn)的支持,請(qǐng)通過(guò) javamail@Sun.COM 聯(lián)系我們。
  問(wèn). 我在登錄 Microsoft Exchange 服務(wù)器時(shí)碰到了麻煩,我確信正在使用的用戶(hù)名和密碼是正確的,我做錯(cuò)了什么?
  答:當(dāng)?shù)卿?Exchange 時(shí),需要使用比簡(jiǎn)單登錄名更多的用戶(hù)名。例如,假如你的電子郵件地址是“J.User@server.com”,Windows NT 登錄名是“juser”,NT 域名是“dom”,而且 Exahange 郵箱名是“Joe User”,那么在使用 JavaMail 登錄時(shí),你將需要使用用戶(hù)名 “dom/juser/J.User”。
  問(wèn). 在發(fā)送二進(jìn)制文件前,我如何編碼它?當(dāng)收到它時(shí),我又如何解碼它?
  答:你不必這樣的做!JavaMail 將自動(dòng)決定合適的編碼用于消息部分,然后才發(fā)送消息。而且當(dāng)讀取它們時(shí),將自動(dòng)解碼消息部分。getInputStream 方法將返回解碼數(shù)據(jù)。
  問(wèn). 假如我不需要自己編碼和解碼附件,我應(yīng)該何時(shí)使用 MimeUtility 方法?
  答:在 JavaMail 沒(méi)有自動(dòng)處理的情況下,MimeUtility 方法是有用的。經(jīng)常發(fā)生的這樣的一種情形是文件名的編碼。基本的 MIME spec(規(guī)范)不答應(yīng)按某種方式編碼標(biāo)題參數(shù)值(比如文件名參數(shù)),該方式與(比如)編碼 Subject(主題)標(biāo)題相同。這限制了參數(shù)值,從而限制了文件名到 ASCII。但一些發(fā)件人卻實(shí)際使用 MIME 文本編碼來(lái)做非 ASCII 文件名的編碼工作。想與這種非標(biāo)準(zhǔn)發(fā)件人互操作的應(yīng)用程序可以使用 encodeText 方法來(lái)編碼文件名,然后調(diào)用 MimeBodyPartsetFileName 方法,而且可以使用 decodeText 方法來(lái)解碼返回的文件名。
  問(wèn). 盡管 JavaMail 完成了所有的編碼和解碼工作,但我仍需要手動(dòng)控制一些主體部分的編碼。
  答:在少數(shù)的場(chǎng)合需要控制編碼,這里有幾個(gè)方法來(lái)重寫(xiě) JavaMail 的默認(rèn)行為。下面是一個(gè)簡(jiǎn)單的方法。在創(chuàng)建整個(gè)消息后,調(diào)用 msg.saveChanges(),然后使用像 mbp.setHeader("Content-Transfer-Encoding", "base64") 的語(yǔ)句來(lái)強(qiáng)制對(duì)指定主體部分做 base64 編碼。
  另一種辦法是編寫(xiě) MimeBodyPart 的子類(lèi),并重寫(xiě) updateHeaders 方法,讓它首先調(diào)用 super.updateHeaders(),然后像上面那樣設(shè)置 Content-Transfer-Encoding 標(biāo)題。
  問(wèn). 為什么 JavaMail 沒(méi)有在非 ASCII 字符集中正確編碼和解碼文件名?
  答:文件名是作為參數(shù)存儲(chǔ)在 MIME 標(biāo)題中的。形如 =?ISO-8859-15?B?5OTkLUluZm8UCGRm?= 的編碼文件名不是 MIME spec(規(guī)范)的一部分。形如 =?A?B?C?= 的文件名是一個(gè)完全有效的文件名,而不是一個(gè)不正確編碼的文件名。JavaMail 沒(méi)有編碼和解碼文件名,因?yàn)檫@樣做會(huì)違反 MIME 規(guī)范。
  基本的 MIME 規(guī)范不答應(yīng)編碼參數(shù)。RFC 2231 定義了一種新的方式,使得可以在 MIME 標(biāo)題中包括編碼參數(shù),包括文件名。它與下面的事實(shí)方式不兼容:許多應(yīng)用程序非法編碼文件名。支持 RFC 2231 將不答應(yīng) JavaMail 與這些現(xiàn)有的程序互操作。據(jù)我所知,很少現(xiàn)有的程序支持 RFC 2231。
  假如你選擇違反 MIME 規(guī)范是為了與其他也違反了 MIME的程序互操作,那么 JavaMail 會(huì)給您所有需要的工具來(lái)完成這件事。
  編碼文件名的解決方法是簡(jiǎn)單的:
  mbp.setFileName(MimeUtility.encodeText(filename));
  解碼文件名的解決方法同樣簡(jiǎn)單:
  String filename = MimeUtility.decodeText(part.getFi

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 通榆县| 湘潭县| 锡林郭勒盟| 安义县| 安泽县| 吉林省| 剑川县| 改则县| 新乐市| 淮北市| 长岛县| 陈巴尔虎旗| 亳州市| 惠安县| 榆社县| 武山县| 湘阴县| 太仆寺旗| 平遥县| 谢通门县| 柘荣县| 普宁市| 佛教| 罗源县| 泸州市| 定西市| 彭水| 高阳县| 井冈山市| 宜宾县| 卢湾区| 高清| 镇雄县| 高唐县| 龙井市| 伊金霍洛旗| 灵璧县| 康保县| 肥西县| 溧水县| 江华|