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

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

JavaMail常見(jiàn)問(wèn)題之發(fā)送郵件問(wèn)題

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

  問(wèn). 我如何回復(fù)消息?
  答:為了回復(fù)消息,請(qǐng)使用 Message 對(duì)象上的 reply 方法。這個(gè)方法將返回一個(gè)新的對(duì)象,對(duì)象中的標(biāo)題已經(jīng)針對(duì)回復(fù)做了恰當(dāng)設(shè)置。你將需要自己提供消息的內(nèi)容。
  問(wèn). 我如何轉(zhuǎn)發(fā)消息?
  答:用于轉(zhuǎn)發(fā)消息的方法取決于你要怎樣表示要轉(zhuǎn)發(fā)的消息。簡(jiǎn)單的辦法是創(chuàng)建一個(gè)新的 MimeMessage,并適當(dāng)?shù)貫樗峁┑刂罚缓髮F(xiàn)有的消息作為附件放在新消息中。為了將原始消息放在新消息中,比如可以使用下面的代碼:
    MimeBodyPart mbp = new MimeBodyPart();
    mbp.setContent(forwardedMsg, "message/rfc822");
    mp.addPart(mbp);
  但是假如你想創(chuàng)建新的消息,并在新消息中包括原始消息的文本,可能也要用 "> " 來(lái)縮進(jìn),那將需要提取原始消息主體中的數(shù)據(jù),并進(jìn)行相應(yīng)的處理。你可能也想取得原始消息的其他附件,并將它們添加到新消息中。
  問(wèn). 我如何發(fā)送 Html 郵件?
  答:在分發(fā)中包括了大量演示程序,它們展示了如何發(fā)送 HTML 郵件。假如想發(fā)送簡(jiǎn)單消息,它具有 HTML 而不是純文本,那請(qǐng)參見(jiàn) demo(演示)目錄中的 senDHTML.java 程序。假如想將 HTML 文件作為附件發(fā)送,請(qǐng)參見(jiàn) sendfile.java 示例,它展示了如何將任何文件作為附件發(fā)送。
  問(wèn). 我如何發(fā)送具有不同字體和顏色的格式化文本的郵件?
  答:最簡(jiǎn)單的辦法是使用 HTML 文本發(fā)送消息。參見(jiàn) 上面。
  問(wèn). 我如何發(fā)送具有純文本和 HTML 文本的郵件,讓每個(gè)郵件的閱讀者可以選擇適合它的格式?
  答:你想要發(fā)送 MIME multipart/alternative 消息。你構(gòu)造了這樣的一條消息,構(gòu)造方式基本上與構(gòu)造 multipart/mixed 消息相同,它使用了 MimeMultipart 對(duì)象,而該對(duì)象又是使用 new MimeMultipart("alternative") 來(lái)構(gòu)造的。然后在 multipart(多部分)中,把 text/plain 主體部分作為第一部分插入,并且把 text/html 作為第二部分插入。參閱 RFC2046,獲取這一消息的結(jié)構(gòu)的細(xì)節(jié)。
  問(wèn). 我如何發(fā)送包含圖像的 HTML 郵件?
  答:最簡(jiǎn)單的辦法是發(fā)送帶有圖像標(biāo)簽的 HTML 文本,標(biāo)簽引用了公共 Web 站點(diǎn)。在這種方法中,在消息中并沒(méi)有真正包括圖像,因此當(dāng)用戶(hù)閱讀消息時(shí),假如沒(méi)有連接到 Internet,那將不能看到圖像。
  另外,你也可以構(gòu)造 MIME multipart/related 消息。參閱 RFC2387,獲取這種消息結(jié)構(gòu)的細(xì)節(jié)。
  問(wèn). Transport 方法 send 和 sendMessage 之間有什么區(qū)別?
  答:send() 方法是一個(gè)靜態(tài)方法,可以直接使用,而不需要 Transport 對(duì)象的實(shí)例。它用于常見(jiàn)、簡(jiǎn)單的場(chǎng)合,比如使用默認(rèn)傳輸發(fā)送單條消息。從內(nèi)部講,send() 方法首先調(diào)用消息上的 saveChanges() 方法。然后創(chuàng)建合適的新 Transport 對(duì)象,調(diào)用 Transport 的 connect() 方法,調(diào)用 Transport 的 sendMessage() 方法來(lái)實(shí)際發(fā)送消息,接著調(diào)用 Transport 的 close() 方法,最后丟棄 Transport 對(duì)象的新實(shí)例,并由垃圾收集器收集(實(shí)際上,還有比那更加復(fù)雜的,但那是一般的想法)。
  如你可以看到,靜態(tài) send() 便利 (convenience) 方法是建立在更加通用的每實(shí)例 sendMessage() 方法的基礎(chǔ)上的。有許多原因可以讓?xiě)?yīng)用程序直接使用 sendMessage() 方法。最常見(jiàn)的原因是為了通過(guò)在單個(gè)連接期間發(fā)送多條消息 來(lái)提高性能,或者為了手動(dòng)治理連接以提供驗(yàn)證信息。當(dāng)使用 sendMessage() 方法時(shí),產(chǎn)生的最常見(jiàn)錯(cuò)誤是,忘記在要發(fā)送的消息上調(diào)用 saveChanges() 方法。
  問(wèn). 我需要驗(yàn)證到 SMTP 服務(wù)器,因此我調(diào)用了 trans.connect(host, user, passWord),然后調(diào)用 trans.send(msg) 發(fā)送消息,但它卻不能工作。
  答:你應(yīng)該調(diào)用 msg.saveChanges(),然后調(diào)用 trans.sendMessage(msg, addrs) 來(lái)發(fā)送消息。如 上面 所描述,send 方法是一個(gè)靜態(tài)便利方法,它會(huì)獲得自己的 Transport 對(duì)象,并創(chuàng)建自己的連接用于發(fā)送消息;它沒(méi)有使用與某些 Transport 對(duì)象有關(guān)的連接,并且它是通過(guò)該 Transport 對(duì)象得到調(diào)用的。當(dāng)然不要忘記將 mail.smtp.auth 屬性設(shè)置為 true 來(lái)啟用 SMTP 驗(yàn)證!
  問(wèn). 我修改了一條消息,但標(biāo)題卻沒(méi)有反映修改。
  答:在創(chuàng)建新消息或修改現(xiàn)有消息后,應(yīng)該調(diào)用 saveChanges()。這將導(dǎo)致重新設(shè)置標(biāo)題以反映變更。注重,Transport.send(Message) 方法隱式調(diào)用了這個(gè)方法。因此假如你正在做的是發(fā)送已修改的消息,就可以跳過(guò)調(diào)用 saveChanges()。saveChanges() 可能是一個(gè)昂貴的操作(非凡是對(duì)于較大或深度嵌套的消息),因此只在需要時(shí)才調(diào)用它。
  問(wèn). 我正在使用 sendMessage() 方法發(fā)送消息,但在消息中的文本前后卻出現(xiàn)希奇的一些行,并且我的附件也在消息體中出現(xiàn)。
  答:通常這些行像下面這樣:
  --928176543.952742998030.JavaMail.name@host
  像 上面 那樣,在創(chuàng)建新消息后,在使用 Transport.sendMessage() 方法發(fā)送消息之前,必須調(diào)用 saveChanges() 方法。靜態(tài) Transport.send() 方法將自動(dòng)調(diào)用 Message.saveChanges() 方法。
  問(wèn). 我為新消息的 Message-ID 標(biāo)題設(shè)置了特定值。但當(dāng)我發(fā)送這條消息時(shí),卻重寫(xiě)了那個(gè)標(biāo)題。
  答:saveChanges() 將為 Message-ID 字段設(shè)置新值,重寫(xiě)所設(shè)置的任何值。假如需要設(shè)置自己的 Message-ID 并保留它,就必須創(chuàng)建自己的 MimeMessage 子類(lèi),重寫(xiě) updateHeaders() 方法,并使用這個(gè)子類(lèi)的一個(gè)實(shí)例。
  class MyMessage extends MimeMessage {
    ...
  
    PRotected void updateHeaders() throws MessagingException {
   super.updateHeaders();
   setHeader("Message-ID", "my-message-id");
    }
    ...
  }
  
  問(wèn). 當(dāng)發(fā)送創(chuàng)建的新消息時(shí),為什么會(huì)得到 UnsupportedDataTypeException?
  答:你可能使用 setContent(Object o, String type) 方法設(shè)置了消息的一些內(nèi)容。為了讓它能工作,必須為指定“類(lèi)型”注冊(cè) JAF DataContentHandler。假如不這樣做,將獲得 UnsupportedDataTypeException。參閱 JAF 文檔,獲取進(jìn)一步信息。
  問(wèn). 當(dāng)發(fā)送消息時(shí),如何能夠顯式地設(shè)置 SMTP FROM: 屬性?
  答:mail.smtp.from 屬性可用于設(shè)置 SMTP FROM: 屬性。假如沒(méi)有設(shè)置這個(gè)屬性,就使用消息的 From 屬性。假如多個(gè)線(xiàn)程需要同時(shí)發(fā)送郵件,并且每個(gè)線(xiàn)程需要設(shè)置 From 屬性,那么每個(gè)線(xiàn)程就必須使用自己的 session 對(duì)象,它具有自己的 Properties 對(duì)象。然后可以在每個(gè) Session 對(duì)象的 各個(gè) Properties 對(duì)象上獨(dú)立設(shè)置 mail.smtp.from 屬性(同樣對(duì)每個(gè)線(xiàn)程做這樣的設(shè)置)。
  問(wèn). 我想重復(fù)發(fā)送消息,并且每次發(fā)送給一組不同的收件人。但調(diào)用 Transport.send(Message) 卻導(dǎo)致每次都創(chuàng)建一個(gè)新的 Transport 會(huì)話(huà)。在本例中,這是一個(gè)次優(yōu)辦法,我如何來(lái)解決它?
  答:創(chuàng)建合適的 Transport 對(duì)象的實(shí)例,然后連上它并重復(fù)調(diào)用 sendMessage() 方法,例如:
  MimeMessage msg = ...;
  // constrUCt message
  msg.saveChanges();
  Transport t = session.getTransport("smtp");
  t.connect();
  
  for (int i = 0; .....) {
    t.sendMessage(msg, new Address[] { recipients[i] });
  }
  
  t.close();
  
  問(wèn). 當(dāng)試圖發(fā)送消息時(shí),我得到了 “MessagingException: 501 HELO requires domain address”(MessagingException: 501 HELO 要求域地址)。
  答:在 SMTP HELO 命令中,SMTP 提供程序使用 InetAddress.getLocalHost().getHostName() 的結(jié)果。假如那個(gè)調(diào)用不能返回任何數(shù)據(jù),就不會(huì)在 HELO 命令中發(fā)送任何名稱(chēng)。檢查你的 JDK 和名稱(chēng)服務(wù)器配置,確保那個(gè)調(diào)用返回正確數(shù)據(jù)。從 JavaMail 1.1.3 開(kāi)始,你也可以設(shè)置 mail.smtp.localhost 屬性,并可以把設(shè)置為想用于 HELO 命令的名稱(chēng)。
  問(wèn). 假如將消息發(fā)送到錯(cuò)誤的地址,為什么我會(huì)獲得 SendFailedException 或 TransportEvent,指出地址是錯(cuò)誤的?
  答:在 Internet 上沒(méi)有端到端驗(yàn)證。通常要將消息轉(zhuǎn)發(fā)到幾個(gè)郵件服務(wù)器,然后才到達(dá)特定的郵件服務(wù)器,該服務(wù)器決定了它是否可以傳送消息。假如在這些后面的步驟中的某個(gè)步驟發(fā)生了錯(cuò)誤,那么通常會(huì)將消息作為不可傳送返回給發(fā)件人。一個(gè)成功的“發(fā)送”只表明郵件服務(wù)器已經(jīng)接受了消息,并將試著傳送它。
  問(wèn). 當(dāng)消息不能被傳送時(shí),就會(huì)返回一個(gè)失敗消息。我如何檢測(cè)這些“回彈”消息?
  答:雖然有一個(gè) Internet 標(biāo)準(zhǔn)用于報(bào)告這樣的錯(cuò)誤(multipart/report MIME 類(lèi)型,參閱 RFC1892),但還沒(méi)有廣泛實(shí)現(xiàn)它。RFC1211 深入討論了這個(gè)問(wèn)題,包括了大量的例子。
  在 Internet 電子郵件中,特定的郵箱或用戶(hù)名是否存在,只能由傳送消息的最終服務(wù)器決定。消息可能通過(guò)幾個(gè)中繼服務(wù)器(它們不能檢測(cè)錯(cuò)誤),然后再到達(dá)最終服務(wù)器。通常,當(dāng)最終服務(wù)器檢測(cè)到這一錯(cuò)誤,它會(huì)返回一個(gè)消息給原始消息的發(fā)送人,指出失敗的原因。有許多 Internet 標(biāo)準(zhǔn)討論了這種傳送狀態(tài)通知 (Delivery Status Notifications),但大量服務(wù)器不支持這些新標(biāo)準(zhǔn),相反使用非凡技術(shù)來(lái)返回這種錯(cuò)誤消息。這使得將“回彈”消息與產(chǎn)生問(wèn)題的原始消息相互關(guān)聯(lián)起來(lái)非常困難(注重,這個(gè)問(wèn)題與 JavaMail 完全無(wú)關(guān))。
  有許多技術(shù)和試探法用于處理這一問(wèn)題,但它們都不是完美的。一種技術(shù)是 Variable Envelope Return Paths,http://cr.yp.to/proto/verp.txt 描述了這一技術(shù)。
  問(wèn). 當(dāng)創(chuàng)建 InternetAddress 對(duì)象時(shí),假如地址是非法的,為什么不會(huì)獲得異常?
  答:InternetAddress 類(lèi)只檢查地址的語(yǔ)法。如 上面 所討論,InternetAddress 類(lèi)不能決定地址是否做為合法地址實(shí)際存在。假如應(yīng)用程序運(yùn)行在防火墻背后或目前沒(méi)有連接到 Internet,那么甚至不能驗(yàn)證主機(jī)名。
  問(wèn). 當(dāng)試圖發(fā)送消息時(shí),我為什

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东乡县| 巴里| 辽宁省| 体育| 闸北区| 保亭| 河东区| 宜章县| 新蔡县| 临西县| 田东县| 南投市| 云林县| 洱源县| 青河县| 临潭县| 延长县| 资兴市| 辽阳县| 榆林市| 宁化县| 保定市| 雷州市| 齐齐哈尔市| 汶川县| 昆山市| 眉山市| 温宿县| 黄大仙区| 龙山县| 新河县| 清涧县| 叙永县| 沂南县| 靖江市| 赤峰市| 余庆县| 边坝县| 平邑县| 湖南省| 靖安县|