WebObjects/Project WONDER/Frameworks/ERJavaMail
ERJavaMail 提供了一個簡單而強大的 API,用於從 WebObjects 應用程式傳送基於元件的電子郵件。ERJavaMail 不依賴於 Project Wonder 的任何其他部分,是開始使用 Wonder 的好方法。
- er.javamail.centralize = true
Centralize 將所有電子郵件傳送到 er.javamail.adminEmail 使用者。
- er.javamail.debugEnabled = true
確定是否顯示電子郵件除錯資訊。這包含協議級別的除錯資訊。
- er.javamail.adminEmail = user@domain.com
用於傳送集中式電子郵件的管理員使用者的電子郵件地址。這是必需的屬性。
- er.javamail.smtpHost = smtp.domain.com
要使用的 SMTP 主機名。如果未設定,將檢查 mail.smtp.host,最終將使用 WOHost。
- er.javamail.senderQueue.size = 50
傳送者佇列可以容納的訊息數量。預設值為 50。
- er.javamail.milliSecondsWaitIfSenderOverflowed = 6000
如果傳送者佇列已滿,則等待的毫秒數。預設值為 6000。
- er.javamail.smtpAuth = true
設定是否使用身份驗證 SMTP 傳送傳出郵件。如果設定,er.javamail.smtpUser 也必須設定(最好設定 er.javamail.smtpPassword)。
- er.javamail.smtpUser = smtpusername
用於登入身份驗證 SMTP 伺服器的使用者名稱。
- er.javamail.smtpPassword = smtppassword
用於登入身份驗證 SMTP 伺服器的密碼。
- er.javamail.XMailerHeader =
要新增到所有傳出郵件訊息的 X-Mailer 標頭。預設值為無。
- er.javamail.defaultEncoding = UTF-8
用於訊息內容的預設字元編碼。預設為 ???。
- er.javamail.WhiteListEmailAddressPatterns =
一個以逗號分隔的白名單電子郵件地址模式列表。如果設定,則只有與其中一個白名單模式匹配的地址才會被傳遞。
- er.javamail.BlackListEmailAddressPatterns =
一個以逗號分隔的黑名單電子郵件地址模式列表。如果設定,則任何與黑名單模式匹配的電子郵件地址都不會被傳遞。
// Create an instance of an ERMailDelivery subclass
ERMailDeliveryHTML mail = new ERMailDeliveryHTML ();
// Here ERMailDeliveryHTML needs a WOComponent to
// render the HTML text content.
mail.setComponent(mailPage);
// Here you create a new instance of the message
// You can loop over this fragment of code, not
// forgetting to use newMail ()
// before you set the attributes of the message.
try {
mail.newMail();
mail.setFromAddress(emailFrom);
mail.setReplyToAddress(emailReplyTo);
mail.setSubject(emailSubject);
mail.setToAddresses(new NSArray (toEmailAddresses));
// Send the mail. There is an optional sendMail(boolean) that
// optionally blocks during the send.
mail.sendMail();
} catch (Exception e) {
// handle the exception ...
}
ERMailDelivery 的子類不僅會為您傳遞郵件,還會建立訊息。因此,ERMailDelivery 在某種程度上更像是一條訊息,而不是一種傳遞機制。對於要傳送的每條訊息,例項化 ERMailDelivery 的具體子類(例如 ERMailDeliveryPlainText)。然後,您可以向其中新增附件。下面是傳送帶有附件的郵件的簡單程式碼段。附件的 MimeType 是從檔名副檔名中解析出來的。
預設情況下,傳送郵件是非同步的,您可以指定一個標誌(true == 應該阻塞,false == 不應該阻塞)來影響行為。
byte[] content; // assume this exist, same interface exists for NSData, too
// Create an instance of an ERMailDelivery subclass
ERMailDeliveryPlainText message = new ERMailDeliveryPlainText();
// set the text and subject
message.setTextContent("Some Mail text");
message.setSubject("The mail subject");
// add the attachment
message.addAttachment(new ERMailDataAttachment("myattachment.zip", null, content));
message.setToAddress("receiver@bitbucket.com");
message.setFromAddress("sender@bitbucket.com");
// send the mail asynchronously
message.sendMail();
注意包含您正在傳送的元件的 WOContext。如果您在正常的請求-響應迴圈中使用 ERMailDeliveryHTML,並且使用預設的 WOContext,那麼很有可能傳送給使用者的下一個頁面將是您傳送的電子郵件元件,而不是您想要傳送的頁面。為此,有幾種可能的解決方法。一種方法是從您的動作方法返回特定元件而不是 null。我使用以下程式碼獲得了更好、更一致的成功
WOContext context = (WOContext) context().clone(); MyComponent component = (MyComponent) WOApplication.application().pageWithName(MyComponent.class.getName(), context); ERMailDeliveryHTML mail = new ERMailDeliveryHTML(); mail.setComponent(component); ...
這似乎可以將電子郵件正確隔離到當前上下文的克隆中,而不是實際的活動上下文。您的里程可能會有所不同。