麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

JavaMail常見問題之發送郵件問題

2019-11-18 13:15:35
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品中文视频 | 婷婷亚洲一区二区三区 | 黄色大片在线免费看 | 最新av在线播放 | jizzjizz中国人少妇中文 | 国产一区二区三区四区五区在线 | 看免费5xxaaa毛片 | 91av网址| 亚洲αv | 精品一区二区三区在线观看国产 | 欧美特黄a | 日本中文字幕网址 | 午夜影视一区二区 | 黄色毛片一级 | 精品亚洲一区二区三区 | 国产亚洲综合精品 | 日本在线观看视频网站 | 羞羞视频免费网站入口 | 国产成人网| 久久影院在线观看 | 桥本有菜免费av一区二区三区 | 精品在线观看一区二区 | 国产xxxxx在线观看 | 国产精品久久久久久久久久久天堂 | 国产精品久久久久久久模特 | 日本在线播放一区二区 | 欧美a区| 成人午夜高清 | 在线高清中文字幕 | 91麻豆精品国产91久久久更新资源速度超快 | 日本欧美一区 | 黑色丝袜美美女被躁视频 | 三级国产三级在线 | 欧美视频一区二区三区在线观看 | 一级免费视频 | 精品国产一区二区三区久久久蜜月 | 911色_911色sss主站色播 | 日本欧美一区二区三区在线观看 | 操碰97 | 久久精品视频一区二区三区 | 高清成人在线 |