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

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

2013-11-15 11:42:53  來源: JSP教程 

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

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.