問
我如何回復消息?
答
為了回復消息
請使用 Message 對象上的 reply 方法
這個方法將返回一個新的對象
對象中的標題已經針對回復做了恰當設置
你將需要自己提供消息的內容
問
我如何轉發消息?
答
用於轉發消息的方法取決於你要怎樣表示要轉發的消息
簡單的辦法是創建一個新的 MimeMessage
並適當地為它提供地址
然後將現有的消息作為附件放在新消息中
為了將原始消息放在新消息中
比如可以使用下面的代碼
MimeBodyPart mbp = new MimeBodyPart();
mbp
setContent(forwardedMsg
message/rfc
);
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 作為第二部分插入
參閱 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)
然後調用 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() 方法發送消息
但在消息中的文本前後卻出現奇怪的一些行
並且我的附件也在消息體中出現
答
通常這些行像下面這樣
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
);
nnect();
for (int i =
;
) {
t
sendMessage(msg
new Address[] { recipients[i] });
}
t
close();
問
當試圖發送消息時
我得到了
MessagingException:
HELO requires domain address
(MessagingException:
HELO 要求域地址)
答
在 SMTP HELO 命令中
SMTP 提供程序使用 InetAddress
getLocalHost()
getHostName() 的結果
如果那個調用不能返回任何數據
就不會在 HELO 命令中發送任何名稱
檢查你的 JDK 和名稱服務器配置
確保那個調用返回正確數據
從 JavaMail
開始
你也可以設置 mail
smtp
localhost 屬性
並可以把設置為想用於 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