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 = [email protected]
要将集中化电子邮件发送到的管理员用户的电子邮件地址。这是必需的属性。
- 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 =
白名单电子邮件地址模式的逗号分隔列表。如果设置,则只有与其中一个白名单模式匹配的地址才会被传递。模式语法与 EOQualifier 的 caseInsensitiveLike 相同。
- er.javamail.BlackListEmailAddressPatterns =
黑名单电子邮件地址模式的逗号分隔列表。如果设置,则任何与黑名单模式匹配的电子邮件地址都不会被传递。模式语法与 EOQualifier 的 caseInsensitiveLike 相同。黑名单过滤器最后处理,因此黑名单模式优先于白名单模式。
// 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("[email protected]"); message.setFromAddress("[email protected]"); // send the mail asynchronously message.sendMail();
请注意包含要发送的组件的 WOContext。如果您在使用默认 WOContext 的正常请求-响应循环中使用 ERMailDeliveryHTML,则发送给用户的下一页很可能是电子邮件组件,而不是您想要的页面。有几种可能的解决方法。一种是让您的 action 方法返回特定组件而不是 null。我使用以下代码获得了更好、更一致的成功率
WOContext context = (WOContext) context().clone(); MyComponent component = (MyComponent) WOApplication.application().pageWithName(MyComponent.class.getName(), context); ERMailDeliveryHTML mail = new ERMailDeliveryHTML(); mail.setComponent(component); ...
这似乎将电子邮件正确地隔离到当前上下文的克隆,而不是实际的活动上下文。您的里程数可能会有所不同。